diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index 5032843..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,203 +0,0 @@
-Eclipse Public License - v 1.0
-
-THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC
-LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM
-CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
-
-1. DEFINITIONS
-
-"Contribution" means:
-
-a) in the case of the initial Contributor, the initial code and documentation
-   distributed under this Agreement, and
-b) in the case of each subsequent Contributor:
-    i) changes to the Program, and
-   ii) additions to the Program;
-
-   where such changes and/or additions to the Program originate from and are
-   distributed by that particular Contributor. A Contribution 'originates'
-   from a Contributor if it was added to the Program by such Contributor
-   itself or anyone acting on such Contributor's behalf. Contributions do not
-   include additions to the Program which: (i) are separate modules of
-   software distributed in conjunction with the Program under their own
-   license agreement, and (ii) are not derivative works of the Program.
-
-"Contributor" means any person or entity that distributes the Program.
-
-"Licensed Patents" mean patent claims licensable by a Contributor which are
-necessarily infringed by the use or sale of its Contribution alone or when
-combined with the Program.
-
-"Program" means the Contributions distributed in accordance with this
-Agreement.
-
-"Recipient" means anyone who receives the Program under this Agreement,
-including all Contributors.
-
-2. GRANT OF RIGHTS
-  a) Subject to the terms of this Agreement, each Contributor hereby grants
-     Recipient a non-exclusive, worldwide, royalty-free copyright license to
-     reproduce, prepare derivative works of, publicly display, publicly
-     perform, distribute and sublicense the Contribution of such Contributor,
-     if any, and such derivative works, in source code and object code form.
-  b) Subject to the terms of this Agreement, each Contributor hereby grants
-     Recipient a non-exclusive, worldwide, royalty-free patent license under
-     Licensed Patents to make, use, sell, offer to sell, import and otherwise
-     transfer the Contribution of such Contributor, if any, in source code and
-     object code form. This patent license shall apply to the combination of
-     the Contribution and the Program if, at the time the Contribution is
-     added by the Contributor, such addition of the Contribution causes such
-     combination to be covered by the Licensed Patents. The patent license
-     shall not apply to any other combinations which include the Contribution.
-     No hardware per se is licensed hereunder.
-  c) Recipient understands that although each Contributor grants the licenses
-     to its Contributions set forth herein, no assurances are provided by any
-     Contributor that the Program does not infringe the patent or other
-     intellectual property rights of any other entity. Each Contributor
-     disclaims any liability to Recipient for claims brought by any other
-     entity based on infringement of intellectual property rights or
-     otherwise. As a condition to exercising the rights and licenses granted
-     hereunder, each Recipient hereby assumes sole responsibility to secure
-     any other intellectual property rights needed, if any. For example, if a
-     third party patent license is required to allow Recipient to distribute
-     the Program, it is Recipient's responsibility to acquire that license
-     before distributing the Program.
-  d) Each Contributor represents that to its knowledge it has sufficient
-     copyright rights in its Contribution, if any, to grant the copyright
-     license set forth in this Agreement.
-
-3. REQUIREMENTS
-
-A Contributor may choose to distribute the Program in object code form under
-its own license agreement, provided that:
-
-  a) it complies with the terms and conditions of this Agreement; and
-  b) its license agreement:
-      i) effectively disclaims on behalf of all Contributors all warranties
-         and conditions, express and implied, including warranties or
-         conditions of title and non-infringement, and implied warranties or
-         conditions of merchantability and fitness for a particular purpose;
-     ii) effectively excludes on behalf of all Contributors all liability for
-         damages, including direct, indirect, special, incidental and
-         consequential damages, such as lost profits;
-    iii) states that any provisions which differ from this Agreement are
-         offered by that Contributor alone and not by any other party; and
-     iv) states that source code for the Program is available from such
-         Contributor, and informs licensees how to obtain it in a reasonable
-         manner on or through a medium customarily used for software exchange.
-
-When the Program is made available in source code form:
-
-  a) it must be made available under this Agreement; and
-  b) a copy of this Agreement must be included with each copy of the Program.
-     Contributors may not remove or alter any copyright notices contained
-     within the Program.
-
-Each Contributor must identify itself as the originator of its Contribution,
-if
-any, in a manner that reasonably allows subsequent Recipients to identify the
-originator of the Contribution.
-
-4. COMMERCIAL DISTRIBUTION
-
-Commercial distributors of software may accept certain responsibilities with
-respect to end users, business partners and the like. While this license is
-intended to facilitate the commercial use of the Program, the Contributor who
-includes the Program in a commercial product offering should do so in a manner
-which does not create potential liability for other Contributors. Therefore,
-if a Contributor includes the Program in a commercial product offering, such
-Contributor ("Commercial Contributor") hereby agrees to defend and indemnify
-every other Contributor ("Indemnified Contributor") against any losses,
-damages and costs (collectively "Losses") arising from claims, lawsuits and
-other legal actions brought by a third party against the Indemnified
-Contributor to the extent caused by the acts or omissions of such Commercial
-Contributor in connection with its distribution of the Program in a commercial
-product offering. The obligations in this section do not apply to any claims
-or Losses relating to any actual or alleged intellectual property
-infringement. In order to qualify, an Indemnified Contributor must:
-a) promptly notify the Commercial Contributor in writing of such claim, and
-b) allow the Commercial Contributor to control, and cooperate with the
-Commercial Contributor in, the defense and any related settlement
-negotiations. The Indemnified Contributor may participate in any such claim at
-its own expense.
-
-For example, a Contributor might include the Program in a commercial product
-offering, Product X. That Contributor is then a Commercial Contributor. If
-that Commercial Contributor then makes performance claims, or offers
-warranties related to Product X, those performance claims and warranties are
-such Commercial Contributor's responsibility alone. Under this section, the
-Commercial Contributor would have to defend claims against the other
-Contributors related to those performance claims and warranties, and if a
-court requires any other Contributor to pay any damages as a result, the
-Commercial Contributor must pay those damages.
-
-5. NO WARRANTY
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR
-IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE,
-NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each
-Recipient is solely responsible for determining the appropriateness of using
-and distributing the Program and assumes all risks associated with its
-exercise of rights under this Agreement , including but not limited to the
-risks and costs of program errors, compliance with applicable laws, damage to
-or loss of data, programs or equipment, and unavailability or interruption of
-operations.
-
-6. DISCLAIMER OF LIABILITY
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY
-CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION
-LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE
-EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY
-OF SUCH DAMAGES.
-
-7. GENERAL
-
-If any provision of this Agreement is invalid or unenforceable under
-applicable law, it shall not affect the validity or enforceability of the
-remainder of the terms of this Agreement, and without further action by the
-parties hereto, such provision shall be reformed to the minimum extent
-necessary to make such provision valid and enforceable.
-
-If Recipient institutes patent litigation against any entity (including a
-cross-claim or counterclaim in a lawsuit) alleging that the Program itself
-(excluding combinations of the Program with other software or hardware)
-infringes such Recipient's patent(s), then such Recipient's rights granted
-under Section 2(b) shall terminate as of the date such litigation is filed.
-
-All Recipient's rights under this Agreement shall terminate if it fails to
-comply with any of the material terms or conditions of this Agreement and does
-not cure such failure in a reasonable period of time after becoming aware of
-such noncompliance. If all Recipient's rights under this Agreement terminate,
-Recipient agrees to cease use and distribution of the Program as soon as
-reasonably practicable. However, Recipient's obligations under this Agreement
-and any licenses granted by Recipient relating to the Program shall continue
-and survive.
-
-Everyone is permitted to copy and distribute copies of this Agreement, but in
-order to avoid inconsistency the Agreement is copyrighted and may only be
-modified in the following manner. The Agreement Steward reserves the right to
-publish new versions (including revisions) of this Agreement from time to
-time. No one other than the Agreement Steward has the right to modify this
-Agreement. The Eclipse Foundation is the initial Agreement Steward. The
-Eclipse Foundation may assign the responsibility to serve as the Agreement
-Steward to a suitable separate entity. Each new version of the Agreement will
-be given a distinguishing version number. The Program (including
-Contributions) may always be distributed subject to the version of the
-Agreement under which it was received. In addition, after a new version of the
-Agreement is published, Contributor may elect to distribute the Program
-(including its Contributions) under the new version. Except as expressly
-stated in Sections 2(a) and 2(b) above, Recipient receives no rights or
-licenses to the intellectual property of any Contributor under this Agreement,
-whether expressly, by implication, estoppel or otherwise. All rights in the
-Program not expressly granted under this Agreement are reserved.
-
-This Agreement is governed by the laws of the State of New York and the
-intellectual property laws of the United States of America. No party to this
-Agreement will bring a legal action under this Agreement more than one year
-after the cause of action arose. Each party waives its rights to a jury trial in
-any resulting litigation.
\ No newline at end of file
diff --git a/README.md b/README.md
deleted file mode 100644
index 6f5b4fd..0000000
--- a/README.md
+++ /dev/null
@@ -1,4 +0,0 @@
-lunifera-ecview-addons
-======================
-
-This project will provide addons for ECView such as UI model extensions and support for a UI DSL.
diff --git a/jenkins.build.config.xml b/jenkins.build.config.xml
index 77712f0..b7cf13b 100644
--- a/jenkins.build.config.xml
+++ b/jenkins.build.config.xml
@@ -22,5 +22,6 @@
                 <jenkins.build.dependency>org.eclipse.osbp.mobile.vaadin</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.runtime</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.runtime.web</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.xtext.oxtype</jenkins.build.dependency>
         </jenkins.build.dependencies>
 </jenkins>
diff --git a/org.eclipse.osbp.ecview.dsl.edit/META-INF/MANIFEST.MF b/org.eclipse.osbp.ecview.dsl.edit/META-INF/MANIFEST.MF
index 19b70cf..95b123b 100644
--- a/org.eclipse.osbp.ecview.dsl.edit/META-INF/MANIFEST.MF
+++ b/org.eclipse.osbp.ecview.dsl.edit/META-INF/MANIFEST.MF
@@ -11,13 +11,13 @@
 Export-Package: org.eclipse.osbp.ecview.dsl.provider,
  org.eclipse.osbp.ecview.semantic.uimodel.provider
 Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.osbp.ecview.dsl;visibility:=reexport,
+ org.eclipse.osbp.ecview.dsl;bundle-version="[0.9.0,0.10.0)";visibility:=reexport,
  org.eclipse.emf.edit;visibility:=reexport,
- org.eclipse.xtext.common.types;visibility:=reexport,
- org.eclipse.xtext.common.types.edit;visibility:=reexport,
- org.eclipse.osbp.ecview.uisemantics;visibility:=reexport,
- org.eclipse.osbp.ecview.uisemantics.edit;visibility:=reexport,
- org.eclipse.xtext.xbase;visibility:=reexport,
+ org.eclipse.xtext.common.types;bundle-version="[2.11.0,2.12.0)";visibility:=reexport,
+ org.eclipse.xtext.common.types.edit;bundle-version="[2.11.0,2.12.0)";visibility:=reexport,
+ org.eclipse.osbp.ecview.uisemantics;bundle-version="[0.9.0,0.10.0)";visibility:=reexport,
+ org.eclipse.osbp.ecview.uisemantics.edit;bundle-version="[0.9.0,0.10.0)";visibility:=reexport,
+ org.eclipse.xtext.xbase;bundle-version="[2.11.0,2.12.0)";visibility:=reexport,
  org.eclipse.emf.ecore;visibility:=reexport,
  org.eclipse.emf.ecore.edit;visibility:=reexport
 Bundle-ActivationPolicy: lazy
diff --git a/org.eclipse.osbp.ecview.dsl.edit/plugin.properties b/org.eclipse.osbp.ecview.dsl.edit/plugin.properties
index b82bd0f..42ebbd8 100644
--- a/org.eclipse.osbp.ecview.dsl.edit/plugin.properties
+++ b/org.eclipse.osbp.ecview.dsl.edit/plugin.properties
@@ -509,3 +509,29 @@
 _UI_UiDateTimeResolution_MONTH_literal = MONTH
 _UI_UiDateTimeResolution_YEAR_literal = YEAR
 _UI_UiDateTimeResolution_UNDEFINED_literal = UNDEFINED
+_UI_UiSortOrderAssignment_type = Ui Sort Order Assignment
+_UI_UiSortOrder_type = Ui Sort Order
+_UI_UiMaskedTextField_type = Ui Masked Text Field
+_UI_UiPrefixedMaskedTextField_type = Ui Prefixed Masked Text Field
+_UI_UiMaskedNumericField_type = Ui Masked Numeric Field
+_UI_UiMaskedDecimalField_type = Ui Masked Decimal Field
+_UI_UiStringToStringMapEntry_type = Ui String To String Map Entry
+_UI_UiRichTextArea_type = Ui Rich Text Area
+_UI_UiPrefixToMaskMapEntry_type = Ui Prefix To Mask Map Entry
+_UI_UiModel_importSection_feature = Import Section
+_UI_UiTable_sortOrderAssignment_feature = Sort Order Assignment
+_UI_UiSortOrderAssignment_columns_feature = Columns
+_UI_UiSortOrder_property_feature = Property
+_UI_UiSortOrder_asc_feature = Asc
+_UI_UiMaskedTextField_mask_feature = Mask
+_UI_UiPrefixedMaskedTextField_mask_feature = Mask
+_UI_UiPrefixedMaskedTextField_prefixMasks_feature = Prefix Masks
+_UI_UiMaskedDecimalField_mask_feature = Mask
+_UI_UiStringToStringMapEntry_key_feature = Key
+_UI_UiStringToStringMapEntry_value_feature = Value
+_UI_UiRichTextArea_asBlob_feature = As Blob
+_UI_UiPrefixToMaskMapEntry_key_feature = Key
+_UI_UiPrefixToMaskMapEntry_value_feature = Value
+_UI_UiDisplayView_type = Ui Display View
+_UI_UiI18nInfo_noCaption_feature = No Caption
+_UI_UiTable_scrollToBottom_feature = Scroll To Bottom
diff --git a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/dsl/provider/UIGrammarEditPlugin.java b/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/dsl/provider/UIGrammarEditPlugin.java
index 0c03cc7..5095321 100644
--- a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/dsl/provider/UIGrammarEditPlugin.java
+++ b/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/dsl/provider/UIGrammarEditPlugin.java
@@ -3,13 +3,9 @@
 package org.eclipse.osbp.ecview.dsl.provider;
 
 import org.eclipse.emf.common.EMFPlugin;
-
 import org.eclipse.emf.common.util.ResourceLocator;
-
 import org.eclipse.emf.ecore.provider.EcoreEditPlugin;
-
 import org.eclipse.osbp.ecview.uisemantics.provider.uisemanticsEditPlugin;
-
 import org.eclipse.xtext.common.types.provider.TypesEditPlugin;
 
 /**
diff --git a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiDialogAssignmentItemProvider.java b/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiDialogAssignmentItemProvider.java
index 7d71f63..3f8149c 100644
--- a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiDialogAssignmentItemProvider.java
+++ b/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiDialogAssignmentItemProvider.java
@@ -293,6 +293,16 @@
 		newChildDescriptors.add
 			(createChildParameter
 				(UiModelPackage.Literals.UI_DIALOG_ASSIGNMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiSortOrderAssignment()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_DIALOG_ASSIGNMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiSortOrder()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_DIALOG_ASSIGNMENT__ELEMENT,
 				 UiModelFactory.eINSTANCE.createUiColumnsAssignment()));
 
 		newChildDescriptors.add
@@ -424,6 +434,31 @@
 			(createChildParameter
 				(UiModelPackage.Literals.UI_DIALOG_ASSIGNMENT__ELEMENT,
 				 UiModelFactory.eINSTANCE.createUiPasswordField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_DIALOG_ASSIGNMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedTextField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_DIALOG_ASSIGNMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiPrefixedMaskedTextField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_DIALOG_ASSIGNMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedNumericField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_DIALOG_ASSIGNMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedDecimalField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_DIALOG_ASSIGNMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiRichTextArea()));
 	}
 
 	/**
diff --git a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiDynamicCaptionItemProvider.java b/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiDynamicCaptionItemProvider.java
deleted file mode 100644
index 5a46a91..0000000
--- a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiDynamicCaptionItemProvider.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/**
- */
-package org.eclipse.osbp.ecview.semantic.uimodel.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-
-import org.eclipse.osbp.ecview.dsl.provider.UIGrammarEditPlugin;
-
-import org.eclipse.osbp.ecview.semantic.uimodel.UiDynamicCaption;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiDynamicCaption} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class UiDynamicCaptionItemProvider 
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public UiDynamicCaptionItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addCaptionPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Caption feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addCaptionPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_UiDynamicCaption_caption_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_UiDynamicCaption_caption_feature", "_UI_UiDynamicCaption_type"),
-				 UiModelPackage.Literals.UI_DYNAMIC_CAPTION__CAPTION,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns UiDynamicCaption.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/UiDynamicCaption"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public String getText(Object object) {
-		String label = ((UiDynamicCaption)object).getCaption();
-		return label == null || label.length() == 0 ?
-			getString("_UI_UiDynamicCaption_type") :
-			getString("_UI_UiDynamicCaption_type") + " " + label;
-	}
-	
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(UiDynamicCaption.class)) {
-			case UiModelPackage.UI_DYNAMIC_CAPTION__CAPTION:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public ResourceLocator getResourceLocator() {
-		return UIGrammarEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiFormLayoutAssigmentItemProvider.java b/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiFormLayoutAssigmentItemProvider.java
index 8bdd453..69200b1 100644
--- a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiFormLayoutAssigmentItemProvider.java
+++ b/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiFormLayoutAssigmentItemProvider.java
@@ -293,6 +293,16 @@
 		newChildDescriptors.add
 			(createChildParameter
 				(UiModelPackage.Literals.UI_FORM_LAYOUT_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiSortOrderAssignment()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_FORM_LAYOUT_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiSortOrder()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_FORM_LAYOUT_ASSIGMENT__ELEMENT,
 				 UiModelFactory.eINSTANCE.createUiColumnsAssignment()));
 
 		newChildDescriptors.add
@@ -424,6 +434,31 @@
 			(createChildParameter
 				(UiModelPackage.Literals.UI_FORM_LAYOUT_ASSIGMENT__ELEMENT,
 				 UiModelFactory.eINSTANCE.createUiPasswordField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_FORM_LAYOUT_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedTextField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_FORM_LAYOUT_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiPrefixedMaskedTextField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_FORM_LAYOUT_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedNumericField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_FORM_LAYOUT_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedDecimalField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_FORM_LAYOUT_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiRichTextArea()));
 	}
 
 	/**
diff --git a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiGridLayoutAssigmentItemProvider.java b/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiGridLayoutAssigmentItemProvider.java
index edd8d2b..68a602d 100644
--- a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiGridLayoutAssigmentItemProvider.java
+++ b/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiGridLayoutAssigmentItemProvider.java
@@ -321,6 +321,16 @@
 		newChildDescriptors.add
 			(createChildParameter
 				(UiModelPackage.Literals.UI_GRID_LAYOUT_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiSortOrderAssignment()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_GRID_LAYOUT_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiSortOrder()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_GRID_LAYOUT_ASSIGMENT__ELEMENT,
 				 UiModelFactory.eINSTANCE.createUiColumnsAssignment()));
 
 		newChildDescriptors.add
@@ -455,6 +465,31 @@
 
 		newChildDescriptors.add
 			(createChildParameter
+				(UiModelPackage.Literals.UI_GRID_LAYOUT_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedTextField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_GRID_LAYOUT_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiPrefixedMaskedTextField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_GRID_LAYOUT_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedNumericField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_GRID_LAYOUT_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedDecimalField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_GRID_LAYOUT_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiRichTextArea()));
+
+		newChildDescriptors.add
+			(createChildParameter
 				(UiModelPackage.Literals.UI_GRID_LAYOUT_ASSIGMENT__FROM,
 				 UiModelFactory.eINSTANCE.createUiPoint()));
 
diff --git a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiHorizontalButtonGroupAssigmentItemProvider.java b/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiHorizontalButtonGroupAssigmentItemProvider.java
index 87d7ffb..e25e367 100644
--- a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiHorizontalButtonGroupAssigmentItemProvider.java
+++ b/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiHorizontalButtonGroupAssigmentItemProvider.java
@@ -293,6 +293,16 @@
 		newChildDescriptors.add
 			(createChildParameter
 				(UiModelPackage.Literals.UI_HORIZONTAL_BUTTON_GROUP_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiSortOrderAssignment()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_HORIZONTAL_BUTTON_GROUP_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiSortOrder()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_HORIZONTAL_BUTTON_GROUP_ASSIGMENT__ELEMENT,
 				 UiModelFactory.eINSTANCE.createUiColumnsAssignment()));
 
 		newChildDescriptors.add
@@ -424,6 +434,31 @@
 			(createChildParameter
 				(UiModelPackage.Literals.UI_HORIZONTAL_BUTTON_GROUP_ASSIGMENT__ELEMENT,
 				 UiModelFactory.eINSTANCE.createUiPasswordField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_HORIZONTAL_BUTTON_GROUP_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedTextField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_HORIZONTAL_BUTTON_GROUP_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiPrefixedMaskedTextField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_HORIZONTAL_BUTTON_GROUP_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedNumericField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_HORIZONTAL_BUTTON_GROUP_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedDecimalField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_HORIZONTAL_BUTTON_GROUP_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiRichTextArea()));
 	}
 
 	/**
diff --git a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiHorizontalLayoutAssigmentItemProvider.java b/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiHorizontalLayoutAssigmentItemProvider.java
index 213e7f1..922aa39 100644
--- a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiHorizontalLayoutAssigmentItemProvider.java
+++ b/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiHorizontalLayoutAssigmentItemProvider.java
@@ -317,6 +317,16 @@
 		newChildDescriptors.add
 			(createChildParameter
 				(UiModelPackage.Literals.UI_HORIZONTAL_LAYOUT_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiSortOrderAssignment()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_HORIZONTAL_LAYOUT_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiSortOrder()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_HORIZONTAL_LAYOUT_ASSIGMENT__ELEMENT,
 				 UiModelFactory.eINSTANCE.createUiColumnsAssignment()));
 
 		newChildDescriptors.add
@@ -448,6 +458,31 @@
 			(createChildParameter
 				(UiModelPackage.Literals.UI_HORIZONTAL_LAYOUT_ASSIGMENT__ELEMENT,
 				 UiModelFactory.eINSTANCE.createUiPasswordField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_HORIZONTAL_LAYOUT_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedTextField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_HORIZONTAL_LAYOUT_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiPrefixedMaskedTextField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_HORIZONTAL_LAYOUT_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedNumericField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_HORIZONTAL_LAYOUT_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedDecimalField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_HORIZONTAL_LAYOUT_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiRichTextArea()));
 	}
 
 	/**
diff --git a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiI18nInfoItemProvider.java b/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiI18nInfoItemProvider.java
index 5ec70e0..0c64c1f 100644
--- a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiI18nInfoItemProvider.java
+++ b/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiI18nInfoItemProvider.java
@@ -63,6 +63,7 @@
 			super.getPropertyDescriptors(object);
 
 			addKeyPropertyDescriptor(object);
+			addNoCaptionPropertyDescriptor(object);
 		}
 		return itemPropertyDescriptors;
 	}
@@ -90,6 +91,28 @@
 	}
 
 	/**
+	 * This adds a property descriptor for the No Caption feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addNoCaptionPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_UiI18nInfo_noCaption_feature"),
+				 getString("_UI_PropertyDescriptor_description", "_UI_UiI18nInfo_noCaption_feature", "_UI_UiI18nInfo_type"),
+				 UiModelPackage.Literals.UI_I1_8N_INFO__NO_CAPTION,
+				 true,
+				 false,
+				 false,
+				 ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE,
+				 null,
+				 null));
+	}
+
+	/**
 	 * This returns UiI18nInfo.gif.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -128,6 +151,7 @@
 
 		switch (notification.getFeatureID(UiI18nInfo.class)) {
 			case UiModelPackage.UI_I1_8N_INFO__KEY:
+			case UiModelPackage.UI_I1_8N_INFO__NO_CAPTION:
 				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
 				return;
 		}
diff --git a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiImportsItemProvider.java b/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiImportsItemProvider.java
deleted file mode 100644
index 995e4d7..0000000
--- a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiImportsItemProvider.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/**
- */
-package org.eclipse.osbp.ecview.semantic.uimodel.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-
-import org.eclipse.osbp.ecview.dsl.provider.UIGrammarEditPlugin;
-
-import org.eclipse.osbp.ecview.semantic.uimodel.UiImports;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiImports} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class UiImportsItemProvider 
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public UiImportsItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-			addNamePropertyDescriptor(object);
-			addImportedNamespacePropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_UiNamedElement_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_UiNamedElement_id_feature", "_UI_UiNamedElement_type"),
-				 UiModelPackage.Literals.UI_NAMED_ELEMENT__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Name feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addNamePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_UiNamedElement_name_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_UiNamedElement_name_feature", "_UI_UiNamedElement_type"),
-				 UiModelPackage.Literals.UI_NAMED_ELEMENT__NAME,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Imported Namespace feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addImportedNamespacePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_UiImports_importedNamespace_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_UiImports_importedNamespace_feature", "_UI_UiImports_type"),
-				 UiModelPackage.Literals.UI_IMPORTS__IMPORTED_NAMESPACE,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns UiImports.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/UiImports"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public String getText(Object object) {
-		String label = ((UiImports)object).getName();
-		return label == null || label.length() == 0 ?
-			getString("_UI_UiImports_type") :
-			getString("_UI_UiImports_type") + " " + label;
-	}
-	
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(UiImports.class)) {
-			case UiModelPackage.UI_IMPORTS__ID:
-			case UiModelPackage.UI_IMPORTS__NAME:
-			case UiModelPackage.UI_IMPORTS__IMPORTED_NAMESPACE:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public ResourceLocator getResourceLocator() {
-		return UIGrammarEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiMobileNavigationPageAssignmentItemProvider.java b/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiMobileNavigationPageAssignmentItemProvider.java
index 62a50ad..2cc5210 100644
--- a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiMobileNavigationPageAssignmentItemProvider.java
+++ b/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiMobileNavigationPageAssignmentItemProvider.java
@@ -317,6 +317,16 @@
 		newChildDescriptors.add
 			(createChildParameter
 				(UiModelPackage.Literals.UI_MOBILE_NAVIGATION_PAGE_ASSIGNMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiSortOrderAssignment()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_MOBILE_NAVIGATION_PAGE_ASSIGNMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiSortOrder()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_MOBILE_NAVIGATION_PAGE_ASSIGNMENT__ELEMENT,
 				 UiModelFactory.eINSTANCE.createUiColumnsAssignment()));
 
 		newChildDescriptors.add
@@ -448,6 +458,31 @@
 			(createChildParameter
 				(UiModelPackage.Literals.UI_MOBILE_NAVIGATION_PAGE_ASSIGNMENT__ELEMENT,
 				 UiModelFactory.eINSTANCE.createUiPasswordField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_MOBILE_NAVIGATION_PAGE_ASSIGNMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedTextField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_MOBILE_NAVIGATION_PAGE_ASSIGNMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiPrefixedMaskedTextField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_MOBILE_NAVIGATION_PAGE_ASSIGNMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedNumericField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_MOBILE_NAVIGATION_PAGE_ASSIGNMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedDecimalField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_MOBILE_NAVIGATION_PAGE_ASSIGNMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiRichTextArea()));
 	}
 
 	/**
diff --git a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiMobileNavigationRootAssigmentItemProvider.java b/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiMobileNavigationRootAssigmentItemProvider.java
index fd653a1..bceaad0 100644
--- a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiMobileNavigationRootAssigmentItemProvider.java
+++ b/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiMobileNavigationRootAssigmentItemProvider.java
@@ -354,6 +354,31 @@
 			(createChildParameter
 				(UiModelPackage.Literals.UI_MOBILE_NAVIGATION_ROOT_ASSIGMENT__ELEMENT,
 				 UiModelFactory.eINSTANCE.createUiPasswordField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_MOBILE_NAVIGATION_ROOT_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedTextField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_MOBILE_NAVIGATION_ROOT_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiPrefixedMaskedTextField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_MOBILE_NAVIGATION_ROOT_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedNumericField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_MOBILE_NAVIGATION_ROOT_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedDecimalField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_MOBILE_NAVIGATION_ROOT_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiRichTextArea()));
 	}
 
 	/**
diff --git a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiMobileTabAssignmentItemProvider.java b/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiMobileTabAssignmentItemProvider.java
index 1a02848..5b158e6 100644
--- a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiMobileTabAssignmentItemProvider.java
+++ b/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiMobileTabAssignmentItemProvider.java
@@ -362,6 +362,16 @@
 		newChildDescriptors.add
 			(createChildParameter
 				(UiModelPackage.Literals.UI_MOBILE_TAB_ASSIGNMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiSortOrderAssignment()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_MOBILE_TAB_ASSIGNMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiSortOrder()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_MOBILE_TAB_ASSIGNMENT__ELEMENT,
 				 UiModelFactory.eINSTANCE.createUiColumnsAssignment()));
 
 		newChildDescriptors.add
@@ -493,6 +503,31 @@
 			(createChildParameter
 				(UiModelPackage.Literals.UI_MOBILE_TAB_ASSIGNMENT__ELEMENT,
 				 UiModelFactory.eINSTANCE.createUiPasswordField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_MOBILE_TAB_ASSIGNMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedTextField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_MOBILE_TAB_ASSIGNMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiPrefixedMaskedTextField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_MOBILE_TAB_ASSIGNMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedNumericField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_MOBILE_TAB_ASSIGNMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedDecimalField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_MOBILE_TAB_ASSIGNMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiRichTextArea()));
 	}
 
 }
diff --git a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiModelItemProvider.java b/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiModelItemProvider.java
index d934bfb..263c6a7 100644
--- a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiModelItemProvider.java
+++ b/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiModelItemProvider.java
@@ -29,6 +29,7 @@
 import org.eclipse.osbp.ecview.semantic.uimodel.UiModel;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiModelFactory;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage;
+import org.eclipse.xtext.xtype.XtypeFactory;
 
 /**
  * This is the item provider adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiModel} object.
@@ -151,7 +152,7 @@
 		if (childrenFeatures == null) {
 			super.getChildrenFeatures(object);
 			childrenFeatures.add(UiModelPackage.Literals.UI_MODEL__ROOTS);
-			childrenFeatures.add(UiModelPackage.Literals.UI_MODEL__IMPORTS);
+			childrenFeatures.add(UiModelPackage.Literals.UI_MODEL__IMPORT_SECTION);
 		}
 		return childrenFeatures;
 	}
@@ -213,7 +214,7 @@
 				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
 				return;
 			case UiModelPackage.UI_MODEL__ROOTS:
-			case UiModelPackage.UI_MODEL__IMPORTS:
+			case UiModelPackage.UI_MODEL__IMPORT_SECTION:
 				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
 				return;
 		}
@@ -254,6 +255,11 @@
 		newChildDescriptors.add
 			(createChildParameter
 				(UiModelPackage.Literals.UI_MODEL__ROOTS,
+				 UiModelFactory.eINSTANCE.createUiDisplayView()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_MODEL__ROOTS,
 				 UiModelFactory.eINSTANCE.createUiMobileView()));
 
 		newChildDescriptors.add
@@ -268,8 +274,8 @@
 
 		newChildDescriptors.add
 			(createChildParameter
-				(UiModelPackage.Literals.UI_MODEL__IMPORTS,
-				 UiModelFactory.eINSTANCE.createUiImports()));
+				(UiModelPackage.Literals.UI_MODEL__IMPORT_SECTION,
+				 XtypeFactory.eINSTANCE.createXImportSection()));
 	}
 
 	/**
diff --git a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiModelItemProviderAdapterFactory.java b/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiModelItemProviderAdapterFactory.java
index a3a918b..f7b1ebd 100644
--- a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiModelItemProviderAdapterFactory.java
+++ b/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiModelItemProviderAdapterFactory.java
@@ -95,29 +95,6 @@
 	}
 
 	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiImports} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected UiImportsItemProvider uiImportsItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiImports}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Adapter createUiImportsAdapter() {
-		if (uiImportsItemProvider == null) {
-			uiImportsItemProvider = new UiImportsItemProvider(this);
-		}
-
-		return uiImportsItemProvider;
-	}
-
-	/**
 	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiContext} instances.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -279,6 +256,29 @@
 	}
 
 	/**
+	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiDisplayView} instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected UiDisplayViewItemProvider uiDisplayViewItemProvider;
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiDisplayView}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Adapter createUiDisplayViewAdapter() {
+		if (uiDisplayViewItemProvider == null) {
+			uiDisplayViewItemProvider = new UiDisplayViewItemProvider(this);
+		}
+
+		return uiDisplayViewItemProvider;
+	}
+
+	/**
 	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileView} instances.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -1038,6 +1038,52 @@
 	}
 
 	/**
+	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiSortOrderAssignment} instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected UiSortOrderAssignmentItemProvider uiSortOrderAssignmentItemProvider;
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiSortOrderAssignment}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Adapter createUiSortOrderAssignmentAdapter() {
+		if (uiSortOrderAssignmentItemProvider == null) {
+			uiSortOrderAssignmentItemProvider = new UiSortOrderAssignmentItemProvider(this);
+		}
+
+		return uiSortOrderAssignmentItemProvider;
+	}
+
+	/**
+	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiSortOrder} instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected UiSortOrderItemProvider uiSortOrderItemProvider;
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiSortOrder}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Adapter createUiSortOrderAdapter() {
+		if (uiSortOrderItemProvider == null) {
+			uiSortOrderItemProvider = new UiSortOrderItemProvider(this);
+		}
+
+		return uiSortOrderItemProvider;
+	}
+
+	/**
 	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiColumnsAssignment} instances.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -2372,6 +2418,167 @@
 	}
 
 	/**
+	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMaskedTextField} instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected UiMaskedTextFieldItemProvider uiMaskedTextFieldItemProvider;
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMaskedTextField}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Adapter createUiMaskedTextFieldAdapter() {
+		if (uiMaskedTextFieldItemProvider == null) {
+			uiMaskedTextFieldItemProvider = new UiMaskedTextFieldItemProvider(this);
+		}
+
+		return uiMaskedTextFieldItemProvider;
+	}
+
+	/**
+	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiPrefixedMaskedTextField} instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected UiPrefixedMaskedTextFieldItemProvider uiPrefixedMaskedTextFieldItemProvider;
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiPrefixedMaskedTextField}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Adapter createUiPrefixedMaskedTextFieldAdapter() {
+		if (uiPrefixedMaskedTextFieldItemProvider == null) {
+			uiPrefixedMaskedTextFieldItemProvider = new UiPrefixedMaskedTextFieldItemProvider(this);
+		}
+
+		return uiPrefixedMaskedTextFieldItemProvider;
+	}
+
+	/**
+	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMaskedNumericField} instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected UiMaskedNumericFieldItemProvider uiMaskedNumericFieldItemProvider;
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMaskedNumericField}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Adapter createUiMaskedNumericFieldAdapter() {
+		if (uiMaskedNumericFieldItemProvider == null) {
+			uiMaskedNumericFieldItemProvider = new UiMaskedNumericFieldItemProvider(this);
+		}
+
+		return uiMaskedNumericFieldItemProvider;
+	}
+
+	/**
+	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMaskedDecimalField} instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected UiMaskedDecimalFieldItemProvider uiMaskedDecimalFieldItemProvider;
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMaskedDecimalField}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Adapter createUiMaskedDecimalFieldAdapter() {
+		if (uiMaskedDecimalFieldItemProvider == null) {
+			uiMaskedDecimalFieldItemProvider = new UiMaskedDecimalFieldItemProvider(this);
+		}
+
+		return uiMaskedDecimalFieldItemProvider;
+	}
+
+	/**
+	 * This keeps track of the one adapter used for all {@link java.util.Map.Entry} instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected UiStringToStringMapEntryItemProvider uiStringToStringMapEntryItemProvider;
+
+	/**
+	 * This creates an adapter for a {@link java.util.Map.Entry}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Adapter createUiStringToStringMapEntryAdapter() {
+		if (uiStringToStringMapEntryItemProvider == null) {
+			uiStringToStringMapEntryItemProvider = new UiStringToStringMapEntryItemProvider(this);
+		}
+
+		return uiStringToStringMapEntryItemProvider;
+	}
+
+	/**
+	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiRichTextArea} instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected UiRichTextAreaItemProvider uiRichTextAreaItemProvider;
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiRichTextArea}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Adapter createUiRichTextAreaAdapter() {
+		if (uiRichTextAreaItemProvider == null) {
+			uiRichTextAreaItemProvider = new UiRichTextAreaItemProvider(this);
+		}
+
+		return uiRichTextAreaItemProvider;
+	}
+
+	/**
+	 * This keeps track of the one adapter used for all {@link java.util.Map.Entry} instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected UiPrefixToMaskMapEntryItemProvider uiPrefixToMaskMapEntryItemProvider;
+
+	/**
+	 * This creates an adapter for a {@link java.util.Map.Entry}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Adapter createUiPrefixToMaskMapEntryAdapter() {
+		if (uiPrefixToMaskMapEntryItemProvider == null) {
+			uiPrefixToMaskMapEntryItemProvider = new UiPrefixToMaskMapEntryItemProvider(this);
+		}
+
+		return uiPrefixToMaskMapEntryItemProvider;
+	}
+
+	/**
 	 * This returns the root adapter factory that contains this factory.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -2471,7 +2678,6 @@
 	 */
 	public void dispose() {
 		if (uiModelItemProvider != null) uiModelItemProvider.dispose();
-		if (uiImportsItemProvider != null) uiImportsItemProvider.dispose();
 		if (uiContextItemProvider != null) uiContextItemProvider.dispose();
 		if (uiExposedActionItemProvider != null) uiExposedActionItemProvider.dispose();
 		if (uiViewSetItemProvider != null) uiViewSetItemProvider.dispose();
@@ -2479,6 +2685,7 @@
 		if (uiDialogItemProvider != null) uiDialogItemProvider.dispose();
 		if (uiDialogAssignmentItemProvider != null) uiDialogAssignmentItemProvider.dispose();
 		if (uiIDEViewItemProvider != null) uiIDEViewItemProvider.dispose();
+		if (uiDisplayViewItemProvider != null) uiDisplayViewItemProvider.dispose();
 		if (uiMobileViewItemProvider != null) uiMobileViewItemProvider.dispose();
 		if (uiPointItemProvider != null) uiPointItemProvider.dispose();
 		if (uiBeanSlotItemProvider != null) uiBeanSlotItemProvider.dispose();
@@ -2512,6 +2719,8 @@
 		if (uiTableItemProvider != null) uiTableItemProvider.dispose();
 		if (uiComboBoxItemProvider != null) uiComboBoxItemProvider.dispose();
 		if (uiColumnItemProvider != null) uiColumnItemProvider.dispose();
+		if (uiSortOrderAssignmentItemProvider != null) uiSortOrderAssignmentItemProvider.dispose();
+		if (uiSortOrderItemProvider != null) uiSortOrderItemProvider.dispose();
 		if (uiColumnsAssignmentItemProvider != null) uiColumnsAssignmentItemProvider.dispose();
 		if (uiNumericFieldItemProvider != null) uiNumericFieldItemProvider.dispose();
 		if (uiCheckBoxItemProvider != null) uiCheckBoxItemProvider.dispose();
@@ -2570,6 +2779,13 @@
 		if (uiSendEventCommandItemProvider != null) uiSendEventCommandItemProvider.dispose();
 		if (uiSetNewInstanceCommandItemProvider != null) uiSetNewInstanceCommandItemProvider.dispose();
 		if (uiPasswordFieldItemProvider != null) uiPasswordFieldItemProvider.dispose();
+		if (uiMaskedTextFieldItemProvider != null) uiMaskedTextFieldItemProvider.dispose();
+		if (uiPrefixedMaskedTextFieldItemProvider != null) uiPrefixedMaskedTextFieldItemProvider.dispose();
+		if (uiMaskedNumericFieldItemProvider != null) uiMaskedNumericFieldItemProvider.dispose();
+		if (uiMaskedDecimalFieldItemProvider != null) uiMaskedDecimalFieldItemProvider.dispose();
+		if (uiStringToStringMapEntryItemProvider != null) uiStringToStringMapEntryItemProvider.dispose();
+		if (uiRichTextAreaItemProvider != null) uiRichTextAreaItemProvider.dispose();
+		if (uiPrefixToMaskMapEntryItemProvider != null) uiPrefixToMaskMapEntryItemProvider.dispose();
 	}
 
 }
diff --git a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiPanelItemProvider.java b/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiPanelItemProvider.java
index 9d29e9d..aaa63f6 100644
--- a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiPanelItemProvider.java
+++ b/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiPanelItemProvider.java
@@ -437,6 +437,16 @@
 		newChildDescriptors.add
 			(createChildParameter
 				(UiModelPackage.Literals.UI_PANEL__CONTENT,
+				 UiModelFactory.eINSTANCE.createUiSortOrderAssignment()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_PANEL__CONTENT,
+				 UiModelFactory.eINSTANCE.createUiSortOrder()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_PANEL__CONTENT,
 				 UiModelFactory.eINSTANCE.createUiColumnsAssignment()));
 
 		newChildDescriptors.add
@@ -568,6 +578,31 @@
 			(createChildParameter
 				(UiModelPackage.Literals.UI_PANEL__CONTENT,
 				 UiModelFactory.eINSTANCE.createUiPasswordField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_PANEL__CONTENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedTextField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_PANEL__CONTENT,
+				 UiModelFactory.eINSTANCE.createUiPrefixedMaskedTextField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_PANEL__CONTENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedNumericField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_PANEL__CONTENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedDecimalField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_PANEL__CONTENT,
+				 UiModelFactory.eINSTANCE.createUiRichTextArea()));
 	}
 
 }
diff --git a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiSplitpanelAssigmentItemProvider.java b/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiSplitpanelAssigmentItemProvider.java
index 74c285a..91880b7 100644
--- a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiSplitpanelAssigmentItemProvider.java
+++ b/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiSplitpanelAssigmentItemProvider.java
@@ -317,6 +317,16 @@
 		newChildDescriptors.add
 			(createChildParameter
 				(UiModelPackage.Literals.UI_SPLITPANEL_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiSortOrderAssignment()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_SPLITPANEL_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiSortOrder()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_SPLITPANEL_ASSIGMENT__ELEMENT,
 				 UiModelFactory.eINSTANCE.createUiColumnsAssignment()));
 
 		newChildDescriptors.add
@@ -448,6 +458,31 @@
 			(createChildParameter
 				(UiModelPackage.Literals.UI_SPLITPANEL_ASSIGMENT__ELEMENT,
 				 UiModelFactory.eINSTANCE.createUiPasswordField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_SPLITPANEL_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedTextField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_SPLITPANEL_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiPrefixedMaskedTextField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_SPLITPANEL_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedNumericField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_SPLITPANEL_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedDecimalField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_SPLITPANEL_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiRichTextArea()));
 	}
 
 	/**
diff --git a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiTabAssignmentItemProvider.java b/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiTabAssignmentItemProvider.java
index 2286dfe..a705095 100644
--- a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiTabAssignmentItemProvider.java
+++ b/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiTabAssignmentItemProvider.java
@@ -300,6 +300,16 @@
 		newChildDescriptors.add
 			(createChildParameter
 				(UiModelPackage.Literals.UI_TAB_ASSIGNMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiSortOrderAssignment()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_TAB_ASSIGNMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiSortOrder()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_TAB_ASSIGNMENT__ELEMENT,
 				 UiModelFactory.eINSTANCE.createUiColumnsAssignment()));
 
 		newChildDescriptors.add
@@ -431,6 +441,31 @@
 			(createChildParameter
 				(UiModelPackage.Literals.UI_TAB_ASSIGNMENT__ELEMENT,
 				 UiModelFactory.eINSTANCE.createUiPasswordField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_TAB_ASSIGNMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedTextField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_TAB_ASSIGNMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiPrefixedMaskedTextField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_TAB_ASSIGNMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedNumericField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_TAB_ASSIGNMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedDecimalField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_TAB_ASSIGNMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiRichTextArea()));
 	}
 
 	/**
diff --git a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiTableItemProvider.java b/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiTableItemProvider.java
index 552f6be..5fe9f4d 100644
--- a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiTableItemProvider.java
+++ b/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiTableItemProvider.java
@@ -60,6 +60,7 @@
 			addConsumeBeanServicePropertyDescriptor(object);
 			addSelectionTypePropertyDescriptor(object);
 			addItemImagePropertyPropertyDescriptor(object);
+			addScrollToBottomPropertyDescriptor(object);
 		}
 		return itemPropertyDescriptors;
 	}
@@ -241,6 +242,28 @@
 	}
 
 	/**
+	 * This adds a property descriptor for the Scroll To Bottom feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addScrollToBottomPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_UiTable_scrollToBottom_feature"),
+				 getString("_UI_PropertyDescriptor_description", "_UI_UiTable_scrollToBottom_feature", "_UI_UiTable_type"),
+				 UiModelPackage.Literals.UI_TABLE__SCROLL_TO_BOTTOM,
+				 true,
+				 false,
+				 false,
+				 ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE,
+				 null,
+				 null));
+	}
+
+	/**
 	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
 	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
 	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
@@ -257,6 +280,7 @@
 			childrenFeatures.add(UiModelPackage.Literals.UI_FIELD__VALIDATORS);
 			childrenFeatures.add(UiModelPackage.Literals.UI_TYPE_PROVIDER__JVM_TYPE);
 			childrenFeatures.add(UiModelPackage.Literals.UI_TABLE__COLUMN_ASSIGNMENT);
+			childrenFeatures.add(UiModelPackage.Literals.UI_TABLE__SORT_ORDER_ASSIGNMENT);
 		}
 		return childrenFeatures;
 	}
@@ -319,6 +343,7 @@
 			case UiModelPackage.UI_TABLE__STYLES:
 			case UiModelPackage.UI_TABLE__CONSUME_BEAN_SERVICE:
 			case UiModelPackage.UI_TABLE__SELECTION_TYPE:
+			case UiModelPackage.UI_TABLE__SCROLL_TO_BOTTOM:
 				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
 				return;
 			case UiModelPackage.UI_TABLE__I18N_INFO:
@@ -326,6 +351,7 @@
 			case UiModelPackage.UI_TABLE__VALIDATORS:
 			case UiModelPackage.UI_TABLE__JVM_TYPE:
 			case UiModelPackage.UI_TABLE__COLUMN_ASSIGNMENT:
+			case UiModelPackage.UI_TABLE__SORT_ORDER_ASSIGNMENT:
 				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
 				return;
 		}
@@ -437,6 +463,11 @@
 			(createChildParameter
 				(UiModelPackage.Literals.UI_TABLE__COLUMN_ASSIGNMENT,
 				 UiModelFactory.eINSTANCE.createUiColumnsAssignment()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_TABLE__SORT_ORDER_ASSIGNMENT,
+				 UiModelFactory.eINSTANCE.createUiSortOrderAssignment()));
 	}
 
 }
diff --git a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiVerticalComponentGroupAssigmentItemProvider.java b/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiVerticalComponentGroupAssigmentItemProvider.java
index 308d661..d533d92 100644
--- a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiVerticalComponentGroupAssigmentItemProvider.java
+++ b/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiVerticalComponentGroupAssigmentItemProvider.java
@@ -293,6 +293,16 @@
 		newChildDescriptors.add
 			(createChildParameter
 				(UiModelPackage.Literals.UI_VERTICAL_COMPONENT_GROUP_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiSortOrderAssignment()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_VERTICAL_COMPONENT_GROUP_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiSortOrder()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_VERTICAL_COMPONENT_GROUP_ASSIGMENT__ELEMENT,
 				 UiModelFactory.eINSTANCE.createUiColumnsAssignment()));
 
 		newChildDescriptors.add
@@ -424,6 +434,31 @@
 			(createChildParameter
 				(UiModelPackage.Literals.UI_VERTICAL_COMPONENT_GROUP_ASSIGMENT__ELEMENT,
 				 UiModelFactory.eINSTANCE.createUiPasswordField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_VERTICAL_COMPONENT_GROUP_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedTextField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_VERTICAL_COMPONENT_GROUP_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiPrefixedMaskedTextField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_VERTICAL_COMPONENT_GROUP_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedNumericField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_VERTICAL_COMPONENT_GROUP_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedDecimalField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_VERTICAL_COMPONENT_GROUP_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiRichTextArea()));
 	}
 
 	/**
diff --git a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiVerticalLayoutAssigmentItemProvider.java b/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiVerticalLayoutAssigmentItemProvider.java
index c747dad..38e1727 100644
--- a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiVerticalLayoutAssigmentItemProvider.java
+++ b/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiVerticalLayoutAssigmentItemProvider.java
@@ -317,6 +317,16 @@
 		newChildDescriptors.add
 			(createChildParameter
 				(UiModelPackage.Literals.UI_VERTICAL_LAYOUT_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiSortOrderAssignment()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_VERTICAL_LAYOUT_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiSortOrder()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_VERTICAL_LAYOUT_ASSIGMENT__ELEMENT,
 				 UiModelFactory.eINSTANCE.createUiColumnsAssignment()));
 
 		newChildDescriptors.add
@@ -448,6 +458,31 @@
 			(createChildParameter
 				(UiModelPackage.Literals.UI_VERTICAL_LAYOUT_ASSIGMENT__ELEMENT,
 				 UiModelFactory.eINSTANCE.createUiPasswordField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_VERTICAL_LAYOUT_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedTextField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_VERTICAL_LAYOUT_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiPrefixedMaskedTextField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_VERTICAL_LAYOUT_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedNumericField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_VERTICAL_LAYOUT_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedDecimalField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_VERTICAL_LAYOUT_ASSIGMENT__ELEMENT,
+				 UiModelFactory.eINSTANCE.createUiRichTextArea()));
 	}
 
 	/**
diff --git a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiViewItemProvider.java b/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiViewItemProvider.java
index 914f75b..e859f59 100644
--- a/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiViewItemProvider.java
+++ b/org.eclipse.osbp.ecview.dsl.edit/src/org/eclipse/osbp/ecview/semantic/uimodel/provider/UiViewItemProvider.java
@@ -368,6 +368,16 @@
 		newChildDescriptors.add
 			(createChildParameter
 				(UiModelPackage.Literals.UI_VIEW__CONTENT,
+				 UiModelFactory.eINSTANCE.createUiSortOrderAssignment()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_VIEW__CONTENT,
+				 UiModelFactory.eINSTANCE.createUiSortOrder()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_VIEW__CONTENT,
 				 UiModelFactory.eINSTANCE.createUiColumnsAssignment()));
 
 		newChildDescriptors.add
@@ -502,6 +512,31 @@
 
 		newChildDescriptors.add
 			(createChildParameter
+				(UiModelPackage.Literals.UI_VIEW__CONTENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedTextField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_VIEW__CONTENT,
+				 UiModelFactory.eINSTANCE.createUiPrefixedMaskedTextField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_VIEW__CONTENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedNumericField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_VIEW__CONTENT,
+				 UiModelFactory.eINSTANCE.createUiMaskedDecimalField()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(UiModelPackage.Literals.UI_VIEW__CONTENT,
+				 UiModelFactory.eINSTANCE.createUiRichTextArea()));
+
+		newChildDescriptors.add
+			(createChildParameter
 				(UiModelPackage.Literals.UI_VIEW__VALIDATOR_ASSIGNMENTS,
 				 UiModelFactory.eINSTANCE.createUiValidatorAssignment()));
 	}
diff --git a/org.eclipse.osbp.ecview.dsl.lib/META-INF/MANIFEST.MF b/org.eclipse.osbp.ecview.dsl.lib/META-INF/MANIFEST.MF
index e96e016..19bc602 100644
--- a/org.eclipse.osbp.ecview.dsl.lib/META-INF/MANIFEST.MF
+++ b/org.eclipse.osbp.ecview.dsl.lib/META-INF/MANIFEST.MF
@@ -11,8 +11,10 @@
  org.eclipse.osbp.dsl.datatype.lib;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.dsl.dto.lib;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.runtime.common;bundle-version="[0.9.0,0.10.0)",
- org.eclipse.xtext.xbase.lib;bundle-version="[2.7.3,2.8.0)",
- javax.validation.api;bundle-version="1.1.0"
+ org.eclipse.xtext.xbase.lib;bundle-version="[2.11.0,2.12.0)",
+ javax.validation.api;bundle-version="1.1.0",
+ org.eclipse.osbp.ecview.core.common.model;bundle-version="0.9.0",
+ org.eclipse.osbp.ecview.core.extension.model;bundle-version="0.9.0"
 Bundle-RequiredExecutionEnvironment: JavaSE-1.7
 Export-Package: org.eclipse.osbp.ecview.dsl.lib;
   uses:="org.eclipse.osbp.dsl.dto.lib,
diff --git a/org.eclipse.osbp.ecview.dsl.lib/src/org/eclipse/osbp/ecview/dsl/lib/Defaults.uisemantic b/org.eclipse.osbp.ecview.dsl.lib/src/org/eclipse/osbp/ecview/dsl/lib/Defaults.uisemantic
index 445fc0f..d1b02d3 100644
--- a/org.eclipse.osbp.ecview.dsl.lib/src/org/eclipse/osbp/ecview/dsl/lib/Defaults.uisemantic
+++ b/org.eclipse.osbp.ecview.dsl.lib/src/org/eclipse/osbp/ecview/dsl/lib/Defaults.uisemantic
@@ -1,21 +1,141 @@
 ePackage "http://osbp.eclipse.org/ecview/dsl/uimodel/core" as view
 
-element Browser {
-	uri view:UiBrowser
-
+element Embeddable {
+	uri view:UiEmbeddable
+	  
 	bindings {
+		
 		/**
-		 * Value property of the UI element.
+		 * Name property of the UI element.
 		 */
-		endpoint value Object
+		endpoint name String
+		
 		/**
-		 * Editable property of the UI element.
+		 * Id property of the UI element.
 		 */
-		endpoint editable Boolean
+		endpoint id String
+
 		/** 
 		 * Visible property of the UI element.
 		 */
 		endpoint visible Boolean
+		
+		/** 
+		 * Initial Visible property of the UI element.
+		 */
+		endpoint initialVisible Boolean
+		
+		/** 
+	 	 * contextClick property of the UI element.
+		 */
+		endpoint observeContextClick org.eclipse.osbp.ecview.core.common.model.core.YContextClickEvent target lastContextClick
+		
+		/**
+		 * Styles property of the UI element.
+		 */
+		endpoint styles String target cssClass
+		
+		/**
+		 * Caption property of the UI element.
+		 */
+		endpoint caption String target label
+		
+		/**
+		 * Translated caption property of the UI element.
+		 */
+		endpoint captionI18n String target labelI18nKey
+		
+		/**
+		 * Css Class property of the UI element.
+		 */
+		endpoint cssClass String
+		
+		/**
+		 * Css Id property of the UI element.
+		 */
+		endpoint cssId String
+		
+		/**
+		 * Auth Group property of the UI element.
+		 */
+		endpoint authorizationGroup String
+		
+		/**
+		 * Auth Id property of the UI element.
+		 */
+		endpoint authorizationId String
+	}
+}
+
+element Layout {
+	uri view:UiLayout
+	  
+	bindings {
+		
+		// extends all bindings from Component
+		extends Embeddable
+		
+		/**
+		 * Editable property of the UI element.
+		 */
+		endpoint editable Boolean
+		
+		/**
+		 * Enabled property of the UI element.
+		 */
+		endpoint enabled Boolean
+		
+		/**
+		 * Attached component. 
+		 */
+		endpoint observeComponentAttach org.eclipse.osbp.ecview.core.common.model.core.YEmbeddableEvent target lastComponentAttach
+		
+		/**
+		 * Detached component.
+		 */
+		endpoint observeComponentDettach org.eclipse.osbp.ecview.core.common.model.core.YEmbeddableEvent target lastComponentAttach
+	}
+}
+
+element Field {
+	uri view:UiField
+	  
+	bindings {
+		
+		// extends all bindings from Component
+		extends Embeddable
+		
+		/**
+		 * Editable property of the UI element.
+		 */
+		endpoint editable Boolean
+		
+		/**
+		 * Enabled property of the UI element.
+		 */
+		endpoint enabled Boolean
+		
+		/**
+		 * Readonly property of the element
+		 */
+		endpoint readonly Boolean
+		
+	}
+}
+
+
+element Browser {
+	uri view:UiBrowser
+
+	bindings {
+		
+		// extends all bindings from Component
+		extends Field
+		  
+		/**
+		 * Value property of the UI element.
+		 */
+		endpoint value Object
 	}
 }
 
@@ -23,18 +143,28 @@
 	uri view:UiTextField
 	
 	bindings {
+		// extends all bindings from Component
+		extends Embeddable
+		  
 		/**
 		 * Value property of the UI element.
 		 */
 		endpoint value String
+		
 		/**
-		 * Editable property of the UI element.
+		 * Focus property of the UI element. 
 		 */
-		endpoint editable Boolean
+		endpoint observeFocus org.eclipse.osbp.ecview.core.common.model.core.YEmbeddableEvent  target lastFocusEvent
+		
 		/**
-		 * Visible property of the UI element.
+		 * The blur property. Read only.
 		 */
-		endpoint visible Boolean
+		endpoint observeBlur org.eclipse.osbp.ecview.core.common.model.core.YEmbeddableEvent target lastBlurEvent
+		
+		/**
+		 * The textChange property. Read only.
+		 */
+		endpoint observeTextChange String target lastTextChange
 	}
 	
 	validator {
@@ -46,18 +176,13 @@
 	uri view:UiMaskedTextField
 	
 	bindings {
+		// extends all bindings from Component
+		extends Field
+		  
 		/**
 		 * Value property of the UI element.
 		 */
 		endpoint value String
-		/**
-		 * Editable property of the UI element.
-		 */
-		endpoint editable Boolean
-		/**
-		 * Visible property of the UI element.
-		 */
-		endpoint visible Boolean
 		
 		/**
 		 * The mask that should be used for this UI element.
@@ -74,18 +199,13 @@
 	uri view:UiMaskedNumericField
 	
 	bindings {
+		// extends all bindings from Component
+		extends Field
+		  
 		/**
 		 * Value property of the UI element.
 		 */
 		endpoint value String
-		/**
-		 * Editable property of the UI element.
-		 */
-		endpoint editable Boolean
-		/**
-		 * Visible property of the UI element.
-		 */
-		endpoint visible Boolean
 		
 		/**
 		 * The mask that should be used for this UI element.
@@ -102,18 +222,13 @@
 	uri view:UiMaskedDecimalField
 	
 	bindings {
+		// extends all bindings from Component
+		extends Field
+		  
 		/**
 		 * Value property of the UI element.
 		 */
 		endpoint value String
-		/**
-		 * Editable property of the UI element.
-		 */
-		endpoint editable Boolean
-		/**
-		 * Visible property of the UI element.
-		 */
-		endpoint visible Boolean
 		
 		/**
 		 * The mask that should be used for this UI element.
@@ -130,18 +245,13 @@
 	uri view:UiPrefixedMaskedTextField
 	
 	bindings {
+		// extends all bindings from Component
+		extends Field
+		  
 		/**
 		 * Value property of the UI element.
 		 */
 		endpoint value String
-		/**
-		 * Editable property of the UI element.
-		 */
-		endpoint editable Boolean
-		/**
-		 * Visible property of the UI element.
-		 */
-		endpoint visible Boolean
 		
 		/**
 		 * The mask that should be used for this UI element.
@@ -154,23 +264,32 @@
 	} 
 }
 
-
 element PasswordField {
 	uri view:UiPasswordField
 	
 	bindings {
+		// extends all bindings from Component
+		extends Field
+		  
 		/**
 		 * Value property of the UI element.
 		 */
 		endpoint value String
+		
 		/**
-		 * Editable property of the UI element.
+		 * Focus property of the UI element. 
 		 */
-		endpoint editable Boolean
+		endpoint observeFocus org.eclipse.osbp.ecview.core.common.model.core.YEmbeddableEvent  target lastFocusEvent
+		
 		/**
-		 * Visible property of the UI element.
+		 * The blur property. Read only.
 		 */
-		endpoint visible Boolean
+		endpoint observeBlur org.eclipse.osbp.ecview.core.common.model.core.YEmbeddableEvent target lastBlurEvent
+		
+		/**
+		 * The textChange property. Read only.
+		 */
+		endpoint observeTextChange String target lastTextChange
 	}
 	
 	validator {
@@ -182,6 +301,9 @@
 	uri view:UiRichTextArea
 	
 	bindings {
+		// extends all bindings from Component
+		extends Field
+		  
 		/**
 		 * Value property of the UI element.
 		 */
@@ -192,14 +314,6 @@
 		 */
 		endpoint blobValue byte[]
 		
-		/**
-		 * Editable property of the UI element.
-		 */
-		endpoint editable Boolean
-		/**
-		 * Visible property of the UI element.
-		 */
-		endpoint visible Boolean
 	}
 	
 	validator {
@@ -211,10 +325,19 @@
 	uri view:UiSuggestTextField
 	
 	bindings {
+		// extends all bindings from Component
+		extends Field
+		  
 		/**
 		 * Value property of the UI element.
 		 */
 		endpoint value String
+		
+		/**
+		 * Keys property of the UI element.
+		 */
+		endpoint keys String
+		
 		/**
 		 * Returns the selected entry.
 		 */
@@ -229,15 +352,6 @@
 		 * True if suggestions should be enabled. False otherwise.
 		 */
 		endpoint suggestionsEnabled Boolean target useSuggestions
-		
-		/**
-		 * Editable property of the UI element.
-		 */
-		endpoint editable Boolean
-		/**
-		 * Visible property of the UI element.
-		 */
-		endpoint visible Boolean
 	}
 	
 	validator {
@@ -249,18 +363,28 @@
 	uri view:UiTextArea
 	
 	bindings {
+		// extends all bindings from Component
+		extends Field
+		  
 		/**
 		 * Value property of the UI element.
 		 */
 		endpoint value String
+		
 		/**
-		 * Editable property of the UI element.
+		 * Focus property of the UI element. 
 		 */
-		endpoint editable Boolean
+		endpoint observeFocus org.eclipse.osbp.ecview.core.common.model.core.YEmbeddableEvent  target lastFocusEvent
+		
 		/**
-		 * Visible property of the UI element.
+		 * The blur property. Read only.
 		 */
-		endpoint visible Boolean
+		endpoint observeBlur org.eclipse.osbp.ecview.core.common.model.core.YEmbeddableEvent target lastBlurEvent
+		
+		/**
+		 * The textChange property. Read only.
+		 */
+		endpoint observeTextChange String target lastTextChange
 	}
 	
 	validator {
@@ -272,18 +396,23 @@
 	uri view:UiDateField
 	
 	bindings {
+		// extends all bindings from Component
+		extends Field
+		  
 		/**
 		 * Value property of the UI element.
 		 */
 		endpoint value String
+		
 		/**
-		 * Editable property of the UI element.
+		 * Focus property of the UI element. 
 		 */
-		endpoint editable Boolean
+		endpoint observeFocus org.eclipse.osbp.ecview.core.common.model.core.YEmbeddableEvent  target lastFocusEvent
+		
 		/**
-		 * Visible property of the UI element.
+		 * The blur property. Read only.
 		 */
-		endpoint visible Boolean
+		endpoint observeBlur org.eclipse.osbp.ecview.core.common.model.core.YEmbeddableEvent target lastBlurEvent
 	}
 	
 	validator {
@@ -297,18 +426,13 @@
 	uri view:UiLabel
 	
 	bindings {
+		// extends all bindings from Component
+		extends Field
+		  
 		/**
 		 * Value property of the UI element.
 		 */
 		endpoint value String
-		/**
-		 * Editable property of the UI element.
-		 */
-		endpoint editable Boolean
-		/**
-		 * Visible property of the UI element.
-		 */
-		endpoint visible Boolean
 	}
 	 
 	validator {
@@ -320,18 +444,18 @@
 	uri view:UiImage
 	
 	bindings {
+		// extends all bindings from Component
+		extends Field
+		  
 		/**
 		 * Value property of the UI element.
 		 */
 		endpoint value String
+		
 		/**
-		 * Editable property of the UI element.
+		 * Resource property to bind resources.
 		 */
-		endpoint editable Boolean
-		/**
-		 * Visible property of the UI element.
-		 */
-		endpoint visible Boolean
+		endpoint resource Object
 	}
 
 }  
@@ -340,18 +464,24 @@
 	uri view:UiCheckBox
 	
 	bindings {
+		// extends all bindings from Component
+		extends Field
+		  
 		/**
 		 * Value property of the UI element.
 		 */
 		endpoint value Boolean
+		
 		/**
-		 * Editable property of the UI element.
+		 * Focus property of the UI element. 
 		 */
-		endpoint editable Boolean
+		endpoint observeFocus org.eclipse.osbp.ecview.core.common.model.core.YEmbeddableEvent  target lastFocusEvent
+		
 		/**
-		 * Visible property of the UI element.
+		 * The blur property. Read only.
 		 */
-		endpoint visible Boolean
+		endpoint observeBlur org.eclipse.osbp.ecview.core.common.model.core.YEmbeddableEvent target lastBlurEvent
+		
 	}
 	
 	validator {
@@ -361,8 +491,11 @@
 
 element Button {
 	uri view:UiButton
-	 
+	  
 	bindings {
+		// extends all bindings from Component
+		extends Embeddable
+		  
 		/**
 		 * If the ui element is clicked, it will return
 		 * the clicktime in milliseconds.
@@ -373,21 +506,19 @@
 		 */
 		endpoint enabled Boolean
 		/**
-		 * Visible property of the UI element.
-		 */
-		endpoint visible Boolean
-		/**
-		 * Caption property of the UI element.
-		 */
-		endpoint caption String target label
-		/**
-		 * Translated caption property of the UI element.
-		 */
-		endpoint captionI18n String target labelI18nKey
-		/**
 		 * Image resource property of the UI element.
 		 */
 		endpoint buttonImage Object target image
+    
+		/**
+		 * Focus property of the UI element. 
+		 */
+		endpoint observeFocus org.eclipse.osbp.ecview.core.common.model.core.YEmbeddableEvent  target lastFocusEvent
+		
+		/**
+		 * The blur property. Read only.
+		 */
+		endpoint observeBlur org.eclipse.osbp.ecview.core.common.model.core.YEmbeddableEvent target lastBlurEvent
 	}
 }
 
@@ -395,6 +526,9 @@
 	uri view:UiMobileNavigationButton
 	 
 	bindings {
+		// extends all bindings from Component
+		extends Embeddable
+		
 		/**
 		 * If the ui element is clicked, it will return
 		 * the clicktime in milliseconds.
@@ -404,10 +538,6 @@
 		 * Enabled property of the UI element.
 		 */
 		endpoint enabled Boolean
-		/**
-		 * Visible property of the UI element.
-		 */
-		endpoint visible Boolean
 	}
 }
 
@@ -452,6 +582,10 @@
 	uri view:UiMobileNavBarAction
 	 
 	bindings {
+		
+		// extends all bindings from Component
+		extends Embeddable
+		
 		/**
 		 * If the ui element is clicked, it will return
 		 * the clicktime in milliseconds.
@@ -461,10 +595,6 @@
 		 * Enabled property of the UI element.
 		 */
 		endpoint enabled Boolean
-		/**
-		 * Visible property of the UI element.
-		 */
-		endpoint visible Boolean
 	}
 }
 
@@ -472,22 +602,24 @@
 	uri view:UiNumericField
 	
 	bindings {
+		// extends all bindings from Component
+		extends Field
+		
 		/**
 		 * Value property of the UI element.
 		 */
 		endpoint value Integer
+		
 		/**
-		 * Editable property of the UI element.
+		 * Focus property of the UI element. 
 		 */
-		endpoint editable Boolean
+		endpoint observeFocus org.eclipse.osbp.ecview.core.common.model.core.YEmbeddableEvent  target lastFocusEvent
+		
 		/**
-		 * Enabled property of the UI element.
+		 * The blur property. Read only.
 		 */
-		endpoint enabled Boolean
-		/**
-		 * Visible property of the UI element.
-		 */
-		endpoint visible Boolean
+		endpoint observeBlur org.eclipse.osbp.ecview.core.common.model.core.YEmbeddableEvent target lastBlurEvent
+		
 	}
 	
 	validator {
@@ -499,22 +631,27 @@
 	uri view:UiDecimalField
 	
 	bindings {
+		
+		// extends all bindings from Component
+		extends Field
 		/**
 		 * Value property of the UI element.
 		 */
 		endpoint value Double
 		/**
-		 * Editable property of the UI element.
-		 */
-		endpoint editable Boolean
-		/**
-		 * Visible property of the UI element.
-		 */
-		endpoint visible Boolean
-		/**
 		 * Locale property of the UI element.
 		 */
 		endpoint locale Locale
+		
+		/**
+		 * Focus property of the UI element. 
+		 */
+		endpoint observeFocus org.eclipse.osbp.ecview.core.common.model.core.YEmbeddableEvent  target lastFocusEvent
+		
+		/**
+		 * The blur property. Read only.
+		 */
+		endpoint observeBlur org.eclipse.osbp.ecview.core.common.model.core.YEmbeddableEvent target lastBlurEvent
 	}
 	
 	validator {
@@ -526,28 +663,23 @@
 	uri view:UiList
 	
 	bindings {
+		// extends all bindings from Component
+		extends Field
+		
 		/**
 		 * Returns the selected entry.
 		 * Only available in singleselection mode.
 		 */
 		final endpoint selection Object
 		/**
-		 * Editable property of the UI element.
-		 */
-		endpoint editable Boolean
-		/**
-		 * Visible property of the UI element.
-		 */
-		endpoint visible Boolean
-		/**
 		 * Returns the collection of list entries.
 		 */
-		list endpoint collection Object
+		list endpoint collection List<?>
 		/**
 		 * Returns the collection of multi selections.
 		 * Only available in multiselection mode.
 		 */
-		endpoint multiSelection Object
+		endpoint multiSelection List<?>
 	}
 
 	validator {
@@ -559,19 +691,14 @@
 	uri view:UiTable
 	
 	bindings {
+		// extends all bindings from Component
+		extends Field
+		
 		/**
 		 * Returns the selected entry.
 		 * Only available in singleselection mode.
 		 */
 		final endpoint selection Object
-		/**
-		 * Editable property of the UI element.
-		 */
-		endpoint editable Boolean
-		/**
-		 * Visible property of the UI element.
-		 */
-		endpoint visible Boolean
 		
 		/**
 		 * If any value is sent to this property, the table will become refreshed.
@@ -581,18 +708,23 @@
 		/**
 		 * Returns the collection of list entries.
 		 */
-		list endpoint collection Object
+		list endpoint collection List<?>
 		/**
 		 * Returns the collection of multi selections.
 		 * Only available in multiselection mode.
 		 */
-		endpoint multiSelection Object
+		endpoint multiSelection List<?>
 		/**
 		 * The filter property for the table. 
 		 * Filters can be applied to tables. As an input you may use a 
 		 * binding to FilterPanel#filter 
 		 */
 		endpoint filter Object
+		
+		/**
+		 * If any object is applied to this endpoint, the table triggers sorting
+		 */
+		endpoint doSort Object
 	}
 
 	validator {
@@ -604,28 +736,23 @@
 	uri view:UiOptionsGroup
 	
 	bindings {
+		// extends all bindings from Component
+		extends Field
+		
 		/**
 		 * Returns the selected entry.
 		 * Only available in singleselection mode.
 		 */
 		final endpoint selection Object
 		/**
-		 * Editable property of the UI element.
-		 */
-		endpoint editable Boolean
-		/**
-		 * Visible property of the UI element.
-		 */
-		endpoint visible Boolean
-		/**
 		 * Returns the collection of list entries.
 		 */
-		list endpoint collection Object
+		list endpoint collection List<?>
 		/**
 		 * Returns the collection of multi selections.
 		 * Only available in multiselection mode.
 		 */
-		endpoint multiSelection Object
+		endpoint multiSelection List<?>
 	}
 
 	validator {
@@ -638,22 +765,16 @@
 	uri view:UiComboBox
 	 
 	bindings {
+		// extends all bindings from Component
+		extends Field
 		/**
 		 * Returns the selected entry.
 		 */
 		final endpoint selection Object
 		/**
-		 * Editable property of the UI element.
-		 */
-		endpoint editable Boolean
-		/**
-		 * Visible property of the UI element.
-		 */
-		endpoint visible Boolean
-		/**
 		 * Returns the collection of list entries.
 		 */
-		list endpoint collection Object
+		list endpoint collection List<?>
 	}
 
 	validator {
@@ -668,13 +789,10 @@
 	uri view:UiMobileNavigationPage
 
 	bindings {
-		/**
-		 * Returns the input value of the navigation page
-		 */
-		final /**
+		 /**
 		 * Value property of the UI element.
 		 */
-		endpoint value Object
+		final endpoint value Object
 		
 		/**
 		 * If any object is set to this property, the navigation page
@@ -698,14 +816,9 @@
 	uri view:UiGridLayout
 	
 	bindings {
-		/**
-		 * Editable property of the UI element.
-		 */
-		endpoint editable Boolean
-		/**
-		 * Visible property of the UI element.
-		 */
-		endpoint visible Boolean
+		// extends all bindings from Component
+		extends Layout
+		
 		/**
 		 * The number of columns in the GridLayout.
 		 */
@@ -739,14 +852,9 @@
 	uri view:UiVerticalLayout
 	
 	bindings {
-		/**
-		 * Editable property of the UI element.
-		 */
-		endpoint editable Boolean
-		/**
-		 * Visible property of the UI element.
-		 */
-		endpoint visible Boolean
+		// extends all bindings from Component
+		extends Layout
+		
 	}
 	
 }
@@ -755,14 +863,9 @@
 	uri view:UiVerticalComponentGroup
 	
 	bindings {
-		/**
-		 * Editable property of the UI element.
-		 */
-		endpoint editable Boolean
-		/**
-		 * Visible property of the UI element.
-		 */
-		endpoint visible Boolean
+		// extends all bindings from Component
+		extends Layout
+		
 	}
 	
 }
@@ -771,6 +874,9 @@
 	uri view:UiSearchField
 	
 	bindings {
+		// extends all bindings from Component
+		extends Field
+		
 		/**
 		 * Value property of the UI element.
 		 */
@@ -783,14 +889,10 @@
 	uri view:UiFormLayout
 	
 	bindings {
-		/**
-		 * Editable property of the UI element.
-		 */
-		endpoint editable Boolean
-		/**
-		 * Visible property of the UI element.
-		 */
-		endpoint visible Boolean
+		
+		// extends all bindings from Component
+		extends Layout
+		
 	}
 	
 }
@@ -799,14 +901,29 @@
 	uri view:UiVerticalComponentGroup
 	
 	bindings {
+		// extends all bindings from Component
+		extends Layout
+		
+	}
+	
+}
+
+element SplitPanel {
+	uri view:UiSplitPanel
+	
+	bindings {
+		// extends all bindings from Component
+		extends Layout
+		
 		/**
-		 * Editable property of the UI element.
+		 * The split position of the panel
 		 */
-		endpoint editable Boolean
+		endpoint splitPosition Integer
+		
 		/**
-		 * Visible property of the UI element.
+		 * Wether vertical or horizontal
 		 */
-		endpoint visible Boolean
+		endpoint vertical Boolean				
 	}
 	
 }
@@ -815,14 +932,9 @@
 	uri view:UiSwitch
 	
 	bindings {
-		/**
-		 * Editable property of the UI element.
-		 */
-		endpoint editable Boolean
-		/**
-		 * Visible property of the UI element.
-		 */
-		endpoint visible Boolean
+		// extends all bindings from Component
+		extends Field
+		
 		/**
 		 * Value property of the UI element.
 		 */
@@ -835,18 +947,13 @@
 	uri view:UiProgressBar
 	
 	bindings {
+		// extends all bindings from Component
+		extends Field
+		
 		/**
 		 * Value property of the UI element.
 		 */
-		endpoint value float
-		/**
-		 * Editable property of the UI element.
-		 */
-		endpoint editable Boolean
-		/**
-		 * Visible property of the UI element.
-		 */
-		endpoint visible Boolean
+		endpoint value Float
 	}
 }
 
@@ -860,6 +967,9 @@
 	uri view:UiSearchPanel
 
 	bindings {
+		// extends all bindings from Component
+		extends Layout
+		
 		/*
 		 * If <code>any kind of value</code> is passed to this property, the 
 		 * search panel will collect the filter from it's search fields
@@ -892,6 +1002,9 @@
 	uri view:UiMobileSearchPanel
 
 	bindings {
+		// extends all bindings from Component
+		extends Layout
+		
 		/*
 		 * If <code>any kind of value</code> is passed to this property, the 
 		 * search panel will collect the filter from it's search fields
@@ -913,22 +1026,17 @@
 		endpoint filter Object
 	}
 }
-
+ 
 element BeanReferenceField {  
 	uri view:UiBeanReferenceField
 	
 	bindings {
+		// extends all bindings from Component
+		extends Field
+		
 		/**
 		 * Value property of the UI element.
 		 */
 		endpoint value Object
-		/**
-		 * Editable property of the UI element.
-		 */
-		endpoint editable Boolean
-		/**
-		 * Visible property of the UI element.
-		 */
-		endpoint visible Boolean
 	}
 }
diff --git a/org.eclipse.osbp.ecview.dsl.tests/.project b/org.eclipse.osbp.ecview.dsl.tests/.project
index 6d8d843..75de8ad 100644
--- a/org.eclipse.osbp.ecview.dsl.tests/.project
+++ b/org.eclipse.osbp.ecview.dsl.tests/.project
@@ -21,7 +21,7 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+			<name>org.eclipse.babel.editor.rbeBuilder</name>
 			<arguments>
 			</arguments>
 		</buildCommand>
@@ -29,6 +29,6 @@
 	<natures>
 		<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.ecview.dsl.tests/META-INF/MANIFEST.MF b/org.eclipse.osbp.ecview.dsl.tests/META-INF/MANIFEST.MF
index 386f4a1..ce1bee6 100644
--- a/org.eclipse.osbp.ecview.dsl.tests/META-INF/MANIFEST.MF
+++ b/org.eclipse.osbp.ecview.dsl.tests/META-INF/MANIFEST.MF
@@ -1,23 +1,20 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
-Bundle-Name: org.eclipse.osbp.ecview.dsl.tests
-Bundle-Vendor: Eclipse OSBP
-Bundle-Version: 0.9.0.qualifier
+Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.osbp.ecview.dsl.tests;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-ClassPath: .
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Export-Package: org.eclipse.osbp.ecview.dsl.tests,
+ org.eclipse.osbp.ecview.semantic.uimodel.tests
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.osbp.ecview.dsl;visibility:=reexport,
+ org.eclipse.xtext.common.types;visibility:=reexport,
+ org.eclipse.osbp.ecview.uisemantics;visibility:=reexport,
+ org.eclipse.xtext.xbase;visibility:=reexport,
+ org.eclipse.emf.ecore;visibility:=reexport,
+ org.eclipse.emf.ecore.xmi;visibility:=reexport,
+ org.junit;visibility:=reexport
 Bundle-ActivationPolicy: lazy
-Require-Bundle: org.eclipse.osbp.ecview.dsl;bundle-version="[0.9.0,0.10.0)",
- org.eclipse.osbp.ecview.dsl.ui;bundle-version="[0.9.0,0.10.0)",
- org.eclipse.core.runtime,
- org.eclipse.xtext.junit4;bundle-version="[2.7.3,2.8.0)",
- org.eclipse.ui.workbench;resolution:=optional,
- org.objectweb.asm;bundle-version="[5.0.1,6.0.0)";resolution:=optional
-Import-Package: org.apache.log4j,
- org.junit;version="4.5.0",
- org.junit.runner;version="4.5.0",
- org.junit.runner.manipulation;version="4.5.0",
- org.junit.runner.notification;version="4.5.0",
- org.junit.runners;version="4.5.0",
- org.junit.runners.model;version="4.5.0",
- org.hamcrest.core
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Export-Package: org.eclipse.osbp.ecview.dsl;version="0.9.0"
diff --git a/org.eclipse.osbp.ecview.dsl.tests/build.properties b/org.eclipse.osbp.ecview.dsl.tests/build.properties
index c22eebe..08af068 100644
--- a/org.eclipse.osbp.ecview.dsl.tests/build.properties
+++ b/org.eclipse.osbp.ecview.dsl.tests/build.properties
@@ -1,5 +1,8 @@
-source.. = src/,\
-          src-gen/,\
-          xtend-gen/
-bin.includes = META-INF/,\
-       .
+#
+
+bin.includes = .,\
+               META-INF/,\
+               plugin.properties
+jars.compile.order = .
+source.. = src/
+output.. = bin/
diff --git a/org.eclipse.osbp.ecview.dsl.tests/org.eclipse.osbp.ecview.dsl.tests.launch b/org.eclipse.osbp.ecview.dsl.tests/org.eclipse.osbp.ecview.dsl.tests.launch
deleted file mode 100644
index da17de4..0000000
--- a/org.eclipse.osbp.ecview.dsl.tests/org.eclipse.osbp.ecview.dsl.tests.launch
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<launchConfiguration type="org.eclipse.jdt.junit.launchconfig">
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
-<listEntry value="/org.eclipse.osbp.ecview.dsl.tests"/>
-</listAttribute>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
-<listEntry value="4"/>
-</listAttribute>
-<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value="=org.eclipse.osbp.ecview.dsl.tests"/>
-<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
-<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit4"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.osbp.ecview.dsl.tests"/>
-</launchConfiguration>
diff --git a/org.eclipse.osbp.ecview.dsl.tests/src-gen/org/eclipse/osbp/ecview/dsl/UIGrammarInjectorProvider.java b/org.eclipse.osbp.ecview.dsl.tests/src-gen/org/eclipse/osbp/ecview/dsl/UIGrammarInjectorProvider.java
deleted file mode 100644
index 33d131e..0000000
--- a/org.eclipse.osbp.ecview.dsl.tests/src-gen/org/eclipse/osbp/ecview/dsl/UIGrammarInjectorProvider.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/**
- * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf), Loetz GmbH&Co.KG (Heidelberg)
- * 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:
- *         Florian Pirchner - Initial implementation
- */
-
-package org.eclipse.osbp.ecview.dsl;
-
-import org.eclipse.xtext.junit4.GlobalRegistries;
-import org.eclipse.xtext.junit4.GlobalRegistries.GlobalStateMemento;
-import org.eclipse.xtext.junit4.IInjectorProvider;
-import org.eclipse.xtext.junit4.IRegistryConfigurator;
-
-import com.google.inject.Injector;
-
-public class UIGrammarInjectorProvider implements IInjectorProvider, IRegistryConfigurator {
-	
-    protected GlobalStateMemento stateBeforeInjectorCreation;
-	protected GlobalStateMemento stateAfterInjectorCreation;
-	protected Injector injector;
-
-	static {
-		GlobalRegistries.initializeDefaults();
-	}
-
-	public Injector getInjector()
-	{
-		if (injector == null) {
-			stateBeforeInjectorCreation = GlobalRegistries.makeCopyOfGlobalState();
-			this.injector = internalCreateInjector();
-			stateAfterInjectorCreation = GlobalRegistries.makeCopyOfGlobalState();
-		}
-		return injector;
-	}
-	
-	protected Injector internalCreateInjector() {
-	    return new UIGrammarStandaloneSetup().createInjectorAndDoEMFRegistration();
-	}
-
-	public void restoreRegistry() {
-		stateBeforeInjectorCreation.restoreGlobalState();
-	}
-
-	public void setupRegistry() {
-		getInjector();
-		stateAfterInjectorCreation.restoreGlobalState();
-	}
-}
diff --git a/org.eclipse.osbp.ecview.dsl.tests/src-gen/org/eclipse/osbp/ecview/dsl/UIGrammarUiInjectorProvider.java b/org.eclipse.osbp.ecview.dsl.tests/src-gen/org/eclipse/osbp/ecview/dsl/UIGrammarUiInjectorProvider.java
deleted file mode 100644
index d16fb57..0000000
--- a/org.eclipse.osbp.ecview.dsl.tests/src-gen/org/eclipse/osbp/ecview/dsl/UIGrammarUiInjectorProvider.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/**
- * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf), Loetz GmbH&Co.KG (Heidelberg)
- * 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:
- *         Florian Pirchner - Initial implementation
- */
-
-package org.eclipse.osbp.ecview.dsl;
-
-import org.eclipse.xtext.junit4.IInjectorProvider;
-
-import com.google.inject.Injector;
-
-public class UIGrammarUiInjectorProvider implements IInjectorProvider {
-	
-	public Injector getInjector() {
-		return org.eclipse.osbp.ecview.dsl.ui.internal.UIGrammarActivator.getInstance().getInjector("org.eclipse.osbp.ecview.dsl.UIGrammar");
-	}
-	
-}
diff --git a/org.eclipse.osbp.ecview.dsl.ui/META-INF/MANIFEST.MF b/org.eclipse.osbp.ecview.dsl.ui/META-INF/MANIFEST.MF
index 1d5c0eb..73056ba 100644
--- a/org.eclipse.osbp.ecview.dsl.ui/META-INF/MANIFEST.MF
+++ b/org.eclipse.osbp.ecview.dsl.ui/META-INF/MANIFEST.MF
@@ -5,16 +5,16 @@
 Bundle-Version: 0.9.0.qualifier
 Bundle-SymbolicName: org.eclipse.osbp.ecview.dsl.ui;singleton:=true
 Bundle-ActivationPolicy: lazy
-Require-Bundle: org.eclipse.xtext.ui;bundle-version="[2.7.3,2.8.0)",
+Require-Bundle: org.eclipse.xtext.ui;bundle-version="[2.11.0,2.12.0)",
  org.eclipse.ui.editors;bundle-version="3.5.0",
  org.eclipse.ui.ide;bundle-version="3.5.0",
- org.eclipse.xtext.ui.shared;bundle-version="[2.7.3,2.8.0)",
- org.eclipse.xtext.xbase.ui;bundle-version="[2.7.3,2.8.0)",
+ org.eclipse.xtext.ui.shared;bundle-version="[2.11.0,2.12.0)",
+ org.eclipse.xtext.xbase.ui;bundle-version="[2.11.0,2.12.0)",
  org.eclipse.ui,
- org.eclipse.xtext.builder;bundle-version="[2.7.3,2.8.0)",
+ org.eclipse.xtext.builder;bundle-version="[2.11.0,2.12.0)",
  org.antlr.runtime,
- org.eclipse.xtext.common.types.ui;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.common.types.ui;bundle-version="[2.11.0,2.12.0)",
+ org.eclipse.xtext.ui.codetemplates.ui;bundle-version="[2.11.0,2.12.0)",
  org.eclipse.compare,
  org.eclipse.osbp.ecview.core.common.model;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.ecview.core.extension.model;bundle-version="[0.9.0,0.10.0)",
@@ -27,29 +27,21 @@
  org.eclipse.osbp.ide.core.ui;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.ide.core.ui.shared;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.xtext.xbase.lib;bundle-version="[2.7.3,2.8.0)",
+ org.eclipse.xtext.xbase.lib;bundle-version="[2.11.0,2.12.0)",
  org.eclipse.jdt.debug.ui,
- org.eclipse.osbp.ecview.uisemantics;bundle-version="0.9.0",
- org.eclipse.osbp.xtext.basic.ui;bundle-version="0.9.0"
+ org.eclipse.osbp.ecview.uisemantics;bundle-version="[0.9.0,0.10.0)",
+ org.eclipse.osbp.ecview.dsl.ide;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.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
 Import-Package: org.apache.log4j
 Bundle-RequiredExecutionEnvironment: JavaSE-1.7
-Export-Package: org.eclipse.osbp.ecview.dsl.ui.contentassist;
-  uses:="org.eclipse.xtext,
-   org.eclipse.emf.ecore,
-   org.eclipse.jface.viewers,
-   org.eclipse.xtext.ui.editor.contentassist,
-   org.eclipse.osbp.ide.core.api.i18n";version="0.9.0",
- org.eclipse.osbp.ecview.dsl.ui.contentassist.antlr;
-  uses:="org.eclipse.xtext,
-   org.eclipse.xtext.ui.editor.contentassist.antlr.internal,
-   org.eclipse.osbp.ecview.dsl.ui.contentassist.antlr.internal,
-   org.eclipse.xtext.ui.codetemplates.ui.partialEditing,
-   org.eclipse.xtext.ui.editor.contentassist.antlr,
-   org.eclipse.osbp.ecview.dsl.services";version="0.9.0",
- org.eclipse.osbp.ecview.dsl.ui.internal;
-  uses:="org.eclipse.ui.plugin,
-   org.osgi.framework,
-   com.google.inject";version="0.9.0",
- org.eclipse.osbp.ecview.dsl.ui.quickfix;
-  uses:="org.eclipse.xtext.xbase.ui.quickfix";version="0.9.0"
-Bundle-Activator: org.eclipse.osbp.ecview.dsl.ui.internal.UIGrammarActivator
+Export-Package: org.eclipse.osbp.ecview.dsl.ui;version="0.9.0",
+ org.eclipse.osbp.ecview.dsl.ui.contentassist;version="0.9.0",
+ org.eclipse.osbp.ecview.dsl.ui.hover;version="0.9.0",
+ org.eclipse.osbp.ecview.dsl.ui.internal;version="0.9.0",
+ org.eclipse.osbp.ecview.dsl.ui.labeling;version="0.9.0",
+ org.eclipse.osbp.ecview.dsl.ui.outline;version="0.9.0",
+ org.eclipse.osbp.ecview.dsl.ui.quickfix;version="0.9.0"
+Bundle-Activator: org.eclipse.osbp.ecview.dsl.ui.internal.DslActivator
diff --git a/org.eclipse.osbp.ecview.dsl.ui/plugin.xml b/org.eclipse.osbp.ecview.dsl.ui/plugin.xml
index 7c9e3fb..cc6f353 100644
--- a/org.eclipse.osbp.ecview.dsl.ui/plugin.xml
+++ b/org.eclipse.osbp.ecview.dsl.ui/plugin.xml
@@ -552,5 +552,34 @@
             extensions="ui">
     </provider>
   </extension>
+    <!-- Organize imports  -->
+    <extension
+        point="org.eclipse.ui.handlers">
+        <handler
+            class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.osbp.xtext.oxtype.ui.imports.OXTypeOrganizeImportsHandler"
+            commandId="org.eclipse.xtext.xbase.ui.organizeImports">
+               <activeWhen>
+                <reference
+                    definitionId="org.eclipse.osbp.ecview.dsl.UIGrammar.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.ecview.dsl.UIGrammar.Editor.opened">
+                    </reference>
+                </visibleWhen>
+            </command>  
+        </menuContribution>
+    </extension>
 
 </plugin>
diff --git a/org.eclipse.osbp.ecview.dsl.ui/plugin.xml_gen b/org.eclipse.osbp.ecview.dsl.ui/plugin.xml_gen
index 88fe7c1..baed1a3 100644
--- a/org.eclipse.osbp.ecview.dsl.ui/plugin.xml_gen
+++ b/org.eclipse.osbp.ecview.dsl.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.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.XtextEditor"
-            contributorClass="org.eclipse.ui.editors.text.TextEditorActionContributor"
-            default="true"
-            extensions="ui"
-            id="org.eclipse.osbp.ecview.dsl.UIGrammar"
-            matchingStrategy="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.xbase.ui.editor.JavaEditorInputMatcher"
-            name="UIGrammar Editor">
-        </editor>
-    </extension>
-    <extension
-        point="org.eclipse.ui.handlers">
-        <handler
-            class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.hyperlinking.OpenDeclarationHandler"
-            commandId="org.eclipse.xtext.ui.editor.hyperlinking.OpenDeclaration">
-            <activeWhen>
-                <reference
-                    definitionId="org.eclipse.osbp.ecview.dsl.UIGrammar.Editor.opened">
-                </reference>
-            </activeWhen>
-        </handler>
-        <handler
-            class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.handler.ValidateActionHandler"
-            commandId="org.eclipse.osbp.ecview.dsl.UIGrammar.validate">
-         <activeWhen>
-            <reference
-                    definitionId="org.eclipse.osbp.ecview.dsl.UIGrammar.Editor.opened">
-            </reference>
-         </activeWhen>
-      	</handler>
-      	<!-- copy qualified name -->
-        <handler
-            class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory: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.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.XtextEditor"
+			contributorClass="org.eclipse.ui.editors.text.TextEditorActionContributor"
+			default="true"
+			extensions="ui"
+			id="org.eclipse.osbp.ecview.dsl.UIGrammar"
+			matchingStrategy="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.xbase.ui.editor.JavaEditorInputMatcher"
+			name="UIGrammar Editor">
+		</editor>
+	</extension>
+	<extension
+		point="org.eclipse.ui.handlers">
+		<handler
+			class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.hyperlinking.OpenDeclarationHandler"
+			commandId="org.eclipse.xtext.ui.editor.hyperlinking.OpenDeclaration">
+			<activeWhen>
+				<reference
+					definitionId="org.eclipse.osbp.ecview.dsl.UIGrammar.Editor.opened">
+				</reference>
+			</activeWhen>
+		</handler>
+		<handler
+			class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.handler.ValidateActionHandler"
+			commandId="org.eclipse.osbp.ecview.dsl.UIGrammar.validate">
+		<activeWhen>
+			<reference
+					definitionId="org.eclipse.osbp.ecview.dsl.UIGrammar.Editor.opened">
+			</reference>
+		</activeWhen>
+		</handler>
+		<!-- copy qualified name -->
+		<handler
+			class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedNameHandler"
+			commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName">
+			<activeWhen>
 				<reference definitionId="org.eclipse.osbp.ecview.dsl.UIGrammar.Editor.opened" />
-            </activeWhen>
-        </handler>
-        <handler
-            class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedNameHandler"
-            commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedName">
-            <activeWhen>
-            	<and>
-            		<reference definitionId="org.eclipse.osbp.ecview.dsl.UIGrammar.XtextEditor.opened" />
-	                <iterate>
+			</activeWhen>
+		</handler>
+		<handler
+			class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedNameHandler"
+			commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedName">
+			<activeWhen>
+				<and>
+					<reference definitionId="org.eclipse.osbp.ecview.dsl.UIGrammar.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.ecview.dsl.UIGrammar.Editor.opened">
-            <and>
-                <reference definitionId="isActiveEditorAnInstanceOfXtextEditor"/>
-                <with variable="activeEditor">
-                    <test property="org.eclipse.xtext.ui.editor.XtextEditor.languageName" 
-                        value="org.eclipse.osbp.ecview.dsl.UIGrammar" 
-                        forcePluginActivation="true"/>
-                </with>        
-            </and>
-        </definition>
-        <definition id="org.eclipse.osbp.ecview.dsl.UIGrammar.XtextEditor.opened">
-            <and>
-                <reference definitionId="isXtextEditorActive"/>
-                <with variable="activeEditor">
-                    <test property="org.eclipse.xtext.ui.editor.XtextEditor.languageName" 
-                        value="org.eclipse.osbp.ecview.dsl.UIGrammar" 
-                        forcePluginActivation="true"/>
-                </with>        
-            </and>
-        </definition>
-    </extension>
-    <extension
-            point="org.eclipse.ui.preferencePages">
-        <page
-            class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.preferences.LanguageRootPreferencePage"
-            id="org.eclipse.osbp.ecview.dsl.UIGrammar"
-            name="UIGrammar">
-            <keywordReference id="org.eclipse.osbp.ecview.dsl.ui.keyword_UIGrammar"/>
-        </page>
-        <page
-            category="org.eclipse.osbp.ecview.dsl.UIGrammar"
-            class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.syntaxcoloring.SyntaxColoringPreferencePage"
-            id="org.eclipse.osbp.ecview.dsl.UIGrammar.coloring"
-            name="Syntax Coloring">
-            <keywordReference id="org.eclipse.osbp.ecview.dsl.ui.keyword_UIGrammar"/>
-        </page>
-        <page
-            category="org.eclipse.osbp.ecview.dsl.UIGrammar"
-            class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.templates.XtextTemplatePreferencePage"
-            id="org.eclipse.osbp.ecview.dsl.UIGrammar.templates"
-            name="Templates">
-            <keywordReference id="org.eclipse.osbp.ecview.dsl.ui.keyword_UIGrammar"/>
-        </page>
-    </extension>
-    <extension
-            point="org.eclipse.ui.propertyPages">
-        <page
-            class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.preferences.LanguageRootPreferencePage"
-            id="org.eclipse.osbp.ecview.dsl.UIGrammar"
-            name="UIGrammar">
-            <keywordReference id="org.eclipse.osbp.ecview.dsl.ui.keyword_UIGrammar"/>
-            <enabledWhen>
-	            <adapt type="org.eclipse.core.resources.IProject"/>
+			</activeWhen>
+		</handler>
+	</extension>
+	<extension point="org.eclipse.core.expressions.definitions">
+		<definition id="org.eclipse.osbp.ecview.dsl.UIGrammar.Editor.opened">
+			<and>
+				<reference definitionId="isActiveEditorAnInstanceOfXtextEditor"/>
+				<with variable="activeEditor">
+					<test property="org.eclipse.xtext.ui.editor.XtextEditor.languageName"
+						value="org.eclipse.osbp.ecview.dsl.UIGrammar"
+						forcePluginActivation="true"/>
+				</with>
+			</and>
+		</definition>
+		<definition id="org.eclipse.osbp.ecview.dsl.UIGrammar.XtextEditor.opened">
+			<and>
+				<reference definitionId="isXtextEditorActive"/>
+				<with variable="activeEditor">
+					<test property="org.eclipse.xtext.ui.editor.XtextEditor.languageName"
+						value="org.eclipse.osbp.ecview.dsl.UIGrammar"
+						forcePluginActivation="true"/>
+				</with>
+			</and>
+		</definition>
+	</extension>
+	<extension
+			point="org.eclipse.ui.preferencePages">
+		<page
+			class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.preferences.LanguageRootPreferencePage"
+			id="org.eclipse.osbp.ecview.dsl.UIGrammar"
+			name="UIGrammar">
+			<keywordReference id="org.eclipse.osbp.ecview.dsl.ui.keyword_UIGrammar"/>
+		</page>
+		<page
+			category="org.eclipse.osbp.ecview.dsl.UIGrammar"
+			class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.syntaxcoloring.SyntaxColoringPreferencePage"
+			id="org.eclipse.osbp.ecview.dsl.UIGrammar.coloring"
+			name="Syntax Coloring">
+			<keywordReference id="org.eclipse.osbp.ecview.dsl.ui.keyword_UIGrammar"/>
+		</page>
+		<page
+			category="org.eclipse.osbp.ecview.dsl.UIGrammar"
+			class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.templates.XtextTemplatePreferencePage"
+			id="org.eclipse.osbp.ecview.dsl.UIGrammar.templates"
+			name="Templates">
+			<keywordReference id="org.eclipse.osbp.ecview.dsl.ui.keyword_UIGrammar"/>
+		</page>
+	</extension>
+	<extension
+			point="org.eclipse.ui.propertyPages">
+		<page
+			class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.preferences.LanguageRootPreferencePage"
+			id="org.eclipse.osbp.ecview.dsl.UIGrammar"
+			name="UIGrammar">
+			<keywordReference id="org.eclipse.osbp.ecview.dsl.ui.keyword_UIGrammar"/>
+			<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.ecview.dsl.ui.keyword_UIGrammar"
-            label="UIGrammar"/>
-    </extension>
-    <extension
-         point="org.eclipse.ui.commands">
-      <command
-            description="Trigger expensive validation"
-            id="org.eclipse.osbp.ecview.dsl.UIGrammar.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.ecview.dsl.UIGrammar.validate"
-                 style="push"
-                 tooltip="Trigger expensive validation">
-            <visibleWhen checkEnabled="false">
-                <reference
-                    definitionId="org.eclipse.osbp.ecview.dsl.UIGrammar.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.ecview.dsl.UIGrammar.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.ecview.dsl.UIGrammar.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.ecview.dsl.ui.keyword_UIGrammar"
+			label="UIGrammar"/>
+	</extension>
+	<extension
+		point="org.eclipse.ui.commands">
+	<command
+			description="Trigger expensive validation"
+			id="org.eclipse.osbp.ecview.dsl.UIGrammar.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.ecview.dsl.UIGrammar.validate"
+				 style="push"
+				 tooltip="Trigger expensive validation">
+			<visibleWhen checkEnabled="false">
+				<reference
+					definitionId="org.eclipse.osbp.ecview.dsl.UIGrammar.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.ecview.dsl.UIGrammar.XtextEditor.opened" />
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.osbp.ecview.dsl.UIGrammar.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.ecview.dsl.UIGrammar.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.ecview.dsl.UIGrammar.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.ecview.dsl.UIGrammar.Editor.opened">
-                	</reference>
-            	</visibleWhen>
+					<reference definitionId="org.eclipse.osbp.ecview.dsl.UIGrammar.Editor.opened">
+					</reference>
+				</visibleWhen>
 			</command>
 		</menuContribution>
 	</extension>
 	<extension point="org.eclipse.ui.handlers">
-	    <handler
-            class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.findrefs.FindReferencesHandler"
-            commandId="org.eclipse.xtext.ui.editor.FindReferences">
-            <activeWhen>
-                <reference
-                    definitionId="org.eclipse.osbp.ecview.dsl.UIGrammar.Editor.opened">
-                </reference>
-            </activeWhen>
-        </handler>
-    </extension>   
-
-<!-- adding resource factories -->
-
+		<handler
+			class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.findrefs.FindReferencesHandler"
+			commandId="org.eclipse.xtext.ui.editor.FindReferences">
+			<activeWhen>
+				<reference
+					definitionId="org.eclipse.osbp.ecview.dsl.UIGrammar.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.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.resource.IResourceUIServiceProvider"
-            uriExtension="ui">
-        </resourceServiceProvider>
-    </extension>
-
-
+		<resourceServiceProvider
+			class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.resource.IResourceUIServiceProvider"
+			uriExtension="ui">
+		</resourceServiceProvider>
+	</extension>
 	<!-- marker definitions for org.eclipse.osbp.ecview.dsl.UIGrammar -->
 	<extension
-	        id="uigrammar.check.fast"
-	        name="UIGrammar Problem"
-	        point="org.eclipse.core.resources.markers">
-	    <super type="org.eclipse.xtext.ui.check.fast"/>
-	    <persistent value="true"/>
+			id="uigrammar.check.fast"
+			name="UIGrammar Problem"
+			point="org.eclipse.core.resources.markers">
+		<super type="org.eclipse.xtext.ui.check.fast"/>
+		<persistent value="true"/>
 	</extension>
 	<extension
-	        id="uigrammar.check.normal"
-	        name="UIGrammar Problem"
-	        point="org.eclipse.core.resources.markers">
-	    <super type="org.eclipse.xtext.ui.check.normal"/>
-	    <persistent value="true"/>
+			id="uigrammar.check.normal"
+			name="UIGrammar Problem"
+			point="org.eclipse.core.resources.markers">
+		<super type="org.eclipse.xtext.ui.check.normal"/>
+		<persistent value="true"/>
 	</extension>
 	<extension
-	        id="uigrammar.check.expensive"
-	        name="UIGrammar Problem"
-	        point="org.eclipse.core.resources.markers">
-	    <super type="org.eclipse.xtext.ui.check.expensive"/>
-	    <persistent value="true"/>
+			id="uigrammar.check.expensive"
+			name="UIGrammar 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.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.builder.IXtextBuilderParticipant"
-            fileExtensions="ui"
-            >
-      </participant>
-   </extension>
-   <extension
-            point="org.eclipse.ui.preferencePages">
-        <page
-            category="org.eclipse.osbp.ecview.dsl.UIGrammar"
-            class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.builder.preferences.BuilderPreferencePage"
-            id="org.eclipse.osbp.ecview.dsl.UIGrammar.compiler.preferencePage"
-            name="Compiler">
-            <keywordReference id="org.eclipse.osbp.ecview.dsl.ui.keyword_UIGrammar"/>
-        </page>
-    </extension>
-    <extension
-            point="org.eclipse.ui.propertyPages">
-        <page
-            category="org.eclipse.osbp.ecview.dsl.UIGrammar"
-            class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.builder.preferences.BuilderPreferencePage"
-            id="org.eclipse.osbp.ecview.dsl.UIGrammar.compiler.propertyPage"
-            name="Compiler">
-            <keywordReference id="org.eclipse.osbp.ecview.dsl.ui.keyword_UIGrammar"/>
-            <enabledWhen>
-	            <adapt type="org.eclipse.core.resources.IProject"/>
+	<extension point="org.eclipse.xtext.builder.participant">
+		<participant
+			class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.builder.IXtextBuilderParticipant"
+			fileExtensions="ui"/>
+	</extension>
+	<extension point="org.eclipse.ui.preferencePages">
+		<page
+			category="org.eclipse.osbp.ecview.dsl.UIGrammar"
+			class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.builder.preferences.BuilderPreferencePage"
+			id="org.eclipse.osbp.ecview.dsl.UIGrammar.compiler.preferencePage"
+			name="Compiler">
+			<keywordReference id="org.eclipse.osbp.ecview.dsl.ui.keyword_UIGrammar"/>
+		</page>
+	</extension>
+	<extension point="org.eclipse.ui.propertyPages">
+		<page
+			category="org.eclipse.osbp.ecview.dsl.UIGrammar"
+			class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.builder.preferences.BuilderPreferencePage"
+			id="org.eclipse.osbp.ecview.dsl.UIGrammar.compiler.propertyPage"
+			name="Compiler">
+			<keywordReference id="org.eclipse.osbp.ecview.dsl.ui.keyword_UIGrammar"/>
+			<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.ecview.dsl.UIGrammar.OpenGeneratedCode"
+				style="push">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.osbp.ecview.dsl.UIGrammar.Editor.opened" />
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<extension point="org.eclipse.ui.handlers">
+		<handler
+			class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.generator.trace.OpenGeneratedFileHandler"
+			commandId="org.eclipse.xtext.ui.OpenGeneratedFileCommand">
+			<activeWhen>
+				<reference definitionId="org.eclipse.osbp.ecview.dsl.UIGrammar.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.ecview.dsl.UIGrammar -->
-    <extension
-            point="org.eclipse.ui.ide.markerResolution">
-        <markerResolutionGenerator
-            class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
-            markerType="org.eclipse.osbp.ecview.dsl.ui.uigrammar.check.fast">
-            <attribute
-                name="FIXABLE_KEY"
-                value="true">
-            </attribute>
-        </markerResolutionGenerator>
-        <markerResolutionGenerator
-            class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
-            markerType="org.eclipse.osbp.ecview.dsl.ui.uigrammar.check.normal">
-            <attribute
-                name="FIXABLE_KEY"
-                value="true">
-            </attribute>
-        </markerResolutionGenerator>
-        <markerResolutionGenerator
-            class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
-            markerType="org.eclipse.osbp.ecview.dsl.ui.uigrammar.check.expensive">
-            <attribute
-                name="FIXABLE_KEY"
-                value="true">
-            </attribute>
-        </markerResolutionGenerator>
-    </extension>
-   	<!-- Rename Refactoring -->
+	<!-- quickfix marker resolution generator for org.eclipse.osbp.ecview.dsl.UIGrammar -->
+	<extension
+			point="org.eclipse.ui.ide.markerResolution">
+		<markerResolutionGenerator
+			class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
+			markerType="org.eclipse.osbp.ecview.dsl.ui.uigrammar.check.fast">
+			<attribute
+				name="FIXABLE_KEY"
+				value="true">
+			</attribute>
+		</markerResolutionGenerator>
+		<markerResolutionGenerator
+			class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
+			markerType="org.eclipse.osbp.ecview.dsl.ui.uigrammar.check.normal">
+			<attribute
+				name="FIXABLE_KEY"
+				value="true">
+			</attribute>
+		</markerResolutionGenerator>
+		<markerResolutionGenerator
+			class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
+			markerType="org.eclipse.osbp.ecview.dsl.ui.uigrammar.check.expensive">
+			<attribute
+				name="FIXABLE_KEY"
+				value="true">
+			</attribute>
+		</markerResolutionGenerator>
+	</extension>
+	<!-- Rename Refactoring -->
 	<extension point="org.eclipse.ui.handlers">
 		<handler 
 			class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory: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.ecview.dsl.UIGrammar.Editor.opened">
-               </reference>
-            </visibleWhen>
-         </command>
-      </menuContribution>
-   </extension>
-   <extension point="org.eclipse.ui.preferencePages">
-	    <page
-	        category="org.eclipse.osbp.ecview.dsl.UIGrammar"
-	        class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.refactoring.ui.RefactoringPreferencePage"
-	        id="org.eclipse.osbp.ecview.dsl.UIGrammar.refactoring"
-	        name="Refactoring">
-	        <keywordReference id="org.eclipse.osbp.ecview.dsl.ui.keyword_UIGrammar"/>
-	    </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.ecview.dsl.UIGrammar.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.ecview.dsl.UIGrammar"
+			class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.refactoring.ui.RefactoringPreferencePage"
+			id="org.eclipse.osbp.ecview.dsl.UIGrammar.refactoring"
+			name="Refactoring">
+			<keywordReference id="org.eclipse.osbp.ecview.dsl.ui.keyword_UIGrammar"/>
+		</page>
+	</extension>
+	<!-- Type Hierarchy  -->
+	<extension point="org.eclipse.ui.handlers">
 		<handler 
 			class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory: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.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.xbase.ui.imports.OrganizeImportsHandler"
+			commandId="org.eclipse.xtext.xbase.ui.organizeImports">
+			<activeWhen>
+				<reference
+					definitionId="org.eclipse.osbp.ecview.dsl.UIGrammar.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.ecview.dsl.UIGrammar.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.ecview.dsl.ui.UIGrammarExecutableExtensionFactory: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.ecview.dsl.ui.UIGrammarExecutableExtensionFactory: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.ecview.dsl.UIGrammar" 
-                          id="org.eclipse.osbp.ecview.dsl.UIGrammar.rulerActions">
-	     <action
-	             label="Not Used"
-	             class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.debug.ui.actions.RulerToggleBreakpointActionDelegate"
-	             style="push"
-	             actionID="RulerDoubleClick"
-	             id="org.eclipse.osbp.ecview.dsl.UIGrammar.doubleClickBreakpointAction"/>
-	  </editorContribution>
-   </extension>
-   <extension point="org.eclipse.ui.popupMenus">
-      <viewerContribution
-         targetID="org.eclipse.osbp.ecview.dsl.UIGrammar.RulerContext"
-         id="org.eclipse.osbp.ecview.dsl.UIGrammar.RulerPopupActions">
-         <action
-            label="Toggle Breakpoint"
-            class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.debug.ui.actions.RulerToggleBreakpointActionDelegate"
-            menubarPath="debug"
-            id="org.eclipse.osbp.ecview.dsl.UIGrammar.rulerContextMenu.toggleBreakpointAction">
-         </action>
-         <action
-            label="Not used"
-            class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.debug.ui.actions.RulerEnableDisableBreakpointActionDelegate"
-            menubarPath="debug"
-            id="org.eclipse.osbp.ecview.dsl.UIGrammar.rulerContextMenu.enableDisableBreakpointAction">
-         </action>
-         <action
-           label="Breakpoint Properties"
-           helpContextId="breakpoint_properties_action_context"
-           class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.jdt.debug.ui.actions.JavaBreakpointPropertiesRulerActionDelegate"
-           menubarPath="group.properties"
-           id="org.eclipse.osbp.ecview.dsl.UIGrammar.rulerContextMenu.openBreapointPropertiesAction">
-         </action>
-      </viewerContribution>
-   </extension>
-    <!-- Introduce Local Variable Refactoring -->
+	<extension point="org.eclipse.core.runtime.adapters">
+		<factory class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory: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.ecview.dsl.UIGrammar" 
+			id="org.eclipse.osbp.ecview.dsl.UIGrammar.rulerActions">
+			<action
+				label="Not Used"
+	 			class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.debug.ui.actions.RulerToggleBreakpointActionDelegate"
+				style="push"
+				actionID="RulerDoubleClick"
+				id="org.eclipse.osbp.ecview.dsl.UIGrammar.doubleClickBreakpointAction"/>
+		</editorContribution>
+	</extension>
+	<extension point="org.eclipse.ui.popupMenus">
+		<viewerContribution
+			targetID="org.eclipse.osbp.ecview.dsl.UIGrammar.RulerContext"
+			id="org.eclipse.osbp.ecview.dsl.UIGrammar.RulerPopupActions">
+			<action
+				label="Toggle Breakpoint"
+				class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.debug.ui.actions.RulerToggleBreakpointActionDelegate"
+				menubarPath="debug"
+				id="org.eclipse.osbp.ecview.dsl.UIGrammar.rulerContextMenu.toggleBreakpointAction">
+			</action>
+			<action
+				label="Not used"
+				class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.debug.ui.actions.RulerEnableDisableBreakpointActionDelegate"
+				menubarPath="debug"
+				id="org.eclipse.osbp.ecview.dsl.UIGrammar.rulerContextMenu.enableDisableBreakpointAction">
+			</action>
+			<action
+				label="Breakpoint Properties"
+				helpContextId="breakpoint_properties_action_context"
+				class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.jdt.debug.ui.actions.JavaBreakpointPropertiesRulerActionDelegate"
+				menubarPath="group.properties"
+				id="org.eclipse.osbp.ecview.dsl.UIGrammar.rulerContextMenu.openBreapointPropertiesAction">
+			</action>
+		</viewerContribution>
+	</extension>
+	<!-- Introduce Local Variable Refactoring -->
 	<extension point="org.eclipse.ui.handlers">
 		<handler 
 			class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory: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.ecview.dsl.UIGrammar.Editor.opened">
-               </reference>
-            </visibleWhen>
-         </command>
-      </menuContribution>
-   </extension>  
-   <!-- Open implementation -->
-   <extension point="org.eclipse.ui.handlers">
-      <handler
-            class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory: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.ecview.dsl.UIGrammar.Editor.opened">
+					</reference>
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<!-- Open implementation -->
+	<extension point="org.eclipse.ui.handlers">
+		<handler
+			class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.xbase.ui.navigation.OpenImplementationHandler"
+			commandId="org.eclipse.xtext.xbase.ui.OpenImplementationCommand">
+			<activeWhen>
 				<reference
 					definitionId="org.eclipse.osbp.ecview.dsl.UIGrammar.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.ecview.dsl.UIGrammar.Editor.opened">
-              </reference>
-		</visibleWhen>
-         </command>
-      </menuContribution>
-   </extension>
-
-  <extension point="org.eclipse.compare.contentViewers">
-    <viewer id="org.eclipse.osbp.ecview.dsl.UIGrammar.compare.contentViewers"
-            class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.compare.InjectableViewerCreator"
-            extensions="ui">
-    </viewer>
-  </extension>
-  <extension point="org.eclipse.compare.contentMergeViewers">
-    <viewer id="org.eclipse.osbp.ecview.dsl.UIGrammar.compare.contentMergeViewers"
-            class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.compare.InjectableViewerCreator"
-            extensions="ui" label="UIGrammar Compare">
-     </viewer>
-  </extension>
-  <extension point="org.eclipse.ui.editors.documentProviders">
-    <provider id="org.eclipse.osbp.ecview.dsl.UIGrammar.editors.documentProviders"
-            class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.model.XtextDocumentProvider"
-            extensions="ui">
-    </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.ecview.dsl.UIGrammar.Editor.opened">
+					</reference>
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<extension point="org.eclipse.compare.contentViewers">
+		<viewer id="org.eclipse.osbp.ecview.dsl.UIGrammar.compare.contentViewers"
+			class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.compare.InjectableViewerCreator"
+			extensions="ui">
+		</viewer>
+	</extension>
+	<extension point="org.eclipse.compare.contentMergeViewers">
+		<viewer id="org.eclipse.osbp.ecview.dsl.UIGrammar.compare.contentMergeViewers"
+			class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.compare.InjectableViewerCreator"
+			extensions="ui" label="UIGrammar Compare">
+		</viewer>
+	</extension>
+	<extension point="org.eclipse.ui.editors.documentProviders">
+		<provider id="org.eclipse.osbp.ecview.dsl.UIGrammar.editors.documentProviders"
+			class="org.eclipse.osbp.ecview.dsl.ui.UIGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.model.XtextDocumentProvider"
+			extensions="ui">
+		</provider>
+	</extension>
+	<extension point="org.eclipse.team.core.fileTypes">
+		<fileTypes
+			extension="ui"
+			type="text">
+		</fileTypes>
+	</extension>
 </plugin>
diff --git a/org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/AbstractUIGrammarUiModule.java b/org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/AbstractUIGrammarUiModule.java
index 52588d0..87b0b28 100644
--- a/org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/AbstractUIGrammarUiModule.java
+++ b/org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/AbstractUIGrammarUiModule.java
@@ -7,366 +7,400 @@
  *
  * Contributors:
  *         Florian Pirchner - Initial implementation
+ *
+ * generated by Xtext 2.11.0
+ *
  */
 
 package org.eclipse.osbp.ecview.dsl.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.ecview.dsl.ide.contentassist.antlr.PartialUIGrammarContentAssistParser;
+import org.eclipse.osbp.ecview.dsl.ide.contentassist.antlr.UIGrammarParser;
+import org.eclipse.osbp.ecview.dsl.ide.contentassist.antlr.internal.InternalUIGrammarLexer;
+import org.eclipse.osbp.ecview.dsl.ui.contentassist.UIGrammarProposalProvider;
+import org.eclipse.osbp.ecview.dsl.ui.labeling.UIGrammarDescriptionLabelProvider;
+import org.eclipse.osbp.ecview.dsl.ui.labeling.UIGrammarLabelProvider;
+import org.eclipse.osbp.ecview.dsl.ui.outline.UIGrammarOutlineTreeProvider;
+import org.eclipse.osbp.ecview.dsl.ui.quickfix.UIGrammarQuickfixProvider;
+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.ecview.dsl.ui.UIGrammarUiModule}
+ * Manual modifications go to {@link UIGrammarUiModule}.
  */
 @SuppressWarnings("all")
-public abstract class AbstractUIGrammarUiModule extends DefaultUiModule {
-	
+public abstract class AbstractUIGrammarUiModule extends DefaultXbaseWithAnnotationsUiModule {
+
 	public AbstractUIGrammarUiModule(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.ecview.dsl.parser.antlr.internal.InternalUIGrammarLexer.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(InternalUIGrammarLexer.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.ecview.dsl.parser.antlr.internal.InternalUIGrammarLexer.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 UIGrammarParser.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(InternalUIGrammarLexer.class).toProvider(LexerProvider.create(InternalUIGrammarLexer.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.ecview.dsl.ui.labeling.UIGrammarLabelProvider.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.ecview.dsl.ui.labeling.UIGrammarDescriptionLabelProvider.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.ecview.dsl.ui.outline.UIGrammarOutlineTreeProvider.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.ecview.dsl.ui.outline.UIGrammarOutlineTreeProvider.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.ecview.dsl.ui.quickfix.UIGrammarQuickfixProvider.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.ecview.dsl.ui.contentassist.UIGrammarProposalProvider.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.labeling.LabelProviderFragment2
+	public Class<? extends ILabelProvider> bindILabelProvider() {
+		return UIGrammarLabelProvider.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(UIGrammarDescriptionLabelProvider.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.ecview.dsl.ui.contentassist.antlr.UIGrammarParser.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.outline.OutlineTreeProviderFragment2
+	public Class<? extends IOutlineTreeProvider> bindIOutlineTreeProvider() {
+		return UIGrammarOutlineTreeProvider.class;
 	}
-
-	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrUiGeneratorFragment
-	public void configureContentAssistLexerProvider(com.google.inject.Binder binder) {
-		binder.bind(org.eclipse.osbp.ecview.dsl.ui.contentassist.antlr.internal.InternalUIGrammarLexer.class).toProvider(org.eclipse.xtext.parser.antlr.LexerProvider.create(org.eclipse.osbp.ecview.dsl.ui.contentassist.antlr.internal.InternalUIGrammarLexer.class));
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.outline.OutlineTreeProviderFragment2
+	public Class<? extends IOutlineTreeStructureProvider> bindIOutlineTreeStructureProvider() {
+		return UIGrammarOutlineTreeProvider.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.ecview.dsl.ui.contentassist.antlr.internal.InternalUIGrammarLexer.class);
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.quickfix.QuickfixProviderFragment2
+	public Class<? extends IssueResolutionProvider> bindIssueResolutionProvider() {
+		return UIGrammarQuickfixProvider.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 UIGrammarProposalProvider.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 PartialUIGrammarContentAssistParser.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.ecview.dsl.ui.contentassist.antlr.PartialUIGrammarContentAssistParser.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.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/UIGrammarExecutableExtensionFactory.java b/org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/UIGrammarExecutableExtensionFactory.java
index 5082450..8d029d6 100644
--- a/org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/UIGrammarExecutableExtensionFactory.java
+++ b/org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/UIGrammarExecutableExtensionFactory.java
@@ -7,17 +7,18 @@
  *
  * Contributors:
  *         Florian Pirchner - Initial implementation
+ *
+ * generated by Xtext 2.11.0
+ *
  */
 
 package org.eclipse.osbp.ecview.dsl.ui;
 
+import com.google.inject.Injector;
+import org.eclipse.osbp.ecview.dsl.ui.internal.DslActivator;
 import org.eclipse.xtext.ui.guice.AbstractGuiceAwareExecutableExtensionFactory;
 import org.osgi.framework.Bundle;
 
-import com.google.inject.Injector;
-
-import org.eclipse.osbp.ecview.dsl.ui.internal.UIGrammarActivator;
-
 /**
  * This class was generated. Customizations should only happen in a newly
  * introduced subclass. 
@@ -26,12 +27,12 @@
 
 	@Override
 	protected Bundle getBundle() {
-		return UIGrammarActivator.getInstance().getBundle();
+		return DslActivator.getInstance().getBundle();
 	}
 	
 	@Override
 	protected Injector getInjector() {
-		return UIGrammarActivator.getInstance().getInjector(UIGrammarActivator.ORG_ECLIPSE_OSBP_ECVIEW_DSL_UIGRAMMAR);
+		return DslActivator.getInstance().getInjector(DslActivator.ORG_ECLIPSE_OSBP_ECVIEW_DSL_UIGRAMMAR);
 	}
 	
 }
diff --git a/org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/AbstractUIGrammarProposalProvider.java b/org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/AbstractUIGrammarProposalProvider.java
index f854518..50b93fd 100644
--- a/org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/AbstractUIGrammarProposalProvider.java
+++ b/org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/AbstractUIGrammarProposalProvider.java
@@ -7,35 +7,37 @@
  *
  * Contributors:
  *         Florian Pirchner - Initial implementation
+ *
+ * generated by Xtext 2.11.0
+ *
  */
 
 package org.eclipse.osbp.ecview.dsl.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.ui.contentassist.XbaseProposalProvider}.
+ * 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 AbstractUIGrammarProposalProvider extends org.eclipse.xtext.xbase.ui.contentassist.XbaseProposalProvider {
-		
+public abstract class AbstractUIGrammarProposalProvider extends OXtypeProposalProvider {
+
 	public void completeUiModel_PackageName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
-	public void completeUiModel_Imports(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+	public void completeUiModel_ImportSection(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
 	public void completeUiModel_Roots(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
-	public void completeUiImports_ImportedNamespace(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
-		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
-	}
 	public void completeUiValidatorAlias_Validator(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
@@ -207,6 +209,33 @@
 	public void completeUiIDEView_ProcessorAssignments(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
+	public void completeUiDisplayView_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeUiDisplayView_JvmType(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeUiDisplayView_BeanSlots(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeUiDisplayView_BindingEndpointAlias(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeUiDisplayView_Bindings(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeUiDisplayView_Content(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeUiDisplayView_ContentAlignment(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeUiDisplayView_ValidatorAssignments(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeUiDisplayView_ProcessorAssignments(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
 	public void completeUiExposedAction_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
@@ -267,6 +296,9 @@
 	public void completeUiMobileView_ProcessorAssignments(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
+	public void completeUiI18nInfo_NoCaption(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
 	public void completeUiI18nInfo_Key(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
@@ -1107,6 +1139,9 @@
 	public void completeUiTable_ConsumeBeanService(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
+	public void completeUiTable_ScrollToBottom(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
 	public void completeUiTable_Readonly(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
@@ -1473,13 +1508,10 @@
 	public void completeUiChangeTrigger_Alias(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
-    
+
 	public void complete_UiModel(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
-	public void complete_UiImports(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
-		// subclasses may override
-	}
 	public void complete_UiRootElements(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
@@ -1558,6 +1590,9 @@
 	public void complete_UiIDEView(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
+	public void complete_UiDisplayView(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
 	public void complete_UiExposedAction(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
diff --git a/org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/PartialUIGrammarContentAssistParser.java b/org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/PartialUIGrammarContentAssistParser.java
deleted file mode 100644
index 3c235a7..0000000
--- a/org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/PartialUIGrammarContentAssistParser.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf), Loetz GmbH&Co.KG (Heidelberg)
- * 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:
- *         Florian Pirchner - Initial implementation
- */
-
-package org.eclipse.osbp.ecview.dsl.ui.contentassist.antlr;
-
-import java.util.Collection;
-import java.util.Collections;
-
-import org.eclipse.xtext.AbstractRule;
-import org.eclipse.xtext.ui.codetemplates.ui.partialEditing.IPartialContentAssistParser;
-import org.eclipse.xtext.ui.editor.contentassist.antlr.FollowElement;
-import org.eclipse.xtext.ui.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
-import org.eclipse.xtext.util.PolymorphicDispatcher;
-
-/**
- * @author Sebastian Zarnekow - Initial contribution and API
- */
-@SuppressWarnings("restriction")
-public class PartialUIGrammarContentAssistParser extends UIGrammarParser implements IPartialContentAssistParser {
-
-	private AbstractRule rule;
-
-	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.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/UIGrammarParser.java b/org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/UIGrammarParser.java
deleted file mode 100644
index 8fc2970..0000000
--- a/org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/UIGrammarParser.java
+++ /dev/null
@@ -1,1315 +0,0 @@
-/**
- * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf), Loetz GmbH&Co.KG (Heidelberg)
- * 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:
- *         Florian Pirchner - Initial implementation
- */
-
-package org.eclipse.osbp.ecview.dsl.ui.contentassist.antlr;
-
-import java.util.Collection;
-import java.util.Map;
-import java.util.HashMap;
-
-import org.antlr.runtime.RecognitionException;
-import org.eclipse.xtext.AbstractElement;
-import org.eclipse.xtext.ui.editor.contentassist.antlr.AbstractContentAssistParser;
-import org.eclipse.xtext.ui.editor.contentassist.antlr.FollowElement;
-import org.eclipse.xtext.ui.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
-
-import com.google.inject.Inject;
-
-import org.eclipse.osbp.ecview.dsl.services.UIGrammarGrammarAccess;
-
-public class UIGrammarParser extends AbstractContentAssistParser {
-	
-	@Inject
-	private UIGrammarGrammarAccess grammarAccess;
-	
-	private Map<AbstractElement, String> nameMappings;
-	
-	@Override
-	protected org.eclipse.osbp.ecview.dsl.ui.contentassist.antlr.internal.InternalUIGrammarParser createParser() {
-		org.eclipse.osbp.ecview.dsl.ui.contentassist.antlr.internal.InternalUIGrammarParser result = new org.eclipse.osbp.ecview.dsl.ui.contentassist.antlr.internal.InternalUIGrammarParser(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.getUiRootElementsAccess().getAlternatives(), "rule__UiRootElements__Alternatives");
-					put(grammarAccess.getUiValidatorAssignmentAccess().getAlternatives_3(), "rule__UiValidatorAssignment__Alternatives_3");
-					put(grammarAccess.getUiBindingEndpointAssignmentAccess().getAlternatives(), "rule__UiBindingEndpointAssignment__Alternatives");
-					put(grammarAccess.getUiRawBindablePathSegmentAccess().getAlternatives_1(), "rule__UiRawBindablePathSegment__Alternatives_1");
-					put(grammarAccess.getUiCommandAccess().getAlternatives(), "rule__UiCommand__Alternatives");
-					put(grammarAccess.getUiIDEViewAccess().getAlternatives_4(), "rule__UiIDEView__Alternatives_4");
-					put(grammarAccess.getUiIDEViewAccess().getAlternatives_7(), "rule__UiIDEView__Alternatives_7");
-					put(grammarAccess.getUiExposedActionAccess().getAlternatives_3(), "rule__UiExposedAction__Alternatives_3");
-					put(grammarAccess.getUiMobileNavBarActionAccess().getAlternatives_3(), "rule__UiMobileNavBarAction__Alternatives_3");
-					put(grammarAccess.getUiMobileViewAccess().getAlternatives_4(), "rule__UiMobileView__Alternatives_4");
-					put(grammarAccess.getUiMobileViewAccess().getAlternatives_7(), "rule__UiMobileView__Alternatives_7");
-					put(grammarAccess.getUiTextFieldAccess().getAlternatives_4_1(), "rule__UiTextField__Alternatives_4_1");
-					put(grammarAccess.getUiPasswordFieldAccess().getAlternatives_4_1(), "rule__UiPasswordField__Alternatives_4_1");
-					put(grammarAccess.getUiMaskedTextFieldAccess().getAlternatives_4_1(), "rule__UiMaskedTextField__Alternatives_4_1");
-					put(grammarAccess.getUiMaskedNumericFieldAccess().getAlternatives_4_1(), "rule__UiMaskedNumericField__Alternatives_4_1");
-					put(grammarAccess.getUiMaskedDecimalFieldAccess().getAlternatives_4_1(), "rule__UiMaskedDecimalField__Alternatives_4_1");
-					put(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getAlternatives_4_1(), "rule__UiPrefixedMaskedTextField__Alternatives_4_1");
-					put(grammarAccess.getUiRichTextAreaAccess().getAlternatives_4_1(), "rule__UiRichTextArea__Alternatives_4_1");
-					put(grammarAccess.getUiSuggestTextFieldAccess().getAlternatives_4_2(), "rule__UiSuggestTextField__Alternatives_4_2");
-					put(grammarAccess.getUiBeanReferenceFieldAccess().getAlternatives_4_2(), "rule__UiBeanReferenceField__Alternatives_4_2");
-					put(grammarAccess.getUiTextAreaAccess().getAlternatives_4_1(), "rule__UiTextArea__Alternatives_4_1");
-					put(grammarAccess.getUiDateFieldAccess().getAlternatives_4_1(), "rule__UiDateField__Alternatives_4_1");
-					put(grammarAccess.getUiBrowserAccess().getAlternatives_4_1(), "rule__UiBrowser__Alternatives_4_1");
-					put(grammarAccess.getUiProgressBarAccess().getAlternatives_4_1(), "rule__UiProgressBar__Alternatives_4_1");
-					put(grammarAccess.getUiTableAccess().getAlternatives_4_4(), "rule__UiTable__Alternatives_4_4");
-					put(grammarAccess.getUiComboBoxAccess().getAlternatives_4_2(), "rule__UiComboBox__Alternatives_4_2");
-					put(grammarAccess.getUiMobileNavigationButtonAccess().getAlternatives_4(), "rule__UiMobileNavigationButton__Alternatives_4");
-					put(grammarAccess.getUiMobileSwitchAccess().getAlternatives_4_2(), "rule__UiMobileSwitch__Alternatives_4_2");
-					put(grammarAccess.getUiDecimalFieldAccess().getAlternatives_4_1(), "rule__UiDecimalField__Alternatives_4_1");
-					put(grammarAccess.getUiOptionsGroupAccess().getAlternatives_4_2(), "rule__UiOptionsGroup__Alternatives_4_2");
-					put(grammarAccess.getUiListAccess().getAlternatives_4_2(), "rule__UiList__Alternatives_4_2");
-					put(grammarAccess.getUiSortOrderAccess().getAlternatives_2(), "rule__UiSortOrder__Alternatives_2");
-					put(grammarAccess.getUiEmbeddableAccess().getAlternatives(), "rule__UiEmbeddable__Alternatives");
-					put(grammarAccess.getUiMobileEmbeddableAccess().getAlternatives(), "rule__UiMobileEmbeddable__Alternatives");
-					put(grammarAccess.getUiMobileLayoutAccess().getAlternatives(), "rule__UiMobileLayout__Alternatives");
-					put(grammarAccess.getUiMobileFieldAccess().getAlternatives(), "rule__UiMobileField__Alternatives");
-					put(grammarAccess.getUiLayoutAccess().getAlternatives(), "rule__UiLayout__Alternatives");
-					put(grammarAccess.getUiFieldAccess().getAlternatives(), "rule__UiField__Alternatives");
-					put(grammarAccess.getUiMobileActionAccess().getAlternatives(), "rule__UiMobileAction__Alternatives");
-					put(grammarAccess.getUiNumericFieldAccess().getAlternatives_4_1(), "rule__UiNumericField__Alternatives_4_1");
-					put(grammarAccess.getUiCheckBoxAccess().getAlternatives_4_1(), "rule__UiCheckBox__Alternatives_4_1");
-					put(grammarAccess.getUiValidatorAccess().getAlternatives(), "rule__UiValidator__Alternatives");
-					put(grammarAccess.getUiVisibilityProcessorAccess().getAlternatives_4(), "rule__UiVisibilityProcessor__Alternatives_4");
-					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.getXImportDeclarationAccess().getAlternatives_1(), "rule__XImportDeclaration__Alternatives_1");
-					put(grammarAccess.getXImportDeclarationAccess().getAlternatives_1_0_3(), "rule__XImportDeclaration__Alternatives_1_0_3");
-					put(grammarAccess.getUiDateFormatAccess().getAlternatives(), "rule__UiDateFormat__Alternatives");
-					put(grammarAccess.getUiDateTimeResolutionAccess().getAlternatives(), "rule__UiDateTimeResolution__Alternatives");
-					put(grammarAccess.getUiSelectionTypeAccess().getAlternatives(), "rule__UiSelectionType__Alternatives");
-					put(grammarAccess.getUiAlignmentAccess().getAlternatives(), "rule__UiAlignment__Alternatives");
-					put(grammarAccess.getUiModelAccess().getGroup(), "rule__UiModel__Group__0");
-					put(grammarAccess.getUiImportsAccess().getGroup(), "rule__UiImports__Group__0");
-					put(grammarAccess.getUiValidatorAliasAccess().getGroup(), "rule__UiValidatorAlias__Group__0");
-					put(grammarAccess.getUiValidatorAssignmentAccess().getGroup(), "rule__UiValidatorAssignment__Group__0");
-					put(grammarAccess.getUiValidatorAssignmentAccess().getGroup_3_1(), "rule__UiValidatorAssignment__Group_3_1__0");
-					put(grammarAccess.getUiViewSetAccess().getGroup(), "rule__UiViewSet__Group__0");
-					put(grammarAccess.getUiBindingEndpointAliasAccess().getGroup(), "rule__UiBindingEndpointAlias__Group__0");
-					put(grammarAccess.getUiBeanSlotAccess().getGroup(), "rule__UiBeanSlot__Group__0");
-					put(grammarAccess.getUiBeanSlotAccess().getGroup_4(), "rule__UiBeanSlot__Group_4__0");
-					put(grammarAccess.getUiBindingAccess().getGroup(), "rule__UiBinding__Group__0");
-					put(grammarAccess.getUiBindingAccess().getGroup_3(), "rule__UiBinding__Group_3__0");
-					put(grammarAccess.getUiBindingEndpointAssignmentAccess().getGroup_0(), "rule__UiBindingEndpointAssignment__Group_0__0");
-					put(grammarAccess.getUiBindingEndpointAssignmentAccess().getGroup_1(), "rule__UiBindingEndpointAssignment__Group_1__0");
-					put(grammarAccess.getUiBindingEndpointAssignmentAccess().getGroup_2(), "rule__UiBindingEndpointAssignment__Group_2__0");
-					put(grammarAccess.getUiPathSegmentAccess().getGroup(), "rule__UiPathSegment__Group__0");
-					put(grammarAccess.getUiNestedPropertyAccess().getGroup(), "rule__UiNestedProperty__Group__0");
-					put(grammarAccess.getUiTypedBindableDefAccess().getGroup(), "rule__UiTypedBindableDef__Group__0");
-					put(grammarAccess.getUiTypedBindableDefAccess().getGroup_1(), "rule__UiTypedBindableDef__Group_1__0");
-					put(grammarAccess.getUiTypedBindableRawTypeAccess().getGroup(), "rule__UiTypedBindableRawType__Group__0");
-					put(grammarAccess.getUiTypedBindableRawTypeAliasAccess().getGroup(), "rule__UiTypedBindableRawTypeAlias__Group__0");
-					put(grammarAccess.getUiRawBindablePathSegmentAccess().getGroup(), "rule__UiRawBindablePathSegment__Group__0");
-					put(grammarAccess.getUiCommandBindableDefAccess().getGroup(), "rule__UiCommandBindableDef__Group__0");
-					put(grammarAccess.getUiMobileNavigationCommandAccess().getGroup(), "rule__UiMobileNavigationCommand__Group__0");
-					put(grammarAccess.getUiOpenDialogCommandAccess().getGroup(), "rule__UiOpenDialogCommand__Group__0");
-					put(grammarAccess.getUiSearchWithDialogCommandAccess().getGroup(), "rule__UiSearchWithDialogCommand__Group__0");
-					put(grammarAccess.getUiAddToTableCommandAccess().getGroup(), "rule__UiAddToTableCommand__Group__0");
-					put(grammarAccess.getUiRemoveFromTableCommandAccess().getGroup(), "rule__UiRemoveFromTableCommand__Group__0");
-					put(grammarAccess.getUiSetNewInstanceCommandAccess().getGroup(), "rule__UiSetNewInstanceCommand__Group__0");
-					put(grammarAccess.getUiSetNewInstanceCommandAccess().getGroup_2(), "rule__UiSetNewInstanceCommand__Group_2__0");
-					put(grammarAccess.getUiSetNewInstanceCommandAccess().getGroup_3(), "rule__UiSetNewInstanceCommand__Group_3__0");
-					put(grammarAccess.getUiSendEventCommandAccess().getGroup(), "rule__UiSendEventCommand__Group__0");
-					put(grammarAccess.getUiIDEViewAccess().getGroup(), "rule__UiIDEView__Group__0");
-					put(grammarAccess.getUiIDEViewAccess().getGroup_3_0(), "rule__UiIDEView__Group_3_0__0");
-					put(grammarAccess.getUiIDEViewAccess().getGroup_3_1(), "rule__UiIDEView__Group_3_1__0");
-					put(grammarAccess.getUiIDEViewAccess().getGroup_3_2(), "rule__UiIDEView__Group_3_2__0");
-					put(grammarAccess.getUiIDEViewAccess().getGroup_3_3(), "rule__UiIDEView__Group_3_3__0");
-					put(grammarAccess.getUiIDEViewAccess().getGroup_6(), "rule__UiIDEView__Group_6__0");
-					put(grammarAccess.getUiExposedActionAccess().getGroup(), "rule__UiExposedAction__Group__0");
-					put(grammarAccess.getUiExposedActionAccess().getGroup_1(), "rule__UiExposedAction__Group_1__0");
-					put(grammarAccess.getUiExposedActionAccess().getGroup_5(), "rule__UiExposedAction__Group_5__0");
-					put(grammarAccess.getUiMobileNavBarActionAccess().getGroup(), "rule__UiMobileNavBarAction__Group__0");
-					put(grammarAccess.getUiMobileNavBarActionAccess().getGroup_1(), "rule__UiMobileNavBarAction__Group_1__0");
-					put(grammarAccess.getUiMobileViewAccess().getGroup(), "rule__UiMobileView__Group__0");
-					put(grammarAccess.getUiMobileViewAccess().getGroup_3_0(), "rule__UiMobileView__Group_3_0__0");
-					put(grammarAccess.getUiMobileViewAccess().getGroup_3_1(), "rule__UiMobileView__Group_3_1__0");
-					put(grammarAccess.getUiMobileViewAccess().getGroup_6(), "rule__UiMobileView__Group_6__0");
-					put(grammarAccess.getUiI18nInfoAccess().getGroup(), "rule__UiI18nInfo__Group__0");
-					put(grammarAccess.getUiGridLayoutAccess().getGroup(), "rule__UiGridLayout__Group__0");
-					put(grammarAccess.getUiGridLayoutAccess().getGroup_2(), "rule__UiGridLayout__Group_2__0");
-					put(grammarAccess.getUiGridLayoutAccess().getGroup_2_1_0(), "rule__UiGridLayout__Group_2_1_0__0");
-					put(grammarAccess.getUiGridLayoutAccess().getGroup_2_1_2(), "rule__UiGridLayout__Group_2_1_2__0");
-					put(grammarAccess.getUiVisibilityProcessorAssignmentAccess().getGroup(), "rule__UiVisibilityProcessorAssignment__Group__0");
-					put(grammarAccess.getUiGridLayoutAssigmentAccess().getGroup(), "rule__UiGridLayoutAssigment__Group__0");
-					put(grammarAccess.getUiGridLayoutAssigmentAccess().getGroup_1(), "rule__UiGridLayoutAssigment__Group_1__0");
-					put(grammarAccess.getUiFormLayoutAccess().getGroup(), "rule__UiFormLayout__Group__0");
-					put(grammarAccess.getUiFormLayoutAccess().getGroup_2_0(), "rule__UiFormLayout__Group_2_0__0");
-					put(grammarAccess.getUiFormLayoutAccess().getGroup_2_1(), "rule__UiFormLayout__Group_2_1__0");
-					put(grammarAccess.getUiFormLayoutAccess().getGroup_2_2(), "rule__UiFormLayout__Group_2_2__0");
-					put(grammarAccess.getUiVerticalLayoutAccess().getGroup(), "rule__UiVerticalLayout__Group__0");
-					put(grammarAccess.getUiVerticalLayoutAccess().getGroup_2_0(), "rule__UiVerticalLayout__Group_2_0__0");
-					put(grammarAccess.getUiVerticalLayoutAccess().getGroup_2_1(), "rule__UiVerticalLayout__Group_2_1__0");
-					put(grammarAccess.getUiVerticalLayoutAccess().getGroup_2_2(), "rule__UiVerticalLayout__Group_2_2__0");
-					put(grammarAccess.getUiVerticalLayoutAssigmentAccess().getGroup(), "rule__UiVerticalLayoutAssigment__Group__0");
-					put(grammarAccess.getUiVerticalLayoutAssigmentAccess().getGroup_1(), "rule__UiVerticalLayoutAssigment__Group_1__0");
-					put(grammarAccess.getUiMobileVerticalLayoutAccess().getGroup(), "rule__UiMobileVerticalLayout__Group__0");
-					put(grammarAccess.getUiMobileVerticalLayoutAccess().getGroup_2_0(), "rule__UiMobileVerticalLayout__Group_2_0__0");
-					put(grammarAccess.getUiMobileVerticalLayoutAccess().getGroup_2_1(), "rule__UiMobileVerticalLayout__Group_2_1__0");
-					put(grammarAccess.getUiMobileVerticalLayoutAccess().getGroup_2_2(), "rule__UiMobileVerticalLayout__Group_2_2__0");
-					put(grammarAccess.getUiMobileVerticalLayoutAssigmentAccess().getGroup(), "rule__UiMobileVerticalLayoutAssigment__Group__0");
-					put(grammarAccess.getUiMobileVerticalLayoutAssigmentAccess().getGroup_1(), "rule__UiMobileVerticalLayoutAssigment__Group_1__0");
-					put(grammarAccess.getUiMobileNavigationRootAccess().getGroup(), "rule__UiMobileNavigationRoot__Group__0");
-					put(grammarAccess.getUiHorizontalLayoutAccess().getGroup(), "rule__UiHorizontalLayout__Group__0");
-					put(grammarAccess.getUiHorizontalLayoutAccess().getGroup_2_0(), "rule__UiHorizontalLayout__Group_2_0__0");
-					put(grammarAccess.getUiHorizontalLayoutAccess().getGroup_2_2(), "rule__UiHorizontalLayout__Group_2_2__0");
-					put(grammarAccess.getUiHorizontalLayoutAccess().getGroup_2_2_0(), "rule__UiHorizontalLayout__Group_2_2_0__0");
-					put(grammarAccess.getUiHorizontalLayoutAssigmentAccess().getGroup(), "rule__UiHorizontalLayoutAssigment__Group__0");
-					put(grammarAccess.getUiHorizontalLayoutAssigmentAccess().getGroup_1(), "rule__UiHorizontalLayoutAssigment__Group_1__0");
-					put(grammarAccess.getUiMobileHorizontalLayoutAccess().getGroup(), "rule__UiMobileHorizontalLayout__Group__0");
-					put(grammarAccess.getUiMobileHorizontalLayoutAccess().getGroup_2_0(), "rule__UiMobileHorizontalLayout__Group_2_0__0");
-					put(grammarAccess.getUiMobileHorizontalLayoutAccess().getGroup_2_1(), "rule__UiMobileHorizontalLayout__Group_2_1__0");
-					put(grammarAccess.getUiMobileHorizontalLayoutAccess().getGroup_2_2(), "rule__UiMobileHorizontalLayout__Group_2_2__0");
-					put(grammarAccess.getUiMobileHorizontalLayoutAssigmentAccess().getGroup(), "rule__UiMobileHorizontalLayoutAssigment__Group__0");
-					put(grammarAccess.getUiMobileHorizontalLayoutAssigmentAccess().getGroup_1(), "rule__UiMobileHorizontalLayoutAssigment__Group_1__0");
-					put(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getGroup(), "rule__UiMobileHorizontalButtonGroup__Group__0");
-					put(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getGroup_2(), "rule__UiMobileHorizontalButtonGroup__Group_2__0");
-					put(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getGroup_2_1_1(), "rule__UiMobileHorizontalButtonGroup__Group_2_1_1__0");
-					put(grammarAccess.getUiMobileVerticalComponentGroupAccess().getGroup(), "rule__UiMobileVerticalComponentGroup__Group__0");
-					put(grammarAccess.getUiMobileVerticalComponentGroupAccess().getGroup_2(), "rule__UiMobileVerticalComponentGroup__Group_2__0");
-					put(grammarAccess.getUiMobileVerticalComponentGroupAccess().getGroup_2_1_2(), "rule__UiMobileVerticalComponentGroup__Group_2_1_2__0");
-					put(grammarAccess.getUiSearchPanelAccess().getGroup(), "rule__UiSearchPanel__Group__0");
-					put(grammarAccess.getUiSearchPanelAccess().getGroup_2(), "rule__UiSearchPanel__Group_2__0");
-					put(grammarAccess.getUiSearchPanelAccess().getGroup_2_1_1(), "rule__UiSearchPanel__Group_2_1_1__0");
-					put(grammarAccess.getUiMobileSearchPanelAccess().getGroup(), "rule__UiMobileSearchPanel__Group__0");
-					put(grammarAccess.getUiMobileSearchPanelAccess().getGroup_2(), "rule__UiMobileSearchPanel__Group_2__0");
-					put(grammarAccess.getUiMobileSearchPanelAccess().getGroup_2_1_1(), "rule__UiMobileSearchPanel__Group_2_1_1__0");
-					put(grammarAccess.getUiMobileTabSheetAccess().getGroup(), "rule__UiMobileTabSheet__Group__0");
-					put(grammarAccess.getUiMobileTabSheetAccess().getGroup_2(), "rule__UiMobileTabSheet__Group_2__0");
-					put(grammarAccess.getUiMobileTabSheetAccess().getGroup_2_1_1(), "rule__UiMobileTabSheet__Group_2_1_1__0");
-					put(grammarAccess.getUiMobileTabAssignmentAccess().getGroup(), "rule__UiMobileTabAssignment__Group__0");
-					put(grammarAccess.getUiTabSheetAccess().getGroup(), "rule__UiTabSheet__Group__0");
-					put(grammarAccess.getUiTabSheetAccess().getGroup_2(), "rule__UiTabSheet__Group_2__0");
-					put(grammarAccess.getUiTabSheetAccess().getGroup_2_1_1(), "rule__UiTabSheet__Group_2_1_1__0");
-					put(grammarAccess.getUiTabAssignmentAccess().getGroup(), "rule__UiTabAssignment__Group__0");
-					put(grammarAccess.getUiSplitpanelAccess().getGroup(), "rule__UiSplitpanel__Group__0");
-					put(grammarAccess.getUiSplitpanelAccess().getGroup_1_0(), "rule__UiSplitpanel__Group_1_0__0");
-					put(grammarAccess.getUiSplitpanelAccess().getGroup_1_1(), "rule__UiSplitpanel__Group_1_1__0");
-					put(grammarAccess.getUiSplitpanelAccess().getGroup_1_1_0(), "rule__UiSplitpanel__Group_1_1_0__0");
-					put(grammarAccess.getUiSplitpanelAccess().getGroup_4_0(), "rule__UiSplitpanel__Group_4_0__0");
-					put(grammarAccess.getUiSplitpanelAccess().getGroup_4_1(), "rule__UiSplitpanel__Group_4_1__0");
-					put(grammarAccess.getUiSplitpanelAccess().getGroup_4_2(), "rule__UiSplitpanel__Group_4_2__0");
-					put(grammarAccess.getUiPanelAccess().getGroup(), "rule__UiPanel__Group__0");
-					put(grammarAccess.getUiPanelAccess().getGroup_1(), "rule__UiPanel__Group_1__0");
-					put(grammarAccess.getUiPanelAccess().getGroup_1_1_2(), "rule__UiPanel__Group_1_1_2__0");
-					put(grammarAccess.getUiDialogAccess().getGroup(), "rule__UiDialog__Group__0");
-					put(grammarAccess.getUiDialogAccess().getGroup_2(), "rule__UiDialog__Group_2__0");
-					put(grammarAccess.getUiDialogAccess().getGroup_2_1_1(), "rule__UiDialog__Group_2_1_1__0");
-					put(grammarAccess.getUiDialogAccess().getGroup_5(), "rule__UiDialog__Group_5__0");
-					put(grammarAccess.getUiDialogAccess().getGroup_6(), "rule__UiDialog__Group_6__0");
-					put(grammarAccess.getUiSearchDialogAccess().getGroup(), "rule__UiSearchDialog__Group__0");
-					put(grammarAccess.getUiSearchDialogAccess().getGroup_2(), "rule__UiSearchDialog__Group_2__0");
-					put(grammarAccess.getUiSearchDialogAccess().getGroup_2_1_1(), "rule__UiSearchDialog__Group_2_1_1__0");
-					put(grammarAccess.getUiSearchDialogAccess().getGroup_5(), "rule__UiSearchDialog__Group_5__0");
-					put(grammarAccess.getUiSearchDialogAccess().getGroup_6(), "rule__UiSearchDialog__Group_6__0");
-					put(grammarAccess.getUiSearchDialogAccess().getGroup_7(), "rule__UiSearchDialog__Group_7__0");
-					put(grammarAccess.getUiMobileNavigationPageAccess().getGroup(), "rule__UiMobileNavigationPage__Group__0");
-					put(grammarAccess.getUiMobileNavigationPageAccess().getGroup_2(), "rule__UiMobileNavigationPage__Group_2__0");
-					put(grammarAccess.getUiMobileNavigationPageAccess().getGroup_2_1_1(), "rule__UiMobileNavigationPage__Group_2_1_1__0");
-					put(grammarAccess.getUiMobileNavigationPageAccess().getGroup_5(), "rule__UiMobileNavigationPage__Group_5__0");
-					put(grammarAccess.getUiMobileNavigationPageAccess().getGroup_6(), "rule__UiMobileNavigationPage__Group_6__0");
-					put(grammarAccess.getUiMobileNavigationPageAssignmentAccess().getGroup(), "rule__UiMobileNavigationPageAssignment__Group__0");
-					put(grammarAccess.getUiMobileNavigationPageAssignmentAccess().getGroup_1(), "rule__UiMobileNavigationPageAssignment__Group_1__0");
-					put(grammarAccess.getUiPointAccess().getGroup(), "rule__UiPoint__Group__0");
-					put(grammarAccess.getUiTextFieldAccess().getGroup(), "rule__UiTextField__Group__0");
-					put(grammarAccess.getUiTextFieldAccess().getGroup_2(), "rule__UiTextField__Group_2__0");
-					put(grammarAccess.getUiTextFieldAccess().getGroup_2_1_0(), "rule__UiTextField__Group_2_1_0__0");
-					put(grammarAccess.getUiTextFieldAccess().getGroup_2_1_1(), "rule__UiTextField__Group_2_1_1__0");
-					put(grammarAccess.getUiTextFieldAccess().getGroup_2_1_2(), "rule__UiTextField__Group_2_1_2__0");
-					put(grammarAccess.getUiTextFieldAccess().getGroup_2_1_3(), "rule__UiTextField__Group_2_1_3__0");
-					put(grammarAccess.getUiTextFieldAccess().getGroup_4(), "rule__UiTextField__Group_4__0");
-					put(grammarAccess.getUiPasswordFieldAccess().getGroup(), "rule__UiPasswordField__Group__0");
-					put(grammarAccess.getUiPasswordFieldAccess().getGroup_2(), "rule__UiPasswordField__Group_2__0");
-					put(grammarAccess.getUiPasswordFieldAccess().getGroup_2_1_0(), "rule__UiPasswordField__Group_2_1_0__0");
-					put(grammarAccess.getUiPasswordFieldAccess().getGroup_4(), "rule__UiPasswordField__Group_4__0");
-					put(grammarAccess.getUiMaskedTextFieldAccess().getGroup(), "rule__UiMaskedTextField__Group__0");
-					put(grammarAccess.getUiMaskedTextFieldAccess().getGroup_2(), "rule__UiMaskedTextField__Group_2__0");
-					put(grammarAccess.getUiMaskedTextFieldAccess().getGroup_2_1_0(), "rule__UiMaskedTextField__Group_2_1_0__0");
-					put(grammarAccess.getUiMaskedTextFieldAccess().getGroup_2_1_1(), "rule__UiMaskedTextField__Group_2_1_1__0");
-					put(grammarAccess.getUiMaskedTextFieldAccess().getGroup_4(), "rule__UiMaskedTextField__Group_4__0");
-					put(grammarAccess.getUiMaskedNumericFieldAccess().getGroup(), "rule__UiMaskedNumericField__Group__0");
-					put(grammarAccess.getUiMaskedNumericFieldAccess().getGroup_2(), "rule__UiMaskedNumericField__Group_2__0");
-					put(grammarAccess.getUiMaskedNumericFieldAccess().getGroup_2_1_0(), "rule__UiMaskedNumericField__Group_2_1_0__0");
-					put(grammarAccess.getUiMaskedNumericFieldAccess().getGroup_4(), "rule__UiMaskedNumericField__Group_4__0");
-					put(grammarAccess.getUiMaskedDecimalFieldAccess().getGroup(), "rule__UiMaskedDecimalField__Group__0");
-					put(grammarAccess.getUiMaskedDecimalFieldAccess().getGroup_2(), "rule__UiMaskedDecimalField__Group_2__0");
-					put(grammarAccess.getUiMaskedDecimalFieldAccess().getGroup_2_1_0(), "rule__UiMaskedDecimalField__Group_2_1_0__0");
-					put(grammarAccess.getUiMaskedDecimalFieldAccess().getGroup_2_1_1(), "rule__UiMaskedDecimalField__Group_2_1_1__0");
-					put(grammarAccess.getUiMaskedDecimalFieldAccess().getGroup_4(), "rule__UiMaskedDecimalField__Group_4__0");
-					put(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getGroup(), "rule__UiPrefixedMaskedTextField__Group__0");
-					put(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getGroup_2(), "rule__UiPrefixedMaskedTextField__Group_2__0");
-					put(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getGroup_2_1_0(), "rule__UiPrefixedMaskedTextField__Group_2_1_0__0");
-					put(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getGroup_2_1_1(), "rule__UiPrefixedMaskedTextField__Group_2_1_1__0");
-					put(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getGroup_2_1_2(), "rule__UiPrefixedMaskedTextField__Group_2_1_2__0");
-					put(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getGroup_2_1_2_3(), "rule__UiPrefixedMaskedTextField__Group_2_1_2_3__0");
-					put(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getGroup_4(), "rule__UiPrefixedMaskedTextField__Group_4__0");
-					put(grammarAccess.getUiPrefixToMaskMapEntryAccess().getGroup(), "rule__UiPrefixToMaskMapEntry__Group__0");
-					put(grammarAccess.getUiRichTextAreaAccess().getGroup(), "rule__UiRichTextArea__Group__0");
-					put(grammarAccess.getUiRichTextAreaAccess().getGroup_2(), "rule__UiRichTextArea__Group_2__0");
-					put(grammarAccess.getUiRichTextAreaAccess().getGroup_2_1_0(), "rule__UiRichTextArea__Group_2_1_0__0");
-					put(grammarAccess.getUiRichTextAreaAccess().getGroup_4(), "rule__UiRichTextArea__Group_4__0");
-					put(grammarAccess.getUiSuggestTextFieldAccess().getGroup(), "rule__UiSuggestTextField__Group__0");
-					put(grammarAccess.getUiSuggestTextFieldAccess().getGroup_2(), "rule__UiSuggestTextField__Group_2__0");
-					put(grammarAccess.getUiSuggestTextFieldAccess().getGroup_2_1_1(), "rule__UiSuggestTextField__Group_2_1_1__0");
-					put(grammarAccess.getUiSuggestTextFieldAccess().getGroup_4(), "rule__UiSuggestTextField__Group_4__0");
-					put(grammarAccess.getUiSuggestTextFieldAccess().getGroup_4_1_0(), "rule__UiSuggestTextField__Group_4_1_0__0");
-					put(grammarAccess.getUiSuggestTextFieldAccess().getGroup_4_1_1(), "rule__UiSuggestTextField__Group_4_1_1__0");
-					put(grammarAccess.getUiSuggestTextFieldAccess().getGroup_4_1_2(), "rule__UiSuggestTextField__Group_4_1_2__0");
-					put(grammarAccess.getUiSuggestTextFieldAccess().getGroup_4_1_3(), "rule__UiSuggestTextField__Group_4_1_3__0");
-					put(grammarAccess.getUiBeanReferenceFieldAccess().getGroup(), "rule__UiBeanReferenceField__Group__0");
-					put(grammarAccess.getUiBeanReferenceFieldAccess().getGroup_2(), "rule__UiBeanReferenceField__Group_2__0");
-					put(grammarAccess.getUiBeanReferenceFieldAccess().getGroup_2_1_1(), "rule__UiBeanReferenceField__Group_2_1_1__0");
-					put(grammarAccess.getUiBeanReferenceFieldAccess().getGroup_4(), "rule__UiBeanReferenceField__Group_4__0");
-					put(grammarAccess.getUiBeanReferenceFieldAccess().getGroup_4_1_0(), "rule__UiBeanReferenceField__Group_4_1_0__0");
-					put(grammarAccess.getUiBeanReferenceFieldAccess().getGroup_4_1_1(), "rule__UiBeanReferenceField__Group_4_1_1__0");
-					put(grammarAccess.getUiBeanReferenceFieldAccess().getGroup_4_1_2(), "rule__UiBeanReferenceField__Group_4_1_2__0");
-					put(grammarAccess.getUiBeanReferenceFieldAccess().getGroup_4_1_3(), "rule__UiBeanReferenceField__Group_4_1_3__0");
-					put(grammarAccess.getUiBeanReferenceFieldAccess().getGroup_4_1_4(), "rule__UiBeanReferenceField__Group_4_1_4__0");
-					put(grammarAccess.getUiBeanReferenceFieldAccess().getGroup_4_1_5(), "rule__UiBeanReferenceField__Group_4_1_5__0");
-					put(grammarAccess.getUiSearchFieldAccess().getGroup(), "rule__UiSearchField__Group__0");
-					put(grammarAccess.getUiSearchFieldAccess().getGroup_2(), "rule__UiSearchField__Group_2__0");
-					put(grammarAccess.getUiSearchFieldAccess().getGroup_2_1_1(), "rule__UiSearchField__Group_2_1_1__0");
-					put(grammarAccess.getUiTextAreaAccess().getGroup(), "rule__UiTextArea__Group__0");
-					put(grammarAccess.getUiTextAreaAccess().getGroup_2(), "rule__UiTextArea__Group_2__0");
-					put(grammarAccess.getUiTextAreaAccess().getGroup_2_1_2(), "rule__UiTextArea__Group_2_1_2__0");
-					put(grammarAccess.getUiTextAreaAccess().getGroup_4(), "rule__UiTextArea__Group_4__0");
-					put(grammarAccess.getUiDateFieldAccess().getGroup(), "rule__UiDateField__Group__0");
-					put(grammarAccess.getUiDateFieldAccess().getGroup_2(), "rule__UiDateField__Group_2__0");
-					put(grammarAccess.getUiDateFieldAccess().getGroup_2_1_2(), "rule__UiDateField__Group_2_1_2__0");
-					put(grammarAccess.getUiDateFieldAccess().getGroup_4(), "rule__UiDateField__Group_4__0");
-					put(grammarAccess.getUiBrowserAccess().getGroup(), "rule__UiBrowser__Group__0");
-					put(grammarAccess.getUiBrowserAccess().getGroup_2(), "rule__UiBrowser__Group_2__0");
-					put(grammarAccess.getUiBrowserAccess().getGroup_2_1_2(), "rule__UiBrowser__Group_2_1_2__0");
-					put(grammarAccess.getUiBrowserAccess().getGroup_4(), "rule__UiBrowser__Group_4__0");
-					put(grammarAccess.getUiProgressBarAccess().getGroup(), "rule__UiProgressBar__Group__0");
-					put(grammarAccess.getUiProgressBarAccess().getGroup_2(), "rule__UiProgressBar__Group_2__0");
-					put(grammarAccess.getUiProgressBarAccess().getGroup_2_1_1(), "rule__UiProgressBar__Group_2_1_1__0");
-					put(grammarAccess.getUiProgressBarAccess().getGroup_4(), "rule__UiProgressBar__Group_4__0");
-					put(grammarAccess.getUiImageAccess().getGroup(), "rule__UiImage__Group__0");
-					put(grammarAccess.getUiImageAccess().getGroup_2(), "rule__UiImage__Group_2__0");
-					put(grammarAccess.getUiImageAccess().getGroup_2_1_1(), "rule__UiImage__Group_2_1_1__0");
-					put(grammarAccess.getUiImageAccess().getGroup_4(), "rule__UiImage__Group_4__0");
-					put(grammarAccess.getUiImageAccess().getGroup_4_1(), "rule__UiImage__Group_4_1__0");
-					put(grammarAccess.getUiTableAccess().getGroup(), "rule__UiTable__Group__0");
-					put(grammarAccess.getUiTableAccess().getGroup_2(), "rule__UiTable__Group_2__0");
-					put(grammarAccess.getUiTableAccess().getGroup_2_1_1(), "rule__UiTable__Group_2_1_1__0");
-					put(grammarAccess.getUiTableAccess().getGroup_4(), "rule__UiTable__Group_4__0");
-					put(grammarAccess.getUiTableAccess().getGroup_4_1_0(), "rule__UiTable__Group_4_1_0__0");
-					put(grammarAccess.getUiTableAccess().getGroup_4_1_1(), "rule__UiTable__Group_4_1_1__0");
-					put(grammarAccess.getUiTableAccess().getGroup_4_1_2(), "rule__UiTable__Group_4_1_2__0");
-					put(grammarAccess.getUiTableAccess().getGroup_4_1_3(), "rule__UiTable__Group_4_1_3__0");
-					put(grammarAccess.getUiComboBoxAccess().getGroup(), "rule__UiComboBox__Group__0");
-					put(grammarAccess.getUiComboBoxAccess().getGroup_2(), "rule__UiComboBox__Group_2__0");
-					put(grammarAccess.getUiComboBoxAccess().getGroup_2_1_1(), "rule__UiComboBox__Group_2_1_1__0");
-					put(grammarAccess.getUiComboBoxAccess().getGroup_4(), "rule__UiComboBox__Group_4__0");
-					put(grammarAccess.getUiComboBoxAccess().getGroup_4_1_0(), "rule__UiComboBox__Group_4_1_0__0");
-					put(grammarAccess.getUiComboBoxAccess().getGroup_4_1_1(), "rule__UiComboBox__Group_4_1_1__0");
-					put(grammarAccess.getUiComboBoxAccess().getGroup_4_1_2(), "rule__UiComboBox__Group_4_1_2__0");
-					put(grammarAccess.getUiComboBoxAccess().getGroup_4_1_3(), "rule__UiComboBox__Group_4_1_3__0");
-					put(grammarAccess.getUiComboBoxAccess().getGroup_4_1_4(), "rule__UiComboBox__Group_4_1_4__0");
-					put(grammarAccess.getUiButtonAccess().getGroup(), "rule__UiButton__Group__0");
-					put(grammarAccess.getUiButtonAccess().getGroup_2(), "rule__UiButton__Group_2__0");
-					put(grammarAccess.getUiButtonAccess().getGroup_2_1_2(), "rule__UiButton__Group_2_1_2__0");
-					put(grammarAccess.getUiMobileNavigationButtonAccess().getGroup(), "rule__UiMobileNavigationButton__Group__0");
-					put(grammarAccess.getUiMobileNavigationButtonAccess().getGroup_2(), "rule__UiMobileNavigationButton__Group_2__0");
-					put(grammarAccess.getUiMobileNavigationButtonAccess().getGroup_2_1_2(), "rule__UiMobileNavigationButton__Group_2_1_2__0");
-					put(grammarAccess.getUiMobileNavigationButtonAccess().getGroup_4_1(), "rule__UiMobileNavigationButton__Group_4_1__0");
-					put(grammarAccess.getUiMobileSwitchAccess().getGroup(), "rule__UiMobileSwitch__Group__0");
-					put(grammarAccess.getUiMobileSwitchAccess().getGroup_2(), "rule__UiMobileSwitch__Group_2__0");
-					put(grammarAccess.getUiMobileSwitchAccess().getGroup_2_1_2(), "rule__UiMobileSwitch__Group_2_1_2__0");
-					put(grammarAccess.getUiMobileSwitchAccess().getGroup_4(), "rule__UiMobileSwitch__Group_4__0");
-					put(grammarAccess.getUiLabelAccess().getGroup(), "rule__UiLabel__Group__0");
-					put(grammarAccess.getUiLabelAccess().getGroup_2(), "rule__UiLabel__Group_2__0");
-					put(grammarAccess.getUiLabelAccess().getGroup_2_1_1(), "rule__UiLabel__Group_2_1_1__0");
-					put(grammarAccess.getUiLabelAccess().getGroup_4(), "rule__UiLabel__Group_4__0");
-					put(grammarAccess.getUiDecimalFieldAccess().getGroup(), "rule__UiDecimalField__Group__0");
-					put(grammarAccess.getUiDecimalFieldAccess().getGroup_2(), "rule__UiDecimalField__Group_2__0");
-					put(grammarAccess.getUiDecimalFieldAccess().getGroup_2_1_2(), "rule__UiDecimalField__Group_2_1_2__0");
-					put(grammarAccess.getUiDecimalFieldAccess().getGroup_2_1_3(), "rule__UiDecimalField__Group_2_1_3__0");
-					put(grammarAccess.getUiDecimalFieldAccess().getGroup_4(), "rule__UiDecimalField__Group_4__0");
-					put(grammarAccess.getUiOptionsGroupAccess().getGroup(), "rule__UiOptionsGroup__Group__0");
-					put(grammarAccess.getUiOptionsGroupAccess().getGroup_2(), "rule__UiOptionsGroup__Group_2__0");
-					put(grammarAccess.getUiOptionsGroupAccess().getGroup_2_1_1(), "rule__UiOptionsGroup__Group_2_1_1__0");
-					put(grammarAccess.getUiOptionsGroupAccess().getGroup_4(), "rule__UiOptionsGroup__Group_4__0");
-					put(grammarAccess.getUiOptionsGroupAccess().getGroup_4_1_0(), "rule__UiOptionsGroup__Group_4_1_0__0");
-					put(grammarAccess.getUiOptionsGroupAccess().getGroup_4_1_1(), "rule__UiOptionsGroup__Group_4_1_1__0");
-					put(grammarAccess.getUiOptionsGroupAccess().getGroup_4_1_2(), "rule__UiOptionsGroup__Group_4_1_2__0");
-					put(grammarAccess.getUiOptionsGroupAccess().getGroup_4_1_3(), "rule__UiOptionsGroup__Group_4_1_3__0");
-					put(grammarAccess.getUiOptionsGroupAccess().getGroup_4_1_4(), "rule__UiOptionsGroup__Group_4_1_4__0");
-					put(grammarAccess.getUiOptionsGroupAccess().getGroup_4_1_5(), "rule__UiOptionsGroup__Group_4_1_5__0");
-					put(grammarAccess.getUiListAccess().getGroup(), "rule__UiList__Group__0");
-					put(grammarAccess.getUiListAccess().getGroup_2(), "rule__UiList__Group_2__0");
-					put(grammarAccess.getUiListAccess().getGroup_2_1_1(), "rule__UiList__Group_2_1_1__0");
-					put(grammarAccess.getUiListAccess().getGroup_4(), "rule__UiList__Group_4__0");
-					put(grammarAccess.getUiListAccess().getGroup_4_1_0(), "rule__UiList__Group_4_1_0__0");
-					put(grammarAccess.getUiListAccess().getGroup_4_1_1(), "rule__UiList__Group_4_1_1__0");
-					put(grammarAccess.getUiListAccess().getGroup_4_1_2(), "rule__UiList__Group_4_1_2__0");
-					put(grammarAccess.getUiListAccess().getGroup_4_1_3(), "rule__UiList__Group_4_1_3__0");
-					put(grammarAccess.getUiListAccess().getGroup_4_1_4(), "rule__UiList__Group_4_1_4__0");
-					put(grammarAccess.getUiListAccess().getGroup_4_1_5(), "rule__UiList__Group_4_1_5__0");
-					put(grammarAccess.getUiColumnsAssignmentAccess().getGroup(), "rule__UiColumnsAssignment__Group__0");
-					put(grammarAccess.getUiSortOrderAssignmentAccess().getGroup(), "rule__UiSortOrderAssignment__Group__0");
-					put(grammarAccess.getUiSortOrderAccess().getGroup(), "rule__UiSortOrder__Group__0");
-					put(grammarAccess.getUiColumnAccess().getGroup(), "rule__UiColumn__Group__0");
-					put(grammarAccess.getUiColumnAccess().getGroup_3(), "rule__UiColumn__Group_3__0");
-					put(grammarAccess.getUiNumericFieldAccess().getGroup(), "rule__UiNumericField__Group__0");
-					put(grammarAccess.getUiNumericFieldAccess().getGroup_2(), "rule__UiNumericField__Group_2__0");
-					put(grammarAccess.getUiNumericFieldAccess().getGroup_2_1_1(), "rule__UiNumericField__Group_2_1_1__0");
-					put(grammarAccess.getUiNumericFieldAccess().getGroup_4(), "rule__UiNumericField__Group_4__0");
-					put(grammarAccess.getUiCheckBoxAccess().getGroup(), "rule__UiCheckBox__Group__0");
-					put(grammarAccess.getUiCheckBoxAccess().getGroup_2(), "rule__UiCheckBox__Group_2__0");
-					put(grammarAccess.getUiCheckBoxAccess().getGroup_2_1_2(), "rule__UiCheckBox__Group_2_1_2__0");
-					put(grammarAccess.getUiCheckBoxAccess().getGroup_4(), "rule__UiCheckBox__Group_4__0");
-					put(grammarAccess.getUiMaxLengthValidatorAccess().getGroup(), "rule__UiMaxLengthValidator__Group__0");
-					put(grammarAccess.getUiMinLengthValidatorAccess().getGroup(), "rule__UiMinLengthValidator__Group__0");
-					put(grammarAccess.getUiRegexpValidatorAccess().getGroup(), "rule__UiRegexpValidator__Group__0");
-					put(grammarAccess.getUiXbaseValidatorAccess().getGroup(), "rule__UiXbaseValidator__Group__0");
-					put(grammarAccess.getUiBeanValidationValidatorAccess().getGroup(), "rule__UiBeanValidationValidator__Group__0");
-					put(grammarAccess.getUiErrorCodeAccess().getGroup(), "rule__UiErrorCode__Group__0");
-					put(grammarAccess.getUiVisibilityProcessorAccess().getGroup(), "rule__UiVisibilityProcessor__Group__0");
-					put(grammarAccess.getUiChangeTriggerAccess().getGroup(), "rule__UiChangeTrigger__Group__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.getXImportDeclarationAccess().getGroup(), "rule__XImportDeclaration__Group__0");
-					put(grammarAccess.getXImportDeclarationAccess().getGroup_1_0(), "rule__XImportDeclaration__Group_1_0__0");
-					put(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup(), "rule__QualifiedNameInStaticImport__Group__0");
-					put(grammarAccess.getUiModelAccess().getPackageNameAssignment_1(), "rule__UiModel__PackageNameAssignment_1");
-					put(grammarAccess.getUiModelAccess().getImportsAssignment_2(), "rule__UiModel__ImportsAssignment_2");
-					put(grammarAccess.getUiModelAccess().getRootsAssignment_3(), "rule__UiModel__RootsAssignment_3");
-					put(grammarAccess.getUiImportsAccess().getImportedNamespaceAssignment_1(), "rule__UiImports__ImportedNamespaceAssignment_1");
-					put(grammarAccess.getUiValidatorAliasAccess().getValidatorAssignment_1(), "rule__UiValidatorAlias__ValidatorAssignment_1");
-					put(grammarAccess.getUiValidatorAliasAccess().getAliasAssignment_3(), "rule__UiValidatorAlias__AliasAssignment_3");
-					put(grammarAccess.getUiValidatorAssignmentAccess().getFieldAssignment_1(), "rule__UiValidatorAssignment__FieldAssignment_1");
-					put(grammarAccess.getUiValidatorAssignmentAccess().getValidatorDefAssignment_3_0(), "rule__UiValidatorAssignment__ValidatorDefAssignment_3_0");
-					put(grammarAccess.getUiValidatorAssignmentAccess().getValidatorAliasAssignment_3_1_0(), "rule__UiValidatorAssignment__ValidatorAliasAssignment_3_1_0");
-					put(grammarAccess.getUiValidatorDefAccess().getValidatorAssignment(), "rule__UiValidatorDef__ValidatorAssignment");
-					put(grammarAccess.getUiViewSetAccess().getNameAssignment_1(), "rule__UiViewSet__NameAssignment_1");
-					put(grammarAccess.getUiViewSetAccess().getBeanSlotsAssignment_3(), "rule__UiViewSet__BeanSlotsAssignment_3");
-					put(grammarAccess.getUiViewSetAccess().getBindingEndpointAliasAssignment_4(), "rule__UiViewSet__BindingEndpointAliasAssignment_4");
-					put(grammarAccess.getUiBindingEndpointAliasAccess().getEndpointAssignment_1(), "rule__UiBindingEndpointAlias__EndpointAssignment_1");
-					put(grammarAccess.getUiBindingEndpointAliasAccess().getAliasAssignment_3(), "rule__UiBindingEndpointAlias__AliasAssignment_3");
-					put(grammarAccess.getUiBeanSlotAccess().getNameAssignment_1(), "rule__UiBeanSlot__NameAssignment_1");
-					put(grammarAccess.getUiBeanSlotAccess().getJvmTypeAssignment_3(), "rule__UiBeanSlot__JvmTypeAssignment_3");
-					put(grammarAccess.getUiBeanSlotAccess().getEventTopicAssignment_4_1(), "rule__UiBeanSlot__EventTopicAssignment_4_1");
-					put(grammarAccess.getUiBindingAccess().getListBindingAssignment_1(), "rule__UiBinding__ListBindingAssignment_1");
-					put(grammarAccess.getUiBindingAccess().getSourceAssignment_2(), "rule__UiBinding__SourceAssignment_2");
-					put(grammarAccess.getUiBindingAccess().getTargetToSourceAssignment_3_0(), "rule__UiBinding__TargetToSourceAssignment_3_0");
-					put(grammarAccess.getUiBindingAccess().getSourceToTargetAssignment_3_2(), "rule__UiBinding__SourceToTargetAssignment_3_2");
-					put(grammarAccess.getUiBindingAccess().getTargetAssignment_4(), "rule__UiBinding__TargetAssignment_4");
-					put(grammarAccess.getUiBindingEndpointAssignmentAccess().getPathAssignment_0_2(), "rule__UiBindingEndpointAssignment__PathAssignment_0_2");
-					put(grammarAccess.getUiBindingEndpointAssignmentAccess().getTypedBindableAliasAssignment_2_1(), "rule__UiBindingEndpointAssignment__TypedBindableAliasAssignment_2_1");
-					put(grammarAccess.getUiBindingEndpointAssignmentAccess().getPathAssignment_2_2(), "rule__UiBindingEndpointAssignment__PathAssignment_2_2");
-					put(grammarAccess.getUiPathSegmentAccess().getGetterAssignment_2(), "rule__UiPathSegment__GetterAssignment_2");
-					put(grammarAccess.getUiPathSegmentAccess().getPathAssignment_3(), "rule__UiPathSegment__PathAssignment_3");
-					put(grammarAccess.getUiNestedPropertyAccess().getGetterAssignment_1(), "rule__UiNestedProperty__GetterAssignment_1");
-					put(grammarAccess.getUiNestedPropertyAccess().getPathAssignment_2(), "rule__UiNestedProperty__PathAssignment_2");
-					put(grammarAccess.getUiTypedBindableDefAccess().getRawBindableAssignment_1_1(), "rule__UiTypedBindableDef__RawBindableAssignment_1_1");
-					put(grammarAccess.getUiTypedBindableDefAccess().getRawBindablePathAssignment_1_2(), "rule__UiTypedBindableDef__RawBindablePathAssignment_1_2");
-					put(grammarAccess.getUiTypedBindableDefAccess().getMethodAssignment_1_5(), "rule__UiTypedBindableDef__MethodAssignment_1_5");
-					put(grammarAccess.getUiTypedBindableRawTypeAccess().getRawBindableAssignment_2(), "rule__UiTypedBindableRawType__RawBindableAssignment_2");
-					put(grammarAccess.getUiTypedBindableRawTypeAccess().getRawBindablePathAssignment_3(), "rule__UiTypedBindableRawType__RawBindablePathAssignment_3");
-					put(grammarAccess.getUiTypedBindableRawTypeAliasAccess().getTypeAssignment_1(), "rule__UiTypedBindableRawTypeAlias__TypeAssignment_1");
-					put(grammarAccess.getUiTypedBindableRawTypeAliasAccess().getAliasAssignment_3(), "rule__UiTypedBindableRawTypeAlias__AliasAssignment_3");
-					put(grammarAccess.getUiRawBindablePathSegmentAccess().getToParentAssignment_1_1(), "rule__UiRawBindablePathSegment__ToParentAssignment_1_1");
-					put(grammarAccess.getUiRawBindablePathSegmentAccess().getRawBindableAssignment_2(), "rule__UiRawBindablePathSegment__RawBindableAssignment_2");
-					put(grammarAccess.getUiRawBindablePathSegmentAccess().getPathAssignment_3(), "rule__UiRawBindablePathSegment__PathAssignment_3");
-					put(grammarAccess.getUiCommandBindableDefAccess().getCommandAssignment_1(), "rule__UiCommandBindableDef__CommandAssignment_1");
-					put(grammarAccess.getUiMobileNavigationCommandAccess().getTargetPageAssignment_2(), "rule__UiMobileNavigationCommand__TargetPageAssignment_2");
-					put(grammarAccess.getUiOpenDialogCommandAccess().getDialogAssignment_2(), "rule__UiOpenDialogCommand__DialogAssignment_2");
-					put(grammarAccess.getUiSearchWithDialogCommandAccess().getDialogAssignment_2(), "rule__UiSearchWithDialogCommand__DialogAssignment_2");
-					put(grammarAccess.getUiAddToTableCommandAccess().getTableAssignment_2(), "rule__UiAddToTableCommand__TableAssignment_2");
-					put(grammarAccess.getUiRemoveFromTableCommandAccess().getTableAssignment_2(), "rule__UiRemoveFromTableCommand__TableAssignment_2");
-					put(grammarAccess.getUiSetNewInstanceCommandAccess().getJvmTypeAssignment_2_1(), "rule__UiSetNewInstanceCommand__JvmTypeAssignment_2_1");
-					put(grammarAccess.getUiSetNewInstanceCommandAccess().getTargetAssignment_3_1(), "rule__UiSetNewInstanceCommand__TargetAssignment_3_1");
-					put(grammarAccess.getUiSendEventCommandAccess().getNoAutoTriggerAssignment_3(), "rule__UiSendEventCommand__NoAutoTriggerAssignment_3");
-					put(grammarAccess.getUiSendEventCommandAccess().getEventTopicAssignment_4(), "rule__UiSendEventCommand__EventTopicAssignment_4");
-					put(grammarAccess.getUiIDEViewAccess().getNameAssignment_1(), "rule__UiIDEView__NameAssignment_1");
-					put(grammarAccess.getUiIDEViewAccess().getSharedStateGroupAssignment_3_0_1(), "rule__UiIDEView__SharedStateGroupAssignment_3_0_1");
-					put(grammarAccess.getUiIDEViewAccess().getViewCategoryAssignment_3_1_1(), "rule__UiIDEView__ViewCategoryAssignment_3_1_1");
-					put(grammarAccess.getUiIDEViewAccess().getJvmTypeAssignment_3_2_1(), "rule__UiIDEView__JvmTypeAssignment_3_2_1");
-					put(grammarAccess.getUiIDEViewAccess().getExposedActionsAssignment_3_3_2(), "rule__UiIDEView__ExposedActionsAssignment_3_3_2");
-					put(grammarAccess.getUiIDEViewAccess().getBeanSlotsAssignment_4_0(), "rule__UiIDEView__BeanSlotsAssignment_4_0");
-					put(grammarAccess.getUiIDEViewAccess().getBindingEndpointAliasAssignment_4_1(), "rule__UiIDEView__BindingEndpointAliasAssignment_4_1");
-					put(grammarAccess.getUiIDEViewAccess().getBindingsAssignment_4_2(), "rule__UiIDEView__BindingsAssignment_4_2");
-					put(grammarAccess.getUiIDEViewAccess().getContentAssignment_5(), "rule__UiIDEView__ContentAssignment_5");
-					put(grammarAccess.getUiIDEViewAccess().getContentAlignmentAssignment_6_1(), "rule__UiIDEView__ContentAlignmentAssignment_6_1");
-					put(grammarAccess.getUiIDEViewAccess().getBindingEndpointAliasAssignment_7_0(), "rule__UiIDEView__BindingEndpointAliasAssignment_7_0");
-					put(grammarAccess.getUiIDEViewAccess().getBindingsAssignment_7_1(), "rule__UiIDEView__BindingsAssignment_7_1");
-					put(grammarAccess.getUiIDEViewAccess().getValidatorAssignmentsAssignment_7_2(), "rule__UiIDEView__ValidatorAssignmentsAssignment_7_2");
-					put(grammarAccess.getUiIDEViewAccess().getProcessorAssignmentsAssignment_7_3(), "rule__UiIDEView__ProcessorAssignmentsAssignment_7_3");
-					put(grammarAccess.getUiExposedActionAccess().getNameAssignment_0(), "rule__UiExposedAction__NameAssignment_0");
-					put(grammarAccess.getUiExposedActionAccess().getIconNameAssignment_1_1(), "rule__UiExposedAction__IconNameAssignment_1_1");
-					put(grammarAccess.getUiExposedActionAccess().getActionReferenceAssignment_3_0(), "rule__UiExposedAction__ActionReferenceAssignment_3_0");
-					put(grammarAccess.getUiExposedActionAccess().getActionIDAssignment_3_1(), "rule__UiExposedAction__ActionIDAssignment_3_1");
-					put(grammarAccess.getUiExposedActionAccess().getCheckDirtyAssignment_4(), "rule__UiExposedAction__CheckDirtyAssignment_4");
-					put(grammarAccess.getUiExposedActionAccess().getExternalCommandIdAssignment_5_1(), "rule__UiExposedAction__ExternalCommandIdAssignment_5_1");
-					put(grammarAccess.getUiMobileNavBarActionAccess().getNameAssignment_0(), "rule__UiMobileNavBarAction__NameAssignment_0");
-					put(grammarAccess.getUiMobileNavBarActionAccess().getIconNameAssignment_1_1(), "rule__UiMobileNavBarAction__IconNameAssignment_1_1");
-					put(grammarAccess.getUiMobileNavBarActionAccess().getActionReferenceAssignment_3_0(), "rule__UiMobileNavBarAction__ActionReferenceAssignment_3_0");
-					put(grammarAccess.getUiMobileNavBarActionAccess().getActionIDAssignment_3_1(), "rule__UiMobileNavBarAction__ActionIDAssignment_3_1");
-					put(grammarAccess.getUiMobileViewAccess().getNameAssignment_1(), "rule__UiMobileView__NameAssignment_1");
-					put(grammarAccess.getUiMobileViewAccess().getSharedStateGroupAssignment_3_0_1(), "rule__UiMobileView__SharedStateGroupAssignment_3_0_1");
-					put(grammarAccess.getUiMobileViewAccess().getJvmTypeAssignment_3_1_1(), "rule__UiMobileView__JvmTypeAssignment_3_1_1");
-					put(grammarAccess.getUiMobileViewAccess().getBeanSlotsAssignment_4_0(), "rule__UiMobileView__BeanSlotsAssignment_4_0");
-					put(grammarAccess.getUiMobileViewAccess().getBindingEndpointAliasAssignment_4_1(), "rule__UiMobileView__BindingEndpointAliasAssignment_4_1");
-					put(grammarAccess.getUiMobileViewAccess().getContentAssignment_5(), "rule__UiMobileView__ContentAssignment_5");
-					put(grammarAccess.getUiMobileViewAccess().getContentAlignmentAssignment_6_1(), "rule__UiMobileView__ContentAlignmentAssignment_6_1");
-					put(grammarAccess.getUiMobileViewAccess().getBindingEndpointAliasAssignment_7_0(), "rule__UiMobileView__BindingEndpointAliasAssignment_7_0");
-					put(grammarAccess.getUiMobileViewAccess().getBindingsAssignment_7_1(), "rule__UiMobileView__BindingsAssignment_7_1");
-					put(grammarAccess.getUiMobileViewAccess().getValidatorAssignmentsAssignment_7_2(), "rule__UiMobileView__ValidatorAssignmentsAssignment_7_2");
-					put(grammarAccess.getUiMobileViewAccess().getProcessorAssignmentsAssignment_7_3(), "rule__UiMobileView__ProcessorAssignmentsAssignment_7_3");
-					put(grammarAccess.getUiI18nInfoAccess().getKeyAssignment_1(), "rule__UiI18nInfo__KeyAssignment_1");
-					put(grammarAccess.getUiGridLayoutAccess().getColumnsAssignment_2_1_0_1(), "rule__UiGridLayout__ColumnsAssignment_2_1_0_1");
-					put(grammarAccess.getUiGridLayoutAccess().getI18nInfoAssignment_2_1_1(), "rule__UiGridLayout__I18nInfoAssignment_2_1_1");
-					put(grammarAccess.getUiGridLayoutAccess().getStylesAssignment_2_1_2_1(), "rule__UiGridLayout__StylesAssignment_2_1_2_1");
-					put(grammarAccess.getUiGridLayoutAccess().getReadonlyAssignment_2_1_3(), "rule__UiGridLayout__ReadonlyAssignment_2_1_3");
-					put(grammarAccess.getUiGridLayoutAccess().getNameAssignment_3(), "rule__UiGridLayout__NameAssignment_3");
-					put(grammarAccess.getUiGridLayoutAccess().getContentsAssignment_5(), "rule__UiGridLayout__ContentsAssignment_5");
-					put(grammarAccess.getUiGridLayoutAccess().getBindingsAssignment_6(), "rule__UiGridLayout__BindingsAssignment_6");
-					put(grammarAccess.getUiGridLayoutAccess().getProcessorAssignmentsAssignment_7(), "rule__UiGridLayout__ProcessorAssignmentsAssignment_7");
-					put(grammarAccess.getUiVisibilityProcessorAssignmentAccess().getProcessorAssignment_1(), "rule__UiVisibilityProcessorAssignment__ProcessorAssignment_1");
-					put(grammarAccess.getUiGridLayoutAssigmentAccess().getElementAssignment_0(), "rule__UiGridLayoutAssigment__ElementAssignment_0");
-					put(grammarAccess.getUiGridLayoutAssigmentAccess().getAlignmentAssignment_1_1(), "rule__UiGridLayoutAssigment__AlignmentAssignment_1_1");
-					put(grammarAccess.getUiFormLayoutAccess().getI18nInfoAssignment_2_0_1(), "rule__UiFormLayout__I18nInfoAssignment_2_0_1");
-					put(grammarAccess.getUiFormLayoutAccess().getStylesAssignment_2_1_1(), "rule__UiFormLayout__StylesAssignment_2_1_1");
-					put(grammarAccess.getUiFormLayoutAccess().getReadonlyAssignment_2_2_0(), "rule__UiFormLayout__ReadonlyAssignment_2_2_0");
-					put(grammarAccess.getUiFormLayoutAccess().getNameAssignment_3(), "rule__UiFormLayout__NameAssignment_3");
-					put(grammarAccess.getUiFormLayoutAccess().getContentsAssignment_5(), "rule__UiFormLayout__ContentsAssignment_5");
-					put(grammarAccess.getUiFormLayoutAccess().getBindingsAssignment_6(), "rule__UiFormLayout__BindingsAssignment_6");
-					put(grammarAccess.getUiFormLayoutAccess().getProcessorAssignmentsAssignment_7(), "rule__UiFormLayout__ProcessorAssignmentsAssignment_7");
-					put(grammarAccess.getUiFormLayoutAssigmentAccess().getElementAssignment(), "rule__UiFormLayoutAssigment__ElementAssignment");
-					put(grammarAccess.getUiVerticalLayoutAccess().getI18nInfoAssignment_2_0_1(), "rule__UiVerticalLayout__I18nInfoAssignment_2_0_1");
-					put(grammarAccess.getUiVerticalLayoutAccess().getStylesAssignment_2_1_1(), "rule__UiVerticalLayout__StylesAssignment_2_1_1");
-					put(grammarAccess.getUiVerticalLayoutAccess().getReadonlyAssignment_2_2_0(), "rule__UiVerticalLayout__ReadonlyAssignment_2_2_0");
-					put(grammarAccess.getUiVerticalLayoutAccess().getNameAssignment_3(), "rule__UiVerticalLayout__NameAssignment_3");
-					put(grammarAccess.getUiVerticalLayoutAccess().getContentsAssignment_5(), "rule__UiVerticalLayout__ContentsAssignment_5");
-					put(grammarAccess.getUiVerticalLayoutAccess().getBindingsAssignment_6(), "rule__UiVerticalLayout__BindingsAssignment_6");
-					put(grammarAccess.getUiVerticalLayoutAccess().getProcessorAssignmentsAssignment_7(), "rule__UiVerticalLayout__ProcessorAssignmentsAssignment_7");
-					put(grammarAccess.getUiVerticalLayoutAssigmentAccess().getElementAssignment_0(), "rule__UiVerticalLayoutAssigment__ElementAssignment_0");
-					put(grammarAccess.getUiVerticalLayoutAssigmentAccess().getAlignmentAssignment_1_1(), "rule__UiVerticalLayoutAssigment__AlignmentAssignment_1_1");
-					put(grammarAccess.getUiMobileVerticalLayoutAccess().getI18nInfoAssignment_2_0_1(), "rule__UiMobileVerticalLayout__I18nInfoAssignment_2_0_1");
-					put(grammarAccess.getUiMobileVerticalLayoutAccess().getStylesAssignment_2_1_1(), "rule__UiMobileVerticalLayout__StylesAssignment_2_1_1");
-					put(grammarAccess.getUiMobileVerticalLayoutAccess().getReadonlyAssignment_2_2_0(), "rule__UiMobileVerticalLayout__ReadonlyAssignment_2_2_0");
-					put(grammarAccess.getUiMobileVerticalLayoutAccess().getNameAssignment_3(), "rule__UiMobileVerticalLayout__NameAssignment_3");
-					put(grammarAccess.getUiMobileVerticalLayoutAccess().getContentsAssignment_5(), "rule__UiMobileVerticalLayout__ContentsAssignment_5");
-					put(grammarAccess.getUiMobileVerticalLayoutAccess().getBindingsAssignment_6(), "rule__UiMobileVerticalLayout__BindingsAssignment_6");
-					put(grammarAccess.getUiMobileVerticalLayoutAccess().getProcessorAssignmentsAssignment_7(), "rule__UiMobileVerticalLayout__ProcessorAssignmentsAssignment_7");
-					put(grammarAccess.getUiMobileVerticalLayoutAssigmentAccess().getElementAssignment_0(), "rule__UiMobileVerticalLayoutAssigment__ElementAssignment_0");
-					put(grammarAccess.getUiMobileVerticalLayoutAssigmentAccess().getAlignmentAssignment_1_1(), "rule__UiMobileVerticalLayoutAssigment__AlignmentAssignment_1_1");
-					put(grammarAccess.getUiMobileNavigationRootAccess().getNameAssignment_2(), "rule__UiMobileNavigationRoot__NameAssignment_2");
-					put(grammarAccess.getUiMobileNavigationRootAccess().getContentsAssignment_4(), "rule__UiMobileNavigationRoot__ContentsAssignment_4");
-					put(grammarAccess.getUiMobileNavigationRootAssigmentAccess().getElementAssignment(), "rule__UiMobileNavigationRootAssigment__ElementAssignment");
-					put(grammarAccess.getUiHorizontalLayoutAccess().getI18nInfoAssignment_2_0_1(), "rule__UiHorizontalLayout__I18nInfoAssignment_2_0_1");
-					put(grammarAccess.getUiHorizontalLayoutAccess().getReadonlyAssignment_2_1(), "rule__UiHorizontalLayout__ReadonlyAssignment_2_1");
-					put(grammarAccess.getUiHorizontalLayoutAccess().getStylesAssignment_2_2_0_1(), "rule__UiHorizontalLayout__StylesAssignment_2_2_0_1");
-					put(grammarAccess.getUiHorizontalLayoutAccess().getNameAssignment_3(), "rule__UiHorizontalLayout__NameAssignment_3");
-					put(grammarAccess.getUiHorizontalLayoutAccess().getContentsAssignment_5(), "rule__UiHorizontalLayout__ContentsAssignment_5");
-					put(grammarAccess.getUiHorizontalLayoutAccess().getBindingsAssignment_6(), "rule__UiHorizontalLayout__BindingsAssignment_6");
-					put(grammarAccess.getUiHorizontalLayoutAccess().getProcessorAssignmentsAssignment_7(), "rule__UiHorizontalLayout__ProcessorAssignmentsAssignment_7");
-					put(grammarAccess.getUiHorizontalLayoutAssigmentAccess().getElementAssignment_0(), "rule__UiHorizontalLayoutAssigment__ElementAssignment_0");
-					put(grammarAccess.getUiHorizontalLayoutAssigmentAccess().getAlignmentAssignment_1_1(), "rule__UiHorizontalLayoutAssigment__AlignmentAssignment_1_1");
-					put(grammarAccess.getUiMobileHorizontalLayoutAccess().getI18nInfoAssignment_2_0_1(), "rule__UiMobileHorizontalLayout__I18nInfoAssignment_2_0_1");
-					put(grammarAccess.getUiMobileHorizontalLayoutAccess().getStylesAssignment_2_1_1(), "rule__UiMobileHorizontalLayout__StylesAssignment_2_1_1");
-					put(grammarAccess.getUiMobileHorizontalLayoutAccess().getReadonlyAssignment_2_2_0(), "rule__UiMobileHorizontalLayout__ReadonlyAssignment_2_2_0");
-					put(grammarAccess.getUiMobileHorizontalLayoutAccess().getNameAssignment_3(), "rule__UiMobileHorizontalLayout__NameAssignment_3");
-					put(grammarAccess.getUiMobileHorizontalLayoutAccess().getContentsAssignment_5(), "rule__UiMobileHorizontalLayout__ContentsAssignment_5");
-					put(grammarAccess.getUiMobileHorizontalLayoutAccess().getBindingsAssignment_6(), "rule__UiMobileHorizontalLayout__BindingsAssignment_6");
-					put(grammarAccess.getUiMobileHorizontalLayoutAccess().getProcessorAssignmentsAssignment_7(), "rule__UiMobileHorizontalLayout__ProcessorAssignmentsAssignment_7");
-					put(grammarAccess.getUiMobileHorizontalLayoutAssigmentAccess().getElementAssignment_0(), "rule__UiMobileHorizontalLayoutAssigment__ElementAssignment_0");
-					put(grammarAccess.getUiMobileHorizontalLayoutAssigmentAccess().getAlignmentAssignment_1_1(), "rule__UiMobileHorizontalLayoutAssigment__AlignmentAssignment_1_1");
-					put(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getI18nInfoAssignment_2_1_0(), "rule__UiMobileHorizontalButtonGroup__I18nInfoAssignment_2_1_0");
-					put(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getStylesAssignment_2_1_1_1(), "rule__UiMobileHorizontalButtonGroup__StylesAssignment_2_1_1_1");
-					put(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getReadonlyAssignment_2_1_2(), "rule__UiMobileHorizontalButtonGroup__ReadonlyAssignment_2_1_2");
-					put(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getNameAssignment_3(), "rule__UiMobileHorizontalButtonGroup__NameAssignment_3");
-					put(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getContentsAssignment_5(), "rule__UiMobileHorizontalButtonGroup__ContentsAssignment_5");
-					put(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getBindingsAssignment_6(), "rule__UiMobileHorizontalButtonGroup__BindingsAssignment_6");
-					put(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getProcessorAssignmentsAssignment_7(), "rule__UiMobileHorizontalButtonGroup__ProcessorAssignmentsAssignment_7");
-					put(grammarAccess.getUiMobileHorizontalButtonGroupAssigmentAccess().getElementAssignment(), "rule__UiMobileHorizontalButtonGroupAssigment__ElementAssignment");
-					put(grammarAccess.getUiMobileVerticalComponentGroupAccess().getI18nInfoAssignment_2_1_0(), "rule__UiMobileVerticalComponentGroup__I18nInfoAssignment_2_1_0");
-					put(grammarAccess.getUiMobileVerticalComponentGroupAccess().getReadonlyAssignment_2_1_1(), "rule__UiMobileVerticalComponentGroup__ReadonlyAssignment_2_1_1");
-					put(grammarAccess.getUiMobileVerticalComponentGroupAccess().getStylesAssignment_2_1_2_1(), "rule__UiMobileVerticalComponentGroup__StylesAssignment_2_1_2_1");
-					put(grammarAccess.getUiMobileVerticalComponentGroupAccess().getNameAssignment_3(), "rule__UiMobileVerticalComponentGroup__NameAssignment_3");
-					put(grammarAccess.getUiMobileVerticalComponentGroupAccess().getContentsAssignment_5(), "rule__UiMobileVerticalComponentGroup__ContentsAssignment_5");
-					put(grammarAccess.getUiMobileVerticalComponentGroupAccess().getBindingsAssignment_6(), "rule__UiMobileVerticalComponentGroup__BindingsAssignment_6");
-					put(grammarAccess.getUiMobileVerticalComponentGroupAccess().getProcessorAssignmentsAssignment_7(), "rule__UiMobileVerticalComponentGroup__ProcessorAssignmentsAssignment_7");
-					put(grammarAccess.getUiMobileVerticalComponentGroupAssigmentAccess().getElementAssignment(), "rule__UiMobileVerticalComponentGroupAssigment__ElementAssignment");
-					put(grammarAccess.getUiSearchPanelAccess().getI18nInfoAssignment_2_1_0(), "rule__UiSearchPanel__I18nInfoAssignment_2_1_0");
-					put(grammarAccess.getUiSearchPanelAccess().getStylesAssignment_2_1_1_1(), "rule__UiSearchPanel__StylesAssignment_2_1_1_1");
-					put(grammarAccess.getUiSearchPanelAccess().getNameAssignment_3(), "rule__UiSearchPanel__NameAssignment_3");
-					put(grammarAccess.getUiSearchPanelAccess().getJvmTypeAssignment_6(), "rule__UiSearchPanel__JvmTypeAssignment_6");
-					put(grammarAccess.getUiSearchPanelAccess().getContentsAssignment_8(), "rule__UiSearchPanel__ContentsAssignment_8");
-					put(grammarAccess.getUiSearchPanelAccess().getBindingsAssignment_9(), "rule__UiSearchPanel__BindingsAssignment_9");
-					put(grammarAccess.getUiSearchPanelAccess().getProcessorAssignmentsAssignment_10(), "rule__UiSearchPanel__ProcessorAssignmentsAssignment_10");
-					put(grammarAccess.getUiMobileSearchPanelAccess().getI18nInfoAssignment_2_1_0(), "rule__UiMobileSearchPanel__I18nInfoAssignment_2_1_0");
-					put(grammarAccess.getUiMobileSearchPanelAccess().getStylesAssignment_2_1_1_1(), "rule__UiMobileSearchPanel__StylesAssignment_2_1_1_1");
-					put(grammarAccess.getUiMobileSearchPanelAccess().getNameAssignment_3(), "rule__UiMobileSearchPanel__NameAssignment_3");
-					put(grammarAccess.getUiMobileSearchPanelAccess().getJvmTypeAssignment_6(), "rule__UiMobileSearchPanel__JvmTypeAssignment_6");
-					put(grammarAccess.getUiMobileSearchPanelAccess().getContentsAssignment_8(), "rule__UiMobileSearchPanel__ContentsAssignment_8");
-					put(grammarAccess.getUiMobileSearchPanelAccess().getBindingsAssignment_9(), "rule__UiMobileSearchPanel__BindingsAssignment_9");
-					put(grammarAccess.getUiMobileSearchPanelAccess().getProcessorAssignmentsAssignment_10(), "rule__UiMobileSearchPanel__ProcessorAssignmentsAssignment_10");
-					put(grammarAccess.getUiMobileTabSheetAccess().getI18nInfoAssignment_2_1_0(), "rule__UiMobileTabSheet__I18nInfoAssignment_2_1_0");
-					put(grammarAccess.getUiMobileTabSheetAccess().getStylesAssignment_2_1_1_1(), "rule__UiMobileTabSheet__StylesAssignment_2_1_1_1");
-					put(grammarAccess.getUiMobileTabSheetAccess().getNameAssignment_3(), "rule__UiMobileTabSheet__NameAssignment_3");
-					put(grammarAccess.getUiMobileTabSheetAccess().getTabsAssignment_5(), "rule__UiMobileTabSheet__TabsAssignment_5");
-					put(grammarAccess.getUiMobileTabSheetAccess().getBindingsAssignment_6(), "rule__UiMobileTabSheet__BindingsAssignment_6");
-					put(grammarAccess.getUiMobileTabSheetAccess().getProcessorAssignmentsAssignment_7(), "rule__UiMobileTabSheet__ProcessorAssignmentsAssignment_7");
-					put(grammarAccess.getUiMobileTabAssignmentAccess().getNameAssignment_1(), "rule__UiMobileTabAssignment__NameAssignment_1");
-					put(grammarAccess.getUiMobileTabAssignmentAccess().getElementAssignment_2(), "rule__UiMobileTabAssignment__ElementAssignment_2");
-					put(grammarAccess.getUiTabSheetAccess().getI18nInfoAssignment_2_1_0(), "rule__UiTabSheet__I18nInfoAssignment_2_1_0");
-					put(grammarAccess.getUiTabSheetAccess().getStylesAssignment_2_1_1_1(), "rule__UiTabSheet__StylesAssignment_2_1_1_1");
-					put(grammarAccess.getUiTabSheetAccess().getNameAssignment_3(), "rule__UiTabSheet__NameAssignment_3");
-					put(grammarAccess.getUiTabSheetAccess().getTabsAssignment_5(), "rule__UiTabSheet__TabsAssignment_5");
-					put(grammarAccess.getUiTabSheetAccess().getBindingsAssignment_6(), "rule__UiTabSheet__BindingsAssignment_6");
-					put(grammarAccess.getUiTabSheetAccess().getProcessorAssignmentsAssignment_7(), "rule__UiTabSheet__ProcessorAssignmentsAssignment_7");
-					put(grammarAccess.getUiTabAssignmentAccess().getNameAssignment_1(), "rule__UiTabAssignment__NameAssignment_1");
-					put(grammarAccess.getUiTabAssignmentAccess().getElementAssignment_2(), "rule__UiTabAssignment__ElementAssignment_2");
-					put(grammarAccess.getUiSplitpanelAccess().getI18nInfoAssignment_1_0_1(), "rule__UiSplitpanel__I18nInfoAssignment_1_0_1");
-					put(grammarAccess.getUiSplitpanelAccess().getStylesAssignment_1_1_0_1(), "rule__UiSplitpanel__StylesAssignment_1_1_0_1");
-					put(grammarAccess.getUiSplitpanelAccess().getNameAssignment_2(), "rule__UiSplitpanel__NameAssignment_2");
-					put(grammarAccess.getUiSplitpanelAccess().getFirstContentAssignment_4_0_1(), "rule__UiSplitpanel__FirstContentAssignment_4_0_1");
-					put(grammarAccess.getUiSplitpanelAccess().getSecondContentAssignment_4_1_1(), "rule__UiSplitpanel__SecondContentAssignment_4_1_1");
-					put(grammarAccess.getUiSplitpanelAccess().getSplitPositionAssignment_4_2_1(), "rule__UiSplitpanel__SplitPositionAssignment_4_2_1");
-					put(grammarAccess.getUiSplitpanelAccess().getReadonlyAssignment_4_3(), "rule__UiSplitpanel__ReadonlyAssignment_4_3");
-					put(grammarAccess.getUiSplitpanelAccess().getBindingsAssignment_5(), "rule__UiSplitpanel__BindingsAssignment_5");
-					put(grammarAccess.getUiSplitpanelAccess().getProcessorAssignmentsAssignment_6(), "rule__UiSplitpanel__ProcessorAssignmentsAssignment_6");
-					put(grammarAccess.getUiSplitpanelAssigmentAccess().getElementAssignment(), "rule__UiSplitpanelAssigment__ElementAssignment");
-					put(grammarAccess.getUiPanelAccess().getI18nInfoAssignment_1_1_0(), "rule__UiPanel__I18nInfoAssignment_1_1_0");
-					put(grammarAccess.getUiPanelAccess().getReadonlyAssignment_1_1_1(), "rule__UiPanel__ReadonlyAssignment_1_1_1");
-					put(grammarAccess.getUiPanelAccess().getStylesAssignment_1_1_2_1(), "rule__UiPanel__StylesAssignment_1_1_2_1");
-					put(grammarAccess.getUiPanelAccess().getNameAssignment_2(), "rule__UiPanel__NameAssignment_2");
-					put(grammarAccess.getUiPanelAccess().getContentAssignment_5(), "rule__UiPanel__ContentAssignment_5");
-					put(grammarAccess.getUiPanelAccess().getBindingsAssignment_6(), "rule__UiPanel__BindingsAssignment_6");
-					put(grammarAccess.getUiPanelAccess().getProcessorAssignmentsAssignment_7(), "rule__UiPanel__ProcessorAssignmentsAssignment_7");
-					put(grammarAccess.getUiDialogAccess().getI18nInfoAssignment_2_1_0(), "rule__UiDialog__I18nInfoAssignment_2_1_0");
-					put(grammarAccess.getUiDialogAccess().getStylesAssignment_2_1_1_1(), "rule__UiDialog__StylesAssignment_2_1_1_1");
-					put(grammarAccess.getUiDialogAccess().getNameAssignment_3(), "rule__UiDialog__NameAssignment_3");
-					put(grammarAccess.getUiDialogAccess().getJvmTypeAssignment_5_1(), "rule__UiDialog__JvmTypeAssignment_5_1");
-					put(grammarAccess.getUiDialogAccess().getContentAssignment_6_0(), "rule__UiDialog__ContentAssignment_6_0");
-					put(grammarAccess.getUiDialogAccess().getBindingsAssignment_7(), "rule__UiDialog__BindingsAssignment_7");
-					put(grammarAccess.getUiDialogAccess().getProcessorAssignmentsAssignment_8(), "rule__UiDialog__ProcessorAssignmentsAssignment_8");
-					put(grammarAccess.getUiDialogAssignmentAccess().getElementAssignment(), "rule__UiDialogAssignment__ElementAssignment");
-					put(grammarAccess.getUiSearchDialogAccess().getI18nInfoAssignment_2_1_0(), "rule__UiSearchDialog__I18nInfoAssignment_2_1_0");
-					put(grammarAccess.getUiSearchDialogAccess().getStylesAssignment_2_1_1_1(), "rule__UiSearchDialog__StylesAssignment_2_1_1_1");
-					put(grammarAccess.getUiSearchDialogAccess().getNameAssignment_3(), "rule__UiSearchDialog__NameAssignment_3");
-					put(grammarAccess.getUiSearchDialogAccess().getJvmTypeAssignment_5_1(), "rule__UiSearchDialog__JvmTypeAssignment_5_1");
-					put(grammarAccess.getUiSearchDialogAccess().getSearchFieldsAssignment_6_2(), "rule__UiSearchDialog__SearchFieldsAssignment_6_2");
-					put(grammarAccess.getUiSearchDialogAccess().getContentAssignment_7_2(), "rule__UiSearchDialog__ContentAssignment_7_2");
-					put(grammarAccess.getUiSearchDialogAccess().getBindingsAssignment_8(), "rule__UiSearchDialog__BindingsAssignment_8");
-					put(grammarAccess.getUiSearchDialogAccess().getProcessorAssignmentsAssignment_9(), "rule__UiSearchDialog__ProcessorAssignmentsAssignment_9");
-					put(grammarAccess.getUiDialogSearchFieldAssignmentAccess().getElementAssignment(), "rule__UiDialogSearchFieldAssignment__ElementAssignment");
-					put(grammarAccess.getUiMobileNavigationPageAccess().getI18nInfoAssignment_2_1_0(), "rule__UiMobileNavigationPage__I18nInfoAssignment_2_1_0");
-					put(grammarAccess.getUiMobileNavigationPageAccess().getStylesAssignment_2_1_1_1(), "rule__UiMobileNavigationPage__StylesAssignment_2_1_1_1");
-					put(grammarAccess.getUiMobileNavigationPageAccess().getNameAssignment_3(), "rule__UiMobileNavigationPage__NameAssignment_3");
-					put(grammarAccess.getUiMobileNavigationPageAccess().getJvmTypeAssignment_5_1(), "rule__UiMobileNavigationPage__JvmTypeAssignment_5_1");
-					put(grammarAccess.getUiMobileNavigationPageAccess().getBarActionsAssignment_6_2(), "rule__UiMobileNavigationPage__BarActionsAssignment_6_2");
-					put(grammarAccess.getUiMobileNavigationPageAccess().getContentsAssignment_7(), "rule__UiMobileNavigationPage__ContentsAssignment_7");
-					put(grammarAccess.getUiMobileNavigationPageAccess().getBindingsAssignment_8(), "rule__UiMobileNavigationPage__BindingsAssignment_8");
-					put(grammarAccess.getUiMobileNavigationPageAccess().getProcessorAssignmentsAssignment_9(), "rule__UiMobileNavigationPage__ProcessorAssignmentsAssignment_9");
-					put(grammarAccess.getUiMobileNavigationPageAssignmentAccess().getElementAssignment_0(), "rule__UiMobileNavigationPageAssignment__ElementAssignment_0");
-					put(grammarAccess.getUiMobileNavigationPageAssignmentAccess().getAlignmentAssignment_1_1(), "rule__UiMobileNavigationPageAssignment__AlignmentAssignment_1_1");
-					put(grammarAccess.getUiPointAccess().getXAssignment_0(), "rule__UiPoint__XAssignment_0");
-					put(grammarAccess.getUiPointAccess().getYAssignment_2(), "rule__UiPoint__YAssignment_2");
-					put(grammarAccess.getUiTextFieldAccess().getMaxLengthAssignment_2_1_0_1(), "rule__UiTextField__MaxLengthAssignment_2_1_0_1");
-					put(grammarAccess.getUiTextFieldAccess().getMinLengthAssignment_2_1_1_1(), "rule__UiTextField__MinLengthAssignment_2_1_1_1");
-					put(grammarAccess.getUiTextFieldAccess().getRegexAssignment_2_1_2_1(), "rule__UiTextField__RegexAssignment_2_1_2_1");
-					put(grammarAccess.getUiTextFieldAccess().getStylesAssignment_2_1_3_1(), "rule__UiTextField__StylesAssignment_2_1_3_1");
-					put(grammarAccess.getUiTextFieldAccess().getI18nInfoAssignment_2_1_4(), "rule__UiTextField__I18nInfoAssignment_2_1_4");
-					put(grammarAccess.getUiTextFieldAccess().getReadonlyAssignment_2_1_5(), "rule__UiTextField__ReadonlyAssignment_2_1_5");
-					put(grammarAccess.getUiTextFieldAccess().getNameAssignment_3(), "rule__UiTextField__NameAssignment_3");
-					put(grammarAccess.getUiTextFieldAccess().getValidatorsAssignment_4_1_0(), "rule__UiTextField__ValidatorsAssignment_4_1_0");
-					put(grammarAccess.getUiTextFieldAccess().getBindingsAssignment_4_1_1(), "rule__UiTextField__BindingsAssignment_4_1_1");
-					put(grammarAccess.getUiTextFieldAccess().getProcessorAssignmentsAssignment_4_2(), "rule__UiTextField__ProcessorAssignmentsAssignment_4_2");
-					put(grammarAccess.getUiPasswordFieldAccess().getStylesAssignment_2_1_0_1(), "rule__UiPasswordField__StylesAssignment_2_1_0_1");
-					put(grammarAccess.getUiPasswordFieldAccess().getI18nInfoAssignment_2_1_1(), "rule__UiPasswordField__I18nInfoAssignment_2_1_1");
-					put(grammarAccess.getUiPasswordFieldAccess().getReadonlyAssignment_2_1_2(), "rule__UiPasswordField__ReadonlyAssignment_2_1_2");
-					put(grammarAccess.getUiPasswordFieldAccess().getNameAssignment_3(), "rule__UiPasswordField__NameAssignment_3");
-					put(grammarAccess.getUiPasswordFieldAccess().getValidatorsAssignment_4_1_0(), "rule__UiPasswordField__ValidatorsAssignment_4_1_0");
-					put(grammarAccess.getUiPasswordFieldAccess().getBindingsAssignment_4_1_1(), "rule__UiPasswordField__BindingsAssignment_4_1_1");
-					put(grammarAccess.getUiPasswordFieldAccess().getProcessorAssignmentsAssignment_4_2(), "rule__UiPasswordField__ProcessorAssignmentsAssignment_4_2");
-					put(grammarAccess.getUiMaskedTextFieldAccess().getStylesAssignment_2_1_0_1(), "rule__UiMaskedTextField__StylesAssignment_2_1_0_1");
-					put(grammarAccess.getUiMaskedTextFieldAccess().getMaskAssignment_2_1_1_1(), "rule__UiMaskedTextField__MaskAssignment_2_1_1_1");
-					put(grammarAccess.getUiMaskedTextFieldAccess().getI18nInfoAssignment_2_1_2(), "rule__UiMaskedTextField__I18nInfoAssignment_2_1_2");
-					put(grammarAccess.getUiMaskedTextFieldAccess().getReadonlyAssignment_2_1_3(), "rule__UiMaskedTextField__ReadonlyAssignment_2_1_3");
-					put(grammarAccess.getUiMaskedTextFieldAccess().getNameAssignment_3(), "rule__UiMaskedTextField__NameAssignment_3");
-					put(grammarAccess.getUiMaskedTextFieldAccess().getValidatorsAssignment_4_1_0(), "rule__UiMaskedTextField__ValidatorsAssignment_4_1_0");
-					put(grammarAccess.getUiMaskedTextFieldAccess().getBindingsAssignment_4_1_1(), "rule__UiMaskedTextField__BindingsAssignment_4_1_1");
-					put(grammarAccess.getUiMaskedTextFieldAccess().getProcessorAssignmentsAssignment_4_2(), "rule__UiMaskedTextField__ProcessorAssignmentsAssignment_4_2");
-					put(grammarAccess.getUiMaskedNumericFieldAccess().getStylesAssignment_2_1_0_1(), "rule__UiMaskedNumericField__StylesAssignment_2_1_0_1");
-					put(grammarAccess.getUiMaskedNumericFieldAccess().getI18nInfoAssignment_2_1_1(), "rule__UiMaskedNumericField__I18nInfoAssignment_2_1_1");
-					put(grammarAccess.getUiMaskedNumericFieldAccess().getReadonlyAssignment_2_1_2(), "rule__UiMaskedNumericField__ReadonlyAssignment_2_1_2");
-					put(grammarAccess.getUiMaskedNumericFieldAccess().getNameAssignment_3(), "rule__UiMaskedNumericField__NameAssignment_3");
-					put(grammarAccess.getUiMaskedNumericFieldAccess().getValidatorsAssignment_4_1_0(), "rule__UiMaskedNumericField__ValidatorsAssignment_4_1_0");
-					put(grammarAccess.getUiMaskedNumericFieldAccess().getBindingsAssignment_4_1_1(), "rule__UiMaskedNumericField__BindingsAssignment_4_1_1");
-					put(grammarAccess.getUiMaskedNumericFieldAccess().getProcessorAssignmentsAssignment_4_2(), "rule__UiMaskedNumericField__ProcessorAssignmentsAssignment_4_2");
-					put(grammarAccess.getUiMaskedDecimalFieldAccess().getStylesAssignment_2_1_0_1(), "rule__UiMaskedDecimalField__StylesAssignment_2_1_0_1");
-					put(grammarAccess.getUiMaskedDecimalFieldAccess().getMaskAssignment_2_1_1_1(), "rule__UiMaskedDecimalField__MaskAssignment_2_1_1_1");
-					put(grammarAccess.getUiMaskedDecimalFieldAccess().getI18nInfoAssignment_2_1_2(), "rule__UiMaskedDecimalField__I18nInfoAssignment_2_1_2");
-					put(grammarAccess.getUiMaskedDecimalFieldAccess().getReadonlyAssignment_2_1_3(), "rule__UiMaskedDecimalField__ReadonlyAssignment_2_1_3");
-					put(grammarAccess.getUiMaskedDecimalFieldAccess().getNameAssignment_3(), "rule__UiMaskedDecimalField__NameAssignment_3");
-					put(grammarAccess.getUiMaskedDecimalFieldAccess().getValidatorsAssignment_4_1_0(), "rule__UiMaskedDecimalField__ValidatorsAssignment_4_1_0");
-					put(grammarAccess.getUiMaskedDecimalFieldAccess().getBindingsAssignment_4_1_1(), "rule__UiMaskedDecimalField__BindingsAssignment_4_1_1");
-					put(grammarAccess.getUiMaskedDecimalFieldAccess().getProcessorAssignmentsAssignment_4_2(), "rule__UiMaskedDecimalField__ProcessorAssignmentsAssignment_4_2");
-					put(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getStylesAssignment_2_1_0_1(), "rule__UiPrefixedMaskedTextField__StylesAssignment_2_1_0_1");
-					put(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getMaskAssignment_2_1_1_1(), "rule__UiPrefixedMaskedTextField__MaskAssignment_2_1_1_1");
-					put(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getPrefixMasksAssignment_2_1_2_2(), "rule__UiPrefixedMaskedTextField__PrefixMasksAssignment_2_1_2_2");
-					put(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getPrefixMasksAssignment_2_1_2_3_1(), "rule__UiPrefixedMaskedTextField__PrefixMasksAssignment_2_1_2_3_1");
-					put(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getI18nInfoAssignment_2_1_3(), "rule__UiPrefixedMaskedTextField__I18nInfoAssignment_2_1_3");
-					put(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getReadonlyAssignment_2_1_4(), "rule__UiPrefixedMaskedTextField__ReadonlyAssignment_2_1_4");
-					put(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getNameAssignment_3(), "rule__UiPrefixedMaskedTextField__NameAssignment_3");
-					put(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getValidatorsAssignment_4_1_0(), "rule__UiPrefixedMaskedTextField__ValidatorsAssignment_4_1_0");
-					put(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getBindingsAssignment_4_1_1(), "rule__UiPrefixedMaskedTextField__BindingsAssignment_4_1_1");
-					put(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getProcessorAssignmentsAssignment_4_2(), "rule__UiPrefixedMaskedTextField__ProcessorAssignmentsAssignment_4_2");
-					put(grammarAccess.getUiPrefixToMaskMapEntryAccess().getKeyAssignment_2(), "rule__UiPrefixToMaskMapEntry__KeyAssignment_2");
-					put(grammarAccess.getUiPrefixToMaskMapEntryAccess().getValueAssignment_4(), "rule__UiPrefixToMaskMapEntry__ValueAssignment_4");
-					put(grammarAccess.getUiRichTextAreaAccess().getStylesAssignment_2_1_0_1(), "rule__UiRichTextArea__StylesAssignment_2_1_0_1");
-					put(grammarAccess.getUiRichTextAreaAccess().getI18nInfoAssignment_2_1_1(), "rule__UiRichTextArea__I18nInfoAssignment_2_1_1");
-					put(grammarAccess.getUiRichTextAreaAccess().getAsBlobAssignment_2_1_2(), "rule__UiRichTextArea__AsBlobAssignment_2_1_2");
-					put(grammarAccess.getUiRichTextAreaAccess().getReadonlyAssignment_2_1_3(), "rule__UiRichTextArea__ReadonlyAssignment_2_1_3");
-					put(grammarAccess.getUiRichTextAreaAccess().getNameAssignment_3(), "rule__UiRichTextArea__NameAssignment_3");
-					put(grammarAccess.getUiRichTextAreaAccess().getValidatorsAssignment_4_1_0(), "rule__UiRichTextArea__ValidatorsAssignment_4_1_0");
-					put(grammarAccess.getUiRichTextAreaAccess().getBindingsAssignment_4_1_1(), "rule__UiRichTextArea__BindingsAssignment_4_1_1");
-					put(grammarAccess.getUiRichTextAreaAccess().getProcessorAssignmentsAssignment_4_2(), "rule__UiRichTextArea__ProcessorAssignmentsAssignment_4_2");
-					put(grammarAccess.getUiSuggestTextFieldAccess().getI18nInfoAssignment_2_1_0(), "rule__UiSuggestTextField__I18nInfoAssignment_2_1_0");
-					put(grammarAccess.getUiSuggestTextFieldAccess().getStylesAssignment_2_1_1_1(), "rule__UiSuggestTextField__StylesAssignment_2_1_1_1");
-					put(grammarAccess.getUiSuggestTextFieldAccess().getNameAssignment_3(), "rule__UiSuggestTextField__NameAssignment_3");
-					put(grammarAccess.getUiSuggestTextFieldAccess().getJvmTypeAssignment_4_1_0_1(), "rule__UiSuggestTextField__JvmTypeAssignment_4_1_0_1");
-					put(grammarAccess.getUiSuggestTextFieldAccess().getItemCaptionPropertyAssignment_4_1_1_1(), "rule__UiSuggestTextField__ItemCaptionPropertyAssignment_4_1_1_1");
-					put(grammarAccess.getUiSuggestTextFieldAccess().getItemFilterPropertyAssignment_4_1_2_1(), "rule__UiSuggestTextField__ItemFilterPropertyAssignment_4_1_2_1");
-					put(grammarAccess.getUiSuggestTextFieldAccess().getItemUUIDPropertyAssignment_4_1_3_1(), "rule__UiSuggestTextField__ItemUUIDPropertyAssignment_4_1_3_1");
-					put(grammarAccess.getUiSuggestTextFieldAccess().getAutoHidePopupAssignment_4_1_4(), "rule__UiSuggestTextField__AutoHidePopupAssignment_4_1_4");
-					put(grammarAccess.getUiSuggestTextFieldAccess().getReadonlyAssignment_4_1_5(), "rule__UiSuggestTextField__ReadonlyAssignment_4_1_5");
-					put(grammarAccess.getUiSuggestTextFieldAccess().getValidatorsAssignment_4_2_0(), "rule__UiSuggestTextField__ValidatorsAssignment_4_2_0");
-					put(grammarAccess.getUiSuggestTextFieldAccess().getBindingsAssignment_4_2_1(), "rule__UiSuggestTextField__BindingsAssignment_4_2_1");
-					put(grammarAccess.getUiSuggestTextFieldAccess().getProcessorAssignmentsAssignment_4_3(), "rule__UiSuggestTextField__ProcessorAssignmentsAssignment_4_3");
-					put(grammarAccess.getUiBeanReferenceFieldAccess().getI18nInfoAssignment_2_1_0(), "rule__UiBeanReferenceField__I18nInfoAssignment_2_1_0");
-					put(grammarAccess.getUiBeanReferenceFieldAccess().getStylesAssignment_2_1_1_1(), "rule__UiBeanReferenceField__StylesAssignment_2_1_1_1");
-					put(grammarAccess.getUiBeanReferenceFieldAccess().getNameAssignment_3(), "rule__UiBeanReferenceField__NameAssignment_3");
-					put(grammarAccess.getUiBeanReferenceFieldAccess().getJvmTypeAssignment_4_1_0_1(), "rule__UiBeanReferenceField__JvmTypeAssignment_4_1_0_1");
-					put(grammarAccess.getUiBeanReferenceFieldAccess().getReferenceSourceJvmTypeAssignment_4_1_1_1(), "rule__UiBeanReferenceField__ReferenceSourceJvmTypeAssignment_4_1_1_1");
-					put(grammarAccess.getUiBeanReferenceFieldAccess().getReferenceSourceFieldAssignment_4_1_1_3(), "rule__UiBeanReferenceField__ReferenceSourceFieldAssignment_4_1_1_3");
-					put(grammarAccess.getUiBeanReferenceFieldAccess().getCaptionPropertyAssignment_4_1_2_1(), "rule__UiBeanReferenceField__CaptionPropertyAssignment_4_1_2_1");
-					put(grammarAccess.getUiBeanReferenceFieldAccess().getDescriptionPropertyAssignment_4_1_3_1(), "rule__UiBeanReferenceField__DescriptionPropertyAssignment_4_1_3_1");
-					put(grammarAccess.getUiBeanReferenceFieldAccess().getImagePropertyAssignment_4_1_4_1(), "rule__UiBeanReferenceField__ImagePropertyAssignment_4_1_4_1");
-					put(grammarAccess.getUiBeanReferenceFieldAccess().getInMemoryBeanProviderAssignment_4_1_5_1(), "rule__UiBeanReferenceField__InMemoryBeanProviderAssignment_4_1_5_1");
-					put(grammarAccess.getUiBeanReferenceFieldAccess().getValidatorsAssignment_4_2_0(), "rule__UiBeanReferenceField__ValidatorsAssignment_4_2_0");
-					put(grammarAccess.getUiBeanReferenceFieldAccess().getBindingsAssignment_4_2_1(), "rule__UiBeanReferenceField__BindingsAssignment_4_2_1");
-					put(grammarAccess.getUiBeanReferenceFieldAccess().getProcessorAssignmentsAssignment_4_3(), "rule__UiBeanReferenceField__ProcessorAssignmentsAssignment_4_3");
-					put(grammarAccess.getUiSearchFieldAccess().getI18nInfoAssignment_2_1_0(), "rule__UiSearchField__I18nInfoAssignment_2_1_0");
-					put(grammarAccess.getUiSearchFieldAccess().getStylesAssignment_2_1_1_1(), "rule__UiSearchField__StylesAssignment_2_1_1_1");
-					put(grammarAccess.getUiSearchFieldAccess().getPropertyAssignment_3(), "rule__UiSearchField__PropertyAssignment_3");
-					put(grammarAccess.getUiTextAreaAccess().getI18nInfoAssignment_2_1_0(), "rule__UiTextArea__I18nInfoAssignment_2_1_0");
-					put(grammarAccess.getUiTextAreaAccess().getReadonlyAssignment_2_1_1(), "rule__UiTextArea__ReadonlyAssignment_2_1_1");
-					put(grammarAccess.getUiTextAreaAccess().getStylesAssignment_2_1_2_1(), "rule__UiTextArea__StylesAssignment_2_1_2_1");
-					put(grammarAccess.getUiTextAreaAccess().getNameAssignment_3(), "rule__UiTextArea__NameAssignment_3");
-					put(grammarAccess.getUiTextAreaAccess().getValidatorsAssignment_4_1_0(), "rule__UiTextArea__ValidatorsAssignment_4_1_0");
-					put(grammarAccess.getUiTextAreaAccess().getBindingsAssignment_4_1_1(), "rule__UiTextArea__BindingsAssignment_4_1_1");
-					put(grammarAccess.getUiTextAreaAccess().getProcessorAssignmentsAssignment_4_2(), "rule__UiTextArea__ProcessorAssignmentsAssignment_4_2");
-					put(grammarAccess.getUiDateFieldAccess().getDateFormatAssignment_2_1_0(), "rule__UiDateField__DateFormatAssignment_2_1_0");
-					put(grammarAccess.getUiDateFieldAccess().getResolutionAssignment_2_1_1(), "rule__UiDateField__ResolutionAssignment_2_1_1");
-					put(grammarAccess.getUiDateFieldAccess().getStylesAssignment_2_1_2_1(), "rule__UiDateField__StylesAssignment_2_1_2_1");
-					put(grammarAccess.getUiDateFieldAccess().getI18nInfoAssignment_2_1_3(), "rule__UiDateField__I18nInfoAssignment_2_1_3");
-					put(grammarAccess.getUiDateFieldAccess().getReadonlyAssignment_2_1_4(), "rule__UiDateField__ReadonlyAssignment_2_1_4");
-					put(grammarAccess.getUiDateFieldAccess().getNameAssignment_3(), "rule__UiDateField__NameAssignment_3");
-					put(grammarAccess.getUiDateFieldAccess().getValidatorsAssignment_4_1_0(), "rule__UiDateField__ValidatorsAssignment_4_1_0");
-					put(grammarAccess.getUiDateFieldAccess().getBindingsAssignment_4_1_1(), "rule__UiDateField__BindingsAssignment_4_1_1");
-					put(grammarAccess.getUiDateFieldAccess().getProcessorAssignmentsAssignment_4_2(), "rule__UiDateField__ProcessorAssignmentsAssignment_4_2");
-					put(grammarAccess.getUiBrowserAccess().getI18nInfoAssignment_2_1_0(), "rule__UiBrowser__I18nInfoAssignment_2_1_0");
-					put(grammarAccess.getUiBrowserAccess().getReadonlyAssignment_2_1_1(), "rule__UiBrowser__ReadonlyAssignment_2_1_1");
-					put(grammarAccess.getUiBrowserAccess().getStylesAssignment_2_1_2_1(), "rule__UiBrowser__StylesAssignment_2_1_2_1");
-					put(grammarAccess.getUiBrowserAccess().getNameAssignment_3(), "rule__UiBrowser__NameAssignment_3");
-					put(grammarAccess.getUiBrowserAccess().getValidatorsAssignment_4_1_0(), "rule__UiBrowser__ValidatorsAssignment_4_1_0");
-					put(grammarAccess.getUiBrowserAccess().getBindingsAssignment_4_1_1(), "rule__UiBrowser__BindingsAssignment_4_1_1");
-					put(grammarAccess.getUiBrowserAccess().getProcessorAssignmentsAssignment_4_2(), "rule__UiBrowser__ProcessorAssignmentsAssignment_4_2");
-					put(grammarAccess.getUiProgressBarAccess().getI18nInfoAssignment_2_1_0(), "rule__UiProgressBar__I18nInfoAssignment_2_1_0");
-					put(grammarAccess.getUiProgressBarAccess().getStylesAssignment_2_1_1_1(), "rule__UiProgressBar__StylesAssignment_2_1_1_1");
-					put(grammarAccess.getUiProgressBarAccess().getNameAssignment_3(), "rule__UiProgressBar__NameAssignment_3");
-					put(grammarAccess.getUiProgressBarAccess().getValidatorsAssignment_4_1_0(), "rule__UiProgressBar__ValidatorsAssignment_4_1_0");
-					put(grammarAccess.getUiProgressBarAccess().getBindingsAssignment_4_1_1(), "rule__UiProgressBar__BindingsAssignment_4_1_1");
-					put(grammarAccess.getUiProgressBarAccess().getProcessorAssignmentsAssignment_4_2(), "rule__UiProgressBar__ProcessorAssignmentsAssignment_4_2");
-					put(grammarAccess.getUiImageAccess().getI18nInfoAssignment_2_1_0(), "rule__UiImage__I18nInfoAssignment_2_1_0");
-					put(grammarAccess.getUiImageAccess().getStylesAssignment_2_1_1_1(), "rule__UiImage__StylesAssignment_2_1_1_1");
-					put(grammarAccess.getUiImageAccess().getNameAssignment_3(), "rule__UiImage__NameAssignment_3");
-					put(grammarAccess.getUiImageAccess().getValueAssignment_4_1_1(), "rule__UiImage__ValueAssignment_4_1_1");
-					put(grammarAccess.getUiImageAccess().getBindingsAssignment_4_2(), "rule__UiImage__BindingsAssignment_4_2");
-					put(grammarAccess.getUiImageAccess().getProcessorAssignmentsAssignment_4_3(), "rule__UiImage__ProcessorAssignmentsAssignment_4_3");
-					put(grammarAccess.getUiTableAccess().getI18nInfoAssignment_2_1_0(), "rule__UiTable__I18nInfoAssignment_2_1_0");
-					put(grammarAccess.getUiTableAccess().getStylesAssignment_2_1_1_1(), "rule__UiTable__StylesAssignment_2_1_1_1");
-					put(grammarAccess.getUiTableAccess().getNameAssignment_3(), "rule__UiTable__NameAssignment_3");
-					put(grammarAccess.getUiTableAccess().getJvmTypeAssignment_4_1_0_1(), "rule__UiTable__JvmTypeAssignment_4_1_0_1");
-					put(grammarAccess.getUiTableAccess().getSelectionTypeAssignment_4_1_1_1(), "rule__UiTable__SelectionTypeAssignment_4_1_1_1");
-					put(grammarAccess.getUiTableAccess().getItemImagePropertyAssignment_4_1_2_1(), "rule__UiTable__ItemImagePropertyAssignment_4_1_2_1");
-					put(grammarAccess.getUiTableAccess().getConsumeBeanServiceAssignment_4_1_3_0(), "rule__UiTable__ConsumeBeanServiceAssignment_4_1_3_0");
-					put(grammarAccess.getUiTableAccess().getReadonlyAssignment_4_1_4(), "rule__UiTable__ReadonlyAssignment_4_1_4");
-					put(grammarAccess.getUiTableAccess().getColumnAssignmentAssignment_4_2(), "rule__UiTable__ColumnAssignmentAssignment_4_2");
-					put(grammarAccess.getUiTableAccess().getSortOrderAssignmentAssignment_4_3(), "rule__UiTable__SortOrderAssignmentAssignment_4_3");
-					put(grammarAccess.getUiTableAccess().getValidatorsAssignment_4_4_0(), "rule__UiTable__ValidatorsAssignment_4_4_0");
-					put(grammarAccess.getUiTableAccess().getBindingsAssignment_4_4_1(), "rule__UiTable__BindingsAssignment_4_4_1");
-					put(grammarAccess.getUiTableAccess().getProcessorAssignmentsAssignment_4_5(), "rule__UiTable__ProcessorAssignmentsAssignment_4_5");
-					put(grammarAccess.getUiComboBoxAccess().getI18nInfoAssignment_2_1_0(), "rule__UiComboBox__I18nInfoAssignment_2_1_0");
-					put(grammarAccess.getUiComboBoxAccess().getStylesAssignment_2_1_1_1(), "rule__UiComboBox__StylesAssignment_2_1_1_1");
-					put(grammarAccess.getUiComboBoxAccess().getNameAssignment_3(), "rule__UiComboBox__NameAssignment_3");
-					put(grammarAccess.getUiComboBoxAccess().getJvmTypeAssignment_4_1_0_1(), "rule__UiComboBox__JvmTypeAssignment_4_1_0_1");
-					put(grammarAccess.getUiComboBoxAccess().getItemCaptionPropertyAssignment_4_1_1_1(), "rule__UiComboBox__ItemCaptionPropertyAssignment_4_1_1_1");
-					put(grammarAccess.getUiComboBoxAccess().getDescriptionPropertyAssignment_4_1_2_1(), "rule__UiComboBox__DescriptionPropertyAssignment_4_1_2_1");
-					put(grammarAccess.getUiComboBoxAccess().getItemImagePropertyAssignment_4_1_3_1(), "rule__UiComboBox__ItemImagePropertyAssignment_4_1_3_1");
-					put(grammarAccess.getUiComboBoxAccess().getConsumeBeanServiceAssignment_4_1_4_0(), "rule__UiComboBox__ConsumeBeanServiceAssignment_4_1_4_0");
-					put(grammarAccess.getUiComboBoxAccess().getReadonlyAssignment_4_1_5(), "rule__UiComboBox__ReadonlyAssignment_4_1_5");
-					put(grammarAccess.getUiComboBoxAccess().getValidatorsAssignment_4_2_0(), "rule__UiComboBox__ValidatorsAssignment_4_2_0");
-					put(grammarAccess.getUiComboBoxAccess().getBindingsAssignment_4_2_1(), "rule__UiComboBox__BindingsAssignment_4_2_1");
-					put(grammarAccess.getUiComboBoxAccess().getProcessorAssignmentsAssignment_4_3(), "rule__UiComboBox__ProcessorAssignmentsAssignment_4_3");
-					put(grammarAccess.getUiButtonAccess().getI18nInfoAssignment_2_1_0(), "rule__UiButton__I18nInfoAssignment_2_1_0");
-					put(grammarAccess.getUiButtonAccess().getReadonlyAssignment_2_1_1(), "rule__UiButton__ReadonlyAssignment_2_1_1");
-					put(grammarAccess.getUiButtonAccess().getStylesAssignment_2_1_2_1(), "rule__UiButton__StylesAssignment_2_1_2_1");
-					put(grammarAccess.getUiButtonAccess().getNameAssignment_3(), "rule__UiButton__NameAssignment_3");
-					put(grammarAccess.getUiMobileNavigationButtonAccess().getI18nInfoAssignment_2_1_0(), "rule__UiMobileNavigationButton__I18nInfoAssignment_2_1_0");
-					put(grammarAccess.getUiMobileNavigationButtonAccess().getReadonlyAssignment_2_1_1(), "rule__UiMobileNavigationButton__ReadonlyAssignment_2_1_1");
-					put(grammarAccess.getUiMobileNavigationButtonAccess().getStylesAssignment_2_1_2_1(), "rule__UiMobileNavigationButton__StylesAssignment_2_1_2_1");
-					put(grammarAccess.getUiMobileNavigationButtonAccess().getNameAssignment_3(), "rule__UiMobileNavigationButton__NameAssignment_3");
-					put(grammarAccess.getUiMobileNavigationButtonAccess().getTargetPageAssignment_4_0(), "rule__UiMobileNavigationButton__TargetPageAssignment_4_0");
-					put(grammarAccess.getUiMobileNavigationButtonAccess().getTargetPageAliasAssignment_4_1_1(), "rule__UiMobileNavigationButton__TargetPageAliasAssignment_4_1_1");
-					put(grammarAccess.getUiMobileSwitchAccess().getI18nInfoAssignment_2_1_0(), "rule__UiMobileSwitch__I18nInfoAssignment_2_1_0");
-					put(grammarAccess.getUiMobileSwitchAccess().getReadonlyAssignment_2_1_1(), "rule__UiMobileSwitch__ReadonlyAssignment_2_1_1");
-					put(grammarAccess.getUiMobileSwitchAccess().getStylesAssignment_2_1_2_1(), "rule__UiMobileSwitch__StylesAssignment_2_1_2_1");
-					put(grammarAccess.getUiMobileSwitchAccess().getNameAssignment_3(), "rule__UiMobileSwitch__NameAssignment_3");
-					put(grammarAccess.getUiMobileSwitchAccess().getProcessorAssignmentsAssignment_4_1(), "rule__UiMobileSwitch__ProcessorAssignmentsAssignment_4_1");
-					put(grammarAccess.getUiMobileSwitchAccess().getValidatorsAssignment_4_2_0(), "rule__UiMobileSwitch__ValidatorsAssignment_4_2_0");
-					put(grammarAccess.getUiMobileSwitchAccess().getBindingsAssignment_4_2_1(), "rule__UiMobileSwitch__BindingsAssignment_4_2_1");
-					put(grammarAccess.getUiLabelAccess().getI18nInfoAssignment_2_1_0(), "rule__UiLabel__I18nInfoAssignment_2_1_0");
-					put(grammarAccess.getUiLabelAccess().getStylesAssignment_2_1_1_1(), "rule__UiLabel__StylesAssignment_2_1_1_1");
-					put(grammarAccess.getUiLabelAccess().getNameAssignment_3(), "rule__UiLabel__NameAssignment_3");
-					put(grammarAccess.getUiLabelAccess().getProcessorAssignmentsAssignment_4_1(), "rule__UiLabel__ProcessorAssignmentsAssignment_4_1");
-					put(grammarAccess.getUiLabelAccess().getBindingsAssignment_4_2(), "rule__UiLabel__BindingsAssignment_4_2");
-					put(grammarAccess.getUiDecimalFieldAccess().getNoGroupingAssignment_2_1_0(), "rule__UiDecimalField__NoGroupingAssignment_2_1_0");
-					put(grammarAccess.getUiDecimalFieldAccess().getNoMarkNegativeAssignment_2_1_1(), "rule__UiDecimalField__NoMarkNegativeAssignment_2_1_1");
-					put(grammarAccess.getUiDecimalFieldAccess().getStylesAssignment_2_1_2_1(), "rule__UiDecimalField__StylesAssignment_2_1_2_1");
-					put(grammarAccess.getUiDecimalFieldAccess().getPrecisionAssignment_2_1_3_1(), "rule__UiDecimalField__PrecisionAssignment_2_1_3_1");
-					put(grammarAccess.getUiDecimalFieldAccess().getI18nInfoAssignment_2_1_4(), "rule__UiDecimalField__I18nInfoAssignment_2_1_4");
-					put(grammarAccess.getUiDecimalFieldAccess().getReadonlyAssignment_2_1_5(), "rule__UiDecimalField__ReadonlyAssignment_2_1_5");
-					put(grammarAccess.getUiDecimalFieldAccess().getNameAssignment_3(), "rule__UiDecimalField__NameAssignment_3");
-					put(grammarAccess.getUiDecimalFieldAccess().getValidatorsAssignment_4_1_0(), "rule__UiDecimalField__ValidatorsAssignment_4_1_0");
-					put(grammarAccess.getUiDecimalFieldAccess().getBindingsAssignment_4_1_1(), "rule__UiDecimalField__BindingsAssignment_4_1_1");
-					put(grammarAccess.getUiDecimalFieldAccess().getProcessorAssignmentsAssignment_4_2(), "rule__UiDecimalField__ProcessorAssignmentsAssignment_4_2");
-					put(grammarAccess.getUiOptionsGroupAccess().getI18nInfoAssignment_2_1_0(), "rule__UiOptionsGroup__I18nInfoAssignment_2_1_0");
-					put(grammarAccess.getUiOptionsGroupAccess().getStylesAssignment_2_1_1_1(), "rule__UiOptionsGroup__StylesAssignment_2_1_1_1");
-					put(grammarAccess.getUiOptionsGroupAccess().getNameAssignment_3(), "rule__UiOptionsGroup__NameAssignment_3");
-					put(grammarAccess.getUiOptionsGroupAccess().getJvmTypeAssignment_4_1_0_1(), "rule__UiOptionsGroup__JvmTypeAssignment_4_1_0_1");
-					put(grammarAccess.getUiOptionsGroupAccess().getSelectionTypeAssignment_4_1_1_1(), "rule__UiOptionsGroup__SelectionTypeAssignment_4_1_1_1");
-					put(grammarAccess.getUiOptionsGroupAccess().getItemCaptionPropertyAssignment_4_1_2_1(), "rule__UiOptionsGroup__ItemCaptionPropertyAssignment_4_1_2_1");
-					put(grammarAccess.getUiOptionsGroupAccess().getDescriptionPropertyAssignment_4_1_3_1(), "rule__UiOptionsGroup__DescriptionPropertyAssignment_4_1_3_1");
-					put(grammarAccess.getUiOptionsGroupAccess().getItemImagePropertyAssignment_4_1_4_1(), "rule__UiOptionsGroup__ItemImagePropertyAssignment_4_1_4_1");
-					put(grammarAccess.getUiOptionsGroupAccess().getConsumeBeanServiceAssignment_4_1_5_0(), "rule__UiOptionsGroup__ConsumeBeanServiceAssignment_4_1_5_0");
-					put(grammarAccess.getUiOptionsGroupAccess().getReadonlyAssignment_4_1_6(), "rule__UiOptionsGroup__ReadonlyAssignment_4_1_6");
-					put(grammarAccess.getUiOptionsGroupAccess().getValidatorsAssignment_4_2_0(), "rule__UiOptionsGroup__ValidatorsAssignment_4_2_0");
-					put(grammarAccess.getUiOptionsGroupAccess().getBindingsAssignment_4_2_1(), "rule__UiOptionsGroup__BindingsAssignment_4_2_1");
-					put(grammarAccess.getUiOptionsGroupAccess().getProcessorAssignmentsAssignment_4_3(), "rule__UiOptionsGroup__ProcessorAssignmentsAssignment_4_3");
-					put(grammarAccess.getUiListAccess().getI18nInfoAssignment_2_1_0(), "rule__UiList__I18nInfoAssignment_2_1_0");
-					put(grammarAccess.getUiListAccess().getStylesAssignment_2_1_1_1(), "rule__UiList__StylesAssignment_2_1_1_1");
-					put(grammarAccess.getUiListAccess().getNameAssignment_3(), "rule__UiList__NameAssignment_3");
-					put(grammarAccess.getUiListAccess().getJvmTypeAssignment_4_1_0_1(), "rule__UiList__JvmTypeAssignment_4_1_0_1");
-					put(grammarAccess.getUiListAccess().getSelectionTypeAssignment_4_1_1_1(), "rule__UiList__SelectionTypeAssignment_4_1_1_1");
-					put(grammarAccess.getUiListAccess().getItemCaptionPropertyAssignment_4_1_2_1(), "rule__UiList__ItemCaptionPropertyAssignment_4_1_2_1");
-					put(grammarAccess.getUiListAccess().getDescriptionPropertyAssignment_4_1_3_1(), "rule__UiList__DescriptionPropertyAssignment_4_1_3_1");
-					put(grammarAccess.getUiListAccess().getItemImagePropertyAssignment_4_1_4_1(), "rule__UiList__ItemImagePropertyAssignment_4_1_4_1");
-					put(grammarAccess.getUiListAccess().getConsumeBeanServiceAssignment_4_1_5_0(), "rule__UiList__ConsumeBeanServiceAssignment_4_1_5_0");
-					put(grammarAccess.getUiListAccess().getReadonlyAssignment_4_1_6(), "rule__UiList__ReadonlyAssignment_4_1_6");
-					put(grammarAccess.getUiListAccess().getValidatorsAssignment_4_2_0(), "rule__UiList__ValidatorsAssignment_4_2_0");
-					put(grammarAccess.getUiListAccess().getBindingsAssignment_4_2_1(), "rule__UiList__BindingsAssignment_4_2_1");
-					put(grammarAccess.getUiListAccess().getProcessorAssignmentsAssignment_4_3(), "rule__UiList__ProcessorAssignmentsAssignment_4_3");
-					put(grammarAccess.getUiColumnsAssignmentAccess().getColumnsAssignment_3(), "rule__UiColumnsAssignment__ColumnsAssignment_3");
-					put(grammarAccess.getUiSortOrderAssignmentAccess().getColumnsAssignment_3(), "rule__UiSortOrderAssignment__ColumnsAssignment_3");
-					put(grammarAccess.getUiSortOrderAccess().getPropertyAssignment_1(), "rule__UiSortOrder__PropertyAssignment_1");
-					put(grammarAccess.getUiSortOrderAccess().getAscAssignment_2_1(), "rule__UiSortOrder__AscAssignment_2_1");
-					put(grammarAccess.getUiColumnAccess().getPropertyAssignment_2(), "rule__UiColumn__PropertyAssignment_2");
-					put(grammarAccess.getUiColumnAccess().getIconNameAssignment_3_1(), "rule__UiColumn__IconNameAssignment_3_1");
-					put(grammarAccess.getUiNumericFieldAccess().getNoGroupingAssignment_2_1_0(), "rule__UiNumericField__NoGroupingAssignment_2_1_0");
-					put(grammarAccess.getUiNumericFieldAccess().getStylesAssignment_2_1_1_1(), "rule__UiNumericField__StylesAssignment_2_1_1_1");
-					put(grammarAccess.getUiNumericFieldAccess().getNoMarkNegativeAssignment_2_1_2(), "rule__UiNumericField__NoMarkNegativeAssignment_2_1_2");
-					put(grammarAccess.getUiNumericFieldAccess().getI18nInfoAssignment_2_1_3(), "rule__UiNumericField__I18nInfoAssignment_2_1_3");
-					put(grammarAccess.getUiNumericFieldAccess().getReadonlyAssignment_2_1_4(), "rule__UiNumericField__ReadonlyAssignment_2_1_4");
-					put(grammarAccess.getUiNumericFieldAccess().getNameAssignment_3(), "rule__UiNumericField__NameAssignment_3");
-					put(grammarAccess.getUiNumericFieldAccess().getValidatorsAssignment_4_1_0(), "rule__UiNumericField__ValidatorsAssignment_4_1_0");
-					put(grammarAccess.getUiNumericFieldAccess().getBindingsAssignment_4_1_1(), "rule__UiNumericField__BindingsAssignment_4_1_1");
-					put(grammarAccess.getUiNumericFieldAccess().getProcessorAssignmentsAssignment_4_2(), "rule__UiNumericField__ProcessorAssignmentsAssignment_4_2");
-					put(grammarAccess.getUiCheckBoxAccess().getI18nInfoAssignment_2_1_0(), "rule__UiCheckBox__I18nInfoAssignment_2_1_0");
-					put(grammarAccess.getUiCheckBoxAccess().getReadonlyAssignment_2_1_1(), "rule__UiCheckBox__ReadonlyAssignment_2_1_1");
-					put(grammarAccess.getUiCheckBoxAccess().getStylesAssignment_2_1_2_1(), "rule__UiCheckBox__StylesAssignment_2_1_2_1");
-					put(grammarAccess.getUiCheckBoxAccess().getNameAssignment_3(), "rule__UiCheckBox__NameAssignment_3");
-					put(grammarAccess.getUiCheckBoxAccess().getValidatorsAssignment_4_1_0(), "rule__UiCheckBox__ValidatorsAssignment_4_1_0");
-					put(grammarAccess.getUiCheckBoxAccess().getBindingsAssignment_4_1_1(), "rule__UiCheckBox__BindingsAssignment_4_1_1");
-					put(grammarAccess.getUiCheckBoxAccess().getProcessorAssignmentsAssignment_4_2(), "rule__UiCheckBox__ProcessorAssignmentsAssignment_4_2");
-					put(grammarAccess.getUiMaxLengthValidatorAccess().getNameAssignment_2(), "rule__UiMaxLengthValidator__NameAssignment_2");
-					put(grammarAccess.getUiMaxLengthValidatorAccess().getMaxLengthAssignment_4(), "rule__UiMaxLengthValidator__MaxLengthAssignment_4");
-					put(grammarAccess.getUiMaxLengthValidatorAccess().getErrorCodeAssignment_6(), "rule__UiMaxLengthValidator__ErrorCodeAssignment_6");
-					put(grammarAccess.getUiMinLengthValidatorAccess().getNameAssignment_2(), "rule__UiMinLengthValidator__NameAssignment_2");
-					put(grammarAccess.getUiMinLengthValidatorAccess().getMinLengthAssignment_4(), "rule__UiMinLengthValidator__MinLengthAssignment_4");
-					put(grammarAccess.getUiMinLengthValidatorAccess().getErrorCodeAssignment_6(), "rule__UiMinLengthValidator__ErrorCodeAssignment_6");
-					put(grammarAccess.getUiRegexpValidatorAccess().getNameAssignment_2(), "rule__UiRegexpValidator__NameAssignment_2");
-					put(grammarAccess.getUiRegexpValidatorAccess().getRegExpressionAssignment_4(), "rule__UiRegexpValidator__RegExpressionAssignment_4");
-					put(grammarAccess.getUiRegexpValidatorAccess().getErrorCodeAssignment_6(), "rule__UiRegexpValidator__ErrorCodeAssignment_6");
-					put(grammarAccess.getUiXbaseValidatorAccess().getNameAssignment_2(), "rule__UiXbaseValidator__NameAssignment_2");
-					put(grammarAccess.getUiXbaseValidatorAccess().getJvmTypeAssignment_4(), "rule__UiXbaseValidator__JvmTypeAssignment_4");
-					put(grammarAccess.getUiXbaseValidatorAccess().getErrorCodesAssignment_6(), "rule__UiXbaseValidator__ErrorCodesAssignment_6");
-					put(grammarAccess.getUiXbaseValidatorAccess().getExpressionAssignment_7(), "rule__UiXbaseValidator__ExpressionAssignment_7");
-					put(grammarAccess.getUiBeanValidationValidatorAccess().getNameAssignment_2(), "rule__UiBeanValidationValidator__NameAssignment_2");
-					put(grammarAccess.getUiErrorCodeAccess().getNameAssignment_1(), "rule__UiErrorCode__NameAssignment_1");
-					put(grammarAccess.getUiErrorCodeAccess().getDefaultMessageAssignment_2(), "rule__UiErrorCode__DefaultMessageAssignment_2");
-					put(grammarAccess.getUiVisibilityProcessorAccess().getNameAssignment_2(), "rule__UiVisibilityProcessor__NameAssignment_2");
-					put(grammarAccess.getUiVisibilityProcessorAccess().getDataUsedAssignment_4_0(), "rule__UiVisibilityProcessor__DataUsedAssignment_4_0");
-					put(grammarAccess.getUiVisibilityProcessorAccess().getChangeTriggersAssignment_4_1(), "rule__UiVisibilityProcessor__ChangeTriggersAssignment_4_1");
-					put(grammarAccess.getUiVisibilityProcessorAccess().getImportedElementsAssignment_4_2(), "rule__UiVisibilityProcessor__ImportedElementsAssignment_4_2");
-					put(grammarAccess.getUiVisibilityProcessorAccess().getRuleAssignment_5(), "rule__UiVisibilityProcessor__RuleAssignment_5");
-					put(grammarAccess.getUiXbaseVisibilityRuleAccess().getExpressionAssignment(), "rule__UiXbaseVisibilityRule__ExpressionAssignment");
-					put(grammarAccess.getUiChangeTriggerAccess().getEndpointAssignment_1(), "rule__UiChangeTrigger__EndpointAssignment_1");
-					put(grammarAccess.getUiChangeTriggerAccess().getAliasAssignment_3(), "rule__UiChangeTrigger__AliasAssignment_3");
-					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.getXImportDeclarationAccess().getStaticAssignment_1_0_0(), "rule__XImportDeclaration__StaticAssignment_1_0_0");
-					put(grammarAccess.getXImportDeclarationAccess().getExtensionAssignment_1_0_1(), "rule__XImportDeclaration__ExtensionAssignment_1_0_1");
-					put(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_1_0_2(), "rule__XImportDeclaration__ImportedTypeAssignment_1_0_2");
-					put(grammarAccess.getXImportDeclarationAccess().getWildcardAssignment_1_0_3_0(), "rule__XImportDeclaration__WildcardAssignment_1_0_3_0");
-					put(grammarAccess.getXImportDeclarationAccess().getMemberNameAssignment_1_0_3_1(), "rule__XImportDeclaration__MemberNameAssignment_1_0_3_1");
-					put(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_1_1(), "rule__XImportDeclaration__ImportedTypeAssignment_1_1");
-					put(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceAssignment_1_2(), "rule__XImportDeclaration__ImportedNamespaceAssignment_1_2");
-					put(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), "rule__UiIDEView__UnorderedGroup_3");
-					put(grammarAccess.getUiMobileViewAccess().getUnorderedGroup_3(), "rule__UiMobileView__UnorderedGroup_3");
-					put(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), "rule__UiGridLayout__UnorderedGroup_2_1");
-					put(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2(), "rule__UiFormLayout__UnorderedGroup_2");
-					put(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2(), "rule__UiVerticalLayout__UnorderedGroup_2");
-					put(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2(), "rule__UiMobileVerticalLayout__UnorderedGroup_2");
-					put(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2(), "rule__UiHorizontalLayout__UnorderedGroup_2");
-					put(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2(), "rule__UiMobileHorizontalLayout__UnorderedGroup_2");
-					put(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1(), "rule__UiMobileHorizontalButtonGroup__UnorderedGroup_2_1");
-					put(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1(), "rule__UiMobileVerticalComponentGroup__UnorderedGroup_2_1");
-					put(grammarAccess.getUiSearchPanelAccess().getUnorderedGroup_2_1(), "rule__UiSearchPanel__UnorderedGroup_2_1");
-					put(grammarAccess.getUiMobileSearchPanelAccess().getUnorderedGroup_2_1(), "rule__UiMobileSearchPanel__UnorderedGroup_2_1");
-					put(grammarAccess.getUiMobileTabSheetAccess().getUnorderedGroup_2_1(), "rule__UiMobileTabSheet__UnorderedGroup_2_1");
-					put(grammarAccess.getUiTabSheetAccess().getUnorderedGroup_2_1(), "rule__UiTabSheet__UnorderedGroup_2_1");
-					put(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_1(), "rule__UiSplitpanel__UnorderedGroup_1");
-					put(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4(), "rule__UiSplitpanel__UnorderedGroup_4");
-					put(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1(), "rule__UiPanel__UnorderedGroup_1_1");
-					put(grammarAccess.getUiDialogAccess().getUnorderedGroup_2_1(), "rule__UiDialog__UnorderedGroup_2_1");
-					put(grammarAccess.getUiSearchDialogAccess().getUnorderedGroup_2_1(), "rule__UiSearchDialog__UnorderedGroup_2_1");
-					put(grammarAccess.getUiMobileNavigationPageAccess().getUnorderedGroup_2_1(), "rule__UiMobileNavigationPage__UnorderedGroup_2_1");
-					put(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), "rule__UiTextField__UnorderedGroup_2_1");
-					put(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1(), "rule__UiPasswordField__UnorderedGroup_2_1");
-					put(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), "rule__UiMaskedTextField__UnorderedGroup_2_1");
-					put(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1(), "rule__UiMaskedNumericField__UnorderedGroup_2_1");
-					put(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), "rule__UiMaskedDecimalField__UnorderedGroup_2_1");
-					put(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), "rule__UiPrefixedMaskedTextField__UnorderedGroup_2_1");
-					put(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), "rule__UiRichTextArea__UnorderedGroup_2_1");
-					put(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_2_1(), "rule__UiSuggestTextField__UnorderedGroup_2_1");
-					put(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), "rule__UiSuggestTextField__UnorderedGroup_4_1");
-					put(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_2_1(), "rule__UiBeanReferenceField__UnorderedGroup_2_1");
-					put(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), "rule__UiBeanReferenceField__UnorderedGroup_4_1");
-					put(grammarAccess.getUiSearchFieldAccess().getUnorderedGroup_2_1(), "rule__UiSearchField__UnorderedGroup_2_1");
-					put(grammarAccess.getUiTextAreaAccess().getUnorderedGroup_2_1(), "rule__UiTextArea__UnorderedGroup_2_1");
-					put(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), "rule__UiDateField__UnorderedGroup_2_1");
-					put(grammarAccess.getUiBrowserAccess().getUnorderedGroup_2_1(), "rule__UiBrowser__UnorderedGroup_2_1");
-					put(grammarAccess.getUiProgressBarAccess().getUnorderedGroup_2_1(), "rule__UiProgressBar__UnorderedGroup_2_1");
-					put(grammarAccess.getUiImageAccess().getUnorderedGroup_2_1(), "rule__UiImage__UnorderedGroup_2_1");
-					put(grammarAccess.getUiTableAccess().getUnorderedGroup_2_1(), "rule__UiTable__UnorderedGroup_2_1");
-					put(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), "rule__UiTable__UnorderedGroup_4_1");
-					put(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_2_1(), "rule__UiComboBox__UnorderedGroup_2_1");
-					put(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), "rule__UiComboBox__UnorderedGroup_4_1");
-					put(grammarAccess.getUiButtonAccess().getUnorderedGroup_2_1(), "rule__UiButton__UnorderedGroup_2_1");
-					put(grammarAccess.getUiMobileNavigationButtonAccess().getUnorderedGroup_2_1(), "rule__UiMobileNavigationButton__UnorderedGroup_2_1");
-					put(grammarAccess.getUiMobileSwitchAccess().getUnorderedGroup_2_1(), "rule__UiMobileSwitch__UnorderedGroup_2_1");
-					put(grammarAccess.getUiLabelAccess().getUnorderedGroup_2_1(), "rule__UiLabel__UnorderedGroup_2_1");
-					put(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), "rule__UiDecimalField__UnorderedGroup_2_1");
-					put(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_2_1(), "rule__UiOptionsGroup__UnorderedGroup_2_1");
-					put(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), "rule__UiOptionsGroup__UnorderedGroup_4_1");
-					put(grammarAccess.getUiListAccess().getUnorderedGroup_2_1(), "rule__UiList__UnorderedGroup_2_1");
-					put(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), "rule__UiList__UnorderedGroup_4_1");
-					put(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), "rule__UiNumericField__UnorderedGroup_2_1");
-					put(grammarAccess.getUiCheckBoxAccess().getUnorderedGroup_2_1(), "rule__UiCheckBox__UnorderedGroup_2_1");
-				}
-			};
-		}
-		return nameMappings.get(element);
-	}
-	
-	@Override
-	protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
-		try {
-			org.eclipse.osbp.ecview.dsl.ui.contentassist.antlr.internal.InternalUIGrammarParser typedParser = (org.eclipse.osbp.ecview.dsl.ui.contentassist.antlr.internal.InternalUIGrammarParser) parser;
-			typedParser.entryRuleUiModel();
-			return typedParser.getFollowElements();
-		} catch(RecognitionException ex) {
-			throw new RuntimeException(ex);
-		}		
-	}
-	
-	@Override
-	protected String[] getInitialHiddenTokens() {
-		return new String[] { "RULE_WS", "RULE_ML_COMMENT", "RULE_SL_COMMENT" };
-	}
-	
-	public UIGrammarGrammarAccess getGrammarAccess() {
-		return this.grammarAccess;
-	}
-	
-	public void setGrammarAccess(UIGrammarGrammarAccess grammarAccess) {
-		this.grammarAccess = grammarAccess;
-	}
-}
diff --git a/org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g b/org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g
deleted file mode 100644
index 0dcd90b..0000000
--- a/org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g
+++ /dev/null
@@ -1,10012 +0,0 @@
-/**
- * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf), Loetz GmbH&Co.KG (Heidelberg)
- * 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:
- *         Florian Pirchner - Initial implementation
- */
-
-grammar InternalUIGrammar;
-
-options {
-	superClass=AbstractInternalContentAssistParser;
-	backtrack=true;
-	
-}
-
-@lexer::header {
-package org.eclipse.osbp.ecview.dsl.ui.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.ui.editor.contentassist.antlr.internal.Lexer;
-}
-
-@parser::header {
-package org.eclipse.osbp.ecview.dsl.ui.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.ui.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
-import org.eclipse.xtext.ui.editor.contentassist.antlr.internal.DFA;
-import org.eclipse.osbp.ecview.dsl.services.UIGrammarGrammarAccess;
-
-}
-
-@parser::members {
- 
- 	private UIGrammarGrammarAccess grammarAccess;
- 	
-    public void setGrammarAccess(UIGrammarGrammarAccess grammarAccess) {
-    	this.grammarAccess = grammarAccess;
-    }
-    
-    @Override
-    protected Grammar getGrammar() {
-    	return grammarAccess.getGrammar();
-    }
-    
-    @Override
-    protected String getValueForTokenName(String tokenName) {
-    	return tokenName;
-    }
-
-}
-
-
-
-
-// Entry rule entryRuleUiModel
-entryRuleUiModel 
-:
-{ before(grammarAccess.getUiModelRule()); }
-	 ruleUiModel
-{ after(grammarAccess.getUiModelRule()); } 
-	 EOF 
-;
-
-// Rule UiModel
-ruleUiModel
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiModelAccess().getGroup()); }
-(rule__UiModel__Group__0)
-{ after(grammarAccess.getUiModelAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiImports
-entryRuleUiImports 
-:
-{ before(grammarAccess.getUiImportsRule()); }
-	 ruleUiImports
-{ after(grammarAccess.getUiImportsRule()); } 
-	 EOF 
-;
-
-// Rule UiImports
-ruleUiImports
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiImportsAccess().getGroup()); }
-(rule__UiImports__Group__0)
-{ after(grammarAccess.getUiImportsAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiRootElements
-entryRuleUiRootElements 
-:
-{ before(grammarAccess.getUiRootElementsRule()); }
-	 ruleUiRootElements
-{ after(grammarAccess.getUiRootElementsRule()); } 
-	 EOF 
-;
-
-// Rule UiRootElements
-ruleUiRootElements
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiRootElementsAccess().getAlternatives()); }
-(rule__UiRootElements__Alternatives)
-{ after(grammarAccess.getUiRootElementsAccess().getAlternatives()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiValidatorAlias
-entryRuleUiValidatorAlias 
-:
-{ before(grammarAccess.getUiValidatorAliasRule()); }
-	 ruleUiValidatorAlias
-{ after(grammarAccess.getUiValidatorAliasRule()); } 
-	 EOF 
-;
-
-// Rule UiValidatorAlias
-ruleUiValidatorAlias
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiValidatorAliasAccess().getGroup()); }
-(rule__UiValidatorAlias__Group__0)
-{ after(grammarAccess.getUiValidatorAliasAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiValidatorAssignment
-entryRuleUiValidatorAssignment 
-:
-{ before(grammarAccess.getUiValidatorAssignmentRule()); }
-	 ruleUiValidatorAssignment
-{ after(grammarAccess.getUiValidatorAssignmentRule()); } 
-	 EOF 
-;
-
-// Rule UiValidatorAssignment
-ruleUiValidatorAssignment
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiValidatorAssignmentAccess().getGroup()); }
-(rule__UiValidatorAssignment__Group__0)
-{ after(grammarAccess.getUiValidatorAssignmentAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiValidatorDef
-entryRuleUiValidatorDef 
-:
-{ before(grammarAccess.getUiValidatorDefRule()); }
-	 ruleUiValidatorDef
-{ after(grammarAccess.getUiValidatorDefRule()); } 
-	 EOF 
-;
-
-// Rule UiValidatorDef
-ruleUiValidatorDef
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiValidatorDefAccess().getValidatorAssignment()); }
-(rule__UiValidatorDef__ValidatorAssignment)
-{ after(grammarAccess.getUiValidatorDefAccess().getValidatorAssignment()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiViewSet
-entryRuleUiViewSet 
-:
-{ before(grammarAccess.getUiViewSetRule()); }
-	 ruleUiViewSet
-{ after(grammarAccess.getUiViewSetRule()); } 
-	 EOF 
-;
-
-// Rule UiViewSet
-ruleUiViewSet
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiViewSetAccess().getGroup()); }
-(rule__UiViewSet__Group__0)
-{ after(grammarAccess.getUiViewSetAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiBindingEndpointAlias
-entryRuleUiBindingEndpointAlias 
-:
-{ before(grammarAccess.getUiBindingEndpointAliasRule()); }
-	 ruleUiBindingEndpointAlias
-{ after(grammarAccess.getUiBindingEndpointAliasRule()); } 
-	 EOF 
-;
-
-// Rule UiBindingEndpointAlias
-ruleUiBindingEndpointAlias
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiBindingEndpointAliasAccess().getGroup()); }
-(rule__UiBindingEndpointAlias__Group__0)
-{ after(grammarAccess.getUiBindingEndpointAliasAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiBeanSlot
-entryRuleUiBeanSlot 
-:
-{ before(grammarAccess.getUiBeanSlotRule()); }
-	 ruleUiBeanSlot
-{ after(grammarAccess.getUiBeanSlotRule()); } 
-	 EOF 
-;
-
-// Rule UiBeanSlot
-ruleUiBeanSlot
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiBeanSlotAccess().getGroup()); }
-(rule__UiBeanSlot__Group__0)
-{ after(grammarAccess.getUiBeanSlotAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiBinding
-entryRuleUiBinding 
-:
-{ before(grammarAccess.getUiBindingRule()); }
-	 ruleUiBinding
-{ after(grammarAccess.getUiBindingRule()); } 
-	 EOF 
-;
-
-// Rule UiBinding
-ruleUiBinding
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiBindingAccess().getGroup()); }
-(rule__UiBinding__Group__0)
-{ after(grammarAccess.getUiBindingAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiBindingEndpointAssignment
-entryRuleUiBindingEndpointAssignment 
-:
-{ before(grammarAccess.getUiBindingEndpointAssignmentRule()); }
-	 ruleUiBindingEndpointAssignment
-{ after(grammarAccess.getUiBindingEndpointAssignmentRule()); } 
-	 EOF 
-;
-
-// Rule UiBindingEndpointAssignment
-ruleUiBindingEndpointAssignment
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiBindingEndpointAssignmentAccess().getAlternatives()); }
-(rule__UiBindingEndpointAssignment__Alternatives)
-{ after(grammarAccess.getUiBindingEndpointAssignmentAccess().getAlternatives()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiPathSegment
-entryRuleUiPathSegment 
-:
-{ before(grammarAccess.getUiPathSegmentRule()); }
-	 ruleUiPathSegment
-{ after(grammarAccess.getUiPathSegmentRule()); } 
-	 EOF 
-;
-
-// Rule UiPathSegment
-ruleUiPathSegment
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiPathSegmentAccess().getGroup()); }
-(rule__UiPathSegment__Group__0)
-{ after(grammarAccess.getUiPathSegmentAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiNestedProperty
-entryRuleUiNestedProperty 
-:
-{ before(grammarAccess.getUiNestedPropertyRule()); }
-	 ruleUiNestedProperty
-{ after(grammarAccess.getUiNestedPropertyRule()); } 
-	 EOF 
-;
-
-// Rule UiNestedProperty
-ruleUiNestedProperty
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiNestedPropertyAccess().getGroup()); }
-(rule__UiNestedProperty__Group__0)
-{ after(grammarAccess.getUiNestedPropertyAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiTypedBindableDef
-entryRuleUiTypedBindableDef 
-:
-{ before(grammarAccess.getUiTypedBindableDefRule()); }
-	 ruleUiTypedBindableDef
-{ after(grammarAccess.getUiTypedBindableDefRule()); } 
-	 EOF 
-;
-
-// Rule UiTypedBindableDef
-ruleUiTypedBindableDef
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiTypedBindableDefAccess().getGroup()); }
-(rule__UiTypedBindableDef__Group__0)
-{ after(grammarAccess.getUiTypedBindableDefAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiTypedBindableRawType
-entryRuleUiTypedBindableRawType 
-:
-{ before(grammarAccess.getUiTypedBindableRawTypeRule()); }
-	 ruleUiTypedBindableRawType
-{ after(grammarAccess.getUiTypedBindableRawTypeRule()); } 
-	 EOF 
-;
-
-// Rule UiTypedBindableRawType
-ruleUiTypedBindableRawType
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiTypedBindableRawTypeAccess().getGroup()); }
-(rule__UiTypedBindableRawType__Group__0)
-{ after(grammarAccess.getUiTypedBindableRawTypeAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiTypedBindableRawTypeAlias
-entryRuleUiTypedBindableRawTypeAlias 
-:
-{ before(grammarAccess.getUiTypedBindableRawTypeAliasRule()); }
-	 ruleUiTypedBindableRawTypeAlias
-{ after(grammarAccess.getUiTypedBindableRawTypeAliasRule()); } 
-	 EOF 
-;
-
-// Rule UiTypedBindableRawTypeAlias
-ruleUiTypedBindableRawTypeAlias
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiTypedBindableRawTypeAliasAccess().getGroup()); }
-(rule__UiTypedBindableRawTypeAlias__Group__0)
-{ after(grammarAccess.getUiTypedBindableRawTypeAliasAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiRawBindablePathSegment
-entryRuleUiRawBindablePathSegment 
-:
-{ before(grammarAccess.getUiRawBindablePathSegmentRule()); }
-	 ruleUiRawBindablePathSegment
-{ after(grammarAccess.getUiRawBindablePathSegmentRule()); } 
-	 EOF 
-;
-
-// Rule UiRawBindablePathSegment
-ruleUiRawBindablePathSegment
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiRawBindablePathSegmentAccess().getGroup()); }
-(rule__UiRawBindablePathSegment__Group__0)
-{ after(grammarAccess.getUiRawBindablePathSegmentAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiCommandBindableDef
-entryRuleUiCommandBindableDef 
-:
-{ before(grammarAccess.getUiCommandBindableDefRule()); }
-	 ruleUiCommandBindableDef
-{ after(grammarAccess.getUiCommandBindableDefRule()); } 
-	 EOF 
-;
-
-// Rule UiCommandBindableDef
-ruleUiCommandBindableDef
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiCommandBindableDefAccess().getGroup()); }
-(rule__UiCommandBindableDef__Group__0)
-{ after(grammarAccess.getUiCommandBindableDefAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiCommand
-entryRuleUiCommand 
-:
-{ before(grammarAccess.getUiCommandRule()); }
-	 ruleUiCommand
-{ after(grammarAccess.getUiCommandRule()); } 
-	 EOF 
-;
-
-// Rule UiCommand
-ruleUiCommand
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiCommandAccess().getAlternatives()); }
-(rule__UiCommand__Alternatives)
-{ after(grammarAccess.getUiCommandAccess().getAlternatives()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiMobileNavigationCommand
-entryRuleUiMobileNavigationCommand 
-:
-{ before(grammarAccess.getUiMobileNavigationCommandRule()); }
-	 ruleUiMobileNavigationCommand
-{ after(grammarAccess.getUiMobileNavigationCommandRule()); } 
-	 EOF 
-;
-
-// Rule UiMobileNavigationCommand
-ruleUiMobileNavigationCommand
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiMobileNavigationCommandAccess().getGroup()); }
-(rule__UiMobileNavigationCommand__Group__0)
-{ after(grammarAccess.getUiMobileNavigationCommandAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiOpenDialogCommand
-entryRuleUiOpenDialogCommand 
-:
-{ before(grammarAccess.getUiOpenDialogCommandRule()); }
-	 ruleUiOpenDialogCommand
-{ after(grammarAccess.getUiOpenDialogCommandRule()); } 
-	 EOF 
-;
-
-// Rule UiOpenDialogCommand
-ruleUiOpenDialogCommand
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiOpenDialogCommandAccess().getGroup()); }
-(rule__UiOpenDialogCommand__Group__0)
-{ after(grammarAccess.getUiOpenDialogCommandAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiSearchWithDialogCommand
-entryRuleUiSearchWithDialogCommand 
-:
-{ before(grammarAccess.getUiSearchWithDialogCommandRule()); }
-	 ruleUiSearchWithDialogCommand
-{ after(grammarAccess.getUiSearchWithDialogCommandRule()); } 
-	 EOF 
-;
-
-// Rule UiSearchWithDialogCommand
-ruleUiSearchWithDialogCommand
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiSearchWithDialogCommandAccess().getGroup()); }
-(rule__UiSearchWithDialogCommand__Group__0)
-{ after(grammarAccess.getUiSearchWithDialogCommandAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiAddToTableCommand
-entryRuleUiAddToTableCommand 
-:
-{ before(grammarAccess.getUiAddToTableCommandRule()); }
-	 ruleUiAddToTableCommand
-{ after(grammarAccess.getUiAddToTableCommandRule()); } 
-	 EOF 
-;
-
-// Rule UiAddToTableCommand
-ruleUiAddToTableCommand
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiAddToTableCommandAccess().getGroup()); }
-(rule__UiAddToTableCommand__Group__0)
-{ after(grammarAccess.getUiAddToTableCommandAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiRemoveFromTableCommand
-entryRuleUiRemoveFromTableCommand 
-:
-{ before(grammarAccess.getUiRemoveFromTableCommandRule()); }
-	 ruleUiRemoveFromTableCommand
-{ after(grammarAccess.getUiRemoveFromTableCommandRule()); } 
-	 EOF 
-;
-
-// Rule UiRemoveFromTableCommand
-ruleUiRemoveFromTableCommand
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiRemoveFromTableCommandAccess().getGroup()); }
-(rule__UiRemoveFromTableCommand__Group__0)
-{ after(grammarAccess.getUiRemoveFromTableCommandAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiSetNewInstanceCommand
-entryRuleUiSetNewInstanceCommand 
-:
-{ before(grammarAccess.getUiSetNewInstanceCommandRule()); }
-	 ruleUiSetNewInstanceCommand
-{ after(grammarAccess.getUiSetNewInstanceCommandRule()); } 
-	 EOF 
-;
-
-// Rule UiSetNewInstanceCommand
-ruleUiSetNewInstanceCommand
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiSetNewInstanceCommandAccess().getGroup()); }
-(rule__UiSetNewInstanceCommand__Group__0)
-{ after(grammarAccess.getUiSetNewInstanceCommandAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiSendEventCommand
-entryRuleUiSendEventCommand 
-:
-{ before(grammarAccess.getUiSendEventCommandRule()); }
-	 ruleUiSendEventCommand
-{ after(grammarAccess.getUiSendEventCommandRule()); } 
-	 EOF 
-;
-
-// Rule UiSendEventCommand
-ruleUiSendEventCommand
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiSendEventCommandAccess().getGroup()); }
-(rule__UiSendEventCommand__Group__0)
-{ after(grammarAccess.getUiSendEventCommandAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiView
-entryRuleUiView 
-:
-{ before(grammarAccess.getUiViewRule()); }
-	 ruleUiView
-{ after(grammarAccess.getUiViewRule()); } 
-	 EOF 
-;
-
-// Rule UiView
-ruleUiView
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiViewAccess().getUiIDEViewParserRuleCall()); }
-	ruleUiIDEView
-{ after(grammarAccess.getUiViewAccess().getUiIDEViewParserRuleCall()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiIDEView
-entryRuleUiIDEView 
-:
-{ before(grammarAccess.getUiIDEViewRule()); }
-	 ruleUiIDEView
-{ after(grammarAccess.getUiIDEViewRule()); } 
-	 EOF 
-;
-
-// Rule UiIDEView
-ruleUiIDEView
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiIDEViewAccess().getGroup()); }
-(rule__UiIDEView__Group__0)
-{ after(grammarAccess.getUiIDEViewAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiExposedAction
-entryRuleUiExposedAction 
-:
-{ before(grammarAccess.getUiExposedActionRule()); }
-	 ruleUiExposedAction
-{ after(grammarAccess.getUiExposedActionRule()); } 
-	 EOF 
-;
-
-// Rule UiExposedAction
-ruleUiExposedAction
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiExposedActionAccess().getGroup()); }
-(rule__UiExposedAction__Group__0)
-{ after(grammarAccess.getUiExposedActionAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiMobileNavBarAction
-entryRuleUiMobileNavBarAction 
-:
-{ before(grammarAccess.getUiMobileNavBarActionRule()); }
-	 ruleUiMobileNavBarAction
-{ after(grammarAccess.getUiMobileNavBarActionRule()); } 
-	 EOF 
-;
-
-// Rule UiMobileNavBarAction
-ruleUiMobileNavBarAction
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiMobileNavBarActionAccess().getGroup()); }
-(rule__UiMobileNavBarAction__Group__0)
-{ after(grammarAccess.getUiMobileNavBarActionAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiMobileView
-entryRuleUiMobileView 
-:
-{ before(grammarAccess.getUiMobileViewRule()); }
-	 ruleUiMobileView
-{ after(grammarAccess.getUiMobileViewRule()); } 
-	 EOF 
-;
-
-// Rule UiMobileView
-ruleUiMobileView
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiMobileViewAccess().getGroup()); }
-(rule__UiMobileView__Group__0)
-{ after(grammarAccess.getUiMobileViewAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiI18nInfo
-entryRuleUiI18nInfo 
-:
-{ before(grammarAccess.getUiI18nInfoRule()); }
-	 ruleUiI18nInfo
-{ after(grammarAccess.getUiI18nInfoRule()); } 
-	 EOF 
-;
-
-// Rule UiI18nInfo
-ruleUiI18nInfo
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiI18nInfoAccess().getGroup()); }
-(rule__UiI18nInfo__Group__0)
-{ after(grammarAccess.getUiI18nInfoAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiGridLayout
-entryRuleUiGridLayout 
-:
-{ before(grammarAccess.getUiGridLayoutRule()); }
-	 ruleUiGridLayout
-{ after(grammarAccess.getUiGridLayoutRule()); } 
-	 EOF 
-;
-
-// Rule UiGridLayout
-ruleUiGridLayout
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiGridLayoutAccess().getGroup()); }
-(rule__UiGridLayout__Group__0)
-{ after(grammarAccess.getUiGridLayoutAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiVisibilityProcessorAssignment
-entryRuleUiVisibilityProcessorAssignment 
-:
-{ before(grammarAccess.getUiVisibilityProcessorAssignmentRule()); }
-	 ruleUiVisibilityProcessorAssignment
-{ after(grammarAccess.getUiVisibilityProcessorAssignmentRule()); } 
-	 EOF 
-;
-
-// Rule UiVisibilityProcessorAssignment
-ruleUiVisibilityProcessorAssignment
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiVisibilityProcessorAssignmentAccess().getGroup()); }
-(rule__UiVisibilityProcessorAssignment__Group__0)
-{ after(grammarAccess.getUiVisibilityProcessorAssignmentAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiGridLayoutAssigment
-entryRuleUiGridLayoutAssigment 
-:
-{ before(grammarAccess.getUiGridLayoutAssigmentRule()); }
-	 ruleUiGridLayoutAssigment
-{ after(grammarAccess.getUiGridLayoutAssigmentRule()); } 
-	 EOF 
-;
-
-// Rule UiGridLayoutAssigment
-ruleUiGridLayoutAssigment
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiGridLayoutAssigmentAccess().getGroup()); }
-(rule__UiGridLayoutAssigment__Group__0)
-{ after(grammarAccess.getUiGridLayoutAssigmentAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiFormLayout
-entryRuleUiFormLayout 
-:
-{ before(grammarAccess.getUiFormLayoutRule()); }
-	 ruleUiFormLayout
-{ after(grammarAccess.getUiFormLayoutRule()); } 
-	 EOF 
-;
-
-// Rule UiFormLayout
-ruleUiFormLayout
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiFormLayoutAccess().getGroup()); }
-(rule__UiFormLayout__Group__0)
-{ after(grammarAccess.getUiFormLayoutAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiFormLayoutAssigment
-entryRuleUiFormLayoutAssigment 
-:
-{ before(grammarAccess.getUiFormLayoutAssigmentRule()); }
-	 ruleUiFormLayoutAssigment
-{ after(grammarAccess.getUiFormLayoutAssigmentRule()); } 
-	 EOF 
-;
-
-// Rule UiFormLayoutAssigment
-ruleUiFormLayoutAssigment
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiFormLayoutAssigmentAccess().getElementAssignment()); }
-(rule__UiFormLayoutAssigment__ElementAssignment)
-{ after(grammarAccess.getUiFormLayoutAssigmentAccess().getElementAssignment()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiVerticalLayout
-entryRuleUiVerticalLayout 
-:
-{ before(grammarAccess.getUiVerticalLayoutRule()); }
-	 ruleUiVerticalLayout
-{ after(grammarAccess.getUiVerticalLayoutRule()); } 
-	 EOF 
-;
-
-// Rule UiVerticalLayout
-ruleUiVerticalLayout
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiVerticalLayoutAccess().getGroup()); }
-(rule__UiVerticalLayout__Group__0)
-{ after(grammarAccess.getUiVerticalLayoutAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiVerticalLayoutAssigment
-entryRuleUiVerticalLayoutAssigment 
-:
-{ before(grammarAccess.getUiVerticalLayoutAssigmentRule()); }
-	 ruleUiVerticalLayoutAssigment
-{ after(grammarAccess.getUiVerticalLayoutAssigmentRule()); } 
-	 EOF 
-;
-
-// Rule UiVerticalLayoutAssigment
-ruleUiVerticalLayoutAssigment
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiVerticalLayoutAssigmentAccess().getGroup()); }
-(rule__UiVerticalLayoutAssigment__Group__0)
-{ after(grammarAccess.getUiVerticalLayoutAssigmentAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiMobileVerticalLayout
-entryRuleUiMobileVerticalLayout 
-:
-{ before(grammarAccess.getUiMobileVerticalLayoutRule()); }
-	 ruleUiMobileVerticalLayout
-{ after(grammarAccess.getUiMobileVerticalLayoutRule()); } 
-	 EOF 
-;
-
-// Rule UiMobileVerticalLayout
-ruleUiMobileVerticalLayout
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiMobileVerticalLayoutAccess().getGroup()); }
-(rule__UiMobileVerticalLayout__Group__0)
-{ after(grammarAccess.getUiMobileVerticalLayoutAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiMobileVerticalLayoutAssigment
-entryRuleUiMobileVerticalLayoutAssigment 
-:
-{ before(grammarAccess.getUiMobileVerticalLayoutAssigmentRule()); }
-	 ruleUiMobileVerticalLayoutAssigment
-{ after(grammarAccess.getUiMobileVerticalLayoutAssigmentRule()); } 
-	 EOF 
-;
-
-// Rule UiMobileVerticalLayoutAssigment
-ruleUiMobileVerticalLayoutAssigment
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiMobileVerticalLayoutAssigmentAccess().getGroup()); }
-(rule__UiMobileVerticalLayoutAssigment__Group__0)
-{ after(grammarAccess.getUiMobileVerticalLayoutAssigmentAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiMobileNavigationRoot
-entryRuleUiMobileNavigationRoot 
-:
-{ before(grammarAccess.getUiMobileNavigationRootRule()); }
-	 ruleUiMobileNavigationRoot
-{ after(grammarAccess.getUiMobileNavigationRootRule()); } 
-	 EOF 
-;
-
-// Rule UiMobileNavigationRoot
-ruleUiMobileNavigationRoot
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiMobileNavigationRootAccess().getGroup()); }
-(rule__UiMobileNavigationRoot__Group__0)
-{ after(grammarAccess.getUiMobileNavigationRootAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiMobileNavigationRootAssigment
-entryRuleUiMobileNavigationRootAssigment 
-:
-{ before(grammarAccess.getUiMobileNavigationRootAssigmentRule()); }
-	 ruleUiMobileNavigationRootAssigment
-{ after(grammarAccess.getUiMobileNavigationRootAssigmentRule()); } 
-	 EOF 
-;
-
-// Rule UiMobileNavigationRootAssigment
-ruleUiMobileNavigationRootAssigment
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiMobileNavigationRootAssigmentAccess().getElementAssignment()); }
-(rule__UiMobileNavigationRootAssigment__ElementAssignment)
-{ after(grammarAccess.getUiMobileNavigationRootAssigmentAccess().getElementAssignment()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiHorizontalLayout
-entryRuleUiHorizontalLayout 
-:
-{ before(grammarAccess.getUiHorizontalLayoutRule()); }
-	 ruleUiHorizontalLayout
-{ after(grammarAccess.getUiHorizontalLayoutRule()); } 
-	 EOF 
-;
-
-// Rule UiHorizontalLayout
-ruleUiHorizontalLayout
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiHorizontalLayoutAccess().getGroup()); }
-(rule__UiHorizontalLayout__Group__0)
-{ after(grammarAccess.getUiHorizontalLayoutAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiHorizontalLayoutAssigment
-entryRuleUiHorizontalLayoutAssigment 
-:
-{ before(grammarAccess.getUiHorizontalLayoutAssigmentRule()); }
-	 ruleUiHorizontalLayoutAssigment
-{ after(grammarAccess.getUiHorizontalLayoutAssigmentRule()); } 
-	 EOF 
-;
-
-// Rule UiHorizontalLayoutAssigment
-ruleUiHorizontalLayoutAssigment
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiHorizontalLayoutAssigmentAccess().getGroup()); }
-(rule__UiHorizontalLayoutAssigment__Group__0)
-{ after(grammarAccess.getUiHorizontalLayoutAssigmentAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiMobileHorizontalLayout
-entryRuleUiMobileHorizontalLayout 
-:
-{ before(grammarAccess.getUiMobileHorizontalLayoutRule()); }
-	 ruleUiMobileHorizontalLayout
-{ after(grammarAccess.getUiMobileHorizontalLayoutRule()); } 
-	 EOF 
-;
-
-// Rule UiMobileHorizontalLayout
-ruleUiMobileHorizontalLayout
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiMobileHorizontalLayoutAccess().getGroup()); }
-(rule__UiMobileHorizontalLayout__Group__0)
-{ after(grammarAccess.getUiMobileHorizontalLayoutAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiMobileHorizontalLayoutAssigment
-entryRuleUiMobileHorizontalLayoutAssigment 
-:
-{ before(grammarAccess.getUiMobileHorizontalLayoutAssigmentRule()); }
-	 ruleUiMobileHorizontalLayoutAssigment
-{ after(grammarAccess.getUiMobileHorizontalLayoutAssigmentRule()); } 
-	 EOF 
-;
-
-// Rule UiMobileHorizontalLayoutAssigment
-ruleUiMobileHorizontalLayoutAssigment
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiMobileHorizontalLayoutAssigmentAccess().getGroup()); }
-(rule__UiMobileHorizontalLayoutAssigment__Group__0)
-{ after(grammarAccess.getUiMobileHorizontalLayoutAssigmentAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiMobileHorizontalButtonGroup
-entryRuleUiMobileHorizontalButtonGroup 
-:
-{ before(grammarAccess.getUiMobileHorizontalButtonGroupRule()); }
-	 ruleUiMobileHorizontalButtonGroup
-{ after(grammarAccess.getUiMobileHorizontalButtonGroupRule()); } 
-	 EOF 
-;
-
-// Rule UiMobileHorizontalButtonGroup
-ruleUiMobileHorizontalButtonGroup
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getGroup()); }
-(rule__UiMobileHorizontalButtonGroup__Group__0)
-{ after(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiMobileHorizontalButtonGroupAssigment
-entryRuleUiMobileHorizontalButtonGroupAssigment 
-:
-{ before(grammarAccess.getUiMobileHorizontalButtonGroupAssigmentRule()); }
-	 ruleUiMobileHorizontalButtonGroupAssigment
-{ after(grammarAccess.getUiMobileHorizontalButtonGroupAssigmentRule()); } 
-	 EOF 
-;
-
-// Rule UiMobileHorizontalButtonGroupAssigment
-ruleUiMobileHorizontalButtonGroupAssigment
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiMobileHorizontalButtonGroupAssigmentAccess().getElementAssignment()); }
-(rule__UiMobileHorizontalButtonGroupAssigment__ElementAssignment)
-{ after(grammarAccess.getUiMobileHorizontalButtonGroupAssigmentAccess().getElementAssignment()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiMobileVerticalComponentGroup
-entryRuleUiMobileVerticalComponentGroup 
-:
-{ before(grammarAccess.getUiMobileVerticalComponentGroupRule()); }
-	 ruleUiMobileVerticalComponentGroup
-{ after(grammarAccess.getUiMobileVerticalComponentGroupRule()); } 
-	 EOF 
-;
-
-// Rule UiMobileVerticalComponentGroup
-ruleUiMobileVerticalComponentGroup
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiMobileVerticalComponentGroupAccess().getGroup()); }
-(rule__UiMobileVerticalComponentGroup__Group__0)
-{ after(grammarAccess.getUiMobileVerticalComponentGroupAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiMobileVerticalComponentGroupAssigment
-entryRuleUiMobileVerticalComponentGroupAssigment 
-:
-{ before(grammarAccess.getUiMobileVerticalComponentGroupAssigmentRule()); }
-	 ruleUiMobileVerticalComponentGroupAssigment
-{ after(grammarAccess.getUiMobileVerticalComponentGroupAssigmentRule()); } 
-	 EOF 
-;
-
-// Rule UiMobileVerticalComponentGroupAssigment
-ruleUiMobileVerticalComponentGroupAssigment
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiMobileVerticalComponentGroupAssigmentAccess().getElementAssignment()); }
-(rule__UiMobileVerticalComponentGroupAssigment__ElementAssignment)
-{ after(grammarAccess.getUiMobileVerticalComponentGroupAssigmentAccess().getElementAssignment()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiSearchPanel
-entryRuleUiSearchPanel 
-:
-{ before(grammarAccess.getUiSearchPanelRule()); }
-	 ruleUiSearchPanel
-{ after(grammarAccess.getUiSearchPanelRule()); } 
-	 EOF 
-;
-
-// Rule UiSearchPanel
-ruleUiSearchPanel
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiSearchPanelAccess().getGroup()); }
-(rule__UiSearchPanel__Group__0)
-{ after(grammarAccess.getUiSearchPanelAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiMobileSearchPanel
-entryRuleUiMobileSearchPanel 
-:
-{ before(grammarAccess.getUiMobileSearchPanelRule()); }
-	 ruleUiMobileSearchPanel
-{ after(grammarAccess.getUiMobileSearchPanelRule()); } 
-	 EOF 
-;
-
-// Rule UiMobileSearchPanel
-ruleUiMobileSearchPanel
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiMobileSearchPanelAccess().getGroup()); }
-(rule__UiMobileSearchPanel__Group__0)
-{ after(grammarAccess.getUiMobileSearchPanelAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiMobileTabSheet
-entryRuleUiMobileTabSheet 
-:
-{ before(grammarAccess.getUiMobileTabSheetRule()); }
-	 ruleUiMobileTabSheet
-{ after(grammarAccess.getUiMobileTabSheetRule()); } 
-	 EOF 
-;
-
-// Rule UiMobileTabSheet
-ruleUiMobileTabSheet
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiMobileTabSheetAccess().getGroup()); }
-(rule__UiMobileTabSheet__Group__0)
-{ after(grammarAccess.getUiMobileTabSheetAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiMobileTabAssignment
-entryRuleUiMobileTabAssignment 
-:
-{ before(grammarAccess.getUiMobileTabAssignmentRule()); }
-	 ruleUiMobileTabAssignment
-{ after(grammarAccess.getUiMobileTabAssignmentRule()); } 
-	 EOF 
-;
-
-// Rule UiMobileTabAssignment
-ruleUiMobileTabAssignment
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiMobileTabAssignmentAccess().getGroup()); }
-(rule__UiMobileTabAssignment__Group__0)
-{ after(grammarAccess.getUiMobileTabAssignmentAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiTabSheet
-entryRuleUiTabSheet 
-:
-{ before(grammarAccess.getUiTabSheetRule()); }
-	 ruleUiTabSheet
-{ after(grammarAccess.getUiTabSheetRule()); } 
-	 EOF 
-;
-
-// Rule UiTabSheet
-ruleUiTabSheet
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiTabSheetAccess().getGroup()); }
-(rule__UiTabSheet__Group__0)
-{ after(grammarAccess.getUiTabSheetAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiTabAssignment
-entryRuleUiTabAssignment 
-:
-{ before(grammarAccess.getUiTabAssignmentRule()); }
-	 ruleUiTabAssignment
-{ after(grammarAccess.getUiTabAssignmentRule()); } 
-	 EOF 
-;
-
-// Rule UiTabAssignment
-ruleUiTabAssignment
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiTabAssignmentAccess().getGroup()); }
-(rule__UiTabAssignment__Group__0)
-{ after(grammarAccess.getUiTabAssignmentAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiSplitpanel
-entryRuleUiSplitpanel 
-:
-{ before(grammarAccess.getUiSplitpanelRule()); }
-	 ruleUiSplitpanel
-{ after(grammarAccess.getUiSplitpanelRule()); } 
-	 EOF 
-;
-
-// Rule UiSplitpanel
-ruleUiSplitpanel
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiSplitpanelAccess().getGroup()); }
-(rule__UiSplitpanel__Group__0)
-{ after(grammarAccess.getUiSplitpanelAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiSplitpanelAssigment
-entryRuleUiSplitpanelAssigment 
-:
-{ before(grammarAccess.getUiSplitpanelAssigmentRule()); }
-	 ruleUiSplitpanelAssigment
-{ after(grammarAccess.getUiSplitpanelAssigmentRule()); } 
-	 EOF 
-;
-
-// Rule UiSplitpanelAssigment
-ruleUiSplitpanelAssigment
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiSplitpanelAssigmentAccess().getElementAssignment()); }
-(rule__UiSplitpanelAssigment__ElementAssignment)
-{ after(grammarAccess.getUiSplitpanelAssigmentAccess().getElementAssignment()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiPanel
-entryRuleUiPanel 
-:
-{ before(grammarAccess.getUiPanelRule()); }
-	 ruleUiPanel
-{ after(grammarAccess.getUiPanelRule()); } 
-	 EOF 
-;
-
-// Rule UiPanel
-ruleUiPanel
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiPanelAccess().getGroup()); }
-(rule__UiPanel__Group__0)
-{ after(grammarAccess.getUiPanelAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiDialog
-entryRuleUiDialog 
-:
-{ before(grammarAccess.getUiDialogRule()); }
-	 ruleUiDialog
-{ after(grammarAccess.getUiDialogRule()); } 
-	 EOF 
-;
-
-// Rule UiDialog
-ruleUiDialog
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiDialogAccess().getGroup()); }
-(rule__UiDialog__Group__0)
-{ after(grammarAccess.getUiDialogAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiDialogAssignment
-entryRuleUiDialogAssignment 
-:
-{ before(grammarAccess.getUiDialogAssignmentRule()); }
-	 ruleUiDialogAssignment
-{ after(grammarAccess.getUiDialogAssignmentRule()); } 
-	 EOF 
-;
-
-// Rule UiDialogAssignment
-ruleUiDialogAssignment
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiDialogAssignmentAccess().getElementAssignment()); }
-(rule__UiDialogAssignment__ElementAssignment)
-{ after(grammarAccess.getUiDialogAssignmentAccess().getElementAssignment()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiSearchDialog
-entryRuleUiSearchDialog 
-:
-{ before(grammarAccess.getUiSearchDialogRule()); }
-	 ruleUiSearchDialog
-{ after(grammarAccess.getUiSearchDialogRule()); } 
-	 EOF 
-;
-
-// Rule UiSearchDialog
-ruleUiSearchDialog
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiSearchDialogAccess().getGroup()); }
-(rule__UiSearchDialog__Group__0)
-{ after(grammarAccess.getUiSearchDialogAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiDialogSearchFieldAssignment
-entryRuleUiDialogSearchFieldAssignment 
-:
-{ before(grammarAccess.getUiDialogSearchFieldAssignmentRule()); }
-	 ruleUiDialogSearchFieldAssignment
-{ after(grammarAccess.getUiDialogSearchFieldAssignmentRule()); } 
-	 EOF 
-;
-
-// Rule UiDialogSearchFieldAssignment
-ruleUiDialogSearchFieldAssignment
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiDialogSearchFieldAssignmentAccess().getElementAssignment()); }
-(rule__UiDialogSearchFieldAssignment__ElementAssignment)
-{ after(grammarAccess.getUiDialogSearchFieldAssignmentAccess().getElementAssignment()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiMobileNavigationPage
-entryRuleUiMobileNavigationPage 
-:
-{ before(grammarAccess.getUiMobileNavigationPageRule()); }
-	 ruleUiMobileNavigationPage
-{ after(grammarAccess.getUiMobileNavigationPageRule()); } 
-	 EOF 
-;
-
-// Rule UiMobileNavigationPage
-ruleUiMobileNavigationPage
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiMobileNavigationPageAccess().getGroup()); }
-(rule__UiMobileNavigationPage__Group__0)
-{ after(grammarAccess.getUiMobileNavigationPageAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiMobileNavigationPageAssignment
-entryRuleUiMobileNavigationPageAssignment 
-:
-{ before(grammarAccess.getUiMobileNavigationPageAssignmentRule()); }
-	 ruleUiMobileNavigationPageAssignment
-{ after(grammarAccess.getUiMobileNavigationPageAssignmentRule()); } 
-	 EOF 
-;
-
-// Rule UiMobileNavigationPageAssignment
-ruleUiMobileNavigationPageAssignment
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiMobileNavigationPageAssignmentAccess().getGroup()); }
-(rule__UiMobileNavigationPageAssignment__Group__0)
-{ after(grammarAccess.getUiMobileNavigationPageAssignmentAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-// Entry rule entryRuleUiTextField
-entryRuleUiTextField 
-:
-{ before(grammarAccess.getUiTextFieldRule()); }
-	 ruleUiTextField
-{ after(grammarAccess.getUiTextFieldRule()); } 
-	 EOF 
-;
-
-// Rule UiTextField
-ruleUiTextField
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiTextFieldAccess().getGroup()); }
-(rule__UiTextField__Group__0)
-{ after(grammarAccess.getUiTextFieldAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiPasswordField
-entryRuleUiPasswordField 
-:
-{ before(grammarAccess.getUiPasswordFieldRule()); }
-	 ruleUiPasswordField
-{ after(grammarAccess.getUiPasswordFieldRule()); } 
-	 EOF 
-;
-
-// Rule UiPasswordField
-ruleUiPasswordField
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiPasswordFieldAccess().getGroup()); }
-(rule__UiPasswordField__Group__0)
-{ after(grammarAccess.getUiPasswordFieldAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiMaskedTextField
-entryRuleUiMaskedTextField 
-:
-{ before(grammarAccess.getUiMaskedTextFieldRule()); }
-	 ruleUiMaskedTextField
-{ after(grammarAccess.getUiMaskedTextFieldRule()); } 
-	 EOF 
-;
-
-// Rule UiMaskedTextField
-ruleUiMaskedTextField
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiMaskedTextFieldAccess().getGroup()); }
-(rule__UiMaskedTextField__Group__0)
-{ after(grammarAccess.getUiMaskedTextFieldAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiMaskedNumericField
-entryRuleUiMaskedNumericField 
-:
-{ before(grammarAccess.getUiMaskedNumericFieldRule()); }
-	 ruleUiMaskedNumericField
-{ after(grammarAccess.getUiMaskedNumericFieldRule()); } 
-	 EOF 
-;
-
-// Rule UiMaskedNumericField
-ruleUiMaskedNumericField
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiMaskedNumericFieldAccess().getGroup()); }
-(rule__UiMaskedNumericField__Group__0)
-{ after(grammarAccess.getUiMaskedNumericFieldAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiMaskedDecimalField
-entryRuleUiMaskedDecimalField 
-:
-{ before(grammarAccess.getUiMaskedDecimalFieldRule()); }
-	 ruleUiMaskedDecimalField
-{ after(grammarAccess.getUiMaskedDecimalFieldRule()); } 
-	 EOF 
-;
-
-// Rule UiMaskedDecimalField
-ruleUiMaskedDecimalField
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiMaskedDecimalFieldAccess().getGroup()); }
-(rule__UiMaskedDecimalField__Group__0)
-{ after(grammarAccess.getUiMaskedDecimalFieldAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiPrefixedMaskedTextField
-entryRuleUiPrefixedMaskedTextField 
-:
-{ before(grammarAccess.getUiPrefixedMaskedTextFieldRule()); }
-	 ruleUiPrefixedMaskedTextField
-{ after(grammarAccess.getUiPrefixedMaskedTextFieldRule()); } 
-	 EOF 
-;
-
-// Rule UiPrefixedMaskedTextField
-ruleUiPrefixedMaskedTextField
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getGroup()); }
-(rule__UiPrefixedMaskedTextField__Group__0)
-{ after(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiPrefixToMaskMapEntry
-entryRuleUiPrefixToMaskMapEntry 
-:
-{ before(grammarAccess.getUiPrefixToMaskMapEntryRule()); }
-	 ruleUiPrefixToMaskMapEntry
-{ after(grammarAccess.getUiPrefixToMaskMapEntryRule()); } 
-	 EOF 
-;
-
-// Rule UiPrefixToMaskMapEntry
-ruleUiPrefixToMaskMapEntry
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiPrefixToMaskMapEntryAccess().getGroup()); }
-(rule__UiPrefixToMaskMapEntry__Group__0)
-{ after(grammarAccess.getUiPrefixToMaskMapEntryAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiRichTextArea
-entryRuleUiRichTextArea 
-:
-{ before(grammarAccess.getUiRichTextAreaRule()); }
-	 ruleUiRichTextArea
-{ after(grammarAccess.getUiRichTextAreaRule()); } 
-	 EOF 
-;
-
-// Rule UiRichTextArea
-ruleUiRichTextArea
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiRichTextAreaAccess().getGroup()); }
-(rule__UiRichTextArea__Group__0)
-{ after(grammarAccess.getUiRichTextAreaAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiSuggestTextField
-entryRuleUiSuggestTextField 
-:
-{ before(grammarAccess.getUiSuggestTextFieldRule()); }
-	 ruleUiSuggestTextField
-{ after(grammarAccess.getUiSuggestTextFieldRule()); } 
-	 EOF 
-;
-
-// Rule UiSuggestTextField
-ruleUiSuggestTextField
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiSuggestTextFieldAccess().getGroup()); }
-(rule__UiSuggestTextField__Group__0)
-{ after(grammarAccess.getUiSuggestTextFieldAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiBeanReferenceField
-entryRuleUiBeanReferenceField 
-:
-{ before(grammarAccess.getUiBeanReferenceFieldRule()); }
-	 ruleUiBeanReferenceField
-{ after(grammarAccess.getUiBeanReferenceFieldRule()); } 
-	 EOF 
-;
-
-// Rule UiBeanReferenceField
-ruleUiBeanReferenceField
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiBeanReferenceFieldAccess().getGroup()); }
-(rule__UiBeanReferenceField__Group__0)
-{ after(grammarAccess.getUiBeanReferenceFieldAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiSearchField
-entryRuleUiSearchField 
-:
-{ before(grammarAccess.getUiSearchFieldRule()); }
-	 ruleUiSearchField
-{ after(grammarAccess.getUiSearchFieldRule()); } 
-	 EOF 
-;
-
-// Rule UiSearchField
-ruleUiSearchField
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiSearchFieldAccess().getGroup()); }
-(rule__UiSearchField__Group__0)
-{ after(grammarAccess.getUiSearchFieldAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiTextArea
-entryRuleUiTextArea 
-:
-{ before(grammarAccess.getUiTextAreaRule()); }
-	 ruleUiTextArea
-{ after(grammarAccess.getUiTextAreaRule()); } 
-	 EOF 
-;
-
-// Rule UiTextArea
-ruleUiTextArea
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiTextAreaAccess().getGroup()); }
-(rule__UiTextArea__Group__0)
-{ after(grammarAccess.getUiTextAreaAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiDateField
-entryRuleUiDateField 
-:
-{ before(grammarAccess.getUiDateFieldRule()); }
-	 ruleUiDateField
-{ after(grammarAccess.getUiDateFieldRule()); } 
-	 EOF 
-;
-
-// Rule UiDateField
-ruleUiDateField
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiDateFieldAccess().getGroup()); }
-(rule__UiDateField__Group__0)
-{ after(grammarAccess.getUiDateFieldAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiBrowser
-entryRuleUiBrowser 
-:
-{ before(grammarAccess.getUiBrowserRule()); }
-	 ruleUiBrowser
-{ after(grammarAccess.getUiBrowserRule()); } 
-	 EOF 
-;
-
-// Rule UiBrowser
-ruleUiBrowser
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiBrowserAccess().getGroup()); }
-(rule__UiBrowser__Group__0)
-{ after(grammarAccess.getUiBrowserAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiProgressBar
-entryRuleUiProgressBar 
-:
-{ before(grammarAccess.getUiProgressBarRule()); }
-	 ruleUiProgressBar
-{ after(grammarAccess.getUiProgressBarRule()); } 
-	 EOF 
-;
-
-// Rule UiProgressBar
-ruleUiProgressBar
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiProgressBarAccess().getGroup()); }
-(rule__UiProgressBar__Group__0)
-{ after(grammarAccess.getUiProgressBarAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiImage
-entryRuleUiImage 
-:
-{ before(grammarAccess.getUiImageRule()); }
-	 ruleUiImage
-{ after(grammarAccess.getUiImageRule()); } 
-	 EOF 
-;
-
-// Rule UiImage
-ruleUiImage
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiImageAccess().getGroup()); }
-(rule__UiImage__Group__0)
-{ after(grammarAccess.getUiImageAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiTable
-entryRuleUiTable 
-:
-{ before(grammarAccess.getUiTableRule()); }
-	 ruleUiTable
-{ after(grammarAccess.getUiTableRule()); } 
-	 EOF 
-;
-
-// Rule UiTable
-ruleUiTable
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiTableAccess().getGroup()); }
-(rule__UiTable__Group__0)
-{ after(grammarAccess.getUiTableAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiComboBox
-entryRuleUiComboBox 
-:
-{ before(grammarAccess.getUiComboBoxRule()); }
-	 ruleUiComboBox
-{ after(grammarAccess.getUiComboBoxRule()); } 
-	 EOF 
-;
-
-// Rule UiComboBox
-ruleUiComboBox
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiComboBoxAccess().getGroup()); }
-(rule__UiComboBox__Group__0)
-{ after(grammarAccess.getUiComboBoxAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiButton
-entryRuleUiButton 
-:
-{ before(grammarAccess.getUiButtonRule()); }
-	 ruleUiButton
-{ after(grammarAccess.getUiButtonRule()); } 
-	 EOF 
-;
-
-// Rule UiButton
-ruleUiButton
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiButtonAccess().getGroup()); }
-(rule__UiButton__Group__0)
-{ after(grammarAccess.getUiButtonAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiMobileNavigationButton
-entryRuleUiMobileNavigationButton 
-:
-{ before(grammarAccess.getUiMobileNavigationButtonRule()); }
-	 ruleUiMobileNavigationButton
-{ after(grammarAccess.getUiMobileNavigationButtonRule()); } 
-	 EOF 
-;
-
-// Rule UiMobileNavigationButton
-ruleUiMobileNavigationButton
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiMobileNavigationButtonAccess().getGroup()); }
-(rule__UiMobileNavigationButton__Group__0)
-{ after(grammarAccess.getUiMobileNavigationButtonAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiMobileSwitch
-entryRuleUiMobileSwitch 
-:
-{ before(grammarAccess.getUiMobileSwitchRule()); }
-	 ruleUiMobileSwitch
-{ after(grammarAccess.getUiMobileSwitchRule()); } 
-	 EOF 
-;
-
-// Rule UiMobileSwitch
-ruleUiMobileSwitch
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiMobileSwitchAccess().getGroup()); }
-(rule__UiMobileSwitch__Group__0)
-{ after(grammarAccess.getUiMobileSwitchAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiLabel
-entryRuleUiLabel 
-:
-{ before(grammarAccess.getUiLabelRule()); }
-	 ruleUiLabel
-{ after(grammarAccess.getUiLabelRule()); } 
-	 EOF 
-;
-
-// Rule UiLabel
-ruleUiLabel
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiLabelAccess().getGroup()); }
-(rule__UiLabel__Group__0)
-{ after(grammarAccess.getUiLabelAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiDecimalField
-entryRuleUiDecimalField 
-:
-{ before(grammarAccess.getUiDecimalFieldRule()); }
-	 ruleUiDecimalField
-{ after(grammarAccess.getUiDecimalFieldRule()); } 
-	 EOF 
-;
-
-// Rule UiDecimalField
-ruleUiDecimalField
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiDecimalFieldAccess().getGroup()); }
-(rule__UiDecimalField__Group__0)
-{ after(grammarAccess.getUiDecimalFieldAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiOptionsGroup
-entryRuleUiOptionsGroup 
-:
-{ before(grammarAccess.getUiOptionsGroupRule()); }
-	 ruleUiOptionsGroup
-{ after(grammarAccess.getUiOptionsGroupRule()); } 
-	 EOF 
-;
-
-// Rule UiOptionsGroup
-ruleUiOptionsGroup
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiOptionsGroupAccess().getGroup()); }
-(rule__UiOptionsGroup__Group__0)
-{ after(grammarAccess.getUiOptionsGroupAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiList
-entryRuleUiList 
-:
-{ before(grammarAccess.getUiListRule()); }
-	 ruleUiList
-{ after(grammarAccess.getUiListRule()); } 
-	 EOF 
-;
-
-// Rule UiList
-ruleUiList
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiListAccess().getGroup()); }
-(rule__UiList__Group__0)
-{ after(grammarAccess.getUiListAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiColumnsAssignment
-entryRuleUiColumnsAssignment 
-:
-{ before(grammarAccess.getUiColumnsAssignmentRule()); }
-	 ruleUiColumnsAssignment
-{ after(grammarAccess.getUiColumnsAssignmentRule()); } 
-	 EOF 
-;
-
-// Rule UiColumnsAssignment
-ruleUiColumnsAssignment
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiColumnsAssignmentAccess().getGroup()); }
-(rule__UiColumnsAssignment__Group__0)
-{ after(grammarAccess.getUiColumnsAssignmentAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiSortOrderAssignment
-entryRuleUiSortOrderAssignment 
-:
-{ before(grammarAccess.getUiSortOrderAssignmentRule()); }
-	 ruleUiSortOrderAssignment
-{ after(grammarAccess.getUiSortOrderAssignmentRule()); } 
-	 EOF 
-;
-
-// Rule UiSortOrderAssignment
-ruleUiSortOrderAssignment
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiSortOrderAssignmentAccess().getGroup()); }
-(rule__UiSortOrderAssignment__Group__0)
-{ after(grammarAccess.getUiSortOrderAssignmentAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiSortOrder
-entryRuleUiSortOrder 
-:
-{ before(grammarAccess.getUiSortOrderRule()); }
-	 ruleUiSortOrder
-{ after(grammarAccess.getUiSortOrderRule()); } 
-	 EOF 
-;
-
-// Rule UiSortOrder
-ruleUiSortOrder
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiSortOrderAccess().getGroup()); }
-(rule__UiSortOrder__Group__0)
-{ after(grammarAccess.getUiSortOrderAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiColumn
-entryRuleUiColumn 
-:
-{ before(grammarAccess.getUiColumnRule()); }
-	 ruleUiColumn
-{ after(grammarAccess.getUiColumnRule()); } 
-	 EOF 
-;
-
-// Rule UiColumn
-ruleUiColumn
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiColumnAccess().getGroup()); }
-(rule__UiColumn__Group__0)
-{ after(grammarAccess.getUiColumnAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiEmbeddable
-entryRuleUiEmbeddable 
-:
-{ before(grammarAccess.getUiEmbeddableRule()); }
-	 ruleUiEmbeddable
-{ after(grammarAccess.getUiEmbeddableRule()); } 
-	 EOF 
-;
-
-// Rule UiEmbeddable
-ruleUiEmbeddable
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiEmbeddableAccess().getAlternatives()); }
-(rule__UiEmbeddable__Alternatives)
-{ after(grammarAccess.getUiEmbeddableAccess().getAlternatives()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiMobileEmbeddable
-entryRuleUiMobileEmbeddable 
-:
-{ before(grammarAccess.getUiMobileEmbeddableRule()); }
-	 ruleUiMobileEmbeddable
-{ after(grammarAccess.getUiMobileEmbeddableRule()); } 
-	 EOF 
-;
-
-// Rule UiMobileEmbeddable
-ruleUiMobileEmbeddable
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiMobileEmbeddableAccess().getAlternatives()); }
-(rule__UiMobileEmbeddable__Alternatives)
-{ after(grammarAccess.getUiMobileEmbeddableAccess().getAlternatives()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiMobileLayout
-entryRuleUiMobileLayout 
-:
-{ before(grammarAccess.getUiMobileLayoutRule()); }
-	 ruleUiMobileLayout
-{ after(grammarAccess.getUiMobileLayoutRule()); } 
-	 EOF 
-;
-
-// Rule UiMobileLayout
-ruleUiMobileLayout
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiMobileLayoutAccess().getAlternatives()); }
-(rule__UiMobileLayout__Alternatives)
-{ after(grammarAccess.getUiMobileLayoutAccess().getAlternatives()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiMobileField
-entryRuleUiMobileField 
-:
-{ before(grammarAccess.getUiMobileFieldRule()); }
-	 ruleUiMobileField
-{ after(grammarAccess.getUiMobileFieldRule()); } 
-	 EOF 
-;
-
-// Rule UiMobileField
-ruleUiMobileField
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiMobileFieldAccess().getAlternatives()); }
-(rule__UiMobileField__Alternatives)
-{ after(grammarAccess.getUiMobileFieldAccess().getAlternatives()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiLayout
-entryRuleUiLayout 
-:
-{ before(grammarAccess.getUiLayoutRule()); }
-	 ruleUiLayout
-{ after(grammarAccess.getUiLayoutRule()); } 
-	 EOF 
-;
-
-// Rule UiLayout
-ruleUiLayout
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiLayoutAccess().getAlternatives()); }
-(rule__UiLayout__Alternatives)
-{ after(grammarAccess.getUiLayoutAccess().getAlternatives()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiField
-entryRuleUiField 
-:
-{ before(grammarAccess.getUiFieldRule()); }
-	 ruleUiField
-{ after(grammarAccess.getUiFieldRule()); } 
-	 EOF 
-;
-
-// Rule UiField
-ruleUiField
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiFieldAccess().getAlternatives()); }
-(rule__UiField__Alternatives)
-{ after(grammarAccess.getUiFieldAccess().getAlternatives()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiAction
-entryRuleUiAction 
-:
-{ before(grammarAccess.getUiActionRule()); }
-	 ruleUiAction
-{ after(grammarAccess.getUiActionRule()); } 
-	 EOF 
-;
-
-// Rule UiAction
-ruleUiAction
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiActionAccess().getUiButtonParserRuleCall()); }
-	ruleUiButton
-{ after(grammarAccess.getUiActionAccess().getUiButtonParserRuleCall()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiMobileAction
-entryRuleUiMobileAction 
-:
-{ before(grammarAccess.getUiMobileActionRule()); }
-	 ruleUiMobileAction
-{ after(grammarAccess.getUiMobileActionRule()); } 
-	 EOF 
-;
-
-// Rule UiMobileAction
-ruleUiMobileAction
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiMobileActionAccess().getAlternatives()); }
-(rule__UiMobileAction__Alternatives)
-{ after(grammarAccess.getUiMobileActionAccess().getAlternatives()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiNumericField
-entryRuleUiNumericField 
-:
-{ before(grammarAccess.getUiNumericFieldRule()); }
-	 ruleUiNumericField
-{ after(grammarAccess.getUiNumericFieldRule()); } 
-	 EOF 
-;
-
-// Rule UiNumericField
-ruleUiNumericField
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiNumericFieldAccess().getGroup()); }
-(rule__UiNumericField__Group__0)
-{ after(grammarAccess.getUiNumericFieldAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiCheckBox
-entryRuleUiCheckBox 
-:
-{ before(grammarAccess.getUiCheckBoxRule()); }
-	 ruleUiCheckBox
-{ after(grammarAccess.getUiCheckBoxRule()); } 
-	 EOF 
-;
-
-// Rule UiCheckBox
-ruleUiCheckBox
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiCheckBoxAccess().getGroup()); }
-(rule__UiCheckBox__Group__0)
-{ after(grammarAccess.getUiCheckBoxAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiValidator
-entryRuleUiValidator 
-:
-{ before(grammarAccess.getUiValidatorRule()); }
-	 ruleUiValidator
-{ after(grammarAccess.getUiValidatorRule()); } 
-	 EOF 
-;
-
-// Rule UiValidator
-ruleUiValidator
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiValidatorAccess().getAlternatives()); }
-(rule__UiValidator__Alternatives)
-{ after(grammarAccess.getUiValidatorAccess().getAlternatives()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiMaxLengthValidator
-entryRuleUiMaxLengthValidator 
-:
-{ before(grammarAccess.getUiMaxLengthValidatorRule()); }
-	 ruleUiMaxLengthValidator
-{ after(grammarAccess.getUiMaxLengthValidatorRule()); } 
-	 EOF 
-;
-
-// Rule UiMaxLengthValidator
-ruleUiMaxLengthValidator
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiMaxLengthValidatorAccess().getGroup()); }
-(rule__UiMaxLengthValidator__Group__0)
-{ after(grammarAccess.getUiMaxLengthValidatorAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiMinLengthValidator
-entryRuleUiMinLengthValidator 
-:
-{ before(grammarAccess.getUiMinLengthValidatorRule()); }
-	 ruleUiMinLengthValidator
-{ after(grammarAccess.getUiMinLengthValidatorRule()); } 
-	 EOF 
-;
-
-// Rule UiMinLengthValidator
-ruleUiMinLengthValidator
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiMinLengthValidatorAccess().getGroup()); }
-(rule__UiMinLengthValidator__Group__0)
-{ after(grammarAccess.getUiMinLengthValidatorAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiRegexpValidator
-entryRuleUiRegexpValidator 
-:
-{ before(grammarAccess.getUiRegexpValidatorRule()); }
-	 ruleUiRegexpValidator
-{ after(grammarAccess.getUiRegexpValidatorRule()); } 
-	 EOF 
-;
-
-// Rule UiRegexpValidator
-ruleUiRegexpValidator
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiRegexpValidatorAccess().getGroup()); }
-(rule__UiRegexpValidator__Group__0)
-{ after(grammarAccess.getUiRegexpValidatorAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiXbaseValidator
-entryRuleUiXbaseValidator 
-:
-{ before(grammarAccess.getUiXbaseValidatorRule()); }
-	 ruleUiXbaseValidator
-{ after(grammarAccess.getUiXbaseValidatorRule()); } 
-	 EOF 
-;
-
-// Rule UiXbaseValidator
-ruleUiXbaseValidator
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiXbaseValidatorAccess().getGroup()); }
-(rule__UiXbaseValidator__Group__0)
-{ after(grammarAccess.getUiXbaseValidatorAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiBeanValidationValidator
-entryRuleUiBeanValidationValidator 
-:
-{ before(grammarAccess.getUiBeanValidationValidatorRule()); }
-	 ruleUiBeanValidationValidator
-{ after(grammarAccess.getUiBeanValidationValidatorRule()); } 
-	 EOF 
-;
-
-// Rule UiBeanValidationValidator
-ruleUiBeanValidationValidator
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiBeanValidationValidatorAccess().getGroup()); }
-(rule__UiBeanValidationValidator__Group__0)
-{ after(grammarAccess.getUiBeanValidationValidatorAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiErrorCode
-entryRuleUiErrorCode 
-:
-{ before(grammarAccess.getUiErrorCodeRule()); }
-	 ruleUiErrorCode
-{ after(grammarAccess.getUiErrorCodeRule()); } 
-	 EOF 
-;
-
-// Rule UiErrorCode
-ruleUiErrorCode
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiErrorCodeAccess().getGroup()); }
-(rule__UiErrorCode__Group__0)
-{ after(grammarAccess.getUiErrorCodeAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiVisibilityProcessor
-entryRuleUiVisibilityProcessor 
-:
-{ before(grammarAccess.getUiVisibilityProcessorRule()); }
-	 ruleUiVisibilityProcessor
-{ after(grammarAccess.getUiVisibilityProcessorRule()); } 
-	 EOF 
-;
-
-// Rule UiVisibilityProcessor
-ruleUiVisibilityProcessor
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiVisibilityProcessorAccess().getGroup()); }
-(rule__UiVisibilityProcessor__Group__0)
-{ after(grammarAccess.getUiVisibilityProcessorAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiXbaseVisibilityRule
-entryRuleUiXbaseVisibilityRule 
-:
-{ before(grammarAccess.getUiXbaseVisibilityRuleRule()); }
-	 ruleUiXbaseVisibilityRule
-{ after(grammarAccess.getUiXbaseVisibilityRuleRule()); } 
-	 EOF 
-;
-
-// Rule UiXbaseVisibilityRule
-ruleUiXbaseVisibilityRule
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiXbaseVisibilityRuleAccess().getExpressionAssignment()); }
-(rule__UiXbaseVisibilityRule__ExpressionAssignment)
-{ after(grammarAccess.getUiXbaseVisibilityRuleAccess().getExpressionAssignment()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUiChangeTrigger
-entryRuleUiChangeTrigger 
-:
-{ before(grammarAccess.getUiChangeTriggerRule()); }
-	 ruleUiChangeTrigger
-{ after(grammarAccess.getUiChangeTriggerRule()); } 
-	 EOF 
-;
-
-// Rule UiChangeTrigger
-ruleUiChangeTrigger
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUiChangeTriggerAccess().getGroup()); }
-(rule__UiChangeTrigger__Group__0)
-{ after(grammarAccess.getUiChangeTriggerAccess().getGroup()); }
-)
-
-;
-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 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 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 UiDateFormat
-ruleUiDateFormat
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiDateFormatAccess().getAlternatives()); }
-(rule__UiDateFormat__Alternatives)
-{ after(grammarAccess.getUiDateFormatAccess().getAlternatives()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Rule UiDateTimeResolution
-ruleUiDateTimeResolution
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiDateTimeResolutionAccess().getAlternatives()); }
-(rule__UiDateTimeResolution__Alternatives)
-{ after(grammarAccess.getUiDateTimeResolutionAccess().getAlternatives()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Rule UiSelectionType
-ruleUiSelectionType
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiSelectionTypeAccess().getAlternatives()); }
-(rule__UiSelectionType__Alternatives)
-{ after(grammarAccess.getUiSelectionTypeAccess().getAlternatives()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Rule UiAlignment
-ruleUiAlignment
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiAlignmentAccess().getAlternatives()); }
-(rule__UiAlignment__Alternatives)
-{ after(grammarAccess.getUiAlignmentAccess().getAlternatives()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-rule__UiRootElements__Alternatives
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiRootElementsAccess().getUiViewParserRuleCall_0()); }
-	ruleUiView
-{ after(grammarAccess.getUiRootElementsAccess().getUiViewParserRuleCall_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiRootElementsAccess().getUiViewSetParserRuleCall_1()); }
-	ruleUiViewSet
-{ after(grammarAccess.getUiRootElementsAccess().getUiViewSetParserRuleCall_1()); }
-)
-
-    |(
-{ before(grammarAccess.getUiRootElementsAccess().getUiValidatorAliasParserRuleCall_2()); }
-	ruleUiValidatorAlias
-{ after(grammarAccess.getUiRootElementsAccess().getUiValidatorAliasParserRuleCall_2()); }
-)
-
-    |(
-{ before(grammarAccess.getUiRootElementsAccess().getUiMobileViewParserRuleCall_3()); }
-	ruleUiMobileView
-{ after(grammarAccess.getUiRootElementsAccess().getUiMobileViewParserRuleCall_3()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiValidatorAssignment__Alternatives_3
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiValidatorAssignmentAccess().getValidatorDefAssignment_3_0()); }
-(rule__UiValidatorAssignment__ValidatorDefAssignment_3_0)
-{ after(grammarAccess.getUiValidatorAssignmentAccess().getValidatorDefAssignment_3_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiValidatorAssignmentAccess().getGroup_3_1()); }
-(rule__UiValidatorAssignment__Group_3_1__0)
-{ after(grammarAccess.getUiValidatorAssignmentAccess().getGroup_3_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiBindingEndpointAssignment__Alternatives
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiBindingEndpointAssignmentAccess().getGroup_0()); }
-(rule__UiBindingEndpointAssignment__Group_0__0)
-{ after(grammarAccess.getUiBindingEndpointAssignmentAccess().getGroup_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiBindingEndpointAssignmentAccess().getGroup_1()); }
-(rule__UiBindingEndpointAssignment__Group_1__0)
-{ after(grammarAccess.getUiBindingEndpointAssignmentAccess().getGroup_1()); }
-)
-
-    |(
-{ before(grammarAccess.getUiBindingEndpointAssignmentAccess().getGroup_2()); }
-(rule__UiBindingEndpointAssignment__Group_2__0)
-{ after(grammarAccess.getUiBindingEndpointAssignmentAccess().getGroup_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiRawBindablePathSegment__Alternatives_1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiRawBindablePathSegmentAccess().getFullStopKeyword_1_0()); }
-
-	'.' 
-
-{ after(grammarAccess.getUiRawBindablePathSegmentAccess().getFullStopKeyword_1_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiRawBindablePathSegmentAccess().getToParentAssignment_1_1()); }
-(rule__UiRawBindablePathSegment__ToParentAssignment_1_1)
-{ after(grammarAccess.getUiRawBindablePathSegmentAccess().getToParentAssignment_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiCommand__Alternatives
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiCommandAccess().getUiMobileNavigationCommandParserRuleCall_0()); }
-	ruleUiMobileNavigationCommand
-{ after(grammarAccess.getUiCommandAccess().getUiMobileNavigationCommandParserRuleCall_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiCommandAccess().getUiOpenDialogCommandParserRuleCall_1()); }
-	ruleUiOpenDialogCommand
-{ after(grammarAccess.getUiCommandAccess().getUiOpenDialogCommandParserRuleCall_1()); }
-)
-
-    |(
-{ before(grammarAccess.getUiCommandAccess().getUiSearchWithDialogCommandParserRuleCall_2()); }
-	ruleUiSearchWithDialogCommand
-{ after(grammarAccess.getUiCommandAccess().getUiSearchWithDialogCommandParserRuleCall_2()); }
-)
-
-    |(
-{ before(grammarAccess.getUiCommandAccess().getUiAddToTableCommandParserRuleCall_3()); }
-	ruleUiAddToTableCommand
-{ after(grammarAccess.getUiCommandAccess().getUiAddToTableCommandParserRuleCall_3()); }
-)
-
-    |(
-{ before(grammarAccess.getUiCommandAccess().getUiRemoveFromTableCommandParserRuleCall_4()); }
-	ruleUiRemoveFromTableCommand
-{ after(grammarAccess.getUiCommandAccess().getUiRemoveFromTableCommandParserRuleCall_4()); }
-)
-
-    |(
-{ before(grammarAccess.getUiCommandAccess().getUiSendEventCommandParserRuleCall_5()); }
-	ruleUiSendEventCommand
-{ after(grammarAccess.getUiCommandAccess().getUiSendEventCommandParserRuleCall_5()); }
-)
-
-    |(
-{ before(grammarAccess.getUiCommandAccess().getUiSetNewInstanceCommandParserRuleCall_6()); }
-	ruleUiSetNewInstanceCommand
-{ after(grammarAccess.getUiCommandAccess().getUiSetNewInstanceCommandParserRuleCall_6()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiIDEView__Alternatives_4
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiIDEViewAccess().getBeanSlotsAssignment_4_0()); }
-(rule__UiIDEView__BeanSlotsAssignment_4_0)
-{ after(grammarAccess.getUiIDEViewAccess().getBeanSlotsAssignment_4_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiIDEViewAccess().getBindingEndpointAliasAssignment_4_1()); }
-(rule__UiIDEView__BindingEndpointAliasAssignment_4_1)
-{ after(grammarAccess.getUiIDEViewAccess().getBindingEndpointAliasAssignment_4_1()); }
-)
-
-    |(
-{ before(grammarAccess.getUiIDEViewAccess().getBindingsAssignment_4_2()); }
-(rule__UiIDEView__BindingsAssignment_4_2)
-{ after(grammarAccess.getUiIDEViewAccess().getBindingsAssignment_4_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiIDEView__Alternatives_7
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiIDEViewAccess().getBindingEndpointAliasAssignment_7_0()); }
-(rule__UiIDEView__BindingEndpointAliasAssignment_7_0)
-{ after(grammarAccess.getUiIDEViewAccess().getBindingEndpointAliasAssignment_7_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiIDEViewAccess().getBindingsAssignment_7_1()); }
-(rule__UiIDEView__BindingsAssignment_7_1)
-{ after(grammarAccess.getUiIDEViewAccess().getBindingsAssignment_7_1()); }
-)
-
-    |(
-{ before(grammarAccess.getUiIDEViewAccess().getValidatorAssignmentsAssignment_7_2()); }
-(rule__UiIDEView__ValidatorAssignmentsAssignment_7_2)
-{ after(grammarAccess.getUiIDEViewAccess().getValidatorAssignmentsAssignment_7_2()); }
-)
-
-    |(
-{ before(grammarAccess.getUiIDEViewAccess().getProcessorAssignmentsAssignment_7_3()); }
-(rule__UiIDEView__ProcessorAssignmentsAssignment_7_3)
-{ after(grammarAccess.getUiIDEViewAccess().getProcessorAssignmentsAssignment_7_3()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiExposedAction__Alternatives_3
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiExposedActionAccess().getActionReferenceAssignment_3_0()); }
-(rule__UiExposedAction__ActionReferenceAssignment_3_0)
-{ after(grammarAccess.getUiExposedActionAccess().getActionReferenceAssignment_3_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiExposedActionAccess().getActionIDAssignment_3_1()); }
-(rule__UiExposedAction__ActionIDAssignment_3_1)
-{ after(grammarAccess.getUiExposedActionAccess().getActionIDAssignment_3_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiMobileNavBarAction__Alternatives_3
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiMobileNavBarActionAccess().getActionReferenceAssignment_3_0()); }
-(rule__UiMobileNavBarAction__ActionReferenceAssignment_3_0)
-{ after(grammarAccess.getUiMobileNavBarActionAccess().getActionReferenceAssignment_3_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiMobileNavBarActionAccess().getActionIDAssignment_3_1()); }
-(rule__UiMobileNavBarAction__ActionIDAssignment_3_1)
-{ after(grammarAccess.getUiMobileNavBarActionAccess().getActionIDAssignment_3_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiMobileView__Alternatives_4
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiMobileViewAccess().getBeanSlotsAssignment_4_0()); }
-(rule__UiMobileView__BeanSlotsAssignment_4_0)
-{ after(grammarAccess.getUiMobileViewAccess().getBeanSlotsAssignment_4_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiMobileViewAccess().getBindingEndpointAliasAssignment_4_1()); }
-(rule__UiMobileView__BindingEndpointAliasAssignment_4_1)
-{ after(grammarAccess.getUiMobileViewAccess().getBindingEndpointAliasAssignment_4_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiMobileView__Alternatives_7
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiMobileViewAccess().getBindingEndpointAliasAssignment_7_0()); }
-(rule__UiMobileView__BindingEndpointAliasAssignment_7_0)
-{ after(grammarAccess.getUiMobileViewAccess().getBindingEndpointAliasAssignment_7_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiMobileViewAccess().getBindingsAssignment_7_1()); }
-(rule__UiMobileView__BindingsAssignment_7_1)
-{ after(grammarAccess.getUiMobileViewAccess().getBindingsAssignment_7_1()); }
-)
-
-    |(
-{ before(grammarAccess.getUiMobileViewAccess().getValidatorAssignmentsAssignment_7_2()); }
-(rule__UiMobileView__ValidatorAssignmentsAssignment_7_2)
-{ after(grammarAccess.getUiMobileViewAccess().getValidatorAssignmentsAssignment_7_2()); }
-)
-
-    |(
-{ before(grammarAccess.getUiMobileViewAccess().getProcessorAssignmentsAssignment_7_3()); }
-(rule__UiMobileView__ProcessorAssignmentsAssignment_7_3)
-{ after(grammarAccess.getUiMobileViewAccess().getProcessorAssignmentsAssignment_7_3()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiTextField__Alternatives_4_1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiTextFieldAccess().getValidatorsAssignment_4_1_0()); }
-(rule__UiTextField__ValidatorsAssignment_4_1_0)
-{ after(grammarAccess.getUiTextFieldAccess().getValidatorsAssignment_4_1_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiTextFieldAccess().getBindingsAssignment_4_1_1()); }
-(rule__UiTextField__BindingsAssignment_4_1_1)
-{ after(grammarAccess.getUiTextFieldAccess().getBindingsAssignment_4_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiPasswordField__Alternatives_4_1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiPasswordFieldAccess().getValidatorsAssignment_4_1_0()); }
-(rule__UiPasswordField__ValidatorsAssignment_4_1_0)
-{ after(grammarAccess.getUiPasswordFieldAccess().getValidatorsAssignment_4_1_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiPasswordFieldAccess().getBindingsAssignment_4_1_1()); }
-(rule__UiPasswordField__BindingsAssignment_4_1_1)
-{ after(grammarAccess.getUiPasswordFieldAccess().getBindingsAssignment_4_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiMaskedTextField__Alternatives_4_1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiMaskedTextFieldAccess().getValidatorsAssignment_4_1_0()); }
-(rule__UiMaskedTextField__ValidatorsAssignment_4_1_0)
-{ after(grammarAccess.getUiMaskedTextFieldAccess().getValidatorsAssignment_4_1_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiMaskedTextFieldAccess().getBindingsAssignment_4_1_1()); }
-(rule__UiMaskedTextField__BindingsAssignment_4_1_1)
-{ after(grammarAccess.getUiMaskedTextFieldAccess().getBindingsAssignment_4_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiMaskedNumericField__Alternatives_4_1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiMaskedNumericFieldAccess().getValidatorsAssignment_4_1_0()); }
-(rule__UiMaskedNumericField__ValidatorsAssignment_4_1_0)
-{ after(grammarAccess.getUiMaskedNumericFieldAccess().getValidatorsAssignment_4_1_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiMaskedNumericFieldAccess().getBindingsAssignment_4_1_1()); }
-(rule__UiMaskedNumericField__BindingsAssignment_4_1_1)
-{ after(grammarAccess.getUiMaskedNumericFieldAccess().getBindingsAssignment_4_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiMaskedDecimalField__Alternatives_4_1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiMaskedDecimalFieldAccess().getValidatorsAssignment_4_1_0()); }
-(rule__UiMaskedDecimalField__ValidatorsAssignment_4_1_0)
-{ after(grammarAccess.getUiMaskedDecimalFieldAccess().getValidatorsAssignment_4_1_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiMaskedDecimalFieldAccess().getBindingsAssignment_4_1_1()); }
-(rule__UiMaskedDecimalField__BindingsAssignment_4_1_1)
-{ after(grammarAccess.getUiMaskedDecimalFieldAccess().getBindingsAssignment_4_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiPrefixedMaskedTextField__Alternatives_4_1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getValidatorsAssignment_4_1_0()); }
-(rule__UiPrefixedMaskedTextField__ValidatorsAssignment_4_1_0)
-{ after(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getValidatorsAssignment_4_1_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getBindingsAssignment_4_1_1()); }
-(rule__UiPrefixedMaskedTextField__BindingsAssignment_4_1_1)
-{ after(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getBindingsAssignment_4_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiRichTextArea__Alternatives_4_1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiRichTextAreaAccess().getValidatorsAssignment_4_1_0()); }
-(rule__UiRichTextArea__ValidatorsAssignment_4_1_0)
-{ after(grammarAccess.getUiRichTextAreaAccess().getValidatorsAssignment_4_1_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiRichTextAreaAccess().getBindingsAssignment_4_1_1()); }
-(rule__UiRichTextArea__BindingsAssignment_4_1_1)
-{ after(grammarAccess.getUiRichTextAreaAccess().getBindingsAssignment_4_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiSuggestTextField__Alternatives_4_2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiSuggestTextFieldAccess().getValidatorsAssignment_4_2_0()); }
-(rule__UiSuggestTextField__ValidatorsAssignment_4_2_0)
-{ after(grammarAccess.getUiSuggestTextFieldAccess().getValidatorsAssignment_4_2_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiSuggestTextFieldAccess().getBindingsAssignment_4_2_1()); }
-(rule__UiSuggestTextField__BindingsAssignment_4_2_1)
-{ after(grammarAccess.getUiSuggestTextFieldAccess().getBindingsAssignment_4_2_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiBeanReferenceField__Alternatives_4_2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiBeanReferenceFieldAccess().getValidatorsAssignment_4_2_0()); }
-(rule__UiBeanReferenceField__ValidatorsAssignment_4_2_0)
-{ after(grammarAccess.getUiBeanReferenceFieldAccess().getValidatorsAssignment_4_2_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiBeanReferenceFieldAccess().getBindingsAssignment_4_2_1()); }
-(rule__UiBeanReferenceField__BindingsAssignment_4_2_1)
-{ after(grammarAccess.getUiBeanReferenceFieldAccess().getBindingsAssignment_4_2_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiTextArea__Alternatives_4_1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiTextAreaAccess().getValidatorsAssignment_4_1_0()); }
-(rule__UiTextArea__ValidatorsAssignment_4_1_0)
-{ after(grammarAccess.getUiTextAreaAccess().getValidatorsAssignment_4_1_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiTextAreaAccess().getBindingsAssignment_4_1_1()); }
-(rule__UiTextArea__BindingsAssignment_4_1_1)
-{ after(grammarAccess.getUiTextAreaAccess().getBindingsAssignment_4_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiDateField__Alternatives_4_1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiDateFieldAccess().getValidatorsAssignment_4_1_0()); }
-(rule__UiDateField__ValidatorsAssignment_4_1_0)
-{ after(grammarAccess.getUiDateFieldAccess().getValidatorsAssignment_4_1_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiDateFieldAccess().getBindingsAssignment_4_1_1()); }
-(rule__UiDateField__BindingsAssignment_4_1_1)
-{ after(grammarAccess.getUiDateFieldAccess().getBindingsAssignment_4_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiBrowser__Alternatives_4_1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiBrowserAccess().getValidatorsAssignment_4_1_0()); }
-(rule__UiBrowser__ValidatorsAssignment_4_1_0)
-{ after(grammarAccess.getUiBrowserAccess().getValidatorsAssignment_4_1_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiBrowserAccess().getBindingsAssignment_4_1_1()); }
-(rule__UiBrowser__BindingsAssignment_4_1_1)
-{ after(grammarAccess.getUiBrowserAccess().getBindingsAssignment_4_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiProgressBar__Alternatives_4_1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiProgressBarAccess().getValidatorsAssignment_4_1_0()); }
-(rule__UiProgressBar__ValidatorsAssignment_4_1_0)
-{ after(grammarAccess.getUiProgressBarAccess().getValidatorsAssignment_4_1_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiProgressBarAccess().getBindingsAssignment_4_1_1()); }
-(rule__UiProgressBar__BindingsAssignment_4_1_1)
-{ after(grammarAccess.getUiProgressBarAccess().getBindingsAssignment_4_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiTable__Alternatives_4_4
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiTableAccess().getValidatorsAssignment_4_4_0()); }
-(rule__UiTable__ValidatorsAssignment_4_4_0)
-{ after(grammarAccess.getUiTableAccess().getValidatorsAssignment_4_4_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiTableAccess().getBindingsAssignment_4_4_1()); }
-(rule__UiTable__BindingsAssignment_4_4_1)
-{ after(grammarAccess.getUiTableAccess().getBindingsAssignment_4_4_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiComboBox__Alternatives_4_2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiComboBoxAccess().getValidatorsAssignment_4_2_0()); }
-(rule__UiComboBox__ValidatorsAssignment_4_2_0)
-{ after(grammarAccess.getUiComboBoxAccess().getValidatorsAssignment_4_2_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiComboBoxAccess().getBindingsAssignment_4_2_1()); }
-(rule__UiComboBox__BindingsAssignment_4_2_1)
-{ after(grammarAccess.getUiComboBoxAccess().getBindingsAssignment_4_2_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiMobileNavigationButton__Alternatives_4
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiMobileNavigationButtonAccess().getTargetPageAssignment_4_0()); }
-(rule__UiMobileNavigationButton__TargetPageAssignment_4_0)
-{ after(grammarAccess.getUiMobileNavigationButtonAccess().getTargetPageAssignment_4_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiMobileNavigationButtonAccess().getGroup_4_1()); }
-(rule__UiMobileNavigationButton__Group_4_1__0)
-{ after(grammarAccess.getUiMobileNavigationButtonAccess().getGroup_4_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiMobileSwitch__Alternatives_4_2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiMobileSwitchAccess().getValidatorsAssignment_4_2_0()); }
-(rule__UiMobileSwitch__ValidatorsAssignment_4_2_0)
-{ after(grammarAccess.getUiMobileSwitchAccess().getValidatorsAssignment_4_2_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiMobileSwitchAccess().getBindingsAssignment_4_2_1()); }
-(rule__UiMobileSwitch__BindingsAssignment_4_2_1)
-{ after(grammarAccess.getUiMobileSwitchAccess().getBindingsAssignment_4_2_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiDecimalField__Alternatives_4_1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiDecimalFieldAccess().getValidatorsAssignment_4_1_0()); }
-(rule__UiDecimalField__ValidatorsAssignment_4_1_0)
-{ after(grammarAccess.getUiDecimalFieldAccess().getValidatorsAssignment_4_1_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiDecimalFieldAccess().getBindingsAssignment_4_1_1()); }
-(rule__UiDecimalField__BindingsAssignment_4_1_1)
-{ after(grammarAccess.getUiDecimalFieldAccess().getBindingsAssignment_4_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiOptionsGroup__Alternatives_4_2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiOptionsGroupAccess().getValidatorsAssignment_4_2_0()); }
-(rule__UiOptionsGroup__ValidatorsAssignment_4_2_0)
-{ after(grammarAccess.getUiOptionsGroupAccess().getValidatorsAssignment_4_2_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiOptionsGroupAccess().getBindingsAssignment_4_2_1()); }
-(rule__UiOptionsGroup__BindingsAssignment_4_2_1)
-{ after(grammarAccess.getUiOptionsGroupAccess().getBindingsAssignment_4_2_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiList__Alternatives_4_2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiListAccess().getValidatorsAssignment_4_2_0()); }
-(rule__UiList__ValidatorsAssignment_4_2_0)
-{ after(grammarAccess.getUiListAccess().getValidatorsAssignment_4_2_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiListAccess().getBindingsAssignment_4_2_1()); }
-(rule__UiList__BindingsAssignment_4_2_1)
-{ after(grammarAccess.getUiListAccess().getBindingsAssignment_4_2_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiSortOrder__Alternatives_2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiSortOrderAccess().getDescKeyword_2_0()); }
-
-	'desc' 
-
-{ after(grammarAccess.getUiSortOrderAccess().getDescKeyword_2_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiSortOrderAccess().getAscAssignment_2_1()); }
-(rule__UiSortOrder__AscAssignment_2_1)
-{ after(grammarAccess.getUiSortOrderAccess().getAscAssignment_2_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiEmbeddable__Alternatives
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiEmbeddableAccess().getUiLayoutParserRuleCall_0()); }
-	ruleUiLayout
-{ after(grammarAccess.getUiEmbeddableAccess().getUiLayoutParserRuleCall_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiEmbeddableAccess().getUiFieldParserRuleCall_1()); }
-	ruleUiField
-{ after(grammarAccess.getUiEmbeddableAccess().getUiFieldParserRuleCall_1()); }
-)
-
-    |(
-{ before(grammarAccess.getUiEmbeddableAccess().getUiActionParserRuleCall_2()); }
-	ruleUiAction
-{ after(grammarAccess.getUiEmbeddableAccess().getUiActionParserRuleCall_2()); }
-)
-
-    |(
-{ before(grammarAccess.getUiEmbeddableAccess().getUiTabSheetParserRuleCall_3()); }
-	ruleUiTabSheet
-{ after(grammarAccess.getUiEmbeddableAccess().getUiTabSheetParserRuleCall_3()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiMobileEmbeddable__Alternatives
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiMobileEmbeddableAccess().getUiMobileLayoutParserRuleCall_0()); }
-	ruleUiMobileLayout
-{ after(grammarAccess.getUiMobileEmbeddableAccess().getUiMobileLayoutParserRuleCall_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiMobileEmbeddableAccess().getUiMobileFieldParserRuleCall_1()); }
-	ruleUiMobileField
-{ after(grammarAccess.getUiMobileEmbeddableAccess().getUiMobileFieldParserRuleCall_1()); }
-)
-
-    |(
-{ before(grammarAccess.getUiMobileEmbeddableAccess().getUiMobileTabSheetParserRuleCall_2()); }
-	ruleUiMobileTabSheet
-{ after(grammarAccess.getUiMobileEmbeddableAccess().getUiMobileTabSheetParserRuleCall_2()); }
-)
-
-    |(
-{ before(grammarAccess.getUiMobileEmbeddableAccess().getUiMobileActionParserRuleCall_3()); }
-	ruleUiMobileAction
-{ after(grammarAccess.getUiMobileEmbeddableAccess().getUiMobileActionParserRuleCall_3()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiMobileLayout__Alternatives
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiMobileLayoutAccess().getUiMobileHorizontalButtonGroupParserRuleCall_0()); }
-	ruleUiMobileHorizontalButtonGroup
-{ after(grammarAccess.getUiMobileLayoutAccess().getUiMobileHorizontalButtonGroupParserRuleCall_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiMobileLayoutAccess().getUiMobileVerticalComponentGroupParserRuleCall_1()); }
-	ruleUiMobileVerticalComponentGroup
-{ after(grammarAccess.getUiMobileLayoutAccess().getUiMobileVerticalComponentGroupParserRuleCall_1()); }
-)
-
-    |(
-{ before(grammarAccess.getUiMobileLayoutAccess().getUiMobileNavigationPageParserRuleCall_2()); }
-	ruleUiMobileNavigationPage
-{ after(grammarAccess.getUiMobileLayoutAccess().getUiMobileNavigationPageParserRuleCall_2()); }
-)
-
-    |(
-{ before(grammarAccess.getUiMobileLayoutAccess().getUiMobileHorizontalLayoutParserRuleCall_3()); }
-	ruleUiMobileHorizontalLayout
-{ after(grammarAccess.getUiMobileLayoutAccess().getUiMobileHorizontalLayoutParserRuleCall_3()); }
-)
-
-    |(
-{ before(grammarAccess.getUiMobileLayoutAccess().getUiMobileVerticalLayoutParserRuleCall_4()); }
-	ruleUiMobileVerticalLayout
-{ after(grammarAccess.getUiMobileLayoutAccess().getUiMobileVerticalLayoutParserRuleCall_4()); }
-)
-
-    |(
-{ before(grammarAccess.getUiMobileLayoutAccess().getUiMobileSearchPanelParserRuleCall_5()); }
-	ruleUiMobileSearchPanel
-{ after(grammarAccess.getUiMobileLayoutAccess().getUiMobileSearchPanelParserRuleCall_5()); }
-)
-
-    |(
-{ before(grammarAccess.getUiMobileLayoutAccess().getUiMobileNavigationRootParserRuleCall_6()); }
-	ruleUiMobileNavigationRoot
-{ after(grammarAccess.getUiMobileLayoutAccess().getUiMobileNavigationRootParserRuleCall_6()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiMobileField__Alternatives
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiMobileFieldAccess().getUiMobileSwitchParserRuleCall_0()); }
-	ruleUiMobileSwitch
-{ after(grammarAccess.getUiMobileFieldAccess().getUiMobileSwitchParserRuleCall_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiMobileFieldAccess().getUiTextFieldParserRuleCall_1()); }
-	ruleUiTextField
-{ after(grammarAccess.getUiMobileFieldAccess().getUiTextFieldParserRuleCall_1()); }
-)
-
-    |(
-{ before(grammarAccess.getUiMobileFieldAccess().getUiMaskedTextFieldParserRuleCall_2()); }
-	ruleUiMaskedTextField
-{ after(grammarAccess.getUiMobileFieldAccess().getUiMaskedTextFieldParserRuleCall_2()); }
-)
-
-    |(
-{ before(grammarAccess.getUiMobileFieldAccess().getUiMaskedNumericFieldParserRuleCall_3()); }
-	ruleUiMaskedNumericField
-{ after(grammarAccess.getUiMobileFieldAccess().getUiMaskedNumericFieldParserRuleCall_3()); }
-)
-
-    |(
-{ before(grammarAccess.getUiMobileFieldAccess().getUiMaskedDecimalFieldParserRuleCall_4()); }
-	ruleUiMaskedDecimalField
-{ after(grammarAccess.getUiMobileFieldAccess().getUiMaskedDecimalFieldParserRuleCall_4()); }
-)
-
-    |(
-{ before(grammarAccess.getUiMobileFieldAccess().getUiPrefixedMaskedTextFieldParserRuleCall_5()); }
-	ruleUiPrefixedMaskedTextField
-{ after(grammarAccess.getUiMobileFieldAccess().getUiPrefixedMaskedTextFieldParserRuleCall_5()); }
-)
-
-    |(
-{ before(grammarAccess.getUiMobileFieldAccess().getUiRichTextAreaParserRuleCall_6()); }
-	ruleUiRichTextArea
-{ after(grammarAccess.getUiMobileFieldAccess().getUiRichTextAreaParserRuleCall_6()); }
-)
-
-    |(
-{ before(grammarAccess.getUiMobileFieldAccess().getUiPasswordFieldParserRuleCall_7()); }
-	ruleUiPasswordField
-{ after(grammarAccess.getUiMobileFieldAccess().getUiPasswordFieldParserRuleCall_7()); }
-)
-
-    |(
-{ before(grammarAccess.getUiMobileFieldAccess().getUiSuggestTextFieldParserRuleCall_8()); }
-	ruleUiSuggestTextField
-{ after(grammarAccess.getUiMobileFieldAccess().getUiSuggestTextFieldParserRuleCall_8()); }
-)
-
-    |(
-{ before(grammarAccess.getUiMobileFieldAccess().getUiNumericFieldParserRuleCall_9()); }
-	ruleUiNumericField
-{ after(grammarAccess.getUiMobileFieldAccess().getUiNumericFieldParserRuleCall_9()); }
-)
-
-    |(
-{ before(grammarAccess.getUiMobileFieldAccess().getUiTableParserRuleCall_10()); }
-	ruleUiTable
-{ after(grammarAccess.getUiMobileFieldAccess().getUiTableParserRuleCall_10()); }
-)
-
-    |(
-{ before(grammarAccess.getUiMobileFieldAccess().getUiComboBoxParserRuleCall_11()); }
-	ruleUiComboBox
-{ after(grammarAccess.getUiMobileFieldAccess().getUiComboBoxParserRuleCall_11()); }
-)
-
-    |(
-{ before(grammarAccess.getUiMobileFieldAccess().getUiImageParserRuleCall_12()); }
-	ruleUiImage
-{ after(grammarAccess.getUiMobileFieldAccess().getUiImageParserRuleCall_12()); }
-)
-
-    |(
-{ before(grammarAccess.getUiMobileFieldAccess().getUiSearchFieldParserRuleCall_13()); }
-	ruleUiSearchField
-{ after(grammarAccess.getUiMobileFieldAccess().getUiSearchFieldParserRuleCall_13()); }
-)
-
-    |(
-{ before(grammarAccess.getUiMobileFieldAccess().getUiLabelParserRuleCall_14()); }
-	ruleUiLabel
-{ after(grammarAccess.getUiMobileFieldAccess().getUiLabelParserRuleCall_14()); }
-)
-
-    |(
-{ before(grammarAccess.getUiMobileFieldAccess().getUiDecimalFieldParserRuleCall_15()); }
-	ruleUiDecimalField
-{ after(grammarAccess.getUiMobileFieldAccess().getUiDecimalFieldParserRuleCall_15()); }
-)
-
-    |(
-{ before(grammarAccess.getUiMobileFieldAccess().getUiTextAreaParserRuleCall_16()); }
-	ruleUiTextArea
-{ after(grammarAccess.getUiMobileFieldAccess().getUiTextAreaParserRuleCall_16()); }
-)
-
-    |(
-{ before(grammarAccess.getUiMobileFieldAccess().getUiDateFieldParserRuleCall_17()); }
-	ruleUiDateField
-{ after(grammarAccess.getUiMobileFieldAccess().getUiDateFieldParserRuleCall_17()); }
-)
-
-    |(
-{ before(grammarAccess.getUiMobileFieldAccess().getUiBrowserParserRuleCall_18()); }
-	ruleUiBrowser
-{ after(grammarAccess.getUiMobileFieldAccess().getUiBrowserParserRuleCall_18()); }
-)
-
-    |(
-{ before(grammarAccess.getUiMobileFieldAccess().getUiProgressBarParserRuleCall_19()); }
-	ruleUiProgressBar
-{ after(grammarAccess.getUiMobileFieldAccess().getUiProgressBarParserRuleCall_19()); }
-)
-
-    |(
-{ before(grammarAccess.getUiMobileFieldAccess().getUiOptionsGroupParserRuleCall_20()); }
-	ruleUiOptionsGroup
-{ after(grammarAccess.getUiMobileFieldAccess().getUiOptionsGroupParserRuleCall_20()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiLayout__Alternatives
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiLayoutAccess().getUiGridLayoutParserRuleCall_0()); }
-	ruleUiGridLayout
-{ after(grammarAccess.getUiLayoutAccess().getUiGridLayoutParserRuleCall_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiLayoutAccess().getUiFormLayoutParserRuleCall_1()); }
-	ruleUiFormLayout
-{ after(grammarAccess.getUiLayoutAccess().getUiFormLayoutParserRuleCall_1()); }
-)
-
-    |(
-{ before(grammarAccess.getUiLayoutAccess().getUiHorizontalLayoutParserRuleCall_2()); }
-	ruleUiHorizontalLayout
-{ after(grammarAccess.getUiLayoutAccess().getUiHorizontalLayoutParserRuleCall_2()); }
-)
-
-    |(
-{ before(grammarAccess.getUiLayoutAccess().getUiVerticalLayoutParserRuleCall_3()); }
-	ruleUiVerticalLayout
-{ after(grammarAccess.getUiLayoutAccess().getUiVerticalLayoutParserRuleCall_3()); }
-)
-
-    |(
-{ before(grammarAccess.getUiLayoutAccess().getUiSplitpanelParserRuleCall_4()); }
-	ruleUiSplitpanel
-{ after(grammarAccess.getUiLayoutAccess().getUiSplitpanelParserRuleCall_4()); }
-)
-
-    |(
-{ before(grammarAccess.getUiLayoutAccess().getUiPanelParserRuleCall_5()); }
-	ruleUiPanel
-{ after(grammarAccess.getUiLayoutAccess().getUiPanelParserRuleCall_5()); }
-)
-
-    |(
-{ before(grammarAccess.getUiLayoutAccess().getUiSearchPanelParserRuleCall_6()); }
-	ruleUiSearchPanel
-{ after(grammarAccess.getUiLayoutAccess().getUiSearchPanelParserRuleCall_6()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiField__Alternatives
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiFieldAccess().getUiTextFieldParserRuleCall_0()); }
-	ruleUiTextField
-{ after(grammarAccess.getUiFieldAccess().getUiTextFieldParserRuleCall_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiFieldAccess().getUiMaskedTextFieldParserRuleCall_1()); }
-	ruleUiMaskedTextField
-{ after(grammarAccess.getUiFieldAccess().getUiMaskedTextFieldParserRuleCall_1()); }
-)
-
-    |(
-{ before(grammarAccess.getUiFieldAccess().getUiMaskedNumericFieldParserRuleCall_2()); }
-	ruleUiMaskedNumericField
-{ after(grammarAccess.getUiFieldAccess().getUiMaskedNumericFieldParserRuleCall_2()); }
-)
-
-    |(
-{ before(grammarAccess.getUiFieldAccess().getUiMaskedDecimalFieldParserRuleCall_3()); }
-	ruleUiMaskedDecimalField
-{ after(grammarAccess.getUiFieldAccess().getUiMaskedDecimalFieldParserRuleCall_3()); }
-)
-
-    |(
-{ before(grammarAccess.getUiFieldAccess().getUiPrefixedMaskedTextFieldParserRuleCall_4()); }
-	ruleUiPrefixedMaskedTextField
-{ after(grammarAccess.getUiFieldAccess().getUiPrefixedMaskedTextFieldParserRuleCall_4()); }
-)
-
-    |(
-{ before(grammarAccess.getUiFieldAccess().getUiRichTextAreaParserRuleCall_5()); }
-	ruleUiRichTextArea
-{ after(grammarAccess.getUiFieldAccess().getUiRichTextAreaParserRuleCall_5()); }
-)
-
-    |(
-{ before(grammarAccess.getUiFieldAccess().getUiPasswordFieldParserRuleCall_6()); }
-	ruleUiPasswordField
-{ after(grammarAccess.getUiFieldAccess().getUiPasswordFieldParserRuleCall_6()); }
-)
-
-    |(
-{ before(grammarAccess.getUiFieldAccess().getUiSuggestTextFieldParserRuleCall_7()); }
-	ruleUiSuggestTextField
-{ after(grammarAccess.getUiFieldAccess().getUiSuggestTextFieldParserRuleCall_7()); }
-)
-
-    |(
-{ before(grammarAccess.getUiFieldAccess().getUiListParserRuleCall_8()); }
-	ruleUiList
-{ after(grammarAccess.getUiFieldAccess().getUiListParserRuleCall_8()); }
-)
-
-    |(
-{ before(grammarAccess.getUiFieldAccess().getUiNumericFieldParserRuleCall_9()); }
-	ruleUiNumericField
-{ after(grammarAccess.getUiFieldAccess().getUiNumericFieldParserRuleCall_9()); }
-)
-
-    |(
-{ before(grammarAccess.getUiFieldAccess().getUiCheckBoxParserRuleCall_10()); }
-	ruleUiCheckBox
-{ after(grammarAccess.getUiFieldAccess().getUiCheckBoxParserRuleCall_10()); }
-)
-
-    |(
-{ before(grammarAccess.getUiFieldAccess().getUiTableParserRuleCall_11()); }
-	ruleUiTable
-{ after(grammarAccess.getUiFieldAccess().getUiTableParserRuleCall_11()); }
-)
-
-    |(
-{ before(grammarAccess.getUiFieldAccess().getUiComboBoxParserRuleCall_12()); }
-	ruleUiComboBox
-{ after(grammarAccess.getUiFieldAccess().getUiComboBoxParserRuleCall_12()); }
-)
-
-    |(
-{ before(grammarAccess.getUiFieldAccess().getUiImageParserRuleCall_13()); }
-	ruleUiImage
-{ after(grammarAccess.getUiFieldAccess().getUiImageParserRuleCall_13()); }
-)
-
-    |(
-{ before(grammarAccess.getUiFieldAccess().getUiSearchFieldParserRuleCall_14()); }
-	ruleUiSearchField
-{ after(grammarAccess.getUiFieldAccess().getUiSearchFieldParserRuleCall_14()); }
-)
-
-    |(
-{ before(grammarAccess.getUiFieldAccess().getUiLabelParserRuleCall_15()); }
-	ruleUiLabel
-{ after(grammarAccess.getUiFieldAccess().getUiLabelParserRuleCall_15()); }
-)
-
-    |(
-{ before(grammarAccess.getUiFieldAccess().getUiDecimalFieldParserRuleCall_16()); }
-	ruleUiDecimalField
-{ after(grammarAccess.getUiFieldAccess().getUiDecimalFieldParserRuleCall_16()); }
-)
-
-    |(
-{ before(grammarAccess.getUiFieldAccess().getUiTextAreaParserRuleCall_17()); }
-	ruleUiTextArea
-{ after(grammarAccess.getUiFieldAccess().getUiTextAreaParserRuleCall_17()); }
-)
-
-    |(
-{ before(grammarAccess.getUiFieldAccess().getUiDateFieldParserRuleCall_18()); }
-	ruleUiDateField
-{ after(grammarAccess.getUiFieldAccess().getUiDateFieldParserRuleCall_18()); }
-)
-
-    |(
-{ before(grammarAccess.getUiFieldAccess().getUiBrowserParserRuleCall_19()); }
-	ruleUiBrowser
-{ after(grammarAccess.getUiFieldAccess().getUiBrowserParserRuleCall_19()); }
-)
-
-    |(
-{ before(grammarAccess.getUiFieldAccess().getUiProgressBarParserRuleCall_20()); }
-	ruleUiProgressBar
-{ after(grammarAccess.getUiFieldAccess().getUiProgressBarParserRuleCall_20()); }
-)
-
-    |(
-{ before(grammarAccess.getUiFieldAccess().getUiOptionsGroupParserRuleCall_21()); }
-	ruleUiOptionsGroup
-{ after(grammarAccess.getUiFieldAccess().getUiOptionsGroupParserRuleCall_21()); }
-)
-
-    |(
-{ before(grammarAccess.getUiFieldAccess().getUiBeanReferenceFieldParserRuleCall_22()); }
-	ruleUiBeanReferenceField
-{ after(grammarAccess.getUiFieldAccess().getUiBeanReferenceFieldParserRuleCall_22()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiMobileAction__Alternatives
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiMobileActionAccess().getUiMobileNavigationButtonParserRuleCall_0()); }
-	ruleUiMobileNavigationButton
-{ after(grammarAccess.getUiMobileActionAccess().getUiMobileNavigationButtonParserRuleCall_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiMobileActionAccess().getUiButtonParserRuleCall_1()); }
-	ruleUiButton
-{ after(grammarAccess.getUiMobileActionAccess().getUiButtonParserRuleCall_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiNumericField__Alternatives_4_1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiNumericFieldAccess().getValidatorsAssignment_4_1_0()); }
-(rule__UiNumericField__ValidatorsAssignment_4_1_0)
-{ after(grammarAccess.getUiNumericFieldAccess().getValidatorsAssignment_4_1_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiNumericFieldAccess().getBindingsAssignment_4_1_1()); }
-(rule__UiNumericField__BindingsAssignment_4_1_1)
-{ after(grammarAccess.getUiNumericFieldAccess().getBindingsAssignment_4_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiCheckBox__Alternatives_4_1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiCheckBoxAccess().getValidatorsAssignment_4_1_0()); }
-(rule__UiCheckBox__ValidatorsAssignment_4_1_0)
-{ after(grammarAccess.getUiCheckBoxAccess().getValidatorsAssignment_4_1_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiCheckBoxAccess().getBindingsAssignment_4_1_1()); }
-(rule__UiCheckBox__BindingsAssignment_4_1_1)
-{ after(grammarAccess.getUiCheckBoxAccess().getBindingsAssignment_4_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiValidator__Alternatives
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiValidatorAccess().getUiMaxLengthValidatorParserRuleCall_0()); }
-	ruleUiMaxLengthValidator
-{ after(grammarAccess.getUiValidatorAccess().getUiMaxLengthValidatorParserRuleCall_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiValidatorAccess().getUiMinLengthValidatorParserRuleCall_1()); }
-	ruleUiMinLengthValidator
-{ after(grammarAccess.getUiValidatorAccess().getUiMinLengthValidatorParserRuleCall_1()); }
-)
-
-    |(
-{ before(grammarAccess.getUiValidatorAccess().getUiRegexpValidatorParserRuleCall_2()); }
-	ruleUiRegexpValidator
-{ after(grammarAccess.getUiValidatorAccess().getUiRegexpValidatorParserRuleCall_2()); }
-)
-
-    |(
-{ before(grammarAccess.getUiValidatorAccess().getUiXbaseValidatorParserRuleCall_3()); }
-	ruleUiXbaseValidator
-{ after(grammarAccess.getUiValidatorAccess().getUiXbaseValidatorParserRuleCall_3()); }
-)
-
-    |(
-{ before(grammarAccess.getUiValidatorAccess().getUiBeanValidationValidatorParserRuleCall_4()); }
-	ruleUiBeanValidationValidator
-{ after(grammarAccess.getUiValidatorAccess().getUiBeanValidationValidatorParserRuleCall_4()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiVisibilityProcessor__Alternatives_4
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiVisibilityProcessorAccess().getDataUsedAssignment_4_0()); }
-(rule__UiVisibilityProcessor__DataUsedAssignment_4_0)
-{ after(grammarAccess.getUiVisibilityProcessorAccess().getDataUsedAssignment_4_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiVisibilityProcessorAccess().getChangeTriggersAssignment_4_1()); }
-(rule__UiVisibilityProcessor__ChangeTriggersAssignment_4_1)
-{ after(grammarAccess.getUiVisibilityProcessorAccess().getChangeTriggersAssignment_4_1()); }
-)
-
-    |(
-{ before(grammarAccess.getUiVisibilityProcessorAccess().getImportedElementsAssignment_4_2()); }
-(rule__UiVisibilityProcessor__ImportedElementsAssignment_4_2)
-{ after(grammarAccess.getUiVisibilityProcessorAccess().getImportedElementsAssignment_4_2()); }
-)
-
-;
-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__XImportDeclaration__Alternatives_1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXImportDeclarationAccess().getGroup_1_0()); }
-(rule__XImportDeclaration__Group_1_0__0)
-{ after(grammarAccess.getXImportDeclarationAccess().getGroup_1_0()); }
-)
-
-    |(
-{ before(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_1_1()); }
-(rule__XImportDeclaration__ImportedTypeAssignment_1_1)
-{ after(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_1_1()); }
-)
-
-    |(
-{ before(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceAssignment_1_2()); }
-(rule__XImportDeclaration__ImportedNamespaceAssignment_1_2)
-{ after(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceAssignment_1_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XImportDeclaration__Alternatives_1_0_3
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXImportDeclarationAccess().getWildcardAssignment_1_0_3_0()); }
-(rule__XImportDeclaration__WildcardAssignment_1_0_3_0)
-{ after(grammarAccess.getXImportDeclarationAccess().getWildcardAssignment_1_0_3_0()); }
-)
-
-    |(
-{ before(grammarAccess.getXImportDeclarationAccess().getMemberNameAssignment_1_0_3_1()); }
-(rule__XImportDeclaration__MemberNameAssignment_1_0_3_1)
-{ after(grammarAccess.getXImportDeclarationAccess().getMemberNameAssignment_1_0_3_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiDateFormat__Alternatives
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiDateFormatAccess().getDATEEnumLiteralDeclaration_0()); }
-(	'date' 
-)
-{ after(grammarAccess.getUiDateFormatAccess().getDATEEnumLiteralDeclaration_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiDateFormatAccess().getDATE_TIMEEnumLiteralDeclaration_1()); }
-(	'datetime' 
-)
-{ after(grammarAccess.getUiDateFormatAccess().getDATE_TIMEEnumLiteralDeclaration_1()); }
-)
-
-    |(
-{ before(grammarAccess.getUiDateFormatAccess().getTIMEEnumLiteralDeclaration_2()); }
-(	'time' 
-)
-{ after(grammarAccess.getUiDateFormatAccess().getTIMEEnumLiteralDeclaration_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiDateTimeResolution__Alternatives
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiDateTimeResolutionAccess().getUNDEFINEDEnumLiteralDeclaration_0()); }
-(	'undefined' 
-)
-{ after(grammarAccess.getUiDateTimeResolutionAccess().getUNDEFINEDEnumLiteralDeclaration_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiDateTimeResolutionAccess().getSECONDEnumLiteralDeclaration_1()); }
-(	'second' 
-)
-{ after(grammarAccess.getUiDateTimeResolutionAccess().getSECONDEnumLiteralDeclaration_1()); }
-)
-
-    |(
-{ before(grammarAccess.getUiDateTimeResolutionAccess().getMINUTEEnumLiteralDeclaration_2()); }
-(	'minute' 
-)
-{ after(grammarAccess.getUiDateTimeResolutionAccess().getMINUTEEnumLiteralDeclaration_2()); }
-)
-
-    |(
-{ before(grammarAccess.getUiDateTimeResolutionAccess().getHOUREnumLiteralDeclaration_3()); }
-(	'hour' 
-)
-{ after(grammarAccess.getUiDateTimeResolutionAccess().getHOUREnumLiteralDeclaration_3()); }
-)
-
-    |(
-{ before(grammarAccess.getUiDateTimeResolutionAccess().getDAYEnumLiteralDeclaration_4()); }
-(	'day' 
-)
-{ after(grammarAccess.getUiDateTimeResolutionAccess().getDAYEnumLiteralDeclaration_4()); }
-)
-
-    |(
-{ before(grammarAccess.getUiDateTimeResolutionAccess().getMONTHEnumLiteralDeclaration_5()); }
-(	'month' 
-)
-{ after(grammarAccess.getUiDateTimeResolutionAccess().getMONTHEnumLiteralDeclaration_5()); }
-)
-
-    |(
-{ before(grammarAccess.getUiDateTimeResolutionAccess().getYEAREnumLiteralDeclaration_6()); }
-(	'year' 
-)
-{ after(grammarAccess.getUiDateTimeResolutionAccess().getYEAREnumLiteralDeclaration_6()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiSelectionType__Alternatives
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiSelectionTypeAccess().getSINGLEEnumLiteralDeclaration_0()); }
-(	'single' 
-)
-{ after(grammarAccess.getUiSelectionTypeAccess().getSINGLEEnumLiteralDeclaration_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiSelectionTypeAccess().getMULTIEnumLiteralDeclaration_1()); }
-(	'multi' 
-)
-{ after(grammarAccess.getUiSelectionTypeAccess().getMULTIEnumLiteralDeclaration_1()); }
-)
-
-    |(
-{ before(grammarAccess.getUiSelectionTypeAccess().getNONEEnumLiteralDeclaration_2()); }
-(	'none' 
-)
-{ after(grammarAccess.getUiSelectionTypeAccess().getNONEEnumLiteralDeclaration_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiAlignment__Alternatives
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiAlignmentAccess().getUNDEFINEDEnumLiteralDeclaration_0()); }
-(	'undefined' 
-)
-{ after(grammarAccess.getUiAlignmentAccess().getUNDEFINEDEnumLiteralDeclaration_0()); }
-)
-
-    |(
-{ before(grammarAccess.getUiAlignmentAccess().getBOTTOM_CENTEREnumLiteralDeclaration_1()); }
-(	'bottom-center' 
-)
-{ after(grammarAccess.getUiAlignmentAccess().getBOTTOM_CENTEREnumLiteralDeclaration_1()); }
-)
-
-    |(
-{ before(grammarAccess.getUiAlignmentAccess().getBOTTOM_LEFTEnumLiteralDeclaration_2()); }
-(	'bottom-left' 
-)
-{ after(grammarAccess.getUiAlignmentAccess().getBOTTOM_LEFTEnumLiteralDeclaration_2()); }
-)
-
-    |(
-{ before(grammarAccess.getUiAlignmentAccess().getBOTTOM_RIGHTEnumLiteralDeclaration_3()); }
-(	'bottom-right' 
-)
-{ after(grammarAccess.getUiAlignmentAccess().getBOTTOM_RIGHTEnumLiteralDeclaration_3()); }
-)
-
-    |(
-{ before(grammarAccess.getUiAlignmentAccess().getBOTTOM_FILLEnumLiteralDeclaration_4()); }
-(	'bottom-fill' 
-)
-{ after(grammarAccess.getUiAlignmentAccess().getBOTTOM_FILLEnumLiteralDeclaration_4()); }
-)
-
-    |(
-{ before(grammarAccess.getUiAlignmentAccess().getMIDDLE_CENTEREnumLiteralDeclaration_5()); }
-(	'middle-center' 
-)
-{ after(grammarAccess.getUiAlignmentAccess().getMIDDLE_CENTEREnumLiteralDeclaration_5()); }
-)
-
-    |(
-{ before(grammarAccess.getUiAlignmentAccess().getMIDDLE_LEFTEnumLiteralDeclaration_6()); }
-(	'middle-left' 
-)
-{ after(grammarAccess.getUiAlignmentAccess().getMIDDLE_LEFTEnumLiteralDeclaration_6()); }
-)
-
-    |(
-{ before(grammarAccess.getUiAlignmentAccess().getMIDDLE_RIGHTEnumLiteralDeclaration_7()); }
-(	'middle-right' 
-)
-{ after(grammarAccess.getUiAlignmentAccess().getMIDDLE_RIGHTEnumLiteralDeclaration_7()); }
-)
-
-    |(
-{ before(grammarAccess.getUiAlignmentAccess().getMIDDLE_FILLEnumLiteralDeclaration_8()); }
-(	'middle-fill' 
-)
-{ after(grammarAccess.getUiAlignmentAccess().getMIDDLE_FILLEnumLiteralDeclaration_8()); }
-)
-
-    |(
-{ before(grammarAccess.getUiAlignmentAccess().getTOP_CENTEREnumLiteralDeclaration_9()); }
-(	'top-center' 
-)
-{ after(grammarAccess.getUiAlignmentAccess().getTOP_CENTEREnumLiteralDeclaration_9()); }
-)
-
-    |(
-{ before(grammarAccess.getUiAlignmentAccess().getTOP_LEFTEnumLiteralDeclaration_10()); }
-(	'top-left' 
-)
-{ after(grammarAccess.getUiAlignmentAccess().getTOP_LEFTEnumLiteralDeclaration_10()); }
-)
-
-    |(
-{ before(grammarAccess.getUiAlignmentAccess().getTOP_RIGHTEnumLiteralDeclaration_11()); }
-(	'top-right' 
-)
-{ after(grammarAccess.getUiAlignmentAccess().getTOP_RIGHTEnumLiteralDeclaration_11()); }
-)
-
-    |(
-{ before(grammarAccess.getUiAlignmentAccess().getTOP_FILLEnumLiteralDeclaration_12()); }
-(	'top-fill' 
-)
-{ after(grammarAccess.getUiAlignmentAccess().getTOP_FILLEnumLiteralDeclaration_12()); }
-)
-
-    |(
-{ before(grammarAccess.getUiAlignmentAccess().getFILL_CENTEREnumLiteralDeclaration_13()); }
-(	'fill-center' 
-)
-{ after(grammarAccess.getUiAlignmentAccess().getFILL_CENTEREnumLiteralDeclaration_13()); }
-)
-
-    |(
-{ before(grammarAccess.getUiAlignmentAccess().getFILL_LEFTEnumLiteralDeclaration_14()); }
-(	'fill-left' 
-)
-{ after(grammarAccess.getUiAlignmentAccess().getFILL_LEFTEnumLiteralDeclaration_14()); }
-)
-
-    |(
-{ before(grammarAccess.getUiAlignmentAccess().getFILL_RIGHTEnumLiteralDeclaration_15()); }
-(	'fill-right' 
-)
-{ after(grammarAccess.getUiAlignmentAccess().getFILL_RIGHTEnumLiteralDeclaration_15()); }
-)
-
-    |(
-{ before(grammarAccess.getUiAlignmentAccess().getFILL_FILLEnumLiteralDeclaration_16()); }
-(	'fill-fill' 
-)
-{ after(grammarAccess.getUiAlignmentAccess().getFILL_FILLEnumLiteralDeclaration_16()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-rule__UiModel__Group__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiModel__Group__0__Impl
-	rule__UiModel__Group__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiModel__Group__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiModelAccess().getPackageKeyword_0()); }
-
-	'package' 
-
-{ after(grammarAccess.getUiModelAccess().getPackageKeyword_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UiModel__Group__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiModel__Group__1__Impl
-	rule__UiModel__Group__2
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiModel__Group__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiModelAccess().getPackageNameAssignment_1()); }
-(rule__UiModel__PackageNameAssignment_1)
-{ after(grammarAccess.getUiModelAccess().getPackageNameAssignment_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UiModel__Group__2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiModel__Group__2__Impl
-	rule__UiModel__Group__3
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiModel__Group__2__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiModelAccess().getImportsAssignment_2()); }
-(rule__UiModel__ImportsAssignment_2)*
-{ after(grammarAccess.getUiModelAccess().getImportsAssignment_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UiModel__Group__3
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiModel__Group__3__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiModel__Group__3__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiModelAccess().getRootsAssignment_3()); }
-(rule__UiModel__RootsAssignment_3)*
-{ after(grammarAccess.getUiModelAccess().getRootsAssignment_3()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-
-
-
-
-rule__UiImports__Group__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiImports__Group__0__Impl
-	rule__UiImports__Group__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiImports__Group__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiImportsAccess().getImportKeyword_0()); }
-
-	'import' 
-
-{ after(grammarAccess.getUiImportsAccess().getImportKeyword_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UiImports__Group__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiImports__Group__1__Impl
-	rule__UiImports__Group__2
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiImports__Group__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiImportsAccess().getImportedNamespaceAssignment_1()); }
-(rule__UiImports__ImportedNamespaceAssignment_1)
-{ after(grammarAccess.getUiImportsAccess().getImportedNamespaceAssignment_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UiImports__Group__2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiImports__Group__2__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiImports__Group__2__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiImportsAccess().getSemicolonKeyword_2()); }
-(
-	';' 
-)?
-{ after(grammarAccess.getUiImportsAccess().getSemicolonKeyword_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-
-
-rule__UiValidatorAlias__Group__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiValidatorAlias__Group__0__Impl
-	rule__UiValidatorAlias__Group__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiValidatorAlias__Group__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiValidatorAliasAccess().getValidatorAliasKeyword_0()); }
-
-	'validatorAlias' 
-
-{ after(grammarAccess.getUiValidatorAliasAccess().getValidatorAliasKeyword_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UiValidatorAlias__Group__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiValidatorAlias__Group__1__Impl
-	rule__UiValidatorAlias__Group__2
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiValidatorAlias__Group__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiValidatorAliasAccess().getValidatorAssignment_1()); }
-(rule__UiValidatorAlias__ValidatorAssignment_1)
-{ after(grammarAccess.getUiValidatorAliasAccess().getValidatorAssignment_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UiValidatorAlias__Group__2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiValidatorAlias__Group__2__Impl
-	rule__UiValidatorAlias__Group__3
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiValidatorAlias__Group__2__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiValidatorAliasAccess().getAsKeyword_2()); }
-
-	'as' 
-
-{ after(grammarAccess.getUiValidatorAliasAccess().getAsKeyword_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UiValidatorAlias__Group__3
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiValidatorAlias__Group__3__Impl
-	rule__UiValidatorAlias__Group__4
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiValidatorAlias__Group__3__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiValidatorAliasAccess().getAliasAssignment_3()); }
-(rule__UiValidatorAlias__AliasAssignment_3)
-{ after(grammarAccess.getUiValidatorAliasAccess().getAliasAssignment_3()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UiValidatorAlias__Group__4
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiValidatorAlias__Group__4__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiValidatorAlias__Group__4__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiValidatorAliasAccess().getSemicolonKeyword_4()); }
-(
-	';' 
-)?
-{ after(grammarAccess.getUiValidatorAliasAccess().getSemicolonKeyword_4()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-
-
-
-
-
-
-rule__UiValidatorAssignment__Group__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiValidatorAssignment__Group__0__Impl
-	rule__UiValidatorAssignment__Group__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiValidatorAssignment__Group__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiValidatorAssignmentAccess().getFieldValidationKeyword_0()); }
-
-	'fieldValidation' 
-
-{ after(grammarAccess.getUiValidatorAssignmentAccess().getFieldValidationKeyword_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UiValidatorAssignment__Group__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiValidatorAssignment__Group__1__Impl
-	rule__UiValidatorAssignment__Group__2
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiValidatorAssignment__Group__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiValidatorAssignmentAccess().getFieldAssignment_1()); }
-(rule__UiValidatorAssignment__FieldAssignment_1)
-{ after(grammarAccess.getUiValidatorAssignmentAccess().getFieldAssignment_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UiValidatorAssignment__Group__2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiValidatorAssignment__Group__2__Impl
-	rule__UiValidatorAssignment__Group__3
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiValidatorAssignment__Group__2__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiValidatorAssignmentAccess().getPlusSignEqualsSignKeyword_2()); }
-
-	'+=' 
-
-{ after(grammarAccess.getUiValidatorAssignmentAccess().getPlusSignEqualsSignKeyword_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UiValidatorAssignment__Group__3
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiValidatorAssignment__Group__3__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiValidatorAssignment__Group__3__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiValidatorAssignmentAccess().getAlternatives_3()); }
-(rule__UiValidatorAssignment__Alternatives_3)
-{ after(grammarAccess.getUiValidatorAssignmentAccess().getAlternatives_3()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-
-
-
-
-rule__UiValidatorAssignment__Group_3_1__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiValidatorAssignment__Group_3_1__0__Impl
-	rule__UiValidatorAssignment__Group_3_1__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiValidatorAssignment__Group_3_1__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiValidatorAssignmentAccess().getValidatorAliasAssignment_3_1_0()); }
-(rule__UiValidatorAssignment__ValidatorAliasAssignment_3_1_0)
-{ after(grammarAccess.getUiValidatorAssignmentAccess().getValidatorAliasAssignment_3_1_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UiValidatorAssignment__Group_3_1__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiValidatorAssignment__Group_3_1__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiValidatorAssignment__Group_3_1__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiValidatorAssignmentAccess().getSemicolonKeyword_3_1_1()); }
-(
-	';' 
-)?
-{ after(grammarAccess.getUiValidatorAssignmentAccess().getSemicolonKeyword_3_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__UiViewSet__Group__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiViewSet__Group__0__Impl
-	rule__UiViewSet__Group__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiViewSet__Group__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiViewSetAccess().getViewsetKeyword_0()); }
-
-	'viewset' 
-
-{ after(grammarAccess.getUiViewSetAccess().getViewsetKeyword_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UiViewSet__Group__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiViewSet__Group__1__Impl
-	rule__UiViewSet__Group__2
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiViewSet__Group__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiViewSetAccess().getNameAssignment_1()); }
-(rule__UiViewSet__NameAssignment_1)
-{ after(grammarAccess.getUiViewSetAccess().getNameAssignment_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UiViewSet__Group__2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiViewSet__Group__2__Impl
-	rule__UiViewSet__Group__3
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiViewSet__Group__2__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiViewSetAccess().getLeftCurlyBracketKeyword_2()); }
-
-	'{' 
-
-{ after(grammarAccess.getUiViewSetAccess().getLeftCurlyBracketKeyword_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UiViewSet__Group__3
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiViewSet__Group__3__Impl
-	rule__UiViewSet__Group__4
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiViewSet__Group__3__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiViewSetAccess().getBeanSlotsAssignment_3()); }
-(rule__UiViewSet__BeanSlotsAssignment_3)*
-{ after(grammarAccess.getUiViewSetAccess().getBeanSlotsAssignment_3()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UiViewSet__Group__4
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiViewSet__Group__4__Impl
-	rule__UiViewSet__Group__5
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiViewSet__Group__4__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiViewSetAccess().getBindingEndpointAliasAssignment_4()); }
-(rule__UiViewSet__BindingEndpointAliasAssignment_4)*
-{ after(grammarAccess.getUiViewSetAccess().getBindingEndpointAliasAssignment_4()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UiViewSet__Group__5
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiViewSet__Group__5__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiViewSet__Group__5__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiViewSetAccess().getRightCurlyBracketKeyword_5()); }
-
-	'}' 
-
-{ after(grammarAccess.getUiViewSetAccess().getRightCurlyBracketKeyword_5()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-rule__UiBindingEndpointAlias__Group__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiBindingEndpointAlias__Group__0__Impl
-	rule__UiBindingEndpointAlias__Group__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiBindingEndpointAlias__Group__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiBindingEndpointAliasAccess().getDataAliasKeyword_0()); }
-
-	'dataAlias' 
-
-{ after(grammarAccess.getUiBindingEndpointAliasAccess().getDataAliasKeyword_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UiBindingEndpointAlias__Group__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiBindingEndpointAlias__Group__1__Impl
-	rule__UiBindingEndpointAlias__Group__2
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiBindingEndpointAlias__Group__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiBindingEndpointAliasAccess().getEndpointAssignment_1()); }
-(rule__UiBindingEndpointAlias__EndpointAssignment_1)
-{ after(grammarAccess.getUiBindingEndpointAliasAccess().getEndpointAssignment_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UiBindingEndpointAlias__Group__2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiBindingEndpointAlias__Group__2__Impl
-	rule__UiBindingEndpointAlias__Group__3
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiBindingEndpointAlias__Group__2__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiBindingEndpointAliasAccess().getAsKeyword_2()); }
-
-	'as' 
-
-{ after(grammarAccess.getUiBindingEndpointAliasAccess().getAsKeyword_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UiBindingEndpointAlias__Group__3
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiBindingEndpointAlias__Group__3__Impl
-	rule__UiBindingEndpointAlias__Group__4
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiBindingEndpointAlias__Group__3__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiBindingEndpointAliasAccess().getAliasAssignment_3()); }
-(rule__UiBindingEndpointAlias__AliasAssignment_3)
-{ after(grammarAccess.getUiBindingEndpointAliasAccess().getAliasAssignment_3()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UiBindingEndpointAlias__Group__4
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiBindingEndpointAlias__Group__4__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiBindingEndpointAlias__Group__4__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiBindingEndpointAliasAccess().getSemicolonKeyword_4()); }
-(
-	';' 
-)?
-{ after(grammarAccess.getUiBindingEndpointAliasAccess().getSemicolonKeyword_4()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-
-
-
-
-
-
-rule__UiBeanSlot__Group__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiBeanSlot__Group__0__Impl
-	rule__UiBeanSlot__Group__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiBeanSlot__Group__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiBeanSlotAccess().getDatasourceKeyword_0()); }
-
-	'datasource' 
-
-{ after(grammarAccess.getUiBeanSlotAccess().getDatasourceKeyword_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UiBeanSlot__Group__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiBeanSlot__Group__1__Impl
-	rule__UiBeanSlot__Group__2
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiBeanSlot__Group__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiBeanSlotAccess().getNameAssignment_1()); }
-(rule__UiBeanSlot__NameAssignment_1)
-{ after(grammarAccess.getUiBeanSlotAccess().getNameAssignment_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UiBeanSlot__Group__2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiBeanSlot__Group__2__Impl
-	rule__UiBeanSlot__Group__3
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiBeanSlot__Group__2__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiBeanSlotAccess().getColonKeyword_2()); }
-
-	':' 
-
-{ after(grammarAccess.getUiBeanSlotAccess().getColonKeyword_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UiBeanSlot__Group__3
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiBeanSlot__Group__3__Impl
-	rule__UiBeanSlot__Group__4
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiBeanSlot__Group__3__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiBeanSlotAccess().getJvmTypeAssignment_3()); }
-(rule__UiBeanSlot__JvmTypeAssignment_3)
-{ after(grammarAccess.getUiBeanSlotAccess().getJvmTypeAssignment_3()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UiBeanSlot__Group__4
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiBeanSlot__Group__4__Impl
-	rule__UiBeanSlot__Group__5
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiBeanSlot__Group__4__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiBeanSlotAccess().getGroup_4()); }
-(rule__UiBeanSlot__Group_4__0)?
-{ after(grammarAccess.getUiBeanSlotAccess().getGroup_4()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UiBeanSlot__Group__5
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiBeanSlot__Group__5__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiBeanSlot__Group__5__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiBeanSlotAccess().getSemicolonKeyword_5()); }
-(
-	';' 
-)?
-{ after(grammarAccess.getUiBeanSlotAccess().getSemicolonKeyword_5()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-rule__UiBeanSlot__Group_4__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiBeanSlot__Group_4__0__Impl
-	rule__UiBeanSlot__Group_4__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiBeanSlot__Group_4__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiBeanSlotAccess().getEventTopicKeyword_4_0()); }
-
-	'eventTopic' 
-
-{ after(grammarAccess.getUiBeanSlotAccess().getEventTopicKeyword_4_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UiBeanSlot__Group_4__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiBeanSlot__Group_4__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiBeanSlot__Group_4__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiBeanSlotAccess().getEventTopicAssignment_4_1()); }
-(rule__UiBeanSlot__EventTopicAssignment_4_1)
-{ after(grammarAccess.getUiBeanSlotAccess().getEventTopicAssignment_4_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__UiBinding__Group__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiBinding__Group__0__Impl
-	rule__UiBinding__Group__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiBinding__Group__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiBindingAccess().getBindKeyword_0()); }
-
-	'bind' 
-
-{ after(grammarAccess.getUiBindingAccess().getBindKeyword_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UiBinding__Group__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiBinding__Group__1__Impl
-	rule__UiBinding__Group__2
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiBinding__Group__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiBindingAccess().getListBindingAssignment_1()); }
-(rule__UiBinding__ListBindingAssignment_1)?
-{ after(grammarAccess.getUiBindingAccess().getListBindingAssignment_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UiBinding__Group__2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiBinding__Group__2__Impl
-	rule__UiBinding__Group__3
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiBinding__Group__2__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiBindingAccess().getSourceAssignment_2()); }
-(rule__UiBinding__SourceAssignment_2)
-{ after(grammarAccess.getUiBindingAccess().getSourceAssignment_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UiBinding__Group__3
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiBinding__Group__3__Impl
-	rule__UiBinding__Group__4
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiBinding__Group__3__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiBindingAccess().getGroup_3()); }
-(rule__UiBinding__Group_3__0)
-{ after(grammarAccess.getUiBindingAccess().getGroup_3()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UiBinding__Group__4
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiBinding__Group__4__Impl
-	rule__UiBinding__Group__5
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiBinding__Group__4__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiBindingAccess().getTargetAssignment_4()); }
-(rule__UiBinding__TargetAssignment_4)
-{ after(grammarAccess.getUiBindingAccess().getTargetAssignment_4()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UiBinding__Group__5
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiBinding__Group__5__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiBinding__Group__5__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiBindingAccess().getSemicolonKeyword_5()); }
-(
-	';' 
-)?
-{ after(grammarAccess.getUiBindingAccess().getSemicolonKeyword_5()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-rule__UiBinding__Group_3__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiBinding__Group_3__0__Impl
-	rule__UiBinding__Group_3__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiBinding__Group_3__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiBindingAccess().getTargetToSourceAssignment_3_0()); }
-(rule__UiBinding__TargetToSourceAssignment_3_0)?
-{ after(grammarAccess.getUiBindingAccess().getTargetToSourceAssignment_3_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UiBinding__Group_3__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiBinding__Group_3__1__Impl
-	rule__UiBinding__Group_3__2
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiBinding__Group_3__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiBindingAccess().getHyphenMinusHyphenMinusKeyword_3_1()); }
-
-	'--' 
-
-{ after(grammarAccess.getUiBindingAccess().getHyphenMinusHyphenMinusKeyword_3_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UiBinding__Group_3__2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiBinding__Group_3__2__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiBinding__Group_3__2__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiBindingAccess().getSourceToTargetAssignment_3_2()); }
-(rule__UiBinding__SourceToTargetAssignment_3_2)?
-{ after(grammarAccess.getUiBindingAccess().getSourceToTargetAssignment_3_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-
-
-rule__UiBindingEndpointAssignment__Group_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiBindingEndpointAssignment__Group_0__0__Impl
-	rule__UiBindingEndpointAssignment__Group_0__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiBindingEndpointAssignment__Group_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiBindingEndpointAssignmentAccess().getUiTypedBindableDefParserRuleCall_0_0()); }
-	ruleUiTypedBindableDef
-{ after(grammarAccess.getUiBindingEndpointAssignmentAccess().getUiTypedBindableDefParserRuleCall_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UiBindingEndpointAssignment__Group_0__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiBindingEndpointAssignment__Group_0__1__Impl
-	rule__UiBindingEndpointAssignment__Group_0__2
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiBindingEndpointAssignment__Group_0__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiBindingEndpointAssignmentAccess().getUiBindingEndpointAssignmentTypedBindableDefAction_0_1()); }
-(
-
-)
-{ after(grammarAccess.getUiBindingEndpointAssignmentAccess().getUiBindingEndpointAssignmentTypedBindableDefAction_0_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UiBindingEndpointAssignment__Group_0__2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiBindingEndpointAssignment__Group_0__2__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiBindingEndpointAssignment__Group_0__2__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiBindingEndpointAssignmentAccess().getPathAssignment_0_2()); }
-(rule__UiBindingEndpointAssignment__PathAssignment_0_2)?
-{ after(grammarAccess.getUiBindingEndpointAssignmentAccess().getPathAssignment_0_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-
-
-rule__UiBindingEndpointAssignment__Group_1__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiBindingEndpointAssignment__Group_1__0__Impl
-	rule__UiBindingEndpointAssignment__Group_1__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiBindingEndpointAssignment__Group_1__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiBindingEndpointAssignmentAccess().getUiCommandBindableDefParserRuleCall_1_0()); }
-	ruleUiCommandBindableDef
-{ after(grammarAccess.getUiBindingEndpointAssignmentAccess().getUiCommandBindableDefParserRuleCall_1_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UiBindingEndpointAssignment__Group_1__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiBindingEndpointAssignment__Group_1__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiBindingEndpointAssignment__Group_1__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiBindingEndpointAssignmentAccess().getUiBindingEndpointAssignmentTypedBindableDefAction_1_1()); }
-(
-
-)
-{ after(grammarAccess.getUiBindingEndpointAssignmentAccess().getUiBindingEndpointAssignmentTypedBindableDefAction_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__UiBindingEndpointAssignment__Group_2__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiBindingEndpointAssignment__Group_2__0__Impl
-	rule__UiBindingEndpointAssignment__Group_2__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiBindingEndpointAssignment__Group_2__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiBindingEndpointAssignmentAccess().getUiBindingEndpointAssignmentAction_2_0()); }
-(
-
-)
-{ after(grammarAccess.getUiBindingEndpointAssignmentAccess().getUiBindingEndpointAssignmentAction_2_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UiBindingEndpointAssignment__Group_2__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiBindingEndpointAssignment__Group_2__1__Impl
-	rule__UiBindingEndpointAssignment__Group_2__2
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiBindingEndpointAssignment__Group_2__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUiBindingEndpointAssignmentAccess().getTypedBindableAliasAssignment_2_1()); }
-(rule__UiBindingEndpointAssignment__TypedBindableAliasAssignment_2_1)
-{ after(grammarAccess.getUiBindingEndpointAssignmentAccess().getTypedBindableAliasAssignment_2_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UiBindingEndpointAssignment__Group_2__2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UiBindingEndpointAssignment__Group_2__2__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UiBindingEndpointAssignment__Group_2__2__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
diff --git a/org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.tokens b/org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.tokens
deleted file mode 100644
index 1f8d6eb..0000000
--- a/org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.tokens
+++ /dev/null
@@ -1,457 +0,0 @@
-'!'=42
-'!='=24
-'!=='=26
-'#'=203
-'%'=41
-'%='=22
-'&&'=15
-'&'=221
-'('=106
-')'=107
-'*'=38
-'**'=39
-'*='=20
-'+'=36
-'++'=43
-'+='=18
-','=157
-'-'=37
-'--'=44
-'-='=19
-'->'=30
-'.'=16
-'..'=32
-'..<'=31
-'/'=40
-'/='=21
-':'=91
-'::'=232
-';'=82
-'<'=29
-'<>'=34
-'='=13
-'=='=23
-'==='=25
-'=>'=33
-'>'=28
-'>='=27
-'?'=220
-'?.'=233
-'?:'=35
-'BeanValidationValidator'=198
-'Expression'=197
-'MaxLengthValidator'=194
-'MinLengthValidator'=195
-'RegexValidator'=196
-'['=94
-']'=95
-'addToTable'=100
-'alias'=182
-'align'=113
-'as'=84
-'asBlob'=226
-'asc'=231
-'at'=104
-'autoHidePopup'=227
-'bind'=93
-'bottom-center'=65
-'bottom-fill'=68
-'bottom-left'=66
-'bottom-right'=67
-'browser'=173
-'button'=180
-'captionField'=162
-'case'=208
-'catch'=219
-'category'=110
-'checkDirty'=224
-'checkbox'=193
-'code'=199
-'column'=191
-'columns'=189
-'columns='=120
-'combo'=179
-'content'=140
-'dataAlias'=89
-'datasource'=90
-'date'=52
-'datefield'=172
-'datetime'=53
-'day'=59
-'decimalField'=185
-'default'=207
-'desc'=17
-'descriptionField'=167
-'dialog'=141
-'do'=210
-'else'=205
-'eventTopic'=92
-'exposedActions'=112
-'extends'=46
-'extension'=49
-'externalCommand'=116
-'false'=51
-'fieldValidation'=85
-'fill-center'=77
-'fill-fill'=80
-'fill-left'=78
-'fill-right'=79
-'filterField'=163
-'finally'=217
-'fireOn'=201
-'first'=137
-'for'=103
-'form'=122
-'gridlayout'=119
-'horizontalButtonGroup'=128
-'horizontalLayout'=126
-'hour'=58
-'i18n'=118
-'icon'=115
-'iconPath'=176
-'id'=114
-'ideview'=108
-'if'=204
-'image'=175
-'imageField'=168
-'import'=48
-'inMemoryService'=169
-'instanceof'=202
-'label'=184
-'list'=222
-'listSelect'=188
-'mask'=159
-'mask='=152
-'maskedDecimal'=154
-'maskedNumeric'=153
-'maskedText'=151
-'maskedTextWithPrefix'=155
-'maxLength='=147
-'middle-center'=69
-'middle-fill'=72
-'middle-left'=70
-'middle-right'=71
-'minLength='=148
-'minute'=57
-'mobile'=117
-'mobileHorizontalLayout'=127
-'mobileSearchPanel'=132
-'mobileTab'=133
-'mobileVerticalLayout'=124
-'month'=60
-'multi'=63
-'navButton'=181
-'navPage'=144
-'navRoot'=125
-'navbarActions'=145
-'navigateTo'=97
-'new'=211
-'newInstance'=102
-'noAutoTrigger'=223
-'noGrouping'=229
-'noMarkNegative'=230
-'none'=64
-'null'=212
-'numericField'=192
-'openDialog'=98
-'optionsgroup'=187
-'package'=81
-'panel'=139
-'passwordField'=150
-'precision='=186
-'prefix'=158
-'prefixes='=156
-'progressbar'=174
-'readonly'=225
-'refSource'=166
-'referenceField'=165
-'regex='=149
-'removeFromTable'=101
-'return'=215
-'richtextArea'=160
-'rootType'=111
-'search'=143
-'searchPanel'=130
-'searchWith'=99
-'searchdialog'=142
-'searchfield'=170
-'second'=56
-'selectionType'=178
-'sendEvent'=105
-'sharedStateGroup'=109
-'single'=62
-'sort'=190
-'splitPos'=138
-'splitter'=136
-'static'=47
-'styles'=121
-'suggestText'=161
-'super'=50
-'switch'=206
-'switchIt'=183
-'synchronized'=218
-'tab'=134
-'table'=177
-'tabsheet'=135
-'textarea'=171
-'textfield'=146
-'throw'=214
-'time'=54
-'top-center'=73
-'top-fill'=76
-'top-left'=74
-'top-right'=75
-'true'=236
-'try'=216
-'type'=131
-'typeof'=213
-'ui'=96
-'undefined'=55
-'useBeanService'=228
-'uuidField'=164
-'val'=45
-'validatorAlias'=83
-'var'=235
-'verticalGroup'=129
-'verticalLayout'=123
-'viewset'=86
-'visibility'=200
-'while'=209
-'year'=61
-'{'=87
-'|'=234
-'||'=14
-'}'=88
-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__157=157
-T__158=158
-T__159=159
-T__15=15
-T__160=160
-T__161=161
-T__162=162
-T__163=163
-T__164=164
-T__165=165
-T__166=166
-T__167=167
-T__168=168
-T__169=169
-T__16=16
-T__170=170
-T__171=171
-T__172=172
-T__173=173
-T__174=174
-T__175=175
-T__176=176
-T__177=177
-T__178=178
-T__179=179
-T__17=17
-T__180=180
-T__181=181
-T__182=182
-T__183=183
-T__184=184
-T__185=185
-T__186=186
-T__187=187
-T__188=188
-T__189=189
-T__18=18
-T__190=190
-T__191=191
-T__192=192
-T__193=193
-T__194=194
-T__195=195
-T__196=196
-T__197=197
-T__198=198
-T__199=199
-T__19=19
-T__200=200
-T__201=201
-T__202=202
-T__203=203
-T__204=204
-T__205=205
-T__206=206
-T__207=207
-T__208=208
-T__209=209
-T__20=20
-T__210=210
-T__211=211
-T__212=212
-T__213=213
-T__214=214
-T__215=215
-T__216=216
-T__217=217
-T__218=218
-T__219=219
-T__21=21
-T__220=220
-T__221=221
-T__222=222
-T__223=223
-T__224=224
-T__225=225
-T__226=226
-T__227=227
-T__228=228
-T__229=229
-T__22=22
-T__230=230
-T__231=231
-T__232=232
-T__233=233
-T__234=234
-T__235=235
-T__236=236
-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.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammarLexer.java b/org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammarLexer.java
deleted file mode 100644
index 5bc6923..0000000
--- a/org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammarLexer.java
+++ /dev/null
@@ -1,8912 +0,0 @@
-/**
- * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf), Loetz GmbH&Co.KG (Heidelberg)
- * 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:
- *         Florian Pirchner - Initial implementation
- */
-
-package org.eclipse.osbp.ecview.dsl.ui.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.ui.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 InternalUIGrammarLexer 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 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 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__166=166;
-    public static final int T__165=165;
-    public static final int T__168=168;
-    public static final int T__167=167;
-    public static final int T__162=162;
-    public static final int T__161=161;
-    public static final int T__164=164;
-    public static final int T__163=163;
-    public static final int T__160=160;
-    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__159=159;
-    public static final int T__30=30;
-    public static final int T__158=158;
-    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__157=157;
-    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__100=100;
-    public static final int T__221=221;
-    public static final int T__220=220;
-    public static final int T__102=102;
-    public static final int T__223=223;
-    public static final int T__101=101;
-    public static final int T__222=222;
-    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__218=218;
-    public static final int T__217=217;
-    public static final int T__13=13;
-    public static final int T__14=14;
-    public static final int T__219=219;
-    public static final int T__214=214;
-    public static final int T__213=213;
-    public static final int T__216=216;
-    public static final int T__215=215;
-    public static final int T__210=210;
-    public static final int T__212=212;
-    public static final int T__211=211;
-    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__207=207;
-    public static final int T__23=23;
-    public static final int T__206=206;
-    public static final int T__24=24;
-    public static final int T__209=209;
-    public static final int T__25=25;
-    public static final int T__208=208;
-    public static final int T__203=203;
-    public static final int T__202=202;
-    public static final int T__20=20;
-    public static final int T__205=205;
-    public static final int T__21=21;
-    public static final int T__204=204;
-    public static final int T__122=122;
-    public static final int T__121=121;
-    public static final int T__124=124;
-    public static final int T__123=123;
-    public static final int T__120=120;
-    public static final int RULE_SL_COMMENT=10;
-    public static final int T__119=119;
-    public static final int T__118=118;
-    public static final int T__115=115;
-    public static final int T__236=236;
-    public static final int EOF=-1;
-    public static final int T__114=114;
-    public static final int T__235=235;
-    public static final int T__117=117;
-    public static final int T__116=116;
-    public static final int T__111=111;
-    public static final int T__232=232;
-    public static final int T__110=110;
-    public static final int T__231=231;
-    public static final int T__113=113;
-    public static final int T__234=234;
-    public static final int T__112=112;
-    public static final int T__233=233;
-    public static final int T__230=230;
-    public static final int T__108=108;
-    public static final int T__229=229;
-    public static final int T__107=107;
-    public static final int T__228=228;
-    public static final int T__109=109;
-    public static final int T__104=104;
-    public static final int T__225=225;
-    public static final int T__103=103;
-    public static final int T__224=224;
-    public static final int T__106=106;
-    public static final int T__227=227;
-    public static final int T__105=105;
-    public static final int T__226=226;
-    public static final int RULE_HEX=5;
-    public static final int RULE_ML_COMMENT=9;
-    public static final int T__201=201;
-    public static final int T__200=200;
-    public static final int T__91=91;
-    public static final int T__188=188;
-    public static final int T__92=92;
-    public static final int T__187=187;
-    public static final int T__93=93;
-    public static final int T__94=94;
-    public static final int T__189=189;
-    public static final int T__184=184;
-    public static final int T__183=183;
-    public static final int T__186=186;
-    public static final int T__90=90;
-    public static final int T__185=185;
-    public static final int T__180=180;
-    public static final int T__182=182;
-    public static final int T__181=181;
-    public static final int T__99=99;
-    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 T__177=177;
-    public static final int T__176=176;
-    public static final int T__179=179;
-    public static final int T__178=178;
-    public static final int T__173=173;
-    public static final int T__172=172;
-    public static final int T__175=175;
-    public static final int T__174=174;
-    public static final int T__171=171;
-    public static final int T__170=170;
-    public static final int T__169=169;
-    public static final int T__70=70;
-    public static final int T__71=71;
-    public static final int T__72=72;
-    public static final int RULE_STRING=8;
-    public static final int T__77=77;
-    public static final int T__78=78;
-    public static final int T__79=79;
-    public static final int T__73=73;
-    public static final int T__74=74;
-    public static final int T__75=75;
-    public static final int T__76=76;
-    public static final int T__80=80;
-    public static final int T__199=199;
-    public static final int T__81=81;
-    public static final int T__198=198;
-    public static final int T__82=82;
-    public static final int T__83=83;
-    public static final int T__195=195;
-    public static final int T__194=194;
-    public static final int RULE_WS=11;
-    public static final int T__197=197;
-    public static final int T__196=196;
-    public static final int T__191=191;
-    public static final int T__190=190;
-    public static final int T__193=193;
-    public static final int T__192=192;
-    public static final int RULE_ANY_OTHER=12;
-    public static final int T__88=88;
-    public static final int T__89=89;
-    public static final int T__84=84;
-    public static final int T__85=85;
-    public static final int T__86=86;
-    public static final int T__87=87;
-
-    // delegates
-    // delegators
-
-    public InternalUIGrammarLexer() {;} 
-    public InternalUIGrammarLexer(CharStream input) {
-        this(input, new RecognizerSharedState());
-    }
-    public InternalUIGrammarLexer(CharStream input, RecognizerSharedState state) {
-        super(input,state);
-
-    }
-    public String getGrammarFileName() { return "../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:11:7: ( '=' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:12:7: ( '||' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:13:7: ( '&&' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:14:7: ( '.' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:14:9: '.'
-            {
-            match('.'); 
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:15:7: ( 'desc' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:15:9: 'desc'
-            {
-            match("desc"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:16:7: ( '+=' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:17:7: ( '-=' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:18:7: ( '*=' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:19:7: ( '/=' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:20:7: ( '%=' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:21:7: ( '==' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:22:7: ( '!=' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:23:7: ( '===' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:24:7: ( '!==' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:25:7: ( '>=' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:26:7: ( '>' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:27:7: ( '<' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:28:7: ( '->' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:29:7: ( '..<' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:30:7: ( '..' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:31:7: ( '=>' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:32:7: ( '<>' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:33:7: ( '?:' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:34:7: ( '+' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:35:7: ( '-' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:36:7: ( '*' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:37:7: ( '**' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:38:7: ( '/' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:39:7: ( '%' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:40:7: ( '!' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:41:7: ( '++' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:42:7: ( '--' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:43:7: ( 'val' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:44:7: ( 'extends' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:45:7: ( 'static' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:46:7: ( 'import' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:47:7: ( 'extension' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:48:7: ( 'super' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:49:7: ( 'false' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:50:7: ( 'date' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:50:9: 'date'
-            {
-            match("date"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:51:7: ( 'datetime' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:51:9: 'datetime'
-            {
-            match("datetime"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:52:7: ( 'time' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:52:9: 'time'
-            {
-            match("time"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:53:7: ( 'undefined' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:53:9: 'undefined'
-            {
-            match("undefined"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:54:7: ( 'second' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:54:9: 'second'
-            {
-            match("second"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:55:7: ( 'minute' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:55:9: 'minute'
-            {
-            match("minute"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:56:7: ( 'hour' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:56:9: 'hour'
-            {
-            match("hour"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:57:7: ( 'day' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:57:9: 'day'
-            {
-            match("day"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:58:7: ( 'month' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:58:9: 'month'
-            {
-            match("month"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:59:7: ( 'year' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:59:9: 'year'
-            {
-            match("year"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:60:7: ( 'single' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:60:9: 'single'
-            {
-            match("single"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:61:7: ( 'multi' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:61:9: 'multi'
-            {
-            match("multi"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:62:7: ( 'none' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:62:9: 'none'
-            {
-            match("none"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:63:7: ( 'bottom-center' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:63:9: 'bottom-center'
-            {
-            match("bottom-center"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:64:7: ( 'bottom-left' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:64:9: 'bottom-left'
-            {
-            match("bottom-left"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:65:7: ( 'bottom-right' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:65:9: 'bottom-right'
-            {
-            match("bottom-right"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:66:7: ( 'bottom-fill' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:66:9: 'bottom-fill'
-            {
-            match("bottom-fill"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:67:7: ( 'middle-center' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:67:9: 'middle-center'
-            {
-            match("middle-center"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:68:7: ( 'middle-left' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:68:9: 'middle-left'
-            {
-            match("middle-left"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:69:7: ( 'middle-right' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:69:9: 'middle-right'
-            {
-            match("middle-right"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:70:7: ( 'middle-fill' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:70:9: 'middle-fill'
-            {
-            match("middle-fill"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:71:7: ( 'top-center' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:71:9: 'top-center'
-            {
-            match("top-center"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72:7: ( 'top-left' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72:9: 'top-left'
-            {
-            match("top-left"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:73:7: ( 'top-right' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:73:9: 'top-right'
-            {
-            match("top-right"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:74:7: ( 'top-fill' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:74:9: 'top-fill'
-            {
-            match("top-fill"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:75:7: ( 'fill-center' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:75:9: 'fill-center'
-            {
-            match("fill-center"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:76:7: ( 'fill-left' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:76:9: 'fill-left'
-            {
-            match("fill-left"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:77:7: ( 'fill-right' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:77:9: 'fill-right'
-            {
-            match("fill-right"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:78:7: ( 'fill-fill' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:78:9: 'fill-fill'
-            {
-            match("fill-fill"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:79:7: ( 'package' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:79:9: 'package'
-            {
-            match("package"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:80:7: ( ';' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:80:9: ';'
-            {
-            match(';'); 
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:81:7: ( 'validatorAlias' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:81:9: 'validatorAlias'
-            {
-            match("validatorAlias"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:82:7: ( 'as' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:82:9: 'as'
-            {
-            match("as"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:83:7: ( 'fieldValidation' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:83:9: 'fieldValidation'
-            {
-            match("fieldValidation"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:84:7: ( 'viewset' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:84:9: 'viewset'
-            {
-            match("viewset"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:85:7: ( '{' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:85:9: '{'
-            {
-            match('{'); 
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:86:7: ( '}' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:86:9: '}'
-            {
-            match('}'); 
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:87:7: ( 'dataAlias' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:87:9: 'dataAlias'
-            {
-            match("dataAlias"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:88:7: ( 'datasource' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:88:9: 'datasource'
-            {
-            match("datasource"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:89:7: ( ':' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:89:9: ':'
-            {
-            match(':'); 
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:90:7: ( 'eventTopic' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:90:9: 'eventTopic'
-            {
-            match("eventTopic"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:91:7: ( 'bind' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:91:9: 'bind'
-            {
-            match("bind"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:92:7: ( '[' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:92:9: '['
-            {
-            match('['); 
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:93:7: ( ']' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:93:9: ']'
-            {
-            match(']'); 
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:94:7: ( 'ui' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:94:9: 'ui'
-            {
-            match("ui"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:95:7: ( 'navigateTo' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:95:9: 'navigateTo'
-            {
-            match("navigateTo"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:96:7: ( 'openDialog' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:96:9: 'openDialog'
-            {
-            match("openDialog"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:97:7: ( 'searchWith' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:97:9: 'searchWith'
-            {
-            match("searchWith"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:98:8: ( 'addToTable' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:98:10: 'addToTable'
-            {
-            match("addToTable"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:99:8: ( 'removeFromTable' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:99:10: 'removeFromTable'
-            {
-            match("removeFromTable"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:100:8: ( 'newInstance' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:100:10: 'newInstance'
-            {
-            match("newInstance"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:101:8: ( 'for' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:101:10: 'for'
-            {
-            match("for"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:102:8: ( 'at' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:102:10: 'at'
-            {
-            match("at"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:103:8: ( 'sendEvent' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:103:10: 'sendEvent'
-            {
-            match("sendEvent"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:104:8: ( '(' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:104:10: '('
-            {
-            match('('); 
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:105:8: ( ')' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:105:10: ')'
-            {
-            match(')'); 
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:106:8: ( 'ideview' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:106:10: 'ideview'
-            {
-            match("ideview"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:107:8: ( 'sharedStateGroup' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:107:10: 'sharedStateGroup'
-            {
-            match("sharedStateGroup"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:108:8: ( 'category' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:108:10: 'category'
-            {
-            match("category"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:109:8: ( 'rootType' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:109:10: 'rootType'
-            {
-            match("rootType"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:110:8: ( 'exposedActions' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:110:10: 'exposedActions'
-            {
-            match("exposedActions"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:111:8: ( 'align' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:111:10: 'align'
-            {
-            match("align"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:112:8: ( 'id' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:112:10: 'id'
-            {
-            match("id"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:113:8: ( 'icon' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:113:10: 'icon'
-            {
-            match("icon"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:114:8: ( 'externalCommand' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:114:10: 'externalCommand'
-            {
-            match("externalCommand"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:115:8: ( 'mobile' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:115:10: 'mobile'
-            {
-            match("mobile"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:116:8: ( 'i18n' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:116:10: 'i18n'
-            {
-            match("i18n"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:117:8: ( 'gridlayout' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:117:10: 'gridlayout'
-            {
-            match("gridlayout"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:118:8: ( 'columns=' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:118:10: 'columns='
-            {
-            match("columns="); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:119:8: ( 'styles' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:119:10: 'styles'
-            {
-            match("styles"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:120:8: ( 'form' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:120:10: 'form'
-            {
-            match("form"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:121:8: ( 'verticalLayout' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:121:10: 'verticalLayout'
-            {
-            match("verticalLayout"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:122:8: ( 'mobileVerticalLayout' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:122:10: 'mobileVerticalLayout'
-            {
-            match("mobileVerticalLayout"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:123:8: ( 'navRoot' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:123:10: 'navRoot'
-            {
-            match("navRoot"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:124:8: ( 'horizontalLayout' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:124:10: 'horizontalLayout'
-            {
-            match("horizontalLayout"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:125:8: ( 'mobileHorizontalLayout' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:125:10: 'mobileHorizontalLayout'
-            {
-            match("mobileHorizontalLayout"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:126:8: ( 'horizontalButtonGroup' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:126:10: 'horizontalButtonGroup'
-            {
-            match("horizontalButtonGroup"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:127:8: ( 'verticalGroup' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:127:10: 'verticalGroup'
-            {
-            match("verticalGroup"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:128:8: ( 'searchPanel' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:128:10: 'searchPanel'
-            {
-            match("searchPanel"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:129:8: ( 'type' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:129:10: 'type'
-            {
-            match("type"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:130:8: ( 'mobileSearchPanel' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:130:10: 'mobileSearchPanel'
-            {
-            match("mobileSearchPanel"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:131:8: ( 'mobileTab' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:131:10: 'mobileTab'
-            {
-            match("mobileTab"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:132:8: ( 'tab' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:132:10: 'tab'
-            {
-            match("tab"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:133:8: ( 'tabsheet' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:133:10: 'tabsheet'
-            {
-            match("tabsheet"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:134:8: ( 'splitter' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:134:10: 'splitter'
-            {
-            match("splitter"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:135:8: ( 'first' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:135:10: 'first'
-            {
-            match("first"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:136:8: ( 'splitPos' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:136:10: 'splitPos'
-            {
-            match("splitPos"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:137:8: ( 'panel' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:137:10: 'panel'
-            {
-            match("panel"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:138:8: ( 'content' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:138:10: 'content'
-            {
-            match("content"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:139:8: ( 'dialog' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:139:10: 'dialog'
-            {
-            match("dialog"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:140:8: ( 'searchdialog' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:140:10: 'searchdialog'
-            {
-            match("searchdialog"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:141:8: ( 'search' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:141:10: 'search'
-            {
-            match("search"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:142:8: ( 'navPage' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:142:10: 'navPage'
-            {
-            match("navPage"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:143:8: ( 'navbarActions' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:143:10: 'navbarActions'
-            {
-            match("navbarActions"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:144:8: ( 'textfield' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:144:10: 'textfield'
-            {
-            match("textfield"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:145:8: ( 'maxLength=' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:145:10: 'maxLength='
-            {
-            match("maxLength="); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:146:8: ( 'minLength=' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:146:10: 'minLength='
-            {
-            match("minLength="); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:147:8: ( 'regex=' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:147:10: 'regex='
-            {
-            match("regex="); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:148:8: ( 'passwordField' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:148:10: 'passwordField'
-            {
-            match("passwordField"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:149:8: ( 'maskedText' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:149:10: 'maskedText'
-            {
-            match("maskedText"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:150:8: ( 'mask=' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:150:10: 'mask='
-            {
-            match("mask="); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:151:8: ( 'maskedNumeric' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:151:10: 'maskedNumeric'
-            {
-            match("maskedNumeric"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:152:8: ( 'maskedDecimal' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:152:10: 'maskedDecimal'
-            {
-            match("maskedDecimal"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:153:8: ( 'maskedTextWithPrefix' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:153:10: 'maskedTextWithPrefix'
-            {
-            match("maskedTextWithPrefix"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:154:8: ( 'prefixes=' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:154:10: 'prefixes='
-            {
-            match("prefixes="); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__156"
-
-    // $ANTLR start "T__157"
-    public final void mT__157() throws RecognitionException {
-        try {
-            int _type = T__157;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:155:8: ( ',' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:155:10: ','
-            {
-            match(','); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__157"
-
-    // $ANTLR start "T__158"
-    public final void mT__158() throws RecognitionException {
-        try {
-            int _type = T__158;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:156:8: ( 'prefix' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:156:10: 'prefix'
-            {
-            match("prefix"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__158"
-
-    // $ANTLR start "T__159"
-    public final void mT__159() throws RecognitionException {
-        try {
-            int _type = T__159;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:157:8: ( 'mask' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:157:10: 'mask'
-            {
-            match("mask"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__159"
-
-    // $ANTLR start "T__160"
-    public final void mT__160() throws RecognitionException {
-        try {
-            int _type = T__160;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:158:8: ( 'richtextArea' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:158:10: 'richtextArea'
-            {
-            match("richtextArea"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__160"
-
-    // $ANTLR start "T__161"
-    public final void mT__161() throws RecognitionException {
-        try {
-            int _type = T__161;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:159:8: ( 'suggestText' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:159:10: 'suggestText'
-            {
-            match("suggestText"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__161"
-
-    // $ANTLR start "T__162"
-    public final void mT__162() throws RecognitionException {
-        try {
-            int _type = T__162;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:160:8: ( 'captionField' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:160:10: 'captionField'
-            {
-            match("captionField"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__162"
-
-    // $ANTLR start "T__163"
-    public final void mT__163() throws RecognitionException {
-        try {
-            int _type = T__163;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:161:8: ( 'filterField' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:161:10: 'filterField'
-            {
-            match("filterField"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__163"
-
-    // $ANTLR start "T__164"
-    public final void mT__164() throws RecognitionException {
-        try {
-            int _type = T__164;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:162:8: ( 'uuidField' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:162:10: 'uuidField'
-            {
-            match("uuidField"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__164"
-
-    // $ANTLR start "T__165"
-    public final void mT__165() throws RecognitionException {
-        try {
-            int _type = T__165;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:163:8: ( 'referenceField' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:163:10: 'referenceField'
-            {
-            match("referenceField"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__165"
-
-    // $ANTLR start "T__166"
-    public final void mT__166() throws RecognitionException {
-        try {
-            int _type = T__166;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:164:8: ( 'refSource' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:164:10: 'refSource'
-            {
-            match("refSource"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__166"
-
-    // $ANTLR start "T__167"
-    public final void mT__167() throws RecognitionException {
-        try {
-            int _type = T__167;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:165:8: ( 'descriptionField' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:165:10: 'descriptionField'
-            {
-            match("descriptionField"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__167"
-
-    // $ANTLR start "T__168"
-    public final void mT__168() throws RecognitionException {
-        try {
-            int _type = T__168;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:166:8: ( 'imageField' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:166:10: 'imageField'
-            {
-            match("imageField"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__168"
-
-    // $ANTLR start "T__169"
-    public final void mT__169() throws RecognitionException {
-        try {
-            int _type = T__169;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:167:8: ( 'inMemoryService' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:167:10: 'inMemoryService'
-            {
-            match("inMemoryService"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__169"
-
-    // $ANTLR start "T__170"
-    public final void mT__170() throws RecognitionException {
-        try {
-            int _type = T__170;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:168:8: ( 'searchfield' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:168:10: 'searchfield'
-            {
-            match("searchfield"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__170"
-
-    // $ANTLR start "T__171"
-    public final void mT__171() throws RecognitionException {
-        try {
-            int _type = T__171;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:169:8: ( 'textarea' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:169:10: 'textarea'
-            {
-            match("textarea"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__171"
-
-    // $ANTLR start "T__172"
-    public final void mT__172() throws RecognitionException {
-        try {
-            int _type = T__172;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:170:8: ( 'datefield' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:170:10: 'datefield'
-            {
-            match("datefield"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__172"
-
-    // $ANTLR start "T__173"
-    public final void mT__173() throws RecognitionException {
-        try {
-            int _type = T__173;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:171:8: ( 'browser' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:171:10: 'browser'
-            {
-            match("browser"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__173"
-
-    // $ANTLR start "T__174"
-    public final void mT__174() throws RecognitionException {
-        try {
-            int _type = T__174;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:172:8: ( 'progressbar' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:172:10: 'progressbar'
-            {
-            match("progressbar"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__174"
-
-    // $ANTLR start "T__175"
-    public final void mT__175() throws RecognitionException {
-        try {
-            int _type = T__175;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:173:8: ( 'image' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:173:10: 'image'
-            {
-            match("image"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__175"
-
-    // $ANTLR start "T__176"
-    public final void mT__176() throws RecognitionException {
-        try {
-            int _type = T__176;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:174:8: ( 'iconPath' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:174:10: 'iconPath'
-            {
-            match("iconPath"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__176"
-
-    // $ANTLR start "T__177"
-    public final void mT__177() throws RecognitionException {
-        try {
-            int _type = T__177;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:175:8: ( 'table' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:175:10: 'table'
-            {
-            match("table"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__177"
-
-    // $ANTLR start "T__178"
-    public final void mT__178() throws RecognitionException {
-        try {
-            int _type = T__178;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:176:8: ( 'selectionType' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:176:10: 'selectionType'
-            {
-            match("selectionType"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__178"
-
-    // $ANTLR start "T__179"
-    public final void mT__179() throws RecognitionException {
-        try {
-            int _type = T__179;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:177:8: ( 'combo' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:177:10: 'combo'
-            {
-            match("combo"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__179"
-
-    // $ANTLR start "T__180"
-    public final void mT__180() throws RecognitionException {
-        try {
-            int _type = T__180;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:178:8: ( 'button' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:178:10: 'button'
-            {
-            match("button"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__180"
-
-    // $ANTLR start "T__181"
-    public final void mT__181() throws RecognitionException {
-        try {
-            int _type = T__181;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:179:8: ( 'navButton' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:179:10: 'navButton'
-            {
-            match("navButton"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__181"
-
-    // $ANTLR start "T__182"
-    public final void mT__182() throws RecognitionException {
-        try {
-            int _type = T__182;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:180:8: ( 'alias' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:180:10: 'alias'
-            {
-            match("alias"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__182"
-
-    // $ANTLR start "T__183"
-    public final void mT__183() throws RecognitionException {
-        try {
-            int _type = T__183;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:181:8: ( 'switchIt' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:181:10: 'switchIt'
-            {
-            match("switchIt"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__183"
-
-    // $ANTLR start "T__184"
-    public final void mT__184() throws RecognitionException {
-        try {
-            int _type = T__184;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:182:8: ( 'label' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:182:10: 'label'
-            {
-            match("label"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__184"
-
-    // $ANTLR start "T__185"
-    public final void mT__185() throws RecognitionException {
-        try {
-            int _type = T__185;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:183:8: ( 'decimalField' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:183:10: 'decimalField'
-            {
-            match("decimalField"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__185"
-
-    // $ANTLR start "T__186"
-    public final void mT__186() throws RecognitionException {
-        try {
-            int _type = T__186;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:184:8: ( 'precision=' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:184:10: 'precision='
-            {
-            match("precision="); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__186"
-
-    // $ANTLR start "T__187"
-    public final void mT__187() throws RecognitionException {
-        try {
-            int _type = T__187;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:185:8: ( 'optionsgroup' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:185:10: 'optionsgroup'
-            {
-            match("optionsgroup"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__187"
-
-    // $ANTLR start "T__188"
-    public final void mT__188() throws RecognitionException {
-        try {
-            int _type = T__188;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:186:8: ( 'listSelect' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:186:10: 'listSelect'
-            {
-            match("listSelect"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__188"
-
-    // $ANTLR start "T__189"
-    public final void mT__189() throws RecognitionException {
-        try {
-            int _type = T__189;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:187:8: ( 'columns' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:187:10: 'columns'
-            {
-            match("columns"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__189"
-
-    // $ANTLR start "T__190"
-    public final void mT__190() throws RecognitionException {
-        try {
-            int _type = T__190;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:188:8: ( 'sort' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:188:10: 'sort'
-            {
-            match("sort"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__190"
-
-    // $ANTLR start "T__191"
-    public final void mT__191() throws RecognitionException {
-        try {
-            int _type = T__191;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:189:8: ( 'column' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:189:10: 'column'
-            {
-            match("column"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__191"
-
-    // $ANTLR start "T__192"
-    public final void mT__192() throws RecognitionException {
-        try {
-            int _type = T__192;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:190:8: ( 'numericField' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:190:10: 'numericField'
-            {
-            match("numericField"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__192"
-
-    // $ANTLR start "T__193"
-    public final void mT__193() throws RecognitionException {
-        try {
-            int _type = T__193;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:191:8: ( 'checkbox' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:191:10: 'checkbox'
-            {
-            match("checkbox"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__193"
-
-    // $ANTLR start "T__194"
-    public final void mT__194() throws RecognitionException {
-        try {
-            int _type = T__194;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:192:8: ( 'MaxLengthValidator' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:192:10: 'MaxLengthValidator'
-            {
-            match("MaxLengthValidator"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__194"
-
-    // $ANTLR start "T__195"
-    public final void mT__195() throws RecognitionException {
-        try {
-            int _type = T__195;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:193:8: ( 'MinLengthValidator' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:193:10: 'MinLengthValidator'
-            {
-            match("MinLengthValidator"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__195"
-
-    // $ANTLR start "T__196"
-    public final void mT__196() throws RecognitionException {
-        try {
-            int _type = T__196;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:194:8: ( 'RegexValidator' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:194:10: 'RegexValidator'
-            {
-            match("RegexValidator"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__196"
-
-    // $ANTLR start "T__197"
-    public final void mT__197() throws RecognitionException {
-        try {
-            int _type = T__197;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:195:8: ( 'Expression' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:195:10: 'Expression'
-            {
-            match("Expression"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__197"
-
-    // $ANTLR start "T__198"
-    public final void mT__198() throws RecognitionException {
-        try {
-            int _type = T__198;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:196:8: ( 'BeanValidationValidator' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:196:10: 'BeanValidationValidator'
-            {
-            match("BeanValidationValidator"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__198"
-
-    // $ANTLR start "T__199"
-    public final void mT__199() throws RecognitionException {
-        try {
-            int _type = T__199;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:197:8: ( 'code' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:197:10: 'code'
-            {
-            match("code"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__199"
-
-    // $ANTLR start "T__200"
-    public final void mT__200() throws RecognitionException {
-        try {
-            int _type = T__200;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:198:8: ( 'visibility' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:198:10: 'visibility'
-            {
-            match("visibility"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__200"
-
-    // $ANTLR start "T__201"
-    public final void mT__201() throws RecognitionException {
-        try {
-            int _type = T__201;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:199:8: ( 'fireOn' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:199:10: 'fireOn'
-            {
-            match("fireOn"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__201"
-
-    // $ANTLR start "T__202"
-    public final void mT__202() throws RecognitionException {
-        try {
-            int _type = T__202;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:200:8: ( 'instanceof' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:200:10: 'instanceof'
-            {
-            match("instanceof"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__202"
-
-    // $ANTLR start "T__203"
-    public final void mT__203() throws RecognitionException {
-        try {
-            int _type = T__203;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:201:8: ( '#' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:201:10: '#'
-            {
-            match('#'); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__203"
-
-    // $ANTLR start "T__204"
-    public final void mT__204() throws RecognitionException {
-        try {
-            int _type = T__204;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:202:8: ( 'if' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:202:10: 'if'
-            {
-            match("if"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__204"
-
-    // $ANTLR start "T__205"
-    public final void mT__205() throws RecognitionException {
-        try {
-            int _type = T__205;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:203:8: ( 'else' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:203:10: 'else'
-            {
-            match("else"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__205"
-
-    // $ANTLR start "T__206"
-    public final void mT__206() throws RecognitionException {
-        try {
-            int _type = T__206;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:204:8: ( 'switch' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:204:10: 'switch'
-            {
-            match("switch"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__206"
-
-    // $ANTLR start "T__207"
-    public final void mT__207() throws RecognitionException {
-        try {
-            int _type = T__207;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:205:8: ( 'default' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:205:10: 'default'
-            {
-            match("default"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__207"
-
-    // $ANTLR start "T__208"
-    public final void mT__208() throws RecognitionException {
-        try {
-            int _type = T__208;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:206:8: ( 'case' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:206:10: 'case'
-            {
-            match("case"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__208"
-
-    // $ANTLR start "T__209"
-    public final void mT__209() throws RecognitionException {
-        try {
-            int _type = T__209;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:207:8: ( 'while' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:207:10: 'while'
-            {
-            match("while"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__209"
-
-    // $ANTLR start "T__210"
-    public final void mT__210() throws RecognitionException {
-        try {
-            int _type = T__210;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:208:8: ( 'do' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:208:10: 'do'
-            {
-            match("do"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__210"
-
-    // $ANTLR start "T__211"
-    public final void mT__211() throws RecognitionException {
-        try {
-            int _type = T__211;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:209:8: ( 'new' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:209:10: 'new'
-            {
-            match("new"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__211"
-
-    // $ANTLR start "T__212"
-    public final void mT__212() throws RecognitionException {
-        try {
-            int _type = T__212;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:210:8: ( 'null' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:210:10: 'null'
-            {
-            match("null"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__212"
-
-    // $ANTLR start "T__213"
-    public final void mT__213() throws RecognitionException {
-        try {
-            int _type = T__213;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:211:8: ( 'typeof' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:211:10: 'typeof'
-            {
-            match("typeof"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__213"
-
-    // $ANTLR start "T__214"
-    public final void mT__214() throws RecognitionException {
-        try {
-            int _type = T__214;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:212:8: ( 'throw' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:212:10: 'throw'
-            {
-            match("throw"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__214"
-
-    // $ANTLR start "T__215"
-    public final void mT__215() throws RecognitionException {
-        try {
-            int _type = T__215;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:213:8: ( 'return' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:213:10: 'return'
-            {
-            match("return"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__215"
-
-    // $ANTLR start "T__216"
-    public final void mT__216() throws RecognitionException {
-        try {
-            int _type = T__216;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:214:8: ( 'try' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:214:10: 'try'
-            {
-            match("try"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__216"
-
-    // $ANTLR start "T__217"
-    public final void mT__217() throws RecognitionException {
-        try {
-            int _type = T__217;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:215:8: ( 'finally' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:215:10: 'finally'
-            {
-            match("finally"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__217"
-
-    // $ANTLR start "T__218"
-    public final void mT__218() throws RecognitionException {
-        try {
-            int _type = T__218;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:216:8: ( 'synchronized' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:216:10: 'synchronized'
-            {
-            match("synchronized"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__218"
-
-    // $ANTLR start "T__219"
-    public final void mT__219() throws RecognitionException {
-        try {
-            int _type = T__219;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:217:8: ( 'catch' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:217:10: 'catch'
-            {
-            match("catch"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__219"
-
-    // $ANTLR start "T__220"
-    public final void mT__220() throws RecognitionException {
-        try {
-            int _type = T__220;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:218:8: ( '?' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:218:10: '?'
-            {
-            match('?'); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__220"
-
-    // $ANTLR start "T__221"
-    public final void mT__221() throws RecognitionException {
-        try {
-            int _type = T__221;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:219:8: ( '&' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:219:10: '&'
-            {
-            match('&'); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__221"
-
-    // $ANTLR start "T__222"
-    public final void mT__222() throws RecognitionException {
-        try {
-            int _type = T__222;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:220:8: ( 'list' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:220:10: 'list'
-            {
-            match("list"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__222"
-
-    // $ANTLR start "T__223"
-    public final void mT__223() throws RecognitionException {
-        try {
-            int _type = T__223;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:221:8: ( 'noAutoTrigger' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:221:10: 'noAutoTrigger'
-            {
-            match("noAutoTrigger"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__223"
-
-    // $ANTLR start "T__224"
-    public final void mT__224() throws RecognitionException {
-        try {
-            int _type = T__224;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:222:8: ( 'checkDirty' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:222:10: 'checkDirty'
-            {
-            match("checkDirty"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__224"
-
-    // $ANTLR start "T__225"
-    public final void mT__225() throws RecognitionException {
-        try {
-            int _type = T__225;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:223:8: ( 'readonly' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:223:10: 'readonly'
-            {
-            match("readonly"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__225"
-
-    // $ANTLR start "T__226"
-    public final void mT__226() throws RecognitionException {
-        try {
-            int _type = T__226;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:224:8: ( 'asBlob' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:224:10: 'asBlob'
-            {
-            match("asBlob"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__226"
-
-    // $ANTLR start "T__227"
-    public final void mT__227() throws RecognitionException {
-        try {
-            int _type = T__227;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:225:8: ( 'autoHidePopup' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:225:10: 'autoHidePopup'
-            {
-            match("autoHidePopup"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__227"
-
-    // $ANTLR start "T__228"
-    public final void mT__228() throws RecognitionException {
-        try {
-            int _type = T__228;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:226:8: ( 'useBeanService' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:226:10: 'useBeanService'
-            {
-            match("useBeanService"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__228"
-
-    // $ANTLR start "T__229"
-    public final void mT__229() throws RecognitionException {
-        try {
-            int _type = T__229;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:227:8: ( 'noGrouping' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:227:10: 'noGrouping'
-            {
-            match("noGrouping"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__229"
-
-    // $ANTLR start "T__230"
-    public final void mT__230() throws RecognitionException {
-        try {
-            int _type = T__230;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:228:8: ( 'noMarkNegative' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:228:10: 'noMarkNegative'
-            {
-            match("noMarkNegative"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__230"
-
-    // $ANTLR start "T__231"
-    public final void mT__231() throws RecognitionException {
-        try {
-            int _type = T__231;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:229:8: ( 'asc' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:229:10: 'asc'
-            {
-            match("asc"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__231"
-
-    // $ANTLR start "T__232"
-    public final void mT__232() throws RecognitionException {
-        try {
-            int _type = T__232;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:230:8: ( '::' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:230:10: '::'
-            {
-            match("::"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__232"
-
-    // $ANTLR start "T__233"
-    public final void mT__233() throws RecognitionException {
-        try {
-            int _type = T__233;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:231:8: ( '?.' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:231:10: '?.'
-            {
-            match("?."); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__233"
-
-    // $ANTLR start "T__234"
-    public final void mT__234() throws RecognitionException {
-        try {
-            int _type = T__234;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:232:8: ( '|' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:232:10: '|'
-            {
-            match('|'); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__234"
-
-    // $ANTLR start "T__235"
-    public final void mT__235() throws RecognitionException {
-        try {
-            int _type = T__235;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:233:8: ( 'var' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:233:10: 'var'
-            {
-            match("var"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__235"
-
-    // $ANTLR start "T__236"
-    public final void mT__236() throws RecognitionException {
-        try {
-            int _type = T__236;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:234:8: ( 'true' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:234:10: 'true'
-            {
-            match("true"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__236"
-
-    // $ANTLR start "RULE_HEX"
-    public final void mRULE_HEX() throws RecognitionException {
-        try {
-            int _type = RULE_HEX;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72103:10: ( ( '0x' | '0X' ) ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+ ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )? )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72103:12: ( '0x' | '0X' ) ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+ ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )?
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72103: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 :
-                    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72103:13: '0x'
-                    {
-                    match("0x"); 
-
-
-                    }
-                    break;
-                case 2 :
-                    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72103:18: '0X'
-                    {
-                    match("0X"); 
-
-
-                    }
-                    break;
-
-            }
-
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72103: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 :
-            	    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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);
-
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72103: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 :
-                    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72103:59: '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) )
-                    {
-                    match('#'); 
-                    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72103: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 :
-                            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72103: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 :
-                            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72103: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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72105:10: ( '0' .. '9' ( '0' .. '9' | '_' )* )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72105:12: '0' .. '9' ( '0' .. '9' | '_' )*
-            {
-            matchRange('0','9'); 
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72105: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 :
-            	    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72107:14: ( RULE_INT ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )? ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )? )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72107:16: RULE_INT ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )? ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )?
-            {
-            mRULE_INT(); 
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72107: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 :
-                    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72107: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;}
-
-                    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72107:36: ( '+' | '-' )?
-                    int alt6=2;
-                    int LA6_0 = input.LA(1);
-
-                    if ( (LA6_0=='+'||LA6_0=='-') ) {
-                        alt6=1;
-                    }
-                    switch (alt6) {
-                        case 1 :
-                            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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;
-
-            }
-
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72107: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 :
-                    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72107: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 :
-                    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72107: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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72109:9: ( ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )* )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72109:11: ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72109:11: ( '^' )?
-            int alt9=2;
-            int LA9_0 = input.LA(1);
-
-            if ( (LA9_0=='^') ) {
-                alt9=1;
-            }
-            switch (alt9) {
-                case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72109: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.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72109: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 :
-            	    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72111:13: ( ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72111:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72111: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 :
-                    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72111:16: '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )?
-                    {
-                    match('\"'); 
-                    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72111: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 :
-                    	    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72111:21: '\\\\' .
-                    	    {
-                    	    match('\\'); 
-                    	    matchAny(); 
-
-                    	    }
-                    	    break;
-                    	case 2 :
-                    	    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72111: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);
-
-                    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72111:44: ( '\"' )?
-                    int alt12=2;
-                    int LA12_0 = input.LA(1);
-
-                    if ( (LA12_0=='\"') ) {
-                        alt12=1;
-                    }
-                    switch (alt12) {
-                        case 1 :
-                            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72111:44: '\"'
-                            {
-                            match('\"'); 
-
-                            }
-                            break;
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72111:49: '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )?
-                    {
-                    match('\''); 
-                    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72111: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 :
-                    	    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72111:55: '\\\\' .
-                    	    {
-                    	    match('\\'); 
-                    	    matchAny(); 
-
-                    	    }
-                    	    break;
-                    	case 2 :
-                    	    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72111: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);
-
-                    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72111:79: ( '\\'' )?
-                    int alt14=2;
-                    int LA14_0 = input.LA(1);
-
-                    if ( (LA14_0=='\'') ) {
-                        alt14=1;
-                    }
-                    switch (alt14) {
-                        case 1 :
-                            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72111: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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72113:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72113:19: '/*' ( options {greedy=false; } : . )* '*/'
-            {
-            match("/*"); 
-
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72113: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 :
-            	    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72113: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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72115:17: ( '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72115:19: '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
-            {
-            match("//"); 
-
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72115: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 :
-            	    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72115: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);
-
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72115: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 :
-                    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72115:41: ( '\\r' )? '\\n'
-                    {
-                    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72115:41: ( '\\r' )?
-                    int alt18=2;
-                    int LA18_0 = input.LA(1);
-
-                    if ( (LA18_0=='\r') ) {
-                        alt18=1;
-                    }
-                    switch (alt18) {
-                        case 1 :
-                            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72115: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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72117:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72117:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72117: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 :
-            	    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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;
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72119:16: ( . )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:72119:18: .
-            {
-            matchAny(); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "RULE_ANY_OTHER"
-
-    public void mTokens() throws RecognitionException {
-        // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.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 | T__157 | T__158 | T__159 | T__160 | T__161 | T__162 | T__163 | T__164 | T__165 | T__166 | T__167 | T__168 | T__169 | T__170 | T__171 | T__172 | T__173 | T__174 | T__175 | T__176 | T__177 | T__178 | T__179 | T__180 | T__181 | T__182 | T__183 | T__184 | T__185 | T__186 | T__187 | T__188 | T__189 | T__190 | T__191 | T__192 | T__193 | T__194 | T__195 | T__196 | T__197 | T__198 | T__199 | T__200 | T__201 | T__202 | T__203 | T__204 | T__205 | T__206 | T__207 | T__208 | T__209 | T__210 | T__211 | T__212 | T__213 | T__214 | T__215 | T__216 | T__217 | T__218 | T__219 | T__220 | T__221 | T__222 | T__223 | T__224 | T__225 | T__226 | T__227 | T__228 | T__229 | T__230 | T__231 | T__232 | T__233 | T__234 | T__235 | T__236 | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_ID | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER )
-        int alt21=233;
-        alt21 = dfa21.predict(input);
-        switch (alt21) {
-            case 1 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:10: T__13
-                {
-                mT__13(); 
-
-                }
-                break;
-            case 2 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:16: T__14
-                {
-                mT__14(); 
-
-                }
-                break;
-            case 3 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:22: T__15
-                {
-                mT__15(); 
-
-                }
-                break;
-            case 4 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:28: T__16
-                {
-                mT__16(); 
-
-                }
-                break;
-            case 5 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:34: T__17
-                {
-                mT__17(); 
-
-                }
-                break;
-            case 6 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:40: T__18
-                {
-                mT__18(); 
-
-                }
-                break;
-            case 7 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:46: T__19
-                {
-                mT__19(); 
-
-                }
-                break;
-            case 8 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:52: T__20
-                {
-                mT__20(); 
-
-                }
-                break;
-            case 9 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:58: T__21
-                {
-                mT__21(); 
-
-                }
-                break;
-            case 10 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:64: T__22
-                {
-                mT__22(); 
-
-                }
-                break;
-            case 11 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:70: T__23
-                {
-                mT__23(); 
-
-                }
-                break;
-            case 12 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:76: T__24
-                {
-                mT__24(); 
-
-                }
-                break;
-            case 13 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:82: T__25
-                {
-                mT__25(); 
-
-                }
-                break;
-            case 14 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:88: T__26
-                {
-                mT__26(); 
-
-                }
-                break;
-            case 15 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:94: T__27
-                {
-                mT__27(); 
-
-                }
-                break;
-            case 16 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:100: T__28
-                {
-                mT__28(); 
-
-                }
-                break;
-            case 17 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:106: T__29
-                {
-                mT__29(); 
-
-                }
-                break;
-            case 18 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:112: T__30
-                {
-                mT__30(); 
-
-                }
-                break;
-            case 19 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:118: T__31
-                {
-                mT__31(); 
-
-                }
-                break;
-            case 20 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:124: T__32
-                {
-                mT__32(); 
-
-                }
-                break;
-            case 21 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:130: T__33
-                {
-                mT__33(); 
-
-                }
-                break;
-            case 22 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:136: T__34
-                {
-                mT__34(); 
-
-                }
-                break;
-            case 23 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:142: T__35
-                {
-                mT__35(); 
-
-                }
-                break;
-            case 24 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:148: T__36
-                {
-                mT__36(); 
-
-                }
-                break;
-            case 25 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:154: T__37
-                {
-                mT__37(); 
-
-                }
-                break;
-            case 26 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:160: T__38
-                {
-                mT__38(); 
-
-                }
-                break;
-            case 27 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:166: T__39
-                {
-                mT__39(); 
-
-                }
-                break;
-            case 28 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:172: T__40
-                {
-                mT__40(); 
-
-                }
-                break;
-            case 29 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:178: T__41
-                {
-                mT__41(); 
-
-                }
-                break;
-            case 30 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:184: T__42
-                {
-                mT__42(); 
-
-                }
-                break;
-            case 31 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:190: T__43
-                {
-                mT__43(); 
-
-                }
-                break;
-            case 32 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:196: T__44
-                {
-                mT__44(); 
-
-                }
-                break;
-            case 33 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:202: T__45
-                {
-                mT__45(); 
-
-                }
-                break;
-            case 34 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:208: T__46
-                {
-                mT__46(); 
-
-                }
-                break;
-            case 35 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:214: T__47
-                {
-                mT__47(); 
-
-                }
-                break;
-            case 36 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:220: T__48
-                {
-                mT__48(); 
-
-                }
-                break;
-            case 37 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:226: T__49
-                {
-                mT__49(); 
-
-                }
-                break;
-            case 38 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:232: T__50
-                {
-                mT__50(); 
-
-                }
-                break;
-            case 39 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:238: T__51
-                {
-                mT__51(); 
-
-                }
-                break;
-            case 40 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:244: T__52
-                {
-                mT__52(); 
-
-                }
-                break;
-            case 41 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:250: T__53
-                {
-                mT__53(); 
-
-                }
-                break;
-            case 42 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:256: T__54
-                {
-                mT__54(); 
-
-                }
-                break;
-            case 43 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:262: T__55
-                {
-                mT__55(); 
-
-                }
-                break;
-            case 44 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:268: T__56
-                {
-                mT__56(); 
-
-                }
-                break;
-            case 45 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:274: T__57
-                {
-                mT__57(); 
-
-                }
-                break;
-            case 46 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:280: T__58
-                {
-                mT__58(); 
-
-                }
-                break;
-            case 47 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:286: T__59
-                {
-                mT__59(); 
-
-                }
-                break;
-            case 48 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:292: T__60
-                {
-                mT__60(); 
-
-                }
-                break;
-            case 49 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:298: T__61
-                {
-                mT__61(); 
-
-                }
-                break;
-            case 50 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:304: T__62
-                {
-                mT__62(); 
-
-                }
-                break;
-            case 51 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:310: T__63
-                {
-                mT__63(); 
-
-                }
-                break;
-            case 52 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:316: T__64
-                {
-                mT__64(); 
-
-                }
-                break;
-            case 53 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:322: T__65
-                {
-                mT__65(); 
-
-                }
-                break;
-            case 54 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:328: T__66
-                {
-                mT__66(); 
-
-                }
-                break;
-            case 55 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:334: T__67
-                {
-                mT__67(); 
-
-                }
-                break;
-            case 56 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:340: T__68
-                {
-                mT__68(); 
-
-                }
-                break;
-            case 57 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:346: T__69
-                {
-                mT__69(); 
-
-                }
-                break;
-            case 58 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:352: T__70
-                {
-                mT__70(); 
-
-                }
-                break;
-            case 59 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:358: T__71
-                {
-                mT__71(); 
-
-                }
-                break;
-            case 60 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:364: T__72
-                {
-                mT__72(); 
-
-                }
-                break;
-            case 61 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:370: T__73
-                {
-                mT__73(); 
-
-                }
-                break;
-            case 62 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:376: T__74
-                {
-                mT__74(); 
-
-                }
-                break;
-            case 63 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:382: T__75
-                {
-                mT__75(); 
-
-                }
-                break;
-            case 64 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:388: T__76
-                {
-                mT__76(); 
-
-                }
-                break;
-            case 65 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:394: T__77
-                {
-                mT__77(); 
-
-                }
-                break;
-            case 66 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:400: T__78
-                {
-                mT__78(); 
-
-                }
-                break;
-            case 67 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:406: T__79
-                {
-                mT__79(); 
-
-                }
-                break;
-            case 68 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:412: T__80
-                {
-                mT__80(); 
-
-                }
-                break;
-            case 69 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:418: T__81
-                {
-                mT__81(); 
-
-                }
-                break;
-            case 70 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:424: T__82
-                {
-                mT__82(); 
-
-                }
-                break;
-            case 71 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:430: T__83
-                {
-                mT__83(); 
-
-                }
-                break;
-            case 72 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:436: T__84
-                {
-                mT__84(); 
-
-                }
-                break;
-            case 73 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:442: T__85
-                {
-                mT__85(); 
-
-                }
-                break;
-            case 74 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:448: T__86
-                {
-                mT__86(); 
-
-                }
-                break;
-            case 75 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:454: T__87
-                {
-                mT__87(); 
-
-                }
-                break;
-            case 76 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:460: T__88
-                {
-                mT__88(); 
-
-                }
-                break;
-            case 77 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:466: T__89
-                {
-                mT__89(); 
-
-                }
-                break;
-            case 78 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:472: T__90
-                {
-                mT__90(); 
-
-                }
-                break;
-            case 79 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:478: T__91
-                {
-                mT__91(); 
-
-                }
-                break;
-            case 80 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:484: T__92
-                {
-                mT__92(); 
-
-                }
-                break;
-            case 81 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:490: T__93
-                {
-                mT__93(); 
-
-                }
-                break;
-            case 82 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:496: T__94
-                {
-                mT__94(); 
-
-                }
-                break;
-            case 83 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:502: T__95
-                {
-                mT__95(); 
-
-                }
-                break;
-            case 84 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:508: T__96
-                {
-                mT__96(); 
-
-                }
-                break;
-            case 85 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:514: T__97
-                {
-                mT__97(); 
-
-                }
-                break;
-            case 86 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:520: T__98
-                {
-                mT__98(); 
-
-                }
-                break;
-            case 87 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:526: T__99
-                {
-                mT__99(); 
-
-                }
-                break;
-            case 88 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:532: T__100
-                {
-                mT__100(); 
-
-                }
-                break;
-            case 89 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:539: T__101
-                {
-                mT__101(); 
-
-                }
-                break;
-            case 90 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:546: T__102
-                {
-                mT__102(); 
-
-                }
-                break;
-            case 91 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:553: T__103
-                {
-                mT__103(); 
-
-                }
-                break;
-            case 92 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:560: T__104
-                {
-                mT__104(); 
-
-                }
-                break;
-            case 93 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:567: T__105
-                {
-                mT__105(); 
-
-                }
-                break;
-            case 94 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:574: T__106
-                {
-                mT__106(); 
-
-                }
-                break;
-            case 95 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:581: T__107
-                {
-                mT__107(); 
-
-                }
-                break;
-            case 96 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:588: T__108
-                {
-                mT__108(); 
-
-                }
-                break;
-            case 97 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:595: T__109
-                {
-                mT__109(); 
-
-                }
-                break;
-            case 98 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:602: T__110
-                {
-                mT__110(); 
-
-                }
-                break;
-            case 99 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:609: T__111
-                {
-                mT__111(); 
-
-                }
-                break;
-            case 100 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:616: T__112
-                {
-                mT__112(); 
-
-                }
-                break;
-            case 101 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:623: T__113
-                {
-                mT__113(); 
-
-                }
-                break;
-            case 102 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:630: T__114
-                {
-                mT__114(); 
-
-                }
-                break;
-            case 103 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:637: T__115
-                {
-                mT__115(); 
-
-                }
-                break;
-            case 104 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:644: T__116
-                {
-                mT__116(); 
-
-                }
-                break;
-            case 105 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:651: T__117
-                {
-                mT__117(); 
-
-                }
-                break;
-            case 106 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:658: T__118
-                {
-                mT__118(); 
-
-                }
-                break;
-            case 107 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:665: T__119
-                {
-                mT__119(); 
-
-                }
-                break;
-            case 108 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:672: T__120
-                {
-                mT__120(); 
-
-                }
-                break;
-            case 109 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:679: T__121
-                {
-                mT__121(); 
-
-                }
-                break;
-            case 110 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:686: T__122
-                {
-                mT__122(); 
-
-                }
-                break;
-            case 111 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:693: T__123
-                {
-                mT__123(); 
-
-                }
-                break;
-            case 112 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:700: T__124
-                {
-                mT__124(); 
-
-                }
-                break;
-            case 113 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:707: T__125
-                {
-                mT__125(); 
-
-                }
-                break;
-            case 114 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:714: T__126
-                {
-                mT__126(); 
-
-                }
-                break;
-            case 115 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:721: T__127
-                {
-                mT__127(); 
-
-                }
-                break;
-            case 116 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:728: T__128
-                {
-                mT__128(); 
-
-                }
-                break;
-            case 117 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:735: T__129
-                {
-                mT__129(); 
-
-                }
-                break;
-            case 118 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:742: T__130
-                {
-                mT__130(); 
-
-                }
-                break;
-            case 119 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:749: T__131
-                {
-                mT__131(); 
-
-                }
-                break;
-            case 120 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:756: T__132
-                {
-                mT__132(); 
-
-                }
-                break;
-            case 121 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:763: T__133
-                {
-                mT__133(); 
-
-                }
-                break;
-            case 122 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:770: T__134
-                {
-                mT__134(); 
-
-                }
-                break;
-            case 123 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:777: T__135
-                {
-                mT__135(); 
-
-                }
-                break;
-            case 124 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:784: T__136
-                {
-                mT__136(); 
-
-                }
-                break;
-            case 125 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:791: T__137
-                {
-                mT__137(); 
-
-                }
-                break;
-            case 126 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:798: T__138
-                {
-                mT__138(); 
-
-                }
-                break;
-            case 127 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:805: T__139
-                {
-                mT__139(); 
-
-                }
-                break;
-            case 128 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:812: T__140
-                {
-                mT__140(); 
-
-                }
-                break;
-            case 129 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:819: T__141
-                {
-                mT__141(); 
-
-                }
-                break;
-            case 130 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:826: T__142
-                {
-                mT__142(); 
-
-                }
-                break;
-            case 131 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:833: T__143
-                {
-                mT__143(); 
-
-                }
-                break;
-            case 132 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:840: T__144
-                {
-                mT__144(); 
-
-                }
-                break;
-            case 133 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:847: T__145
-                {
-                mT__145(); 
-
-                }
-                break;
-            case 134 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:854: T__146
-                {
-                mT__146(); 
-
-                }
-                break;
-            case 135 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:861: T__147
-                {
-                mT__147(); 
-
-                }
-                break;
-            case 136 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:868: T__148
-                {
-                mT__148(); 
-
-                }
-                break;
-            case 137 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:875: T__149
-                {
-                mT__149(); 
-
-                }
-                break;
-            case 138 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:882: T__150
-                {
-                mT__150(); 
-
-                }
-                break;
-            case 139 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:889: T__151
-                {
-                mT__151(); 
-
-                }
-                break;
-            case 140 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:896: T__152
-                {
-                mT__152(); 
-
-                }
-                break;
-            case 141 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:903: T__153
-                {
-                mT__153(); 
-
-                }
-                break;
-            case 142 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:910: T__154
-                {
-                mT__154(); 
-
-                }
-                break;
-            case 143 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:917: T__155
-                {
-                mT__155(); 
-
-                }
-                break;
-            case 144 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:924: T__156
-                {
-                mT__156(); 
-
-                }
-                break;
-            case 145 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:931: T__157
-                {
-                mT__157(); 
-
-                }
-                break;
-            case 146 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:938: T__158
-                {
-                mT__158(); 
-
-                }
-                break;
-            case 147 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:945: T__159
-                {
-                mT__159(); 
-
-                }
-                break;
-            case 148 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:952: T__160
-                {
-                mT__160(); 
-
-                }
-                break;
-            case 149 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:959: T__161
-                {
-                mT__161(); 
-
-                }
-                break;
-            case 150 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:966: T__162
-                {
-                mT__162(); 
-
-                }
-                break;
-            case 151 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:973: T__163
-                {
-                mT__163(); 
-
-                }
-                break;
-            case 152 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:980: T__164
-                {
-                mT__164(); 
-
-                }
-                break;
-            case 153 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:987: T__165
-                {
-                mT__165(); 
-
-                }
-                break;
-            case 154 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:994: T__166
-                {
-                mT__166(); 
-
-                }
-                break;
-            case 155 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1001: T__167
-                {
-                mT__167(); 
-
-                }
-                break;
-            case 156 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1008: T__168
-                {
-                mT__168(); 
-
-                }
-                break;
-            case 157 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1015: T__169
-                {
-                mT__169(); 
-
-                }
-                break;
-            case 158 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1022: T__170
-                {
-                mT__170(); 
-
-                }
-                break;
-            case 159 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1029: T__171
-                {
-                mT__171(); 
-
-                }
-                break;
-            case 160 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1036: T__172
-                {
-                mT__172(); 
-
-                }
-                break;
-            case 161 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1043: T__173
-                {
-                mT__173(); 
-
-                }
-                break;
-            case 162 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1050: T__174
-                {
-                mT__174(); 
-
-                }
-                break;
-            case 163 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1057: T__175
-                {
-                mT__175(); 
-
-                }
-                break;
-            case 164 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1064: T__176
-                {
-                mT__176(); 
-
-                }
-                break;
-            case 165 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1071: T__177
-                {
-                mT__177(); 
-
-                }
-                break;
-            case 166 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1078: T__178
-                {
-                mT__178(); 
-
-                }
-                break;
-            case 167 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1085: T__179
-                {
-                mT__179(); 
-
-                }
-                break;
-            case 168 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1092: T__180
-                {
-                mT__180(); 
-
-                }
-                break;
-            case 169 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1099: T__181
-                {
-                mT__181(); 
-
-                }
-                break;
-            case 170 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1106: T__182
-                {
-                mT__182(); 
-
-                }
-                break;
-            case 171 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1113: T__183
-                {
-                mT__183(); 
-
-                }
-                break;
-            case 172 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1120: T__184
-                {
-                mT__184(); 
-
-                }
-                break;
-            case 173 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1127: T__185
-                {
-                mT__185(); 
-
-                }
-                break;
-            case 174 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1134: T__186
-                {
-                mT__186(); 
-
-                }
-                break;
-            case 175 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1141: T__187
-                {
-                mT__187(); 
-
-                }
-                break;
-            case 176 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1148: T__188
-                {
-                mT__188(); 
-
-                }
-                break;
-            case 177 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1155: T__189
-                {
-                mT__189(); 
-
-                }
-                break;
-            case 178 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1162: T__190
-                {
-                mT__190(); 
-
-                }
-                break;
-            case 179 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1169: T__191
-                {
-                mT__191(); 
-
-                }
-                break;
-            case 180 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1176: T__192
-                {
-                mT__192(); 
-
-                }
-                break;
-            case 181 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1183: T__193
-                {
-                mT__193(); 
-
-                }
-                break;
-            case 182 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1190: T__194
-                {
-                mT__194(); 
-
-                }
-                break;
-            case 183 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1197: T__195
-                {
-                mT__195(); 
-
-                }
-                break;
-            case 184 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1204: T__196
-                {
-                mT__196(); 
-
-                }
-                break;
-            case 185 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1211: T__197
-                {
-                mT__197(); 
-
-                }
-                break;
-            case 186 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1218: T__198
-                {
-                mT__198(); 
-
-                }
-                break;
-            case 187 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1225: T__199
-                {
-                mT__199(); 
-
-                }
-                break;
-            case 188 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1232: T__200
-                {
-                mT__200(); 
-
-                }
-                break;
-            case 189 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1239: T__201
-                {
-                mT__201(); 
-
-                }
-                break;
-            case 190 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1246: T__202
-                {
-                mT__202(); 
-
-                }
-                break;
-            case 191 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1253: T__203
-                {
-                mT__203(); 
-
-                }
-                break;
-            case 192 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1260: T__204
-                {
-                mT__204(); 
-
-                }
-                break;
-            case 193 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1267: T__205
-                {
-                mT__205(); 
-
-                }
-                break;
-            case 194 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1274: T__206
-                {
-                mT__206(); 
-
-                }
-                break;
-            case 195 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1281: T__207
-                {
-                mT__207(); 
-
-                }
-                break;
-            case 196 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1288: T__208
-                {
-                mT__208(); 
-
-                }
-                break;
-            case 197 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1295: T__209
-                {
-                mT__209(); 
-
-                }
-                break;
-            case 198 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1302: T__210
-                {
-                mT__210(); 
-
-                }
-                break;
-            case 199 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1309: T__211
-                {
-                mT__211(); 
-
-                }
-                break;
-            case 200 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1316: T__212
-                {
-                mT__212(); 
-
-                }
-                break;
-            case 201 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1323: T__213
-                {
-                mT__213(); 
-
-                }
-                break;
-            case 202 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1330: T__214
-                {
-                mT__214(); 
-
-                }
-                break;
-            case 203 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1337: T__215
-                {
-                mT__215(); 
-
-                }
-                break;
-            case 204 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1344: T__216
-                {
-                mT__216(); 
-
-                }
-                break;
-            case 205 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1351: T__217
-                {
-                mT__217(); 
-
-                }
-                break;
-            case 206 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1358: T__218
-                {
-                mT__218(); 
-
-                }
-                break;
-            case 207 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1365: T__219
-                {
-                mT__219(); 
-
-                }
-                break;
-            case 208 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1372: T__220
-                {
-                mT__220(); 
-
-                }
-                break;
-            case 209 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1379: T__221
-                {
-                mT__221(); 
-
-                }
-                break;
-            case 210 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1386: T__222
-                {
-                mT__222(); 
-
-                }
-                break;
-            case 211 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1393: T__223
-                {
-                mT__223(); 
-
-                }
-                break;
-            case 212 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1400: T__224
-                {
-                mT__224(); 
-
-                }
-                break;
-            case 213 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1407: T__225
-                {
-                mT__225(); 
-
-                }
-                break;
-            case 214 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1414: T__226
-                {
-                mT__226(); 
-
-                }
-                break;
-            case 215 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1421: T__227
-                {
-                mT__227(); 
-
-                }
-                break;
-            case 216 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1428: T__228
-                {
-                mT__228(); 
-
-                }
-                break;
-            case 217 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1435: T__229
-                {
-                mT__229(); 
-
-                }
-                break;
-            case 218 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1442: T__230
-                {
-                mT__230(); 
-
-                }
-                break;
-            case 219 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1449: T__231
-                {
-                mT__231(); 
-
-                }
-                break;
-            case 220 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1456: T__232
-                {
-                mT__232(); 
-
-                }
-                break;
-            case 221 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1463: T__233
-                {
-                mT__233(); 
-
-                }
-                break;
-            case 222 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1470: T__234
-                {
-                mT__234(); 
-
-                }
-                break;
-            case 223 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1477: T__235
-                {
-                mT__235(); 
-
-                }
-                break;
-            case 224 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1484: T__236
-                {
-                mT__236(); 
-
-                }
-                break;
-            case 225 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1491: RULE_HEX
-                {
-                mRULE_HEX(); 
-
-                }
-                break;
-            case 226 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1500: RULE_INT
-                {
-                mRULE_INT(); 
-
-                }
-                break;
-            case 227 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1509: RULE_DECIMAL
-                {
-                mRULE_DECIMAL(); 
-
-                }
-                break;
-            case 228 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1522: RULE_ID
-                {
-                mRULE_ID(); 
-
-                }
-                break;
-            case 229 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1530: RULE_STRING
-                {
-                mRULE_STRING(); 
-
-                }
-                break;
-            case 230 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1542: RULE_ML_COMMENT
-                {
-                mRULE_ML_COMMENT(); 
-
-                }
-                break;
-            case 231 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1558: RULE_SL_COMMENT
-                {
-                mRULE_SL_COMMENT(); 
-
-                }
-                break;
-            case 232 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1574: RULE_WS
-                {
-                mRULE_WS(); 
-
-                }
-                break;
-            case 233 :
-                // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1:1582: RULE_ANY_OTHER
-                {
-                mRULE_ANY_OTHER(); 
-
-                }
-                break;
-
-        }
-
-    }
-
-
-    protected DFA21 dfa21 = new DFA21(this);
-    static final String DFA21_eotS =
-        "\1\uffff\1\73\1\75\1\77\1\101\1\106\1\111\1\115\1\120\1\124\1\126\1\130\1\132\1\134\1\137\15\106\1\uffff\1\106\2\uffff\1\u009c\2\uffff\2\106\2\uffff\2\106\1\uffff\5\106\1\uffff\1\106\2\u00b5\1\70\5\uffff\1\u00ba\6\uffff\1\u00bc\1\uffff\3\106\1\u00c3\21\uffff\1\u00c5\10\uffff\20\106\1\u00e0\3\106\1\u00e5\13\106\1\u00f5\22\106\1\uffff\1\u0115\1\106\1\u0117\2\106\6\uffff\4\106\2\uffff\4\106\1\uffff\7\106\1\uffff\1\106\1\uffff\1\u00b5\10\uffff\4\106\1\u0139\1\106\3\uffff\1\u013c\1\u013d\30\106\1\uffff\4\106\1\uffff\5\106\1\u0162\3\106\1\u0168\2\106\1\u016b\2\106\1\uffff\21\106\1\u0185\14\106\1\u0193\1\uffff\1\106\1\uffff\34\106\1\u01b5\2\106\1\u01ba\1\106\1\uffff\2\106\2\uffff\6\106\1\u01c6\14\106\1\u01d3\4\106\1\u01d9\1\u01da\11\106\1\u01e4\1\uffff\1\u01e5\1\uffff\1\u01eb\2\106\1\uffff\2\106\1\uffff\1\u01f1\12\106\1\u01fe\1\u01ff\1\106\1\u0201\1\u0202\11\106\1\uffff\1\106\1\u020d\1\106\1\u020f\11\106\1\uffff\21\106\1\u022a\3\106\1\u022e\3\106\1\u0233\7\106\1\uffff\4\106\1\uffff\13\106\1\uffff\2\106\1\u024d\11\106\1\uffff\2\106\1\u025b\2\106\2\uffff\2\106\1\u0260\1\uffff\2\106\1\u0267\2\106\6\uffff\1\106\1\uffff\1\106\1\u026c\2\106\1\u026f\1\uffff\6\106\1\u0276\1\106\1\u0278\2\106\3\uffff\1\106\2\uffff\12\106\1\uffff\1\106\1\uffff\3\106\1\u028a\6\106\1\u0291\1\u0292\14\106\1\u029f\1\106\1\uffff\2\106\1\u02a3\1\uffff\2\106\1\u02a7\1\106\1\uffff\5\106\1\u02ae\7\106\1\u02b6\11\106\1\u02c0\1\u02c1\1\uffff\1\106\1\u02c3\1\u02c8\2\106\1\u02cb\3\106\1\u02d0\1\106\1\u02d2\1\106\1\uffff\4\106\5\uffff\2\106\1\uffff\1\u02da\1\106\1\u02dc\1\106\1\uffff\2\106\1\uffff\3\106\1\u02e3\2\106\1\uffff\1\u02ea\1\uffff\17\106\1\u02fc\1\106\1\uffff\1\106\1\u0300\2\106\1\u0303\1\106\2\uffff\4\106\1\uffff\2\106\1\u030b\4\106\1\uffff\1\106\1\u0312\1\106\1\uffff\3\106\1\uffff\6\106\1\uffff\2\106\1\u031f\4\106\1\uffff\1\106\1\u0325\2\106\1\u0328\4\106\2\uffff\1\106\1\uffff\4\106\1\uffff\2\106\1\uffff\4\106\1\uffff\1\106\1\uffff\1\106\1\u033a\5\106\1\uffff\1\u0340\1\uffff\6\106\1\uffff\1\106\1\uffff\4\106\1\uffff\11\106\1\u0359\1\u035a\4\106\1\uffff\1\u0363\1\uffff\1\u0364\2\106\1\uffff\2\106\1\uffff\7\106\1\uffff\5\106\1\u0376\1\uffff\1\u0377\13\106\1\uffff\1\u0383\4\106\1\uffff\2\106\1\uffff\14\106\1\u0397\1\u0398\1\u0399\2\106\1\uffff\1\u039c\4\106\1\uffff\1\u03a1\1\106\1\u03a3\4\106\4\uffff\15\106\2\uffff\4\106\6\uffff\13\106\1\u03c4\1\u03c5\1\106\1\u03c7\1\106\3\uffff\1\u03c9\12\106\1\uffff\1\u03d4\1\u03d5\5\106\1\u03db\10\106\1\u03e4\2\106\3\uffff\2\106\1\uffff\4\106\1\uffff\1\u03ed\1\uffff\1\u03ee\1\u03ef\5\106\1\u03f5\12\106\1\u0400\3\106\1\uffff\10\106\1\u040c\2\uffff\1\106\1\uffff\1\106\1\uffff\12\106\2\uffff\1\u0419\1\106\1\u041b\2\106\1\uffff\2\106\1\u0420\1\106\1\u0422\3\106\1\uffff\3\106\1\u0429\1\106\1\u042b\2\106\3\uffff\1\106\1\uffff\3\106\2\uffff\1\u0433\4\106\1\u0439\1\106\1\u043b\1\106\1\uffff\3\106\1\uffff\1\106\1\u0441\1\106\1\u0443\3\106\1\uffff\2\106\1\u0449\1\u044a\1\u044b\3\106\1\u044f\3\106\1\uffff\1\106\1\uffff\4\106\1\uffff\1\u0458\1\uffff\1\u0459\1\106\1\u045b\3\106\1\uffff\1\106\1\uffff\1\u0460\6\106\1\uffff\5\106\1\uffff\1\106\1\uffff\1\106\1\u046e\2\106\1\u0471\1\uffff\1\106\1\uffff\5\106\3\uffff\3\106\1\uffff\2\106\1\u047d\5\106\2\uffff\1\u0483\1\uffff\2\106\1\u0486\1\106\1\uffff\15\106\1\uffff\1\u0495\1\106\1\uffff\1\106\1\u0498\2\106\1\u049b\1\u049c\5\106\1\uffff\2\106\1\u04a4\2\106\1\uffff\1\u04a7\1\106\1\uffff\7\106\1\u04b0\1\u04b1\2\106\1\u04b4\1\106\1\u04b6\1\uffff\1\u04b7\1\u04b8\1\uffff\2\106\2\uffff\5\106\1\u04c0\1\u04c1\1\uffff\1\106\1\u04c3\1\uffff\3\106\1\u04c7\4\106\2\uffff\2\106\1\uffff\1\u04ce\3\uffff\1\106\1\u04d0\2\106\1\u04d3\2\106\2\uffff\1\u04d6\1\uffff\1\106\1\u04d8\1\u04d9\1\uffff\6\106\1\uffff\1\u04e0\1\uffff\2\106\1\uffff\1\106\1\u04e4\1\uffff\1\u04e5\2\uffff\4\106\1\u04ea\1\106\1\uffff\3\106\2\uffff\2\106\1\u04f1\1\106\1\uffff\6\106\1\uffff\2\106\1\u04fb\1\u04fc\5\106\2\uffff\1\106\1\u0503\1\106\1\u0505\2\106\1\uffff\1\106\1\uffff\1\u0509\1\106\1\u050b\1\uffff\1\106\1\uffff\1\u050d\1\uffff";
-    static final String DFA21_eofS =
-        "\u050e\uffff";
-    static final String DFA21_minS =
-        "\1\0\1\75\1\174\1\46\1\56\1\141\1\53\1\55\2\52\3\75\1\76\1\56\1\141\1\154\1\145\1\61\2\141\1\151\1\141\1\157\1\145\1\141\1\151\1\141\1\uffff\1\144\2\uffff\1\72\2\uffff\1\160\1\145\2\uffff\1\141\1\162\1\uffff\2\141\1\145\1\170\1\145\1\uffff\1\150\2\60\1\44\5\uffff\1\75\6\uffff\1\74\1\uffff\1\143\1\164\1\141\1\44\21\uffff\1\75\10\uffff\1\154\1\145\1\162\1\160\1\145\1\163\1\141\1\147\1\141\1\156\1\141\1\154\1\151\1\162\1\156\1\141\1\44\1\157\1\70\1\115\1\44\1\154\1\145\1\162\1\155\2\160\1\142\1\170\1\162\1\165\1\144\1\44\1\151\1\145\1\144\1\142\1\154\1\163\1\162\1\141\1\101\1\166\1\167\1\154\1\164\1\156\1\157\1\164\1\143\1\145\1\uffff\1\44\1\144\1\44\1\151\1\164\6\uffff\1\145\1\141\1\157\1\143\2\uffff\1\160\1\144\1\145\1\151\1\uffff\1\142\1\163\1\170\1\156\1\147\1\160\1\141\1\uffff\1\151\1\uffff\1\60\10\uffff\1\143\1\151\2\141\1\44\1\154\3\uffff\2\44\1\167\1\151\1\164\1\145\1\157\1\156\1\145\1\164\1\154\1\145\1\147\1\157\1\162\1\144\1\145\1\147\1\162\1\151\2\164\1\143\1\157\1\147\1\166\1\uffff\2\156\1\145\1\164\1\uffff\1\163\2\154\1\145\1\141\1\44\1\145\1\55\1\145\1\44\1\164\1\157\1\44\2\145\1\uffff\1\144\1\102\1\114\1\144\1\164\1\151\1\164\1\114\1\153\1\162\1\151\1\162\1\145\1\165\1\162\1\141\1\102\1\44\1\145\1\154\1\164\1\144\1\167\1\164\1\153\1\145\1\163\1\143\1\147\1\154\1\44\1\uffff\1\124\1\uffff\1\141\1\157\1\156\1\151\1\157\1\145\1\123\1\165\1\144\1\164\1\150\1\143\1\164\1\145\1\165\1\164\1\142\1\145\1\143\1\144\1\145\1\164\2\114\1\145\1\162\1\156\1\154\1\44\1\155\1\165\1\44\1\101\1\uffff\1\157\1\144\2\uffff\1\163\1\142\1\151\1\156\1\163\1\164\1\44\1\151\1\145\1\162\1\145\1\156\1\143\1\105\1\143\1\154\1\145\1\164\1\143\1\44\1\150\1\162\1\145\1\151\2\44\1\155\1\141\1\145\1\55\1\145\1\144\1\164\1\117\1\154\1\44\1\uffff\1\44\1\143\1\44\1\150\1\145\1\uffff\1\141\1\167\1\uffff\1\44\1\146\1\106\1\145\1\164\1\145\1\154\1\150\1\154\1\151\1\145\2\44\1\172\2\44\1\164\1\157\1\162\1\147\1\157\2\141\1\165\1\156\1\uffff\1\162\1\44\1\157\1\44\1\163\1\157\1\141\1\154\1\167\2\151\1\162\1\157\1\uffff\1\157\1\156\1\163\1\110\1\104\1\157\1\166\1\170\1\162\1\157\1\162\1\157\1\124\1\164\1\147\1\150\1\151\1\44\1\155\1\145\1\157\1\44\1\153\2\154\1\44\2\145\1\170\1\145\1\126\1\145\1\151\1\uffff\1\141\1\154\2\151\1\uffff\1\154\1\157\1\147\1\141\1\145\1\151\1\143\1\144\1\156\1\145\1\124\1\uffff\1\143\1\163\1\44\1\163\1\144\1\150\1\166\1\164\1\145\1\144\1\120\1\150\1\uffff\1\162\1\164\1\44\1\145\1\141\2\uffff\1\157\1\156\1\44\1\143\1\162\1\126\1\44\1\156\1\154\6\uffff\1\146\1\uffff\1\145\1\44\1\151\1\162\1\44\1\uffff\2\151\1\141\1\145\1\156\1\145\1\44\1\145\1\44\1\156\1\144\3\uffff\1\157\2\uffff\1\157\1\165\1\153\1\141\1\157\1\147\1\162\1\164\1\163\1\151\1\uffff\1\155\1\uffff\1\145\1\156\1\147\1\44\1\157\1\170\1\163\1\145\1\142\1\124\2\44\2\151\1\156\1\145\1\75\1\145\1\165\2\156\1\171\1\145\1\157\1\44\1\157\1\uffff\2\156\1\44\1\uffff\1\104\1\141\1\44\1\145\1\uffff\2\156\1\126\1\163\1\141\1\44\1\160\1\154\1\164\1\155\1\145\1\151\1\165\1\44\2\164\1\154\1\141\1\163\1\151\1\141\1\144\1\157\2\44\1\uffff\1\164\2\44\1\145\1\151\1\44\1\123\1\145\1\157\1\44\1\157\1\44\1\151\1\uffff\1\167\1\164\1\162\1\143\5\uffff\1\106\1\141\1\uffff\1\44\1\171\1\44\1\145\1\uffff\2\145\1\uffff\1\156\1\145\1\156\1\44\1\147\1\55\1\uffff\1\44\1\uffff\1\147\1\104\1\156\1\124\1\160\1\116\2\164\1\145\1\101\2\164\1\143\1\55\1\162\1\44\1\145\1\uffff\1\162\1\44\1\151\1\163\1\44\1\141\2\uffff\1\144\1\141\1\163\1\106\1\uffff\1\156\1\162\1\44\1\154\1\160\1\170\1\162\1\uffff\1\156\1\44\1\164\1\uffff\1\157\1\151\1\171\1\uffff\1\154\2\147\1\141\1\163\1\154\1\uffff\1\164\1\106\1\44\1\145\1\154\1\141\1\162\1\uffff\1\157\1\44\1\151\1\154\1\44\1\157\1\154\1\101\1\160\2\uffff\1\124\1\uffff\1\151\1\141\2\151\1\uffff\1\156\1\157\1\uffff\1\164\1\162\1\163\1\164\1\uffff\1\156\1\uffff\1\145\1\44\1\150\1\171\1\145\1\151\1\154\1\uffff\1\44\1\uffff\1\164\1\154\1\141\1\145\1\154\1\123\1\uffff\1\164\1\143\1\145\1\157\1\145\1\141\1\uffff\1\164\1\145\1\165\1\145\1\164\1\162\1\151\2\145\2\44\1\143\1\157\1\141\1\106\1\143\1\44\1\uffff\1\44\1\144\1\163\1\uffff\1\157\1\163\1\uffff\1\142\1\145\1\154\1\147\1\162\2\143\1\uffff\1\171\1\145\1\164\1\171\1\106\1\44\1\uffff\1\44\1\170\1\162\1\157\1\145\2\164\1\154\4\151\1\uffff\1\44\1\144\1\163\1\143\1\162\1\uffff\1\164\1\107\1\uffff\1\156\1\103\1\143\1\151\1\145\1\164\1\156\1\141\1\145\1\164\1\156\1\141\3\44\1\151\1\154\1\uffff\1\44\1\123\1\157\1\145\1\151\1\uffff\1\44\1\144\1\44\2\144\1\145\1\150\4\uffff\2\162\1\141\1\142\1\150\1\170\1\155\1\143\1\141\1\151\1\156\1\147\1\124\2\uffff\1\164\2\156\1\151\6\uffff\1\106\1\75\1\156\1\142\1\154\1\120\1\157\1\162\1\157\2\145\2\44\1\101\1\44\1\151\3\uffff\1\44\1\164\1\165\1\143\2\150\1\151\1\157\1\144\1\157\1\145\1\uffff\2\44\1\145\1\101\1\171\1\141\1\162\1\44\1\157\1\164\1\143\1\170\1\150\1\145\2\154\1\44\1\124\1\164\3\uffff\1\172\1\144\1\uffff\1\145\1\146\1\154\1\144\1\uffff\1\44\1\uffff\2\44\1\162\1\75\1\164\1\151\1\162\1\44\1\75\1\164\1\145\1\151\1\154\2\147\1\141\1\157\1\151\1\44\1\143\1\145\1\151\1\uffff\1\75\1\141\1\145\1\157\1\147\1\157\1\155\1\106\1\44\2\uffff\1\162\1\uffff\1\145\1\uffff\1\171\2\164\2\126\1\144\1\156\1\141\1\156\1\154\2\uffff\1\44\1\154\1\44\1\171\1\157\1\uffff\1\155\1\151\1\44\1\164\1\44\1\154\1\157\1\144\1\uffff\1\171\2\145\1\44\1\162\1\44\1\144\1\141\3\uffff\1\166\1\uffff\1\151\1\172\1\143\2\uffff\1\44\1\162\1\155\1\102\1\147\1\44\1\164\1\44\1\157\1\uffff\1\145\1\154\1\145\1\uffff\1\162\1\44\1\160\1\44\1\165\1\124\1\151\1\uffff\1\145\1\154\3\44\3\141\1\44\1\164\1\106\1\144\1\uffff\1\151\1\uffff\1\157\1\165\1\155\1\157\1\uffff\1\44\1\uffff\1\44\1\147\1\44\1\160\1\107\1\144\1\uffff\1\166\1\uffff\1\44\1\164\1\151\1\143\1\157\1\150\1\151\1\uffff\1\151\2\141\1\165\1\145\1\uffff\1\151\1\uffff\1\156\1\44\1\144\1\154\1\44\1\uffff\1\165\1\uffff\1\160\1\141\1\145\1\141\1\144\3\uffff\2\154\1\164\1\uffff\2\151\1\44\1\141\1\165\1\160\1\141\1\156\2\uffff\1\44\1\uffff\1\145\1\162\1\44\1\151\1\uffff\1\151\1\143\1\141\1\156\1\120\1\164\1\143\1\154\1\171\1\164\1\162\1\166\1\163\1\uffff\1\44\1\144\1\uffff\1\160\1\44\1\142\1\154\2\44\2\151\2\157\1\145\1\uffff\1\163\1\164\1\44\1\156\1\163\1\uffff\1\44\1\157\1\uffff\1\143\1\157\1\145\1\154\1\164\1\141\1\150\2\44\1\157\1\164\1\44\1\145\1\44\1\uffff\2\44\1\uffff\1\154\1\144\2\uffff\2\144\1\162\1\156\1\154\2\44\1\uffff\1\144\1\44\1\uffff\1\165\1\145\1\156\1\44\1\114\1\141\1\156\1\120\2\uffff\1\165\1\157\1\uffff\1\44\3\uffff\1\145\1\44\2\141\1\44\1\126\1\144\2\uffff\1\44\1\uffff\1\160\2\44\1\uffff\1\141\1\154\1\145\1\162\1\164\1\156\1\uffff\1\44\1\uffff\2\164\1\uffff\1\141\1\44\1\uffff\1\44\2\uffff\1\171\1\114\1\154\1\145\1\44\1\107\1\uffff\2\157\1\154\2\uffff\1\157\1\141\1\44\1\146\1\uffff\3\162\1\151\1\165\1\171\1\uffff\1\151\1\157\2\44\1\144\1\164\1\157\1\170\1\165\2\uffff\1\141\1\44\1\165\1\44\1\160\1\164\1\uffff\1\164\1\uffff\1\44\1\157\1\44\1\uffff\1\162\1\uffff\1\44\1\uffff";
-    static final String DFA21_maxS =
-        "\1\uffff\1\76\1\174\1\46\1\56\1\157\1\75\1\76\5\75\1\76\1\72\1\151\1\170\1\171\1\156\1\157\1\171\2\165\1\157\1\145\2\165\1\162\1\uffff\1\165\2\uffff\1\72\2\uffff\1\160\1\157\2\uffff\1\157\1\162\1\uffff\2\151\1\145\1\170\1\145\1\uffff\1\150\1\170\1\154\1\172\5\uffff\1\75\6\uffff\1\74\1\uffff\1\163\1\171\1\141\1\172\21\uffff\1\75\10\uffff\1\162\1\163\1\162\1\164\1\145\1\163\1\171\1\160\2\156\1\141\1\154\1\151\1\162\1\156\1\160\1\172\1\157\1\70\1\163\1\172\1\154\2\162\1\155\2\160\1\142\1\170\1\162\1\171\1\144\1\172\1\151\1\145\2\156\1\154\1\170\1\165\1\141\1\156\1\166\1\167\1\155\1\164\1\156\1\157\1\164\1\163\1\157\1\uffff\1\172\1\144\1\172\1\151\1\164\6\uffff\2\164\1\157\1\143\2\uffff\1\164\1\156\1\145\1\151\1\uffff\1\142\1\163\1\170\1\156\1\147\1\160\1\141\1\uffff\1\151\1\uffff\1\154\10\uffff\1\143\1\151\1\141\1\145\1\172\1\154\3\uffff\2\172\1\167\1\151\1\164\1\145\1\157\1\156\1\145\1\164\1\154\1\145\1\147\1\157\1\162\1\144\1\145\1\147\1\162\1\151\2\164\1\143\1\157\1\147\1\166\1\uffff\2\156\1\145\1\164\1\uffff\1\163\1\164\1\154\1\163\1\141\1\172\1\145\1\55\1\145\1\172\1\164\1\157\1\172\2\145\1\uffff\1\144\1\102\1\165\1\144\1\164\1\151\1\164\1\114\1\153\1\162\1\151\1\162\1\145\1\165\1\162\1\141\1\151\1\172\1\145\1\154\1\164\1\144\1\167\1\164\1\153\1\145\1\163\1\146\1\147\1\154\1\172\1\uffff\1\124\1\uffff\1\147\1\157\1\156\1\151\1\157\2\145\1\165\1\144\1\164\1\150\1\145\1\164\1\145\1\165\1\164\1\142\1\145\1\143\1\144\1\145\1\164\2\114\1\145\1\162\1\156\1\154\1\172\1\155\1\165\1\172\1\163\1\uffff\1\157\1\144\2\uffff\1\163\1\142\1\151\1\162\1\163\1\164\1\172\1\151\1\145\1\162\1\145\1\156\1\143\1\105\1\143\1\154\1\145\1\164\1\143\1\172\1\150\1\162\1\145\1\151\2\172\1\155\1\141\1\145\1\55\1\145\1\144\1\164\1\117\1\154\1\172\1\uffff\1\172\1\162\1\172\1\150\1\145\1\uffff\1\146\1\167\1\uffff\1\172\1\146\1\106\1\145\1\164\1\145\1\154\1\150\1\154\1\151\1\145\5\172\1\164\1\157\1\162\1\147\1\157\2\141\1\165\1\156\1\uffff\1\162\1\172\1\157\1\172\1\163\1\157\1\141\1\154\1\167\2\151\1\162\1\157\1\uffff\1\157\1\156\1\163\1\110\1\104\1\157\1\166\1\170\1\162\1\157\1\162\1\157\1\124\1\164\1\147\1\150\1\151\1\172\1\155\1\145\1\157\1\172\1\153\2\154\1\172\2\145\1\170\1\145\1\126\1\145\1\151\1\uffff\1\141\1\154\2\151\1\uffff\1\154\1\157\1\147\1\141\1\145\1\151\1\143\1\163\1\156\1\145\1\124\1\uffff\1\143\1\163\1\172\1\163\1\144\1\150\1\166\1\164\1\145\1\144\1\164\1\150\1\uffff\1\162\1\164\1\172\1\145\1\141\2\uffff\1\157\1\156\1\172\2\162\1\126\1\172\1\156\1\154\6\uffff\1\146\1\uffff\1\145\1\172\1\151\1\162\1\172\1\uffff\2\151\1\141\1\145\1\156\1\145\1\172\1\145\1\172\1\156\1\144\3\uffff\1\157\2\uffff\1\157\1\165\1\153\1\141\1\157\1\147\1\162\1\164\1\163\1\151\1\uffff\1\155\1\uffff\1\145\1\156\1\147\1\172\1\157\1\170\1\163\1\145\1\142\1\124\2\172\2\151\1\156\1\145\1\75\1\145\1\165\2\156\1\171\1\145\1\157\1\172\1\157\1\uffff\2\156\1\172\1\uffff\1\142\1\141\1\172\1\145\1\uffff\2\156\1\126\1\163\1\141\1\172\1\160\1\154\1\164\1\155\1\145\1\151\1\165\1\172\2\164\1\154\1\141\1\163\1\151\1\141\1\144\1\157\2\172\1\uffff\1\164\2\172\1\145\1\151\1\172\1\123\1\145\1\157\1\172\1\157\1\172\1\151\1\uffff\1\167\1\164\1\162\1\143\5\uffff\1\106\1\141\1\uffff\1\172\1\171\1\172\1\145\1\uffff\2\145\1\uffff\1\156\1\145\1\156\1\172\1\147\1\55\1\uffff\1\172\1\uffff\1\147\1\124\1\156\1\124\1\160\1\116\2\164\1\145\1\101\2\164\1\143\1\55\1\162\1\172\1\145\1\uffff\1\162\1\172\1\151\1\163\1\172\1\141\2\uffff\1\144\1\141\1\163\1\106\1\uffff\1\156\1\162\1\172\1\154\1\160\1\170\1\162\1\uffff\1\156\1\172\1\164\1\uffff\1\157\1\151\1\171\1\uffff\1\154\2\147\1\141\1\163\1\154\1\uffff\1\164\1\106\1\172\1\145\1\154\1\141\1\162\1\uffff\1\157\1\172\1\151\1\154\1\172\1\157\1\154\1\101\1\160\2\uffff\1\124\1\uffff\1\151\1\141\2\151\1\uffff\1\156\1\157\1\uffff\1\164\1\162\1\163\1\164\1\uffff\1\156\1\uffff\1\145\1\172\1\150\1\171\1\145\1\151\1\154\1\uffff\1\172\1\uffff\1\164\1\154\1\141\1\145\1\154\1\123\1\uffff\1\164\1\162\1\145\1\157\1\145\1\141\1\uffff\1\164\1\145\1\165\1\145\1\164\1\162\1\151\2\145\2\172\1\143\1\157\1\141\1\106\1\162\1\172\1\uffff\1\172\1\144\1\163\1\uffff\1\157\1\163\1\uffff\1\142\1\145\1\154\1\147\1\162\2\143\1\uffff\1\171\1\145\1\164\1\171\1\106\1\172\1\uffff\1\172\1\170\1\162\1\157\1\145\2\164\1\154\4\151\1\uffff\1\172\1\144\1\163\1\143\1\162\1\uffff\1\164\1\114\1\uffff\1\156\1\103\1\143\1\151\1\145\1\164\1\156\1\141\1\145\1\164\1\156\1\141\3\172\1\151\1\154\1\uffff\1\172\1\123\1\157\1\145\1\151\1\uffff\1\172\1\144\1\172\2\144\1\145\1\150\4\uffff\2\162\1\141\1\142\1\150\1\170\1\155\1\143\1\141\1\151\1\156\1\147\1\124\2\uffff\1\164\2\156\1\151\6\uffff\1\106\1\75\1\156\1\142\1\154\1\120\1\157\1\162\1\157\2\145\2\172\1\101\1\172\1\151\3\uffff\1\172\1\164\1\165\1\143\2\150\1\151\1\157\1\144\1\157\1\145\1\uffff\2\172\1\145\1\101\1\171\1\141\1\162\1\172\1\157\1\164\1\143\1\170\1\150\1\145\2\154\1\172\1\124\1\164\3\uffff\1\172\1\144\1\uffff\1\145\1\146\1\154\1\144\1\uffff\1\172\1\uffff\2\172\1\162\1\75\1\164\1\151\1\162\1\172\1\75\1\164\1\145\1\151\1\154\2\147\1\141\1\157\1\151\1\172\1\143\1\145\1\151\1\uffff\1\75\1\141\1\145\1\157\1\147\1\157\1\155\1\106\1\172\2\uffff\1\162\1\uffff\1\145\1\uffff\1\171\2\164\2\126\1\144\1\156\1\141\1\156\1\154\2\uffff\1\172\1\154\1\172\1\171\1\157\1\uffff\1\155\1\151\1\172\1\164\1\172\1\154\1\157\1\144\1\uffff\1\171\2\145\1\172\1\162\1\172\1\144\1\141\3\uffff\1\166\1\uffff\1\151\1\172\1\143\2\uffff\1\172\1\162\1\155\1\114\1\147\1\172\1\164\1\172\1\157\1\uffff\1\145\1\154\1\145\1\uffff\1\162\1\172\1\160\1\172\1\165\1\124\1\151\1\uffff\1\145\1\154\3\172\3\141\1\172\1\164\1\106\1\144\1\uffff\1\151\1\uffff\1\157\1\165\1\155\1\157\1\uffff\1\172\1\uffff\1\172\1\147\1\172\1\160\1\107\1\144\1\uffff\1\166\1\uffff\1\172\1\164\1\151\1\143\1\157\1\150\1\151\1\uffff\1\151\2\141\1\165\1\145\1\uffff\1\151\1\uffff\1\156\1\172\1\144\1\154\1\172\1\uffff\1\165\1\uffff\1\160\1\141\1\145\1\141\1\144\3\uffff\2\154\1\164\1\uffff\2\151\1\172\1\141\1\165\1\160\1\141\1\156\2\uffff\1\172\1\uffff\1\145\1\162\1\172\1\151\1\uffff\1\151\1\143\1\141\1\156\1\120\1\164\1\143\1\154\1\171\1\164\1\162\1\166\1\163\1\uffff\1\172\1\144\1\uffff\1\160\1\172\1\142\1\154\2\172\2\151\2\157\1\145\1\uffff\1\163\1\164\1\172\1\156\1\163\1\uffff\1\172\1\157\1\uffff\1\143\1\157\1\145\1\154\1\164\1\141\1\150\2\172\1\157\1\164\1\172\1\145\1\172\1\uffff\2\172\1\uffff\1\154\1\144\2\uffff\2\144\1\162\1\156\1\154\2\172\1\uffff\1\144\1\172\1\uffff\1\165\1\145\1\156\1\172\1\114\1\141\1\156\1\120\2\uffff\1\165\1\157\1\uffff\1\172\3\uffff\1\145\1\172\2\141\1\172\1\126\1\144\2\uffff\1\172\1\uffff\1\160\2\172\1\uffff\1\141\1\154\1\145\1\162\1\164\1\156\1\uffff\1\172\1\uffff\2\164\1\uffff\1\141\1\172\1\uffff\1\172\2\uffff\1\171\1\114\1\154\1\145\1\172\1\107\1\uffff\2\157\1\154\2\uffff\1\157\1\141\1\172\1\146\1\uffff\3\162\1\151\1\165\1\171\1\uffff\1\151\1\157\2\172\1\144\1\164\1\157\1\170\1\165\2\uffff\1\141\1\172\1\165\1\172\1\160\1\164\1\uffff\1\164\1\uffff\1\172\1\157\1\172\1\uffff\1\162\1\uffff\1\172\1\uffff";
-    static final String DFA21_acceptS =
-        "\34\uffff\1\106\1\uffff\1\113\1\114\1\uffff\1\122\1\123\2\uffff\1\136\1\137\2\uffff\1\u0091\5\uffff\1\u00bf\4\uffff\1\u00e4\2\u00e5\1\u00e8\1\u00e9\1\uffff\1\25\1\1\1\2\1\u00de\1\3\1\u00d1\1\uffff\1\4\4\uffff\1\u00e4\1\6\1\37\1\30\1\7\1\22\1\40\1\31\1\10\1\33\1\32\1\11\1\u00e6\1\u00e7\1\34\1\12\1\35\1\uffff\1\36\1\17\1\20\1\26\1\21\1\27\1\u00dd\1\u00d0\63\uffff\1\106\5\uffff\1\113\1\114\1\u00dc\1\117\1\122\1\123\4\uffff\1\136\1\137\4\uffff\1\u0091\7\uffff\1\u00bf\1\uffff\1\u00e1\1\uffff\1\u00e2\1\u00e3\1\u00e5\1\u00e8\1\15\1\13\1\23\1\24\6\uffff\1\u00c6\1\16\1\14\32\uffff\1\146\4\uffff\1\u00c0\17\uffff\1\124\37\uffff\1\110\1\uffff\1\134\41\uffff\1\57\2\uffff\1\41\1\u00df\44\uffff\1\133\5\uffff\1\172\2\uffff\1\u00cc\31\uffff\1\u00c7\15\uffff\1\u00db\41\uffff\1\5\4\uffff\1\50\13\uffff\1\u00c1\14\uffff\1\u00b2\5\uffff\1\147\1\152\11\uffff\1\156\1\52\1\75\1\76\1\77\1\100\1\uffff\1\167\5\uffff\1\u00e0\13\uffff\1\u008c\1\u0093\1\56\1\uffff\1\61\1\64\12\uffff\1\u00c8\1\uffff\1\121\32\uffff\1\u00c4\3\uffff\1\u00bb\4\uffff\1\u00d2\31\uffff\1\46\15\uffff\1\u00a3\4\uffff\1\47\1\101\1\102\1\103\1\104\2\uffff\1\175\4\uffff\1\u00a5\2\uffff\1\u00ca\6\uffff\1\60\1\uffff\1\63\21\uffff\1\177\6\uffff\1\145\1\u00aa\4\uffff\1\u0089\7\uffff\1\u00cf\3\uffff\1\u00a7\3\uffff\1\u00ac\6\uffff\1\u00c5\7\uffff\1\u0081\11\uffff\1\43\1\155\1\uffff\1\54\4\uffff\1\u0083\2\uffff\1\62\4\uffff\1\u00c2\1\uffff\1\44\7\uffff\1\u00bd\1\uffff\1\u00c9\6\uffff\1\55\6\uffff\1\151\21\uffff\1\u00a8\3\uffff\1\u0092\2\uffff\1\u00d6\7\uffff\1\u00cb\6\uffff\1\u00b3\14\uffff\1\u00c3\5\uffff\1\112\2\uffff\1\42\21\uffff\1\140\5\uffff\1\u00cd\7\uffff\1\71\1\72\1\73\1\74\15\uffff\1\161\1\u0084\4\uffff\1\65\1\66\1\67\1\70\1\u00a1\1\105\20\uffff\1\154\1\u00b1\1\u0080\13\uffff\1\51\23\uffff\1\174\1\176\1\u00ab\2\uffff\1\u00a4\4\uffff\1\173\1\uffff\1\u009f\26\uffff\1\u0090\11\uffff\1\u00d5\1\143\1\uffff\1\142\1\uffff\1\u00b5\12\uffff\1\u00a0\1\115\5\uffff\1\45\10\uffff\1\135\10\uffff\1\u0086\1\53\1\u0098\1\uffff\1\u0088\3\uffff\1\171\1\u0087\11\uffff\1\u00a9\3\uffff\1\u00ae\7\uffff\1\u009a\14\uffff\1\116\1\uffff\1\u00bc\4\uffff\1\120\1\uffff\1\127\6\uffff\1\u009c\1\uffff\1\u00be\7\uffff\1\u008b\5\uffff\1\u00d9\1\uffff\1\125\5\uffff\1\130\1\uffff\1\126\5\uffff\1\u00d4\1\153\1\u00b0\3\uffff\1\u00b9\10\uffff\1\u0095\1\166\1\uffff\1\u009e\4\uffff\1\u0097\15\uffff\1\132\2\uffff\1\u00a2\13\uffff\1\u00ad\5\uffff\1\u0082\2\uffff\1\u00ce\16\uffff\1\u00b4\2\uffff\1\u00af\2\uffff\1\u0094\1\u0096\7\uffff\1\165\2\uffff\1\u00a6\10\uffff\1\u008d\1\u008e\2\uffff\1\u00d3\1\uffff\1\u0085\1\u008a\1\u00d7\7\uffff\1\107\1\157\1\uffff\1\144\3\uffff\1\u00d8\6\uffff\1\u00da\1\uffff\1\u0099\2\uffff\1\u00b8\2\uffff\1\150\1\uffff\1\u009d\1\111\6\uffff\1\131\3\uffff\1\u009b\1\141\4\uffff\1\162\6\uffff\1\170\11\uffff\1\u00b6\1\u00b7\6\uffff\1\160\1\uffff\1\u008f\3\uffff\1\164\1\uffff\1\163\1\uffff\1\u00ba";
-    static final String DFA21_specialS =
-        "\1\0\u050d\uffff}>";
-    static final String[] DFA21_transitionS = {
-            "\11\70\2\67\2\70\1\67\22\70\1\67\1\13\1\65\1\57\1\64\1\12\1\3\1\66\1\45\1\46\1\10\1\6\1\51\1\7\1\4\1\11\1\61\11\62\1\40\1\34\1\15\1\1\1\14\1\16\1\70\1\64\1\56\2\64\1\55\7\64\1\53\4\64\1\54\10\64\1\41\1\70\1\42\1\63\1\64\1\70\1\35\1\32\1\47\1\5\1\20\1\23\1\50\1\27\1\22\2\64\1\52\1\26\1\31\1\43\1\33\1\64\1\44\1\21\1\24\1\25\1\17\1\60\1\64\1\30\1\64\1\36\1\2\1\37\uff82\70",
-            "\1\71\1\72",
-            "\1\74",
-            "\1\76",
-            "\1\100",
-            "\1\103\3\uffff\1\102\3\uffff\1\104\5\uffff\1\105",
-            "\1\110\21\uffff\1\107",
-            "\1\114\17\uffff\1\112\1\113",
-            "\1\117\22\uffff\1\116",
-            "\1\122\4\uffff\1\123\15\uffff\1\121",
-            "\1\125",
-            "\1\127",
-            "\1\131",
-            "\1\133",
-            "\1\136\13\uffff\1\135",
-            "\1\140\3\uffff\1\142\3\uffff\1\141",
-            "\1\145\11\uffff\1\144\1\uffff\1\143",
-            "\1\150\2\uffff\1\152\1\151\5\uffff\1\155\1\153\3\uffff\1\146\1\147\1\uffff\1\154\1\uffff\1\156",
-            "\1\162\61\uffff\1\161\1\160\1\uffff\1\164\6\uffff\1\157\1\163",
-            "\1\165\7\uffff\1\166\5\uffff\1\167",
-            "\1\173\3\uffff\1\174\2\uffff\1\175\1\170\5\uffff\1\171\2\uffff\1\176\6\uffff\1\172",
-            "\1\u0080\4\uffff\1\177\4\uffff\1\u0082\1\uffff\1\u0081",
-            "\1\u0086\7\uffff\1\u0083\5\uffff\1\u0084\5\uffff\1\u0085",
-            "\1\u0087",
-            "\1\u0088",
-            "\1\u008a\3\uffff\1\u008b\11\uffff\1\u0089\5\uffff\1\u008c",
-            "\1\u008e\5\uffff\1\u008d\2\uffff\1\u008f\2\uffff\1\u0090",
-            "\1\u0091\20\uffff\1\u0092",
-            "",
-            "\1\u0095\7\uffff\1\u0097\6\uffff\1\u0094\1\u0096\1\u0098",
-            "",
-            "",
-            "\1\u009b",
-            "",
-            "",
-            "\1\u009f",
-            "\1\u00a0\3\uffff\1\u00a2\5\uffff\1\u00a1",
-            "",
-            "",
-            "\1\u00a5\6\uffff\1\u00a7\6\uffff\1\u00a6",
-            "\1\u00a8",
-            "",
-            "\1\u00aa\7\uffff\1\u00ab",
-            "\1\u00ac\7\uffff\1\u00ad",
-            "\1\u00ae",
-            "\1\u00af",
-            "\1\u00b0",
-            "",
-            "\1\u00b2",
-            "\12\u00b4\10\uffff\1\u00b6\1\uffff\3\u00b6\5\uffff\1\u00b6\13\uffff\1\u00b3\6\uffff\1\u00b4\2\uffff\1\u00b6\1\uffff\3\u00b6\5\uffff\1\u00b6\13\uffff\1\u00b3",
-            "\12\u00b4\10\uffff\1\u00b6\1\uffff\3\u00b6\5\uffff\1\u00b6\22\uffff\1\u00b4\2\uffff\1\u00b6\1\uffff\3\u00b6\5\uffff\1\u00b6",
-            "\1\106\34\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "\1\u00b9",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "\1\u00bb",
-            "",
-            "\1\u00be\2\uffff\1\u00bf\14\uffff\1\u00bd",
-            "\1\u00c0\4\uffff\1\u00c1",
-            "\1\u00c2",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "\1\u00c4",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "\1\u00c6\5\uffff\1\u00c7",
-            "\1\u00c8\15\uffff\1\u00c9",
-            "\1\u00ca",
-            "\1\u00cc\3\uffff\1\u00cb",
-            "\1\u00cd",
-            "\1\u00ce",
-            "\1\u00cf\27\uffff\1\u00d0",
-            "\1\u00d2\10\uffff\1\u00d1",
-            "\1\u00d4\1\uffff\1\u00d3\10\uffff\1\u00d6\1\uffff\1\u00d5",
-            "\1\u00d7",
-            "\1\u00d8",
-            "\1\u00d9",
-            "\1\u00da",
-            "\1\u00db",
-            "\1\u00dc",
-            "\1\u00de\16\uffff\1\u00dd",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\4\106\1\u00df\25\106",
-            "\1\u00e1",
-            "\1\u00e2",
-            "\1\u00e3\45\uffff\1\u00e4",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u00e6",
-            "\1\u00e8\6\uffff\1\u00e7\1\uffff\1\u00ea\3\uffff\1\u00e9",
-            "\1\u00eb",
-            "\1\u00ec",
-            "\1\u00ed",
-            "\1\u00ee",
-            "\1\u00ef",
-            "\1\u00f0",
-            "\1\u00f1",
-            "\1\u00f3\3\uffff\1\u00f2",
-            "\1\u00f4",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u00f6",
-            "\1\u00f7",
-            "\1\u00f9\11\uffff\1\u00f8",
-            "\1\u00fb\13\uffff\1\u00fa",
-            "\1\u00fc",
-            "\1\u00fe\4\uffff\1\u00fd",
-            "\1\u0100\2\uffff\1\u00ff",
-            "\1\u0101",
-            "\1\u0103\5\uffff\1\u0104\5\uffff\1\u0105\40\uffff\1\u0102",
-            "\1\u0106",
-            "\1\u0107",
-            "\1\u0109\1\u0108",
-            "\1\u010a",
-            "\1\u010b",
-            "\1\u010c",
-            "\1\u010d",
-            "\1\u010e\12\uffff\1\u010f\4\uffff\1\u0110",
-            "\1\u0111\11\uffff\1\u0112",
-            "",
-            "\1\106\13\uffff\12\106\7\uffff\1\106\1\u0113\30\106\4\uffff\1\106\1\uffff\2\106\1\u0114\27\106",
-            "\1\u0116",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u0118",
-            "\1\u0119",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "\1\u011a\16\uffff\1\u011b",
-            "\1\u0120\4\uffff\1\u011e\1\u011d\5\uffff\1\u011c\6\uffff\1\u011f",
-            "\1\u0121",
-            "\1\u0122",
-            "",
-            "",
-            "\1\u0124\2\uffff\1\u0125\1\u0123",
-            "\1\u0129\7\uffff\1\u0126\1\u0128\1\u0127",
-            "\1\u012a",
-            "\1\u012b",
-            "",
-            "\1\u012c",
-            "\1\u012d",
-            "\1\u012e",
-            "\1\u012f",
-            "\1\u0130",
-            "\1\u0131",
-            "\1\u0132",
-            "",
-            "\1\u0133",
-            "",
-            "\12\u00b4\10\uffff\1\u00b6\1\uffff\3\u00b6\5\uffff\1\u00b6\22\uffff\1\u00b4\2\uffff\1\u00b6\1\uffff\3\u00b6\5\uffff\1\u00b6",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "\1\u0134",
-            "\1\u0135",
-            "\1\u0136",
-            "\1\u0138\3\uffff\1\u0137",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u013a",
-            "",
-            "",
-            "",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\10\106\1\u013b\21\106",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u013e",
-            "\1\u013f",
-            "\1\u0140",
-            "\1\u0141",
-            "\1\u0142",
-            "\1\u0143",
-            "\1\u0144",
-            "\1\u0145",
-            "\1\u0146",
-            "\1\u0147",
-            "\1\u0148",
-            "\1\u0149",
-            "\1\u014a",
-            "\1\u014b",
-            "\1\u014c",
-            "\1\u014d",
-            "\1\u014e",
-            "\1\u014f",
-            "\1\u0150",
-            "\1\u0151",
-            "\1\u0152",
-            "\1\u0153",
-            "\1\u0154",
-            "\1\u0155",
-            "",
-            "\1\u0156",
-            "\1\u0157",
-            "\1\u0158",
-            "\1\u0159",
-            "",
-            "\1\u015a",
-            "\1\u015b\7\uffff\1\u015c",
-            "\1\u015d",
-            "\1\u015f\15\uffff\1\u015e",
-            "\1\u0160",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\14\106\1\u0161\15\106",
-            "\1\u0163",
-            "\1\u0164",
-            "\1\u0165",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\13\106\1\u0167\6\106\1\u0166\7\106",
-            "\1\u0169",
-            "\1\u016a",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u016c",
-            "\1\u016d",
-            "",
-            "\1\u016e",
-            "\1\u016f",
-            "\1\u0171\50\uffff\1\u0170",
-            "\1\u0172",
-            "\1\u0173",
-            "\1\u0174",
-            "\1\u0175",
-            "\1\u0176",
-            "\1\u0177",
-            "\1\u0178",
-            "\1\u0179",
-            "\1\u017a",
-            "\1\u017b",
-            "\1\u017c",
-            "\1\u017d",
-            "\1\u017e",
-            "\1\u0183\15\uffff\1\u0181\1\uffff\1\u0180\17\uffff\1\u0182\6\uffff\1\u017f",
-            "\1\106\13\uffff\12\106\7\uffff\10\106\1\u0184\21\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u0186",
-            "\1\u0187",
-            "\1\u0188",
-            "\1\u0189",
-            "\1\u018a",
-            "\1\u018b",
-            "\1\u018c",
-            "\1\u018d",
-            "\1\u018e",
-            "\1\u0190\2\uffff\1\u018f",
-            "\1\u0191",
-            "\1\u0192",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "",
-            "\1\u0194",
-            "",
-            "\1\u0196\5\uffff\1\u0195",
-            "\1\u0197",
-            "\1\u0198",
-            "\1\u0199",
-            "\1\u019a",
-            "\1\u019b",
-            "\1\u019d\21\uffff\1\u019c",
-            "\1\u019e",
-            "\1\u019f",
-            "\1\u01a0",
-            "\1\u01a1",
-            "\1\u01a3\1\uffff\1\u01a2",
-            "\1\u01a4",
-            "\1\u01a5",
-            "\1\u01a6",
-            "\1\u01a7",
-            "\1\u01a8",
-            "\1\u01a9",
-            "\1\u01aa",
-            "\1\u01ab",
-            "\1\u01ac",
-            "\1\u01ad",
-            "\1\u01ae",
-            "\1\u01af",
-            "\1\u01b0",
-            "\1\u01b1",
-            "\1\u01b2",
-            "\1\u01b3",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\21\106\1\u01b4\10\106",
-            "\1\u01b6",
-            "\1\u01b7",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\5\106\1\u01b9\15\106\1\u01b8\6\106",
-            "\1\u01bb\61\uffff\1\u01bc",
-            "",
-            "\1\u01bd",
-            "\1\u01be",
-            "",
-            "",
-            "\1\u01bf",
-            "\1\u01c0",
-            "\1\u01c1",
-            "\1\u01c2\3\uffff\1\u01c3",
-            "\1\u01c4",
-            "\1\u01c5",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u01c7",
-            "\1\u01c8",
-            "\1\u01c9",
-            "\1\u01ca",
-            "\1\u01cb",
-            "\1\u01cc",
-            "\1\u01cd",
-            "\1\u01ce",
-            "\1\u01cf",
-            "\1\u01d0",
-            "\1\u01d1",
-            "\1\u01d2",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u01d4",
-            "\1\u01d5",
-            "\1\u01d6",
-            "\1\u01d7",
-            "\1\106\13\uffff\12\106\7\uffff\17\106\1\u01d8\12\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u01db",
-            "\1\u01dc",
-            "\1\u01dd",
-            "\1\u01de",
-            "\1\u01df",
-            "\1\u01e0",
-            "\1\u01e1",
-            "\1\u01e2",
-            "\1\u01e3",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u01e6\2\uffff\1\u01e9\5\uffff\1\u01e7\5\uffff\1\u01e8",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\16\106\1\u01ea\13\106",
-            "\1\u01ec",
-            "\1\u01ed",
-            "",
-            "\1\u01ef\4\uffff\1\u01ee",
-            "\1\u01f0",
-            "",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u01f2",
-            "\1\u01f3",
-            "\1\u01f4",
-            "\1\u01f5",
-            "\1\u01f6",
-            "\1\u01f7",
-            "\1\u01f8",
-            "\1\u01f9",
-            "\1\u01fa",
-            "\1\u01fb",
-            "\1\106\13\uffff\12\106\3\uffff\1\u01fd\3\uffff\32\106\4\uffff\1\106\1\uffff\4\106\1\u01fc\25\106",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u0200",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u0203",
-            "\1\u0204",
-            "\1\u0205",
-            "\1\u0206",
-            "\1\u0207",
-            "\1\u0208",
-            "\1\u0209",
-            "\1\u020a",
-            "\1\u020b",
-            "",
-            "\1\u020c",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u020e",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u0210",
-            "\1\u0211",
-            "\1\u0212",
-            "\1\u0213",
-            "\1\u0214",
-            "\1\u0215",
-            "\1\u0216",
-            "\1\u0217",
-            "\1\u0218",
-            "",
-            "\1\u0219",
-            "\1\u021a",
-            "\1\u021b",
-            "\1\u021c",
-            "\1\u021d",
-            "\1\u021e",
-            "\1\u021f",
-            "\1\u0220",
-            "\1\u0221",
-            "\1\u0222",
-            "\1\u0223",
-            "\1\u0224",
-            "\1\u0225",
-            "\1\u0226",
-            "\1\u0227",
-            "\1\u0228",
-            "\1\u0229",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u022b",
-            "\1\u022c",
-            "\1\u022d",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u022f",
-            "\1\u0230",
-            "\1\u0231",
-            "\1\106\13\uffff\12\106\7\uffff\22\106\1\u0232\7\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u0234",
-            "\1\u0235",
-            "\1\u0236",
-            "\1\u0237",
-            "\1\u0238",
-            "\1\u0239",
-            "\1\u023a",
-            "",
-            "\1\u023b",
-            "\1\u023c",
-            "\1\u023d",
-            "\1\u023e",
-            "",
-            "\1\u023f",
-            "\1\u0240",
-            "\1\u0241",
-            "\1\u0242",
-            "\1\u0243",
-            "\1\u0244",
-            "\1\u0245",
-            "\1\u0246\16\uffff\1\u0247",
-            "\1\u0248",
-            "\1\u0249",
-            "\1\u024a",
-            "",
-            "\1\u024b",
-            "\1\u024c",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u024e",
-            "\1\u024f",
-            "\1\u0250",
-            "\1\u0251",
-            "\1\u0252",
-            "\1\u0253",
-            "\1\u0254",
-            "\1\u0256\43\uffff\1\u0255",
-            "\1\u0257",
-            "",
-            "\1\u0258",
-            "\1\u0259",
-            "\1\106\13\uffff\12\106\7\uffff\5\106\1\u025a\24\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u025c",
-            "\1\u025d",
-            "",
-            "",
-            "\1\u025e",
-            "\1\u025f",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u0261\2\uffff\1\u0264\5\uffff\1\u0262\5\uffff\1\u0263",
-            "\1\u0265",
-            "\1\u0266",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u0268",
-            "\1\u0269",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "\1\u026a",
-            "",
-            "\1\u026b",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u026d",
-            "\1\u026e",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "",
-            "\1\u0270",
-            "\1\u0271",
-            "\1\u0272",
-            "\1\u0273",
-            "\1\u0274",
-            "\1\u0275",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u0277",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u0279",
-            "\1\u027a",
-            "",
-            "",
-            "",
-            "\1\u027b",
-            "",
-            "",
-            "\1\u027c",
-            "\1\u027d",
-            "\1\u027e",
-            "\1\u027f",
-            "\1\u0280",
-            "\1\u0281",
-            "\1\u0282",
-            "\1\u0283",
-            "\1\u0284",
-            "\1\u0285",
-            "",
-            "\1\u0286",
-            "",
-            "\1\u0287",
-            "\1\u0288",
-            "\1\u0289",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u028b",
-            "\1\u028c",
-            "\1\u028d",
-            "\1\u028e",
-            "\1\u028f",
-            "\1\u0290",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u0293",
-            "\1\u0294",
-            "\1\u0295",
-            "\1\u0296",
-            "\1\u0297",
-            "\1\u0298",
-            "\1\u0299",
-            "\1\u029a",
-            "\1\u029b",
-            "\1\u029c",
-            "\1\u029d",
-            "\1\u029e",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u02a0",
-            "",
-            "\1\u02a1",
-            "\1\u02a2",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "",
-            "\1\u02a5\35\uffff\1\u02a4",
-            "\1\u02a6",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u02a8",
-            "",
-            "\1\u02a9",
-            "\1\u02aa",
-            "\1\u02ab",
-            "\1\u02ac",
-            "\1\u02ad",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u02af",
-            "\1\u02b0",
-            "\1\u02b1",
-            "\1\u02b2",
-            "\1\u02b3",
-            "\1\u02b4",
-            "\1\u02b5",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u02b7",
-            "\1\u02b8",
-            "\1\u02b9",
-            "\1\u02ba",
-            "\1\u02bb",
-            "\1\u02bc",
-            "\1\u02bd",
-            "\1\u02be",
-            "\1\u02bf",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "",
-            "\1\u02c2",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\106\13\uffff\12\106\7\uffff\17\106\1\u02c5\6\106\1\u02c4\3\106\4\uffff\1\106\1\uffff\3\106\1\u02c6\1\106\1\u02c7\24\106",
-            "\1\u02c9",
-            "\1\u02ca",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u02cc",
-            "\1\u02cd",
-            "\1\u02ce",
-            "\1\106\13\uffff\12\106\7\uffff\10\106\1\u02cf\21\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u02d1",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u02d3",
-            "",
-            "\1\u02d4",
-            "\1\u02d5",
-            "\1\u02d6",
-            "\1\u02d7",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "\1\u02d8",
-            "\1\u02d9",
-            "",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u02db",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u02dd",
-            "",
-            "\1\u02de",
-            "\1\u02df",
-            "",
-            "\1\u02e0",
-            "\1\u02e1",
-            "\1\u02e2",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u02e4",
-            "\1\u02e5",
-            "",
-            "\1\106\13\uffff\12\106\7\uffff\7\106\1\u02e7\12\106\1\u02e8\1\u02e9\1\106\1\u02e6\4\106\4\uffff\1\106\1\uffff\32\106",
-            "",
-            "\1\u02eb",
-            "\1\u02ee\11\uffff\1\u02ed\5\uffff\1\u02ec",
-            "\1\u02ef",
-            "\1\u02f0",
-            "\1\u02f1",
-            "\1\u02f2",
-            "\1\u02f3",
-            "\1\u02f4",
-            "\1\u02f5",
-            "\1\u02f6",
-            "\1\u02f7",
-            "\1\u02f8",
-            "\1\u02f9",
-            "\1\u02fa",
-            "\1\u02fb",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u02fd",
-            "",
-            "\1\u02fe",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\4\106\1\u02ff\25\106",
-            "\1\u0301",
-            "\1\u0302",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u0304",
-            "",
-            "",
-            "\1\u0305",
-            "\1\u0306",
-            "\1\u0307",
-            "\1\u0308",
-            "",
-            "\1\u0309",
-            "\1\u030a",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u030c",
-            "\1\u030d",
-            "\1\u030e",
-            "\1\u030f",
-            "",
-            "\1\u0310",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\22\106\1\u0311\7\106",
-            "\1\u0313",
-            "",
-            "\1\u0314",
-            "\1\u0315",
-            "\1\u0316",
-            "",
-            "\1\u0317",
-            "\1\u0318",
-            "\1\u0319",
-            "\1\u031a",
-            "\1\u031b",
-            "\1\u031c",
-            "",
-            "\1\u031d",
-            "\1\u031e",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u0320",
-            "\1\u0321",
-            "\1\u0322",
-            "\1\u0323",
-            "",
-            "\1\u0324",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u0326",
-            "\1\u0327",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u0329",
-            "\1\u032a",
-            "\1\u032b",
-            "\1\u032c",
-            "",
-            "",
-            "\1\u032d",
-            "",
-            "\1\u032e",
-            "\1\u032f",
-            "\1\u0330",
-            "\1\u0331",
-            "",
-            "\1\u0332",
-            "\1\u0333",
-            "",
-            "\1\u0334",
-            "\1\u0335",
-            "\1\u0336",
-            "\1\u0337",
-            "",
-            "\1\u0338",
-            "",
-            "\1\u0339",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u033b",
-            "\1\u033c",
-            "\1\u033d",
-            "\1\u033e",
-            "\1\u033f",
-            "",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "",
-            "\1\u0341",
-            "\1\u0342",
-            "\1\u0343",
-            "\1\u0344",
-            "\1\u0345",
-            "\1\u0346",
-            "",
-            "\1\u0347",
-            "\1\u0348\2\uffff\1\u034b\5\uffff\1\u0349\5\uffff\1\u034a",
-            "\1\u034c",
-            "\1\u034d",
-            "\1\u034e",
-            "\1\u034f",
-            "",
-            "\1\u0350",
-            "\1\u0351",
-            "\1\u0352",
-            "\1\u0353",
-            "\1\u0354",
-            "\1\u0355",
-            "\1\u0356",
-            "\1\u0357",
-            "\1\u0358",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u035b",
-            "\1\u035c",
-            "\1\u035d",
-            "\1\u035e",
-            "\1\u035f\2\uffff\1\u0362\5\uffff\1\u0360\5\uffff\1\u0361",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u0365",
-            "\1\u0366",
-            "",
-            "\1\u0367",
-            "\1\u0368",
-            "",
-            "\1\u0369",
-            "\1\u036a",
-            "\1\u036b",
-            "\1\u036c",
-            "\1\u036d",
-            "\1\u036e",
-            "\1\u036f",
-            "",
-            "\1\u0370",
-            "\1\u0371",
-            "\1\u0372",
-            "\1\u0373",
-            "\1\u0374",
-            "\1\106\13\uffff\12\106\3\uffff\1\u0375\3\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u0378",
-            "\1\u0379",
-            "\1\u037a",
-            "\1\u037b",
-            "\1\u037c",
-            "\1\u037d",
-            "\1\u037e",
-            "\1\u037f",
-            "\1\u0380",
-            "\1\u0381",
-            "\1\u0382",
-            "",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u0384",
-            "\1\u0385",
-            "\1\u0386",
-            "\1\u0387",
-            "",
-            "\1\u0388",
-            "\1\u038a\4\uffff\1\u0389",
-            "",
-            "\1\u038b",
-            "\1\u038c",
-            "\1\u038d",
-            "\1\u038e",
-            "\1\u038f",
-            "\1\u0390",
-            "\1\u0391",
-            "\1\u0392",
-            "\1\u0393",
-            "\1\u0394",
-            "\1\u0395",
-            "\1\u0396",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u039a",
-            "\1\u039b",
-            "",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u039d",
-            "\1\u039e",
-            "\1\u039f",
-            "\1\u03a0",
-            "",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u03a2",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u03a4",
-            "\1\u03a5",
-            "\1\u03a6",
-            "\1\u03a7",
-            "",
-            "",
-            "",
-            "",
-            "\1\u03a8",
-            "\1\u03a9",
-            "\1\u03aa",
-            "\1\u03ab",
-            "\1\u03ac",
-            "\1\u03ad",
-            "\1\u03ae",
-            "\1\u03af",
-            "\1\u03b0",
-            "\1\u03b1",
-            "\1\u03b2",
-            "\1\u03b3",
-            "\1\u03b4",
-            "",
-            "",
-            "\1\u03b5",
-            "\1\u03b6",
-            "\1\u03b7",
-            "\1\u03b8",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "\1\u03b9",
-            "\1\u03ba",
-            "\1\u03bb",
-            "\1\u03bc",
-            "\1\u03bd",
-            "\1\u03be",
-            "\1\u03bf",
-            "\1\u03c0",
-            "\1\u03c1",
-            "\1\u03c2",
-            "\1\u03c3",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u03c6",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u03c8",
-            "",
-            "",
-            "",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u03ca",
-            "\1\u03cb",
-            "\1\u03cc",
-            "\1\u03cd",
-            "\1\u03ce",
-            "\1\u03cf",
-            "\1\u03d0",
-            "\1\u03d1",
-            "\1\u03d2",
-            "\1\u03d3",
-            "",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u03d6",
-            "\1\u03d7",
-            "\1\u03d8",
-            "\1\u03d9",
-            "\1\u03da",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u03dc",
-            "\1\u03dd",
-            "\1\u03de",
-            "\1\u03df",
-            "\1\u03e0",
-            "\1\u03e1",
-            "\1\u03e2",
-            "\1\u03e3",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u03e5",
-            "\1\u03e6",
-            "",
-            "",
-            "",
-            "\1\u03e7",
-            "\1\u03e8",
-            "",
-            "\1\u03e9",
-            "\1\u03ea",
-            "\1\u03eb",
-            "\1\u03ec",
-            "",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u03f0",
-            "\1\u03f1",
-            "\1\u03f2",
-            "\1\u03f3",
-            "\1\u03f4",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u03f6",
-            "\1\u03f7",
-            "\1\u03f8",
-            "\1\u03f9",
-            "\1\u03fa",
-            "\1\u03fb",
-            "\1\u03fc",
-            "\1\u03fd",
-            "\1\u03fe",
-            "\1\u03ff",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u0401",
-            "\1\u0402",
-            "\1\u0403",
-            "",
-            "\1\u0404",
-            "\1\u0405",
-            "\1\u0406",
-            "\1\u0407",
-            "\1\u0408",
-            "\1\u0409",
-            "\1\u040a",
-            "\1\u040b",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "",
-            "",
-            "\1\u040d",
-            "",
-            "\1\u040e",
-            "",
-            "\1\u040f",
-            "\1\u0410",
-            "\1\u0411",
-            "\1\u0412",
-            "\1\u0413",
-            "\1\u0414",
-            "\1\u0415",
-            "\1\u0416",
-            "\1\u0417",
-            "\1\u0418",
-            "",
-            "",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u041a",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u041c",
-            "\1\u041d",
-            "",
-            "\1\u041e",
-            "\1\u041f",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u0421",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u0423",
-            "\1\u0424",
-            "\1\u0425",
-            "",
-            "\1\u0426",
-            "\1\u0427",
-            "\1\u0428",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u042a",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u042c",
-            "\1\u042d",
-            "",
-            "",
-            "",
-            "\1\u042e",
-            "",
-            "\1\u042f",
-            "\1\u0430",
-            "\1\u0431",
-            "",
-            "",
-            "\1\106\13\uffff\12\106\7\uffff\26\106\1\u0432\3\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u0434",
-            "\1\u0435",
-            "\1\u0437\11\uffff\1\u0436",
-            "\1\u0438",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u043a",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u043c",
-            "",
-            "\1\u043d",
-            "\1\u043e",
-            "\1\u043f",
-            "",
-            "\1\u0440",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u0442",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u0444",
-            "\1\u0445",
-            "\1\u0446",
-            "",
-            "\1\u0447",
-            "\1\u0448",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u044c",
-            "\1\u044d",
-            "\1\u044e",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u0450",
-            "\1\u0451",
-            "\1\u0452",
-            "",
-            "\1\u0453",
-            "",
-            "\1\u0454",
-            "\1\u0455",
-            "\1\u0456",
-            "\1\u0457",
-            "",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u045a",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u045c",
-            "\1\u045d",
-            "\1\u045e",
-            "",
-            "\1\u045f",
-            "",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u0461",
-            "\1\u0462",
-            "\1\u0463",
-            "\1\u0464",
-            "\1\u0465",
-            "\1\u0466",
-            "",
-            "\1\u0467",
-            "\1\u0468",
-            "\1\u0469",
-            "\1\u046a",
-            "\1\u046b",
-            "",
-            "\1\u046c",
-            "",
-            "\1\u046d",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u046f",
-            "\1\u0470",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "",
-            "\1\u0472",
-            "",
-            "\1\u0473",
-            "\1\u0474",
-            "\1\u0475",
-            "\1\u0476",
-            "\1\u0477",
-            "",
-            "",
-            "",
-            "\1\u0478",
-            "\1\u0479",
-            "\1\u047a",
-            "",
-            "\1\u047b",
-            "\1\u047c",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u047e",
-            "\1\u047f",
-            "\1\u0480",
-            "\1\u0481",
-            "\1\u0482",
-            "",
-            "",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "",
-            "\1\u0484",
-            "\1\u0485",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u0487",
-            "",
-            "\1\u0488",
-            "\1\u0489",
-            "\1\u048a",
-            "\1\u048b",
-            "\1\u048c",
-            "\1\u048d",
-            "\1\u048e",
-            "\1\u048f",
-            "\1\u0490",
-            "\1\u0491",
-            "\1\u0492",
-            "\1\u0493",
-            "\1\u0494",
-            "",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u0496",
-            "",
-            "\1\u0497",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u0499",
-            "\1\u049a",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u049d",
-            "\1\u049e",
-            "\1\u049f",
-            "\1\u04a0",
-            "\1\u04a1",
-            "",
-            "\1\u04a2",
-            "\1\u04a3",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u04a5",
-            "\1\u04a6",
-            "",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u04a8",
-            "",
-            "\1\u04a9",
-            "\1\u04aa",
-            "\1\u04ab",
-            "\1\u04ac",
-            "\1\u04ad",
-            "\1\u04ae",
-            "\1\u04af",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u04b2",
-            "\1\u04b3",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u04b5",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "",
-            "\1\u04b9",
-            "\1\u04ba",
-            "",
-            "",
-            "\1\u04bb",
-            "\1\u04bc",
-            "\1\u04bd",
-            "\1\u04be",
-            "\1\u04bf",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "",
-            "\1\u04c2",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "",
-            "\1\u04c4",
-            "\1\u04c5",
-            "\1\u04c6",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u04c8",
-            "\1\u04c9",
-            "\1\u04ca",
-            "\1\u04cb",
-            "",
-            "",
-            "\1\u04cc",
-            "\1\u04cd",
-            "",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "",
-            "",
-            "",
-            "\1\u04cf",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u04d1",
-            "\1\u04d2",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u04d4",
-            "\1\u04d5",
-            "",
-            "",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "",
-            "\1\u04d7",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "",
-            "\1\u04da",
-            "\1\u04db",
-            "\1\u04dc",
-            "\1\u04dd",
-            "\1\u04de",
-            "\1\u04df",
-            "",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "",
-            "\1\u04e1",
-            "\1\u04e2",
-            "",
-            "\1\u04e3",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "",
-            "",
-            "\1\u04e6",
-            "\1\u04e7",
-            "\1\u04e8",
-            "\1\u04e9",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u04eb",
-            "",
-            "\1\u04ec",
-            "\1\u04ed",
-            "\1\u04ee",
-            "",
-            "",
-            "\1\u04ef",
-            "\1\u04f0",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u04f2",
-            "",
-            "\1\u04f3",
-            "\1\u04f4",
-            "\1\u04f5",
-            "\1\u04f6",
-            "\1\u04f7",
-            "\1\u04f8",
-            "",
-            "\1\u04f9",
-            "\1\u04fa",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u04fd",
-            "\1\u04fe",
-            "\1\u04ff",
-            "\1\u0500",
-            "\1\u0501",
-            "",
-            "",
-            "\1\u0502",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u0504",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u0506",
-            "\1\u0507",
-            "",
-            "\1\u0508",
-            "",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "\1\u050a",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            "",
-            "\1\u050c",
-            "",
-            "\1\106\13\uffff\12\106\7\uffff\32\106\4\uffff\1\106\1\uffff\32\106",
-            ""
-    };
-
-    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]);
-        }
-    }
-
-    static 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 | T__157 | T__158 | T__159 | T__160 | T__161 | T__162 | T__163 | T__164 | T__165 | T__166 | T__167 | T__168 | T__169 | T__170 | T__171 | T__172 | T__173 | T__174 | T__175 | T__176 | T__177 | T__178 | T__179 | T__180 | T__181 | T__182 | T__183 | T__184 | T__185 | T__186 | T__187 | T__188 | T__189 | T__190 | T__191 | T__192 | T__193 | T__194 | T__195 | T__196 | T__197 | T__198 | T__199 | T__200 | T__201 | T__202 | T__203 | T__204 | T__205 | T__206 | T__207 | T__208 | T__209 | T__210 | T__211 | T__212 | T__213 | T__214 | T__215 | T__216 | T__217 | T__218 | T__219 | T__220 | T__221 | T__222 | T__223 | T__224 | T__225 | T__226 | T__227 | T__228 | T__229 | T__230 | T__231 | T__232 | T__233 | T__234 | T__235 | T__236 | 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=='.') ) {s = 4;}
-
-                        else if ( (LA21_0=='d') ) {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=='e') ) {s = 16;}
-
-                        else if ( (LA21_0=='s') ) {s = 17;}
-
-                        else if ( (LA21_0=='i') ) {s = 18;}
-
-                        else if ( (LA21_0=='f') ) {s = 19;}
-
-                        else if ( (LA21_0=='t') ) {s = 20;}
-
-                        else if ( (LA21_0=='u') ) {s = 21;}
-
-                        else if ( (LA21_0=='m') ) {s = 22;}
-
-                        else if ( (LA21_0=='h') ) {s = 23;}
-
-                        else if ( (LA21_0=='y') ) {s = 24;}
-
-                        else if ( (LA21_0=='n') ) {s = 25;}
-
-                        else if ( (LA21_0=='b') ) {s = 26;}
-
-                        else if ( (LA21_0=='p') ) {s = 27;}
-
-                        else if ( (LA21_0==';') ) {s = 28;}
-
-                        else if ( (LA21_0=='a') ) {s = 29;}
-
-                        else if ( (LA21_0=='{') ) {s = 30;}
-
-                        else if ( (LA21_0=='}') ) {s = 31;}
-
-                        else if ( (LA21_0==':') ) {s = 32;}
-
-                        else if ( (LA21_0=='[') ) {s = 33;}
-
-                        else if ( (LA21_0==']') ) {s = 34;}
-
-                        else if ( (LA21_0=='o') ) {s = 35;}
-
-                        else if ( (LA21_0=='r') ) {s = 36;}
-
-                        else if ( (LA21_0=='(') ) {s = 37;}
-
-                        else if ( (LA21_0==')') ) {s = 38;}
-
-                        else if ( (LA21_0=='c') ) {s = 39;}
-
-                        else if ( (LA21_0=='g') ) {s = 40;}
-
-                        else if ( (LA21_0==',') ) {s = 41;}
-
-                        else if ( (LA21_0=='l') ) {s = 42;}
-
-                        else if ( (LA21_0=='M') ) {s = 43;}
-
-                        else if ( (LA21_0=='R') ) {s = 44;}
-
-                        else if ( (LA21_0=='E') ) {s = 45;}
-
-                        else if ( (LA21_0=='B') ) {s = 46;}
-
-                        else if ( (LA21_0=='#') ) {s = 47;}
-
-                        else if ( (LA21_0=='w') ) {s = 48;}
-
-                        else if ( (LA21_0=='0') ) {s = 49;}
-
-                        else if ( ((LA21_0>='1' && LA21_0<='9')) ) {s = 50;}
-
-                        else if ( (LA21_0=='^') ) {s = 51;}
-
-                        else if ( (LA21_0=='$'||LA21_0=='A'||(LA21_0>='C' && LA21_0<='D')||(LA21_0>='F' && LA21_0<='L')||(LA21_0>='N' && LA21_0<='Q')||(LA21_0>='S' && LA21_0<='Z')||LA21_0=='_'||(LA21_0>='j' && LA21_0<='k')||LA21_0=='q'||LA21_0=='x'||LA21_0=='z') ) {s = 52;}
-
-                        else if ( (LA21_0=='\"') ) {s = 53;}
-
-                        else if ( (LA21_0=='\'') ) {s = 54;}
-
-                        else if ( ((LA21_0>='\t' && LA21_0<='\n')||LA21_0=='\r'||LA21_0==' ') ) {s = 55;}
-
-                        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>='~' && LA21_0<='\uFFFF')) ) {s = 56;}
-
-                        if ( s>=0 ) return s;
-                        break;
-            }
-            NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 21, _s, input);
-            error(nvae);
-            throw nvae;
-        }
-    }
- 
-
-}
diff --git a/org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammarParser.java b/org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammarParser.java
deleted file mode 100644
index 8cf1cd0..0000000
--- a/org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammarParser.java
+++ /dev/null
@@ -1,10012 +0,0 @@
-/**
- * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf), Loetz GmbH&Co.KG (Heidelberg)
- * 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:
- *         Florian Pirchner - Initial implementation
- */
-
-package org.eclipse.osbp.ecview.dsl.ui.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.ui.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
-import org.eclipse.xtext.ui.editor.contentassist.antlr.internal.DFA;
-import org.eclipse.osbp.ecview.dsl.services.UIGrammarGrammarAccess;
-
-
-
-import org.antlr.runtime.*;
-import java.util.Stack;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Map;
-import java.util.HashMap;
-@SuppressWarnings("all")
-public class InternalUIGrammarParser 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", "'='", "'||'", "'&&'", "'.'", "'desc'", "'+='", "'-='", "'*='", "'/='", "'%='", "'=='", "'!='", "'==='", "'!=='", "'>='", "'>'", "'<'", "'->'", "'..<'", "'..'", "'=>'", "'<>'", "'?:'", "'+'", "'-'", "'*'", "'**'", "'/'", "'%'", "'!'", "'++'", "'--'", "'val'", "'extends'", "'static'", "'import'", "'extension'", "'super'", "'false'", "'date'", "'datetime'", "'time'", "'undefined'", "'second'", "'minute'", "'hour'", "'day'", "'month'", "'year'", "'single'", "'multi'", "'none'", "'bottom-center'", "'bottom-left'", "'bottom-right'", "'bottom-fill'", "'middle-center'", "'middle-left'", "'middle-right'", "'middle-fill'", "'top-center'", "'top-left'", "'top-right'", "'top-fill'", "'fill-center'", "'fill-left'", "'fill-right'", "'fill-fill'", "'package'", "';'", "'validatorAlias'", "'as'", "'fieldValidation'", "'viewset'", "'{'", "'}'", "'dataAlias'", "'datasource'", "':'", "'eventTopic'", "'bind'", "'['", "']'", "'ui'", "'navigateTo'", "'openDialog'", "'searchWith'", "'addToTable'", "'removeFromTable'", "'newInstance'", "'for'", "'at'", "'sendEvent'", "'('", "')'", "'ideview'", "'sharedStateGroup'", "'category'", "'rootType'", "'exposedActions'", "'align'", "'id'", "'icon'", "'externalCommand'", "'mobile'", "'i18n'", "'gridlayout'", "'columns='", "'styles'", "'form'", "'verticalLayout'", "'mobileVerticalLayout'", "'navRoot'", "'horizontalLayout'", "'mobileHorizontalLayout'", "'horizontalButtonGroup'", "'verticalGroup'", "'searchPanel'", "'type'", "'mobileSearchPanel'", "'mobileTab'", "'tab'", "'tabsheet'", "'splitter'", "'first'", "'splitPos'", "'panel'", "'content'", "'dialog'", "'searchdialog'", "'search'", "'navPage'", "'navbarActions'", "'textfield'", "'maxLength='", "'minLength='", "'regex='", "'passwordField'", "'maskedText'", "'mask='", "'maskedNumeric'", "'maskedDecimal'", "'maskedTextWithPrefix'", "'prefixes='", "','", "'prefix'", "'mask'", "'richtextArea'", "'suggestText'", "'captionField'", "'filterField'", "'uuidField'", "'referenceField'", "'refSource'", "'descriptionField'", "'imageField'", "'inMemoryService'", "'searchfield'", "'textarea'", "'datefield'", "'browser'", "'progressbar'", "'image'", "'iconPath'", "'table'", "'selectionType'", "'combo'", "'button'", "'navButton'", "'alias'", "'switchIt'", "'label'", "'decimalField'", "'precision='", "'optionsgroup'", "'listSelect'", "'columns'", "'sort'", "'column'", "'numericField'", "'checkbox'", "'MaxLengthValidator'", "'MinLengthValidator'", "'RegexValidator'", "'Expression'", "'BeanValidationValidator'", "'code'", "'visibility'", "'fireOn'", "'instanceof'", "'#'", "'if'", "'else'", "'switch'", "'default'", "'case'", "'while'", "'do'", "'new'", "'null'", "'typeof'", "'throw'", "'return'", "'try'", "'finally'", "'synchronized'", "'catch'", "'?'", "'&'", "'list'", "'noAutoTrigger'", "'checkDirty'", "'readonly'", "'asBlob'", "'autoHidePopup'", "'useBeanService'", "'noGrouping'", "'noMarkNegative'", "'asc'", "'::'", "'?.'", "'|'", "'var'", "'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 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 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__166=166;
-    public static final int T__165=165;
-    public static final int T__168=168;
-    public static final int T__167=167;
-    public static final int T__162=162;
-    public static final int T__161=161;
-    public static final int T__164=164;
-    public static final int T__163=163;
-    public static final int T__160=160;
-    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__159=159;
-    public static final int T__30=30;
-    public static final int T__158=158;
-    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__157=157;
-    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__100=100;
-    public static final int T__221=221;
-    public static final int T__220=220;
-    public static final int T__102=102;
-    public static final int T__223=223;
-    public static final int T__101=101;
-    public static final int T__222=222;
-    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__218=218;
-    public static final int T__217=217;
-    public static final int T__13=13;
-    public static final int T__14=14;
-    public static final int T__219=219;
-    public static final int T__214=214;
-    public static final int T__213=213;
-    public static final int T__216=216;
-    public static final int T__215=215;
-    public static final int T__210=210;
-    public static final int T__212=212;
-    public static final int T__211=211;
-    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__207=207;
-    public static final int T__23=23;
-    public static final int T__206=206;
-    public static final int T__24=24;
-    public static final int T__209=209;
-    public static final int T__25=25;
-    public static final int T__208=208;
-    public static final int T__203=203;
-    public static final int T__202=202;
-    public static final int T__20=20;
-    public static final int T__205=205;
-    public static final int T__21=21;
-    public static final int T__204=204;
-    public static final int T__122=122;
-    public static final int T__121=121;
-    public static final int T__124=124;
-    public static final int T__123=123;
-    public static final int T__120=120;
-    public static final int RULE_SL_COMMENT=10;
-    public static final int T__119=119;
-    public static final int T__118=118;
-    public static final int T__115=115;
-    public static final int T__236=236;
-    public static final int EOF=-1;
-    public static final int T__114=114;
-    public static final int T__235=235;
-    public static final int T__117=117;
-    public static final int T__116=116;
-    public static final int T__111=111;
-    public static final int T__232=232;
-    public static final int T__110=110;
-    public static final int T__231=231;
-    public static final int T__113=113;
-    public static final int T__234=234;
-    public static final int T__112=112;
-    public static final int T__233=233;
-    public static final int T__230=230;
-    public static final int T__108=108;
-    public static final int T__229=229;
-    public static final int T__107=107;
-    public static final int T__228=228;
-    public static final int T__109=109;
-    public static final int T__104=104;
-    public static final int T__225=225;
-    public static final int T__103=103;
-    public static final int T__224=224;
-    public static final int T__106=106;
-    public static final int T__227=227;
-    public static final int T__105=105;
-    public static final int T__226=226;
-    public static final int RULE_HEX=5;
-    public static final int RULE_ML_COMMENT=9;
-    public static final int T__201=201;
-    public static final int T__200=200;
-    public static final int T__91=91;
-    public static final int T__188=188;
-    public static final int T__92=92;
-    public static final int T__187=187;
-    public static final int T__93=93;
-    public static final int T__94=94;
-    public static final int T__189=189;
-    public static final int T__184=184;
-    public static final int T__183=183;
-    public static final int T__186=186;
-    public static final int T__90=90;
-    public static final int T__185=185;
-    public static final int T__180=180;
-    public static final int T__182=182;
-    public static final int T__181=181;
-    public static final int T__99=99;
-    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 T__177=177;
-    public static final int T__176=176;
-    public static final int T__179=179;
-    public static final int T__178=178;
-    public static final int T__173=173;
-    public static final int T__172=172;
-    public static final int T__175=175;
-    public static final int T__174=174;
-    public static final int T__171=171;
-    public static final int T__170=170;
-    public static final int T__169=169;
-    public static final int T__70=70;
-    public static final int T__71=71;
-    public static final int T__72=72;
-    public static final int RULE_STRING=8;
-    public static final int T__77=77;
-    public static final int T__78=78;
-    public static final int T__79=79;
-    public static final int T__73=73;
-    public static final int T__74=74;
-    public static final int T__75=75;
-    public static final int T__76=76;
-    public static final int T__80=80;
-    public static final int T__199=199;
-    public static final int T__81=81;
-    public static final int T__198=198;
-    public static final int T__82=82;
-    public static final int T__83=83;
-    public static final int T__195=195;
-    public static final int T__194=194;
-    public static final int RULE_WS=11;
-    public static final int T__197=197;
-    public static final int T__196=196;
-    public static final int T__191=191;
-    public static final int T__190=190;
-    public static final int T__193=193;
-    public static final int T__192=192;
-    public static final int RULE_ANY_OTHER=12;
-    public static final int T__88=88;
-    public static final int T__89=89;
-    public static final int T__84=84;
-    public static final int T__85=85;
-    public static final int T__86=86;
-    public static final int T__87=87;
-
-    // delegates
-    // delegators
-
-
-        public InternalUIGrammarParser(TokenStream input) {
-            this(input, new RecognizerSharedState());
-        }
-        public InternalUIGrammarParser(TokenStream input, RecognizerSharedState state) {
-            super(input, state);
-             
-        }
-        
-
-    public String[] getTokenNames() { return InternalUIGrammarParser.tokenNames; }
-    public String getGrammarFileName() { return "../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g"; }
-
-
-     
-     	private UIGrammarGrammarAccess grammarAccess;
-     	
-        public void setGrammarAccess(UIGrammarGrammarAccess grammarAccess) {
-        	this.grammarAccess = grammarAccess;
-        }
-        
-        @Override
-        protected Grammar getGrammar() {
-        	return grammarAccess.getGrammar();
-        }
-        
-        @Override
-        protected String getValueForTokenName(String tokenName) {
-        	return tokenName;
-        }
-
-
-
-
-    // $ANTLR start "entryRuleUiModel"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:61:1: entryRuleUiModel : ruleUiModel EOF ;
-    public final void entryRuleUiModel() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:62:1: ( ruleUiModel EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:63:1: ruleUiModel EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiModelRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiModel_in_entryRuleUiModel67);
-            ruleUiModel();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiModelRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiModel74); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiModel"
-
-
-    // $ANTLR start "ruleUiModel"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:70:1: ruleUiModel : ( ( rule__UiModel__Group__0 ) ) ;
-    public final void ruleUiModel() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:74:2: ( ( ( rule__UiModel__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:75:1: ( ( rule__UiModel__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:75:1: ( ( rule__UiModel__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:76:1: ( rule__UiModel__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiModelAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:77:1: ( rule__UiModel__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:77:2: rule__UiModel__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiModel__Group__0_in_ruleUiModel100);
-            rule__UiModel__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiModelAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiModel"
-
-
-    // $ANTLR start "entryRuleUiImports"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:89:1: entryRuleUiImports : ruleUiImports EOF ;
-    public final void entryRuleUiImports() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:90:1: ( ruleUiImports EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:91:1: ruleUiImports EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiImportsRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiImports_in_entryRuleUiImports127);
-            ruleUiImports();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiImportsRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiImports134); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiImports"
-
-
-    // $ANTLR start "ruleUiImports"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:98:1: ruleUiImports : ( ( rule__UiImports__Group__0 ) ) ;
-    public final void ruleUiImports() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:102:2: ( ( ( rule__UiImports__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:103:1: ( ( rule__UiImports__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:103:1: ( ( rule__UiImports__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:104:1: ( rule__UiImports__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiImportsAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:105:1: ( rule__UiImports__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:105:2: rule__UiImports__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiImports__Group__0_in_ruleUiImports160);
-            rule__UiImports__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiImportsAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiImports"
-
-
-    // $ANTLR start "entryRuleUiRootElements"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:117:1: entryRuleUiRootElements : ruleUiRootElements EOF ;
-    public final void entryRuleUiRootElements() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:118:1: ( ruleUiRootElements EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:119:1: ruleUiRootElements EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiRootElementsRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiRootElements_in_entryRuleUiRootElements187);
-            ruleUiRootElements();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiRootElementsRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiRootElements194); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiRootElements"
-
-
-    // $ANTLR start "ruleUiRootElements"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:126:1: ruleUiRootElements : ( ( rule__UiRootElements__Alternatives ) ) ;
-    public final void ruleUiRootElements() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:130:2: ( ( ( rule__UiRootElements__Alternatives ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:131:1: ( ( rule__UiRootElements__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:131:1: ( ( rule__UiRootElements__Alternatives ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:132:1: ( rule__UiRootElements__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiRootElementsAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:133:1: ( rule__UiRootElements__Alternatives )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:133:2: rule__UiRootElements__Alternatives
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiRootElements__Alternatives_in_ruleUiRootElements220);
-            rule__UiRootElements__Alternatives();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiRootElementsAccess().getAlternatives()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiRootElements"
-
-
-    // $ANTLR start "entryRuleUiValidatorAlias"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:145:1: entryRuleUiValidatorAlias : ruleUiValidatorAlias EOF ;
-    public final void entryRuleUiValidatorAlias() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:146:1: ( ruleUiValidatorAlias EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:147:1: ruleUiValidatorAlias EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiValidatorAliasRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiValidatorAlias_in_entryRuleUiValidatorAlias247);
-            ruleUiValidatorAlias();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiValidatorAliasRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiValidatorAlias254); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiValidatorAlias"
-
-
-    // $ANTLR start "ruleUiValidatorAlias"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:154:1: ruleUiValidatorAlias : ( ( rule__UiValidatorAlias__Group__0 ) ) ;
-    public final void ruleUiValidatorAlias() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:158:2: ( ( ( rule__UiValidatorAlias__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:159:1: ( ( rule__UiValidatorAlias__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:159:1: ( ( rule__UiValidatorAlias__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:160:1: ( rule__UiValidatorAlias__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiValidatorAliasAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:161:1: ( rule__UiValidatorAlias__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:161:2: rule__UiValidatorAlias__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiValidatorAlias__Group__0_in_ruleUiValidatorAlias280);
-            rule__UiValidatorAlias__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiValidatorAliasAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiValidatorAlias"
-
-
-    // $ANTLR start "entryRuleUiValidatorAssignment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:173:1: entryRuleUiValidatorAssignment : ruleUiValidatorAssignment EOF ;
-    public final void entryRuleUiValidatorAssignment() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:174:1: ( ruleUiValidatorAssignment EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:175:1: ruleUiValidatorAssignment EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiValidatorAssignmentRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiValidatorAssignment_in_entryRuleUiValidatorAssignment307);
-            ruleUiValidatorAssignment();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiValidatorAssignmentRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiValidatorAssignment314); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiValidatorAssignment"
-
-
-    // $ANTLR start "ruleUiValidatorAssignment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:182:1: ruleUiValidatorAssignment : ( ( rule__UiValidatorAssignment__Group__0 ) ) ;
-    public final void ruleUiValidatorAssignment() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:186:2: ( ( ( rule__UiValidatorAssignment__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:187:1: ( ( rule__UiValidatorAssignment__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:187:1: ( ( rule__UiValidatorAssignment__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:188:1: ( rule__UiValidatorAssignment__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiValidatorAssignmentAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:189:1: ( rule__UiValidatorAssignment__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:189:2: rule__UiValidatorAssignment__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiValidatorAssignment__Group__0_in_ruleUiValidatorAssignment340);
-            rule__UiValidatorAssignment__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiValidatorAssignmentAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiValidatorAssignment"
-
-
-    // $ANTLR start "entryRuleUiValidatorDef"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:201:1: entryRuleUiValidatorDef : ruleUiValidatorDef EOF ;
-    public final void entryRuleUiValidatorDef() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:202:1: ( ruleUiValidatorDef EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:203:1: ruleUiValidatorDef EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiValidatorDefRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiValidatorDef_in_entryRuleUiValidatorDef367);
-            ruleUiValidatorDef();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiValidatorDefRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiValidatorDef374); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiValidatorDef"
-
-
-    // $ANTLR start "ruleUiValidatorDef"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:210:1: ruleUiValidatorDef : ( ( rule__UiValidatorDef__ValidatorAssignment ) ) ;
-    public final void ruleUiValidatorDef() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:214:2: ( ( ( rule__UiValidatorDef__ValidatorAssignment ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:215:1: ( ( rule__UiValidatorDef__ValidatorAssignment ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:215:1: ( ( rule__UiValidatorDef__ValidatorAssignment ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:216:1: ( rule__UiValidatorDef__ValidatorAssignment )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiValidatorDefAccess().getValidatorAssignment()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:217:1: ( rule__UiValidatorDef__ValidatorAssignment )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:217:2: rule__UiValidatorDef__ValidatorAssignment
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiValidatorDef__ValidatorAssignment_in_ruleUiValidatorDef400);
-            rule__UiValidatorDef__ValidatorAssignment();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiValidatorDefAccess().getValidatorAssignment()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiValidatorDef"
-
-
-    // $ANTLR start "entryRuleUiViewSet"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:229:1: entryRuleUiViewSet : ruleUiViewSet EOF ;
-    public final void entryRuleUiViewSet() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:230:1: ( ruleUiViewSet EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:231:1: ruleUiViewSet EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiViewSetRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiViewSet_in_entryRuleUiViewSet427);
-            ruleUiViewSet();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiViewSetRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiViewSet434); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiViewSet"
-
-
-    // $ANTLR start "ruleUiViewSet"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:238:1: ruleUiViewSet : ( ( rule__UiViewSet__Group__0 ) ) ;
-    public final void ruleUiViewSet() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:242:2: ( ( ( rule__UiViewSet__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:243:1: ( ( rule__UiViewSet__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:243:1: ( ( rule__UiViewSet__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:244:1: ( rule__UiViewSet__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiViewSetAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:245:1: ( rule__UiViewSet__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:245:2: rule__UiViewSet__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiViewSet__Group__0_in_ruleUiViewSet460);
-            rule__UiViewSet__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiViewSetAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiViewSet"
-
-
-    // $ANTLR start "entryRuleUiBindingEndpointAlias"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:257:1: entryRuleUiBindingEndpointAlias : ruleUiBindingEndpointAlias EOF ;
-    public final void entryRuleUiBindingEndpointAlias() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:258:1: ( ruleUiBindingEndpointAlias EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:259:1: ruleUiBindingEndpointAlias EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiBindingEndpointAliasRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiBindingEndpointAlias_in_entryRuleUiBindingEndpointAlias487);
-            ruleUiBindingEndpointAlias();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiBindingEndpointAliasRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiBindingEndpointAlias494); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiBindingEndpointAlias"
-
-
-    // $ANTLR start "ruleUiBindingEndpointAlias"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:266:1: ruleUiBindingEndpointAlias : ( ( rule__UiBindingEndpointAlias__Group__0 ) ) ;
-    public final void ruleUiBindingEndpointAlias() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:270:2: ( ( ( rule__UiBindingEndpointAlias__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:271:1: ( ( rule__UiBindingEndpointAlias__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:271:1: ( ( rule__UiBindingEndpointAlias__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:272:1: ( rule__UiBindingEndpointAlias__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiBindingEndpointAliasAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:273:1: ( rule__UiBindingEndpointAlias__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:273:2: rule__UiBindingEndpointAlias__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiBindingEndpointAlias__Group__0_in_ruleUiBindingEndpointAlias520);
-            rule__UiBindingEndpointAlias__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiBindingEndpointAliasAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiBindingEndpointAlias"
-
-
-    // $ANTLR start "entryRuleUiBeanSlot"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:285:1: entryRuleUiBeanSlot : ruleUiBeanSlot EOF ;
-    public final void entryRuleUiBeanSlot() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:286:1: ( ruleUiBeanSlot EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:287:1: ruleUiBeanSlot EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiBeanSlotRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiBeanSlot_in_entryRuleUiBeanSlot547);
-            ruleUiBeanSlot();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiBeanSlotRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiBeanSlot554); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiBeanSlot"
-
-
-    // $ANTLR start "ruleUiBeanSlot"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:294:1: ruleUiBeanSlot : ( ( rule__UiBeanSlot__Group__0 ) ) ;
-    public final void ruleUiBeanSlot() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:298:2: ( ( ( rule__UiBeanSlot__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:299:1: ( ( rule__UiBeanSlot__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:299:1: ( ( rule__UiBeanSlot__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:300:1: ( rule__UiBeanSlot__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiBeanSlotAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:301:1: ( rule__UiBeanSlot__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:301:2: rule__UiBeanSlot__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiBeanSlot__Group__0_in_ruleUiBeanSlot580);
-            rule__UiBeanSlot__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiBeanSlotAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiBeanSlot"
-
-
-    // $ANTLR start "entryRuleUiBinding"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:313:1: entryRuleUiBinding : ruleUiBinding EOF ;
-    public final void entryRuleUiBinding() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:314:1: ( ruleUiBinding EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:315:1: ruleUiBinding EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiBindingRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiBinding_in_entryRuleUiBinding607);
-            ruleUiBinding();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiBindingRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiBinding614); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiBinding"
-
-
-    // $ANTLR start "ruleUiBinding"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:322:1: ruleUiBinding : ( ( rule__UiBinding__Group__0 ) ) ;
-    public final void ruleUiBinding() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:326:2: ( ( ( rule__UiBinding__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:327:1: ( ( rule__UiBinding__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:327:1: ( ( rule__UiBinding__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:328:1: ( rule__UiBinding__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiBindingAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:329:1: ( rule__UiBinding__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:329:2: rule__UiBinding__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiBinding__Group__0_in_ruleUiBinding640);
-            rule__UiBinding__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiBindingAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiBinding"
-
-
-    // $ANTLR start "entryRuleUiBindingEndpointAssignment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:341:1: entryRuleUiBindingEndpointAssignment : ruleUiBindingEndpointAssignment EOF ;
-    public final void entryRuleUiBindingEndpointAssignment() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:342:1: ( ruleUiBindingEndpointAssignment EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:343:1: ruleUiBindingEndpointAssignment EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiBindingEndpointAssignmentRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiBindingEndpointAssignment_in_entryRuleUiBindingEndpointAssignment667);
-            ruleUiBindingEndpointAssignment();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiBindingEndpointAssignmentRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiBindingEndpointAssignment674); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiBindingEndpointAssignment"
-
-
-    // $ANTLR start "ruleUiBindingEndpointAssignment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:350:1: ruleUiBindingEndpointAssignment : ( ( rule__UiBindingEndpointAssignment__Alternatives ) ) ;
-    public final void ruleUiBindingEndpointAssignment() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:354:2: ( ( ( rule__UiBindingEndpointAssignment__Alternatives ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:355:1: ( ( rule__UiBindingEndpointAssignment__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:355:1: ( ( rule__UiBindingEndpointAssignment__Alternatives ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:356:1: ( rule__UiBindingEndpointAssignment__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiBindingEndpointAssignmentAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:357:1: ( rule__UiBindingEndpointAssignment__Alternatives )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:357:2: rule__UiBindingEndpointAssignment__Alternatives
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiBindingEndpointAssignment__Alternatives_in_ruleUiBindingEndpointAssignment700);
-            rule__UiBindingEndpointAssignment__Alternatives();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiBindingEndpointAssignmentAccess().getAlternatives()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiBindingEndpointAssignment"
-
-
-    // $ANTLR start "entryRuleUiPathSegment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:369:1: entryRuleUiPathSegment : ruleUiPathSegment EOF ;
-    public final void entryRuleUiPathSegment() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:370:1: ( ruleUiPathSegment EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:371:1: ruleUiPathSegment EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiPathSegmentRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiPathSegment_in_entryRuleUiPathSegment727);
-            ruleUiPathSegment();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiPathSegmentRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiPathSegment734); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiPathSegment"
-
-
-    // $ANTLR start "ruleUiPathSegment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:378:1: ruleUiPathSegment : ( ( rule__UiPathSegment__Group__0 ) ) ;
-    public final void ruleUiPathSegment() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:382:2: ( ( ( rule__UiPathSegment__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:383:1: ( ( rule__UiPathSegment__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:383:1: ( ( rule__UiPathSegment__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:384:1: ( rule__UiPathSegment__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiPathSegmentAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:385:1: ( rule__UiPathSegment__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:385:2: rule__UiPathSegment__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiPathSegment__Group__0_in_ruleUiPathSegment760);
-            rule__UiPathSegment__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiPathSegmentAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiPathSegment"
-
-
-    // $ANTLR start "entryRuleUiNestedProperty"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:397:1: entryRuleUiNestedProperty : ruleUiNestedProperty EOF ;
-    public final void entryRuleUiNestedProperty() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:398:1: ( ruleUiNestedProperty EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:399:1: ruleUiNestedProperty EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiNestedPropertyRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiNestedProperty_in_entryRuleUiNestedProperty787);
-            ruleUiNestedProperty();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiNestedPropertyRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiNestedProperty794); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiNestedProperty"
-
-
-    // $ANTLR start "ruleUiNestedProperty"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:406:1: ruleUiNestedProperty : ( ( rule__UiNestedProperty__Group__0 ) ) ;
-    public final void ruleUiNestedProperty() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:410:2: ( ( ( rule__UiNestedProperty__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:411:1: ( ( rule__UiNestedProperty__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:411:1: ( ( rule__UiNestedProperty__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:412:1: ( rule__UiNestedProperty__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiNestedPropertyAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:413:1: ( rule__UiNestedProperty__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:413:2: rule__UiNestedProperty__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiNestedProperty__Group__0_in_ruleUiNestedProperty820);
-            rule__UiNestedProperty__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiNestedPropertyAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiNestedProperty"
-
-
-    // $ANTLR start "entryRuleUiTypedBindableDef"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:425:1: entryRuleUiTypedBindableDef : ruleUiTypedBindableDef EOF ;
-    public final void entryRuleUiTypedBindableDef() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:426:1: ( ruleUiTypedBindableDef EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:427:1: ruleUiTypedBindableDef EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiTypedBindableDefRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiTypedBindableDef_in_entryRuleUiTypedBindableDef847);
-            ruleUiTypedBindableDef();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiTypedBindableDefRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiTypedBindableDef854); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiTypedBindableDef"
-
-
-    // $ANTLR start "ruleUiTypedBindableDef"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:434:1: ruleUiTypedBindableDef : ( ( rule__UiTypedBindableDef__Group__0 ) ) ;
-    public final void ruleUiTypedBindableDef() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:438:2: ( ( ( rule__UiTypedBindableDef__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:439:1: ( ( rule__UiTypedBindableDef__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:439:1: ( ( rule__UiTypedBindableDef__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:440:1: ( rule__UiTypedBindableDef__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiTypedBindableDefAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:441:1: ( rule__UiTypedBindableDef__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:441:2: rule__UiTypedBindableDef__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiTypedBindableDef__Group__0_in_ruleUiTypedBindableDef880);
-            rule__UiTypedBindableDef__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiTypedBindableDefAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiTypedBindableDef"
-
-
-    // $ANTLR start "entryRuleUiTypedBindableRawType"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:453:1: entryRuleUiTypedBindableRawType : ruleUiTypedBindableRawType EOF ;
-    public final void entryRuleUiTypedBindableRawType() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:454:1: ( ruleUiTypedBindableRawType EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:455:1: ruleUiTypedBindableRawType EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiTypedBindableRawTypeRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiTypedBindableRawType_in_entryRuleUiTypedBindableRawType907);
-            ruleUiTypedBindableRawType();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiTypedBindableRawTypeRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiTypedBindableRawType914); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiTypedBindableRawType"
-
-
-    // $ANTLR start "ruleUiTypedBindableRawType"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:462:1: ruleUiTypedBindableRawType : ( ( rule__UiTypedBindableRawType__Group__0 ) ) ;
-    public final void ruleUiTypedBindableRawType() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:466:2: ( ( ( rule__UiTypedBindableRawType__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:467:1: ( ( rule__UiTypedBindableRawType__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:467:1: ( ( rule__UiTypedBindableRawType__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:468:1: ( rule__UiTypedBindableRawType__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiTypedBindableRawTypeAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:469:1: ( rule__UiTypedBindableRawType__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:469:2: rule__UiTypedBindableRawType__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiTypedBindableRawType__Group__0_in_ruleUiTypedBindableRawType940);
-            rule__UiTypedBindableRawType__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiTypedBindableRawTypeAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiTypedBindableRawType"
-
-
-    // $ANTLR start "entryRuleUiTypedBindableRawTypeAlias"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:481:1: entryRuleUiTypedBindableRawTypeAlias : ruleUiTypedBindableRawTypeAlias EOF ;
-    public final void entryRuleUiTypedBindableRawTypeAlias() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:482:1: ( ruleUiTypedBindableRawTypeAlias EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:483:1: ruleUiTypedBindableRawTypeAlias EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiTypedBindableRawTypeAliasRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiTypedBindableRawTypeAlias_in_entryRuleUiTypedBindableRawTypeAlias967);
-            ruleUiTypedBindableRawTypeAlias();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiTypedBindableRawTypeAliasRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiTypedBindableRawTypeAlias974); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiTypedBindableRawTypeAlias"
-
-
-    // $ANTLR start "ruleUiTypedBindableRawTypeAlias"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:490:1: ruleUiTypedBindableRawTypeAlias : ( ( rule__UiTypedBindableRawTypeAlias__Group__0 ) ) ;
-    public final void ruleUiTypedBindableRawTypeAlias() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:494:2: ( ( ( rule__UiTypedBindableRawTypeAlias__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:495:1: ( ( rule__UiTypedBindableRawTypeAlias__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:495:1: ( ( rule__UiTypedBindableRawTypeAlias__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:496:1: ( rule__UiTypedBindableRawTypeAlias__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiTypedBindableRawTypeAliasAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:497:1: ( rule__UiTypedBindableRawTypeAlias__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:497:2: rule__UiTypedBindableRawTypeAlias__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiTypedBindableRawTypeAlias__Group__0_in_ruleUiTypedBindableRawTypeAlias1000);
-            rule__UiTypedBindableRawTypeAlias__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiTypedBindableRawTypeAliasAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiTypedBindableRawTypeAlias"
-
-
-    // $ANTLR start "entryRuleUiRawBindablePathSegment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:509:1: entryRuleUiRawBindablePathSegment : ruleUiRawBindablePathSegment EOF ;
-    public final void entryRuleUiRawBindablePathSegment() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:510:1: ( ruleUiRawBindablePathSegment EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:511:1: ruleUiRawBindablePathSegment EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiRawBindablePathSegmentRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiRawBindablePathSegment_in_entryRuleUiRawBindablePathSegment1027);
-            ruleUiRawBindablePathSegment();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiRawBindablePathSegmentRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiRawBindablePathSegment1034); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiRawBindablePathSegment"
-
-
-    // $ANTLR start "ruleUiRawBindablePathSegment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:518:1: ruleUiRawBindablePathSegment : ( ( rule__UiRawBindablePathSegment__Group__0 ) ) ;
-    public final void ruleUiRawBindablePathSegment() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:522:2: ( ( ( rule__UiRawBindablePathSegment__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:523:1: ( ( rule__UiRawBindablePathSegment__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:523:1: ( ( rule__UiRawBindablePathSegment__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:524:1: ( rule__UiRawBindablePathSegment__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiRawBindablePathSegmentAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:525:1: ( rule__UiRawBindablePathSegment__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:525:2: rule__UiRawBindablePathSegment__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiRawBindablePathSegment__Group__0_in_ruleUiRawBindablePathSegment1060);
-            rule__UiRawBindablePathSegment__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiRawBindablePathSegmentAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiRawBindablePathSegment"
-
-
-    // $ANTLR start "entryRuleUiCommandBindableDef"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:537:1: entryRuleUiCommandBindableDef : ruleUiCommandBindableDef EOF ;
-    public final void entryRuleUiCommandBindableDef() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:538:1: ( ruleUiCommandBindableDef EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:539:1: ruleUiCommandBindableDef EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiCommandBindableDefRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiCommandBindableDef_in_entryRuleUiCommandBindableDef1087);
-            ruleUiCommandBindableDef();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiCommandBindableDefRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiCommandBindableDef1094); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiCommandBindableDef"
-
-
-    // $ANTLR start "ruleUiCommandBindableDef"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:546:1: ruleUiCommandBindableDef : ( ( rule__UiCommandBindableDef__Group__0 ) ) ;
-    public final void ruleUiCommandBindableDef() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:550:2: ( ( ( rule__UiCommandBindableDef__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:551:1: ( ( rule__UiCommandBindableDef__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:551:1: ( ( rule__UiCommandBindableDef__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:552:1: ( rule__UiCommandBindableDef__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiCommandBindableDefAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:553:1: ( rule__UiCommandBindableDef__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:553:2: rule__UiCommandBindableDef__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiCommandBindableDef__Group__0_in_ruleUiCommandBindableDef1120);
-            rule__UiCommandBindableDef__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiCommandBindableDefAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiCommandBindableDef"
-
-
-    // $ANTLR start "entryRuleUiCommand"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:565:1: entryRuleUiCommand : ruleUiCommand EOF ;
-    public final void entryRuleUiCommand() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:566:1: ( ruleUiCommand EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:567:1: ruleUiCommand EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiCommandRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiCommand_in_entryRuleUiCommand1147);
-            ruleUiCommand();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiCommandRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiCommand1154); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiCommand"
-
-
-    // $ANTLR start "ruleUiCommand"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:574:1: ruleUiCommand : ( ( rule__UiCommand__Alternatives ) ) ;
-    public final void ruleUiCommand() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:578:2: ( ( ( rule__UiCommand__Alternatives ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:579:1: ( ( rule__UiCommand__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:579:1: ( ( rule__UiCommand__Alternatives ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:580:1: ( rule__UiCommand__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiCommandAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:581:1: ( rule__UiCommand__Alternatives )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:581:2: rule__UiCommand__Alternatives
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiCommand__Alternatives_in_ruleUiCommand1180);
-            rule__UiCommand__Alternatives();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiCommandAccess().getAlternatives()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiCommand"
-
-
-    // $ANTLR start "entryRuleUiMobileNavigationCommand"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:593:1: entryRuleUiMobileNavigationCommand : ruleUiMobileNavigationCommand EOF ;
-    public final void entryRuleUiMobileNavigationCommand() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:594:1: ( ruleUiMobileNavigationCommand EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:595:1: ruleUiMobileNavigationCommand EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileNavigationCommandRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiMobileNavigationCommand_in_entryRuleUiMobileNavigationCommand1207);
-            ruleUiMobileNavigationCommand();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileNavigationCommandRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiMobileNavigationCommand1214); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiMobileNavigationCommand"
-
-
-    // $ANTLR start "ruleUiMobileNavigationCommand"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:602:1: ruleUiMobileNavigationCommand : ( ( rule__UiMobileNavigationCommand__Group__0 ) ) ;
-    public final void ruleUiMobileNavigationCommand() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:606:2: ( ( ( rule__UiMobileNavigationCommand__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:607:1: ( ( rule__UiMobileNavigationCommand__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:607:1: ( ( rule__UiMobileNavigationCommand__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:608:1: ( rule__UiMobileNavigationCommand__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileNavigationCommandAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:609:1: ( rule__UiMobileNavigationCommand__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:609:2: rule__UiMobileNavigationCommand__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiMobileNavigationCommand__Group__0_in_ruleUiMobileNavigationCommand1240);
-            rule__UiMobileNavigationCommand__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileNavigationCommandAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiMobileNavigationCommand"
-
-
-    // $ANTLR start "entryRuleUiOpenDialogCommand"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:621:1: entryRuleUiOpenDialogCommand : ruleUiOpenDialogCommand EOF ;
-    public final void entryRuleUiOpenDialogCommand() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:622:1: ( ruleUiOpenDialogCommand EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:623:1: ruleUiOpenDialogCommand EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiOpenDialogCommandRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiOpenDialogCommand_in_entryRuleUiOpenDialogCommand1267);
-            ruleUiOpenDialogCommand();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiOpenDialogCommandRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiOpenDialogCommand1274); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiOpenDialogCommand"
-
-
-    // $ANTLR start "ruleUiOpenDialogCommand"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:630:1: ruleUiOpenDialogCommand : ( ( rule__UiOpenDialogCommand__Group__0 ) ) ;
-    public final void ruleUiOpenDialogCommand() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:634:2: ( ( ( rule__UiOpenDialogCommand__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:635:1: ( ( rule__UiOpenDialogCommand__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:635:1: ( ( rule__UiOpenDialogCommand__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:636:1: ( rule__UiOpenDialogCommand__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiOpenDialogCommandAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:637:1: ( rule__UiOpenDialogCommand__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:637:2: rule__UiOpenDialogCommand__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiOpenDialogCommand__Group__0_in_ruleUiOpenDialogCommand1300);
-            rule__UiOpenDialogCommand__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiOpenDialogCommandAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiOpenDialogCommand"
-
-
-    // $ANTLR start "entryRuleUiSearchWithDialogCommand"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:649:1: entryRuleUiSearchWithDialogCommand : ruleUiSearchWithDialogCommand EOF ;
-    public final void entryRuleUiSearchWithDialogCommand() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:650:1: ( ruleUiSearchWithDialogCommand EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:651:1: ruleUiSearchWithDialogCommand EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiSearchWithDialogCommandRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiSearchWithDialogCommand_in_entryRuleUiSearchWithDialogCommand1327);
-            ruleUiSearchWithDialogCommand();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiSearchWithDialogCommandRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiSearchWithDialogCommand1334); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiSearchWithDialogCommand"
-
-
-    // $ANTLR start "ruleUiSearchWithDialogCommand"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:658:1: ruleUiSearchWithDialogCommand : ( ( rule__UiSearchWithDialogCommand__Group__0 ) ) ;
-    public final void ruleUiSearchWithDialogCommand() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:662:2: ( ( ( rule__UiSearchWithDialogCommand__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:663:1: ( ( rule__UiSearchWithDialogCommand__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:663:1: ( ( rule__UiSearchWithDialogCommand__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:664:1: ( rule__UiSearchWithDialogCommand__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiSearchWithDialogCommandAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:665:1: ( rule__UiSearchWithDialogCommand__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:665:2: rule__UiSearchWithDialogCommand__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiSearchWithDialogCommand__Group__0_in_ruleUiSearchWithDialogCommand1360);
-            rule__UiSearchWithDialogCommand__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiSearchWithDialogCommandAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiSearchWithDialogCommand"
-
-
-    // $ANTLR start "entryRuleUiAddToTableCommand"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:677:1: entryRuleUiAddToTableCommand : ruleUiAddToTableCommand EOF ;
-    public final void entryRuleUiAddToTableCommand() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:678:1: ( ruleUiAddToTableCommand EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:679:1: ruleUiAddToTableCommand EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiAddToTableCommandRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiAddToTableCommand_in_entryRuleUiAddToTableCommand1387);
-            ruleUiAddToTableCommand();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiAddToTableCommandRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiAddToTableCommand1394); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiAddToTableCommand"
-
-
-    // $ANTLR start "ruleUiAddToTableCommand"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:686:1: ruleUiAddToTableCommand : ( ( rule__UiAddToTableCommand__Group__0 ) ) ;
-    public final void ruleUiAddToTableCommand() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:690:2: ( ( ( rule__UiAddToTableCommand__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:691:1: ( ( rule__UiAddToTableCommand__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:691:1: ( ( rule__UiAddToTableCommand__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:692:1: ( rule__UiAddToTableCommand__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiAddToTableCommandAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:693:1: ( rule__UiAddToTableCommand__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:693:2: rule__UiAddToTableCommand__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiAddToTableCommand__Group__0_in_ruleUiAddToTableCommand1420);
-            rule__UiAddToTableCommand__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiAddToTableCommandAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiAddToTableCommand"
-
-
-    // $ANTLR start "entryRuleUiRemoveFromTableCommand"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:705:1: entryRuleUiRemoveFromTableCommand : ruleUiRemoveFromTableCommand EOF ;
-    public final void entryRuleUiRemoveFromTableCommand() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:706:1: ( ruleUiRemoveFromTableCommand EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:707:1: ruleUiRemoveFromTableCommand EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiRemoveFromTableCommandRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiRemoveFromTableCommand_in_entryRuleUiRemoveFromTableCommand1447);
-            ruleUiRemoveFromTableCommand();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiRemoveFromTableCommandRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiRemoveFromTableCommand1454); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiRemoveFromTableCommand"
-
-
-    // $ANTLR start "ruleUiRemoveFromTableCommand"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:714:1: ruleUiRemoveFromTableCommand : ( ( rule__UiRemoveFromTableCommand__Group__0 ) ) ;
-    public final void ruleUiRemoveFromTableCommand() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:718:2: ( ( ( rule__UiRemoveFromTableCommand__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:719:1: ( ( rule__UiRemoveFromTableCommand__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:719:1: ( ( rule__UiRemoveFromTableCommand__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:720:1: ( rule__UiRemoveFromTableCommand__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiRemoveFromTableCommandAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:721:1: ( rule__UiRemoveFromTableCommand__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:721:2: rule__UiRemoveFromTableCommand__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiRemoveFromTableCommand__Group__0_in_ruleUiRemoveFromTableCommand1480);
-            rule__UiRemoveFromTableCommand__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiRemoveFromTableCommandAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiRemoveFromTableCommand"
-
-
-    // $ANTLR start "entryRuleUiSetNewInstanceCommand"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:733:1: entryRuleUiSetNewInstanceCommand : ruleUiSetNewInstanceCommand EOF ;
-    public final void entryRuleUiSetNewInstanceCommand() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:734:1: ( ruleUiSetNewInstanceCommand EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:735:1: ruleUiSetNewInstanceCommand EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiSetNewInstanceCommandRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiSetNewInstanceCommand_in_entryRuleUiSetNewInstanceCommand1507);
-            ruleUiSetNewInstanceCommand();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiSetNewInstanceCommandRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiSetNewInstanceCommand1514); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiSetNewInstanceCommand"
-
-
-    // $ANTLR start "ruleUiSetNewInstanceCommand"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:742:1: ruleUiSetNewInstanceCommand : ( ( rule__UiSetNewInstanceCommand__Group__0 ) ) ;
-    public final void ruleUiSetNewInstanceCommand() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:746:2: ( ( ( rule__UiSetNewInstanceCommand__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:747:1: ( ( rule__UiSetNewInstanceCommand__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:747:1: ( ( rule__UiSetNewInstanceCommand__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:748:1: ( rule__UiSetNewInstanceCommand__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiSetNewInstanceCommandAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:749:1: ( rule__UiSetNewInstanceCommand__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:749:2: rule__UiSetNewInstanceCommand__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiSetNewInstanceCommand__Group__0_in_ruleUiSetNewInstanceCommand1540);
-            rule__UiSetNewInstanceCommand__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiSetNewInstanceCommandAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiSetNewInstanceCommand"
-
-
-    // $ANTLR start "entryRuleUiSendEventCommand"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:761:1: entryRuleUiSendEventCommand : ruleUiSendEventCommand EOF ;
-    public final void entryRuleUiSendEventCommand() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:762:1: ( ruleUiSendEventCommand EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:763:1: ruleUiSendEventCommand EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiSendEventCommandRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiSendEventCommand_in_entryRuleUiSendEventCommand1567);
-            ruleUiSendEventCommand();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiSendEventCommandRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiSendEventCommand1574); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiSendEventCommand"
-
-
-    // $ANTLR start "ruleUiSendEventCommand"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:770:1: ruleUiSendEventCommand : ( ( rule__UiSendEventCommand__Group__0 ) ) ;
-    public final void ruleUiSendEventCommand() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:774:2: ( ( ( rule__UiSendEventCommand__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:775:1: ( ( rule__UiSendEventCommand__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:775:1: ( ( rule__UiSendEventCommand__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:776:1: ( rule__UiSendEventCommand__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiSendEventCommandAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:777:1: ( rule__UiSendEventCommand__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:777:2: rule__UiSendEventCommand__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiSendEventCommand__Group__0_in_ruleUiSendEventCommand1600);
-            rule__UiSendEventCommand__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiSendEventCommandAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiSendEventCommand"
-
-
-    // $ANTLR start "entryRuleUiView"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:789:1: entryRuleUiView : ruleUiView EOF ;
-    public final void entryRuleUiView() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:790:1: ( ruleUiView EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:791:1: ruleUiView EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiViewRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiView_in_entryRuleUiView1627);
-            ruleUiView();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiViewRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiView1634); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiView"
-
-
-    // $ANTLR start "ruleUiView"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:798:1: ruleUiView : ( ruleUiIDEView ) ;
-    public final void ruleUiView() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:802:2: ( ( ruleUiIDEView ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:803:1: ( ruleUiIDEView )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:803:1: ( ruleUiIDEView )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:804:1: ruleUiIDEView
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiViewAccess().getUiIDEViewParserRuleCall()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiIDEView_in_ruleUiView1660);
-            ruleUiIDEView();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiViewAccess().getUiIDEViewParserRuleCall()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiView"
-
-
-    // $ANTLR start "entryRuleUiIDEView"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:817:1: entryRuleUiIDEView : ruleUiIDEView EOF ;
-    public final void entryRuleUiIDEView() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:818:1: ( ruleUiIDEView EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:819:1: ruleUiIDEView EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiIDEViewRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiIDEView_in_entryRuleUiIDEView1686);
-            ruleUiIDEView();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiIDEViewRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiIDEView1693); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiIDEView"
-
-
-    // $ANTLR start "ruleUiIDEView"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:826:1: ruleUiIDEView : ( ( rule__UiIDEView__Group__0 ) ) ;
-    public final void ruleUiIDEView() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:830:2: ( ( ( rule__UiIDEView__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:831:1: ( ( rule__UiIDEView__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:831:1: ( ( rule__UiIDEView__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:832:1: ( rule__UiIDEView__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiIDEViewAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:833:1: ( rule__UiIDEView__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:833:2: rule__UiIDEView__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiIDEView__Group__0_in_ruleUiIDEView1719);
-            rule__UiIDEView__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiIDEViewAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiIDEView"
-
-
-    // $ANTLR start "entryRuleUiExposedAction"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:845:1: entryRuleUiExposedAction : ruleUiExposedAction EOF ;
-    public final void entryRuleUiExposedAction() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:846:1: ( ruleUiExposedAction EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:847:1: ruleUiExposedAction EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiExposedActionRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiExposedAction_in_entryRuleUiExposedAction1746);
-            ruleUiExposedAction();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiExposedActionRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiExposedAction1753); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiExposedAction"
-
-
-    // $ANTLR start "ruleUiExposedAction"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:854:1: ruleUiExposedAction : ( ( rule__UiExposedAction__Group__0 ) ) ;
-    public final void ruleUiExposedAction() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:858:2: ( ( ( rule__UiExposedAction__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:859:1: ( ( rule__UiExposedAction__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:859:1: ( ( rule__UiExposedAction__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:860:1: ( rule__UiExposedAction__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiExposedActionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:861:1: ( rule__UiExposedAction__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:861:2: rule__UiExposedAction__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiExposedAction__Group__0_in_ruleUiExposedAction1779);
-            rule__UiExposedAction__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiExposedActionAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiExposedAction"
-
-
-    // $ANTLR start "entryRuleUiMobileNavBarAction"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:873:1: entryRuleUiMobileNavBarAction : ruleUiMobileNavBarAction EOF ;
-    public final void entryRuleUiMobileNavBarAction() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:874:1: ( ruleUiMobileNavBarAction EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:875:1: ruleUiMobileNavBarAction EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileNavBarActionRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiMobileNavBarAction_in_entryRuleUiMobileNavBarAction1806);
-            ruleUiMobileNavBarAction();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileNavBarActionRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiMobileNavBarAction1813); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiMobileNavBarAction"
-
-
-    // $ANTLR start "ruleUiMobileNavBarAction"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:882:1: ruleUiMobileNavBarAction : ( ( rule__UiMobileNavBarAction__Group__0 ) ) ;
-    public final void ruleUiMobileNavBarAction() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:886:2: ( ( ( rule__UiMobileNavBarAction__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:887:1: ( ( rule__UiMobileNavBarAction__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:887:1: ( ( rule__UiMobileNavBarAction__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:888:1: ( rule__UiMobileNavBarAction__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileNavBarActionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:889:1: ( rule__UiMobileNavBarAction__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:889:2: rule__UiMobileNavBarAction__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiMobileNavBarAction__Group__0_in_ruleUiMobileNavBarAction1839);
-            rule__UiMobileNavBarAction__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileNavBarActionAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiMobileNavBarAction"
-
-
-    // $ANTLR start "entryRuleUiMobileView"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:901:1: entryRuleUiMobileView : ruleUiMobileView EOF ;
-    public final void entryRuleUiMobileView() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:902:1: ( ruleUiMobileView EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:903:1: ruleUiMobileView EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileViewRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiMobileView_in_entryRuleUiMobileView1866);
-            ruleUiMobileView();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileViewRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiMobileView1873); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiMobileView"
-
-
-    // $ANTLR start "ruleUiMobileView"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:910:1: ruleUiMobileView : ( ( rule__UiMobileView__Group__0 ) ) ;
-    public final void ruleUiMobileView() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:914:2: ( ( ( rule__UiMobileView__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:915:1: ( ( rule__UiMobileView__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:915:1: ( ( rule__UiMobileView__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:916:1: ( rule__UiMobileView__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileViewAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:917:1: ( rule__UiMobileView__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:917:2: rule__UiMobileView__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiMobileView__Group__0_in_ruleUiMobileView1899);
-            rule__UiMobileView__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileViewAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiMobileView"
-
-
-    // $ANTLR start "entryRuleUiI18nInfo"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:929:1: entryRuleUiI18nInfo : ruleUiI18nInfo EOF ;
-    public final void entryRuleUiI18nInfo() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:930:1: ( ruleUiI18nInfo EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:931:1: ruleUiI18nInfo EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiI18nInfoRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiI18nInfo_in_entryRuleUiI18nInfo1926);
-            ruleUiI18nInfo();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiI18nInfoRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiI18nInfo1933); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiI18nInfo"
-
-
-    // $ANTLR start "ruleUiI18nInfo"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:938:1: ruleUiI18nInfo : ( ( rule__UiI18nInfo__Group__0 ) ) ;
-    public final void ruleUiI18nInfo() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:942:2: ( ( ( rule__UiI18nInfo__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:943:1: ( ( rule__UiI18nInfo__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:943:1: ( ( rule__UiI18nInfo__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:944:1: ( rule__UiI18nInfo__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiI18nInfoAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:945:1: ( rule__UiI18nInfo__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:945:2: rule__UiI18nInfo__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiI18nInfo__Group__0_in_ruleUiI18nInfo1959);
-            rule__UiI18nInfo__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiI18nInfoAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiI18nInfo"
-
-
-    // $ANTLR start "entryRuleUiGridLayout"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:957:1: entryRuleUiGridLayout : ruleUiGridLayout EOF ;
-    public final void entryRuleUiGridLayout() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:958:1: ( ruleUiGridLayout EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:959:1: ruleUiGridLayout EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiGridLayoutRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiGridLayout_in_entryRuleUiGridLayout1986);
-            ruleUiGridLayout();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiGridLayoutRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiGridLayout1993); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiGridLayout"
-
-
-    // $ANTLR start "ruleUiGridLayout"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:966:1: ruleUiGridLayout : ( ( rule__UiGridLayout__Group__0 ) ) ;
-    public final void ruleUiGridLayout() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:970:2: ( ( ( rule__UiGridLayout__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:971:1: ( ( rule__UiGridLayout__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:971:1: ( ( rule__UiGridLayout__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:972:1: ( rule__UiGridLayout__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiGridLayoutAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:973:1: ( rule__UiGridLayout__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:973:2: rule__UiGridLayout__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiGridLayout__Group__0_in_ruleUiGridLayout2019);
-            rule__UiGridLayout__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiGridLayoutAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiGridLayout"
-
-
-    // $ANTLR start "entryRuleUiVisibilityProcessorAssignment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:985:1: entryRuleUiVisibilityProcessorAssignment : ruleUiVisibilityProcessorAssignment EOF ;
-    public final void entryRuleUiVisibilityProcessorAssignment() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:986:1: ( ruleUiVisibilityProcessorAssignment EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:987:1: ruleUiVisibilityProcessorAssignment EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiVisibilityProcessorAssignmentRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiVisibilityProcessorAssignment_in_entryRuleUiVisibilityProcessorAssignment2046);
-            ruleUiVisibilityProcessorAssignment();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiVisibilityProcessorAssignmentRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiVisibilityProcessorAssignment2053); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiVisibilityProcessorAssignment"
-
-
-    // $ANTLR start "ruleUiVisibilityProcessorAssignment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:994:1: ruleUiVisibilityProcessorAssignment : ( ( rule__UiVisibilityProcessorAssignment__Group__0 ) ) ;
-    public final void ruleUiVisibilityProcessorAssignment() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:998:2: ( ( ( rule__UiVisibilityProcessorAssignment__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:999:1: ( ( rule__UiVisibilityProcessorAssignment__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:999:1: ( ( rule__UiVisibilityProcessorAssignment__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1000:1: ( rule__UiVisibilityProcessorAssignment__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiVisibilityProcessorAssignmentAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1001:1: ( rule__UiVisibilityProcessorAssignment__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1001:2: rule__UiVisibilityProcessorAssignment__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiVisibilityProcessorAssignment__Group__0_in_ruleUiVisibilityProcessorAssignment2079);
-            rule__UiVisibilityProcessorAssignment__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiVisibilityProcessorAssignmentAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiVisibilityProcessorAssignment"
-
-
-    // $ANTLR start "entryRuleUiGridLayoutAssigment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1013:1: entryRuleUiGridLayoutAssigment : ruleUiGridLayoutAssigment EOF ;
-    public final void entryRuleUiGridLayoutAssigment() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1014:1: ( ruleUiGridLayoutAssigment EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1015:1: ruleUiGridLayoutAssigment EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiGridLayoutAssigmentRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiGridLayoutAssigment_in_entryRuleUiGridLayoutAssigment2106);
-            ruleUiGridLayoutAssigment();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiGridLayoutAssigmentRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiGridLayoutAssigment2113); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiGridLayoutAssigment"
-
-
-    // $ANTLR start "ruleUiGridLayoutAssigment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1022:1: ruleUiGridLayoutAssigment : ( ( rule__UiGridLayoutAssigment__Group__0 ) ) ;
-    public final void ruleUiGridLayoutAssigment() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1026:2: ( ( ( rule__UiGridLayoutAssigment__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1027:1: ( ( rule__UiGridLayoutAssigment__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1027:1: ( ( rule__UiGridLayoutAssigment__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1028:1: ( rule__UiGridLayoutAssigment__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiGridLayoutAssigmentAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1029:1: ( rule__UiGridLayoutAssigment__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1029:2: rule__UiGridLayoutAssigment__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiGridLayoutAssigment__Group__0_in_ruleUiGridLayoutAssigment2139);
-            rule__UiGridLayoutAssigment__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiGridLayoutAssigmentAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiGridLayoutAssigment"
-
-
-    // $ANTLR start "entryRuleUiFormLayout"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1041:1: entryRuleUiFormLayout : ruleUiFormLayout EOF ;
-    public final void entryRuleUiFormLayout() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1042:1: ( ruleUiFormLayout EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1043:1: ruleUiFormLayout EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiFormLayoutRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiFormLayout_in_entryRuleUiFormLayout2166);
-            ruleUiFormLayout();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiFormLayoutRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiFormLayout2173); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiFormLayout"
-
-
-    // $ANTLR start "ruleUiFormLayout"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1050:1: ruleUiFormLayout : ( ( rule__UiFormLayout__Group__0 ) ) ;
-    public final void ruleUiFormLayout() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1054:2: ( ( ( rule__UiFormLayout__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1055:1: ( ( rule__UiFormLayout__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1055:1: ( ( rule__UiFormLayout__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1056:1: ( rule__UiFormLayout__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiFormLayoutAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1057:1: ( rule__UiFormLayout__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1057:2: rule__UiFormLayout__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiFormLayout__Group__0_in_ruleUiFormLayout2199);
-            rule__UiFormLayout__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiFormLayoutAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiFormLayout"
-
-
-    // $ANTLR start "entryRuleUiFormLayoutAssigment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1069:1: entryRuleUiFormLayoutAssigment : ruleUiFormLayoutAssigment EOF ;
-    public final void entryRuleUiFormLayoutAssigment() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1070:1: ( ruleUiFormLayoutAssigment EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1071:1: ruleUiFormLayoutAssigment EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiFormLayoutAssigmentRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiFormLayoutAssigment_in_entryRuleUiFormLayoutAssigment2226);
-            ruleUiFormLayoutAssigment();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiFormLayoutAssigmentRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiFormLayoutAssigment2233); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiFormLayoutAssigment"
-
-
-    // $ANTLR start "ruleUiFormLayoutAssigment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1078:1: ruleUiFormLayoutAssigment : ( ( rule__UiFormLayoutAssigment__ElementAssignment ) ) ;
-    public final void ruleUiFormLayoutAssigment() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1082:2: ( ( ( rule__UiFormLayoutAssigment__ElementAssignment ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1083:1: ( ( rule__UiFormLayoutAssigment__ElementAssignment ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1083:1: ( ( rule__UiFormLayoutAssigment__ElementAssignment ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1084:1: ( rule__UiFormLayoutAssigment__ElementAssignment )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiFormLayoutAssigmentAccess().getElementAssignment()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1085:1: ( rule__UiFormLayoutAssigment__ElementAssignment )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1085:2: rule__UiFormLayoutAssigment__ElementAssignment
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiFormLayoutAssigment__ElementAssignment_in_ruleUiFormLayoutAssigment2259);
-            rule__UiFormLayoutAssigment__ElementAssignment();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiFormLayoutAssigmentAccess().getElementAssignment()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiFormLayoutAssigment"
-
-
-    // $ANTLR start "entryRuleUiVerticalLayout"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1097:1: entryRuleUiVerticalLayout : ruleUiVerticalLayout EOF ;
-    public final void entryRuleUiVerticalLayout() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1098:1: ( ruleUiVerticalLayout EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1099:1: ruleUiVerticalLayout EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiVerticalLayoutRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiVerticalLayout_in_entryRuleUiVerticalLayout2286);
-            ruleUiVerticalLayout();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiVerticalLayoutRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiVerticalLayout2293); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiVerticalLayout"
-
-
-    // $ANTLR start "ruleUiVerticalLayout"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1106:1: ruleUiVerticalLayout : ( ( rule__UiVerticalLayout__Group__0 ) ) ;
-    public final void ruleUiVerticalLayout() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1110:2: ( ( ( rule__UiVerticalLayout__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1111:1: ( ( rule__UiVerticalLayout__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1111:1: ( ( rule__UiVerticalLayout__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1112:1: ( rule__UiVerticalLayout__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiVerticalLayoutAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1113:1: ( rule__UiVerticalLayout__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1113:2: rule__UiVerticalLayout__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiVerticalLayout__Group__0_in_ruleUiVerticalLayout2319);
-            rule__UiVerticalLayout__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiVerticalLayoutAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiVerticalLayout"
-
-
-    // $ANTLR start "entryRuleUiVerticalLayoutAssigment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1125:1: entryRuleUiVerticalLayoutAssigment : ruleUiVerticalLayoutAssigment EOF ;
-    public final void entryRuleUiVerticalLayoutAssigment() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1126:1: ( ruleUiVerticalLayoutAssigment EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1127:1: ruleUiVerticalLayoutAssigment EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiVerticalLayoutAssigmentRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiVerticalLayoutAssigment_in_entryRuleUiVerticalLayoutAssigment2346);
-            ruleUiVerticalLayoutAssigment();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiVerticalLayoutAssigmentRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiVerticalLayoutAssigment2353); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiVerticalLayoutAssigment"
-
-
-    // $ANTLR start "ruleUiVerticalLayoutAssigment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1134:1: ruleUiVerticalLayoutAssigment : ( ( rule__UiVerticalLayoutAssigment__Group__0 ) ) ;
-    public final void ruleUiVerticalLayoutAssigment() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1138:2: ( ( ( rule__UiVerticalLayoutAssigment__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1139:1: ( ( rule__UiVerticalLayoutAssigment__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1139:1: ( ( rule__UiVerticalLayoutAssigment__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1140:1: ( rule__UiVerticalLayoutAssigment__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiVerticalLayoutAssigmentAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1141:1: ( rule__UiVerticalLayoutAssigment__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1141:2: rule__UiVerticalLayoutAssigment__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiVerticalLayoutAssigment__Group__0_in_ruleUiVerticalLayoutAssigment2379);
-            rule__UiVerticalLayoutAssigment__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiVerticalLayoutAssigmentAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiVerticalLayoutAssigment"
-
-
-    // $ANTLR start "entryRuleUiMobileVerticalLayout"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1153:1: entryRuleUiMobileVerticalLayout : ruleUiMobileVerticalLayout EOF ;
-    public final void entryRuleUiMobileVerticalLayout() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1154:1: ( ruleUiMobileVerticalLayout EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1155:1: ruleUiMobileVerticalLayout EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileVerticalLayoutRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiMobileVerticalLayout_in_entryRuleUiMobileVerticalLayout2406);
-            ruleUiMobileVerticalLayout();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileVerticalLayoutRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiMobileVerticalLayout2413); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiMobileVerticalLayout"
-
-
-    // $ANTLR start "ruleUiMobileVerticalLayout"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1162:1: ruleUiMobileVerticalLayout : ( ( rule__UiMobileVerticalLayout__Group__0 ) ) ;
-    public final void ruleUiMobileVerticalLayout() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1166:2: ( ( ( rule__UiMobileVerticalLayout__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1167:1: ( ( rule__UiMobileVerticalLayout__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1167:1: ( ( rule__UiMobileVerticalLayout__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1168:1: ( rule__UiMobileVerticalLayout__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileVerticalLayoutAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1169:1: ( rule__UiMobileVerticalLayout__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1169:2: rule__UiMobileVerticalLayout__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiMobileVerticalLayout__Group__0_in_ruleUiMobileVerticalLayout2439);
-            rule__UiMobileVerticalLayout__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileVerticalLayoutAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiMobileVerticalLayout"
-
-
-    // $ANTLR start "entryRuleUiMobileVerticalLayoutAssigment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1181:1: entryRuleUiMobileVerticalLayoutAssigment : ruleUiMobileVerticalLayoutAssigment EOF ;
-    public final void entryRuleUiMobileVerticalLayoutAssigment() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1182:1: ( ruleUiMobileVerticalLayoutAssigment EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1183:1: ruleUiMobileVerticalLayoutAssigment EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileVerticalLayoutAssigmentRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiMobileVerticalLayoutAssigment_in_entryRuleUiMobileVerticalLayoutAssigment2466);
-            ruleUiMobileVerticalLayoutAssigment();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileVerticalLayoutAssigmentRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiMobileVerticalLayoutAssigment2473); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiMobileVerticalLayoutAssigment"
-
-
-    // $ANTLR start "ruleUiMobileVerticalLayoutAssigment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1190:1: ruleUiMobileVerticalLayoutAssigment : ( ( rule__UiMobileVerticalLayoutAssigment__Group__0 ) ) ;
-    public final void ruleUiMobileVerticalLayoutAssigment() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1194:2: ( ( ( rule__UiMobileVerticalLayoutAssigment__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1195:1: ( ( rule__UiMobileVerticalLayoutAssigment__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1195:1: ( ( rule__UiMobileVerticalLayoutAssigment__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1196:1: ( rule__UiMobileVerticalLayoutAssigment__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileVerticalLayoutAssigmentAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1197:1: ( rule__UiMobileVerticalLayoutAssigment__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1197:2: rule__UiMobileVerticalLayoutAssigment__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiMobileVerticalLayoutAssigment__Group__0_in_ruleUiMobileVerticalLayoutAssigment2499);
-            rule__UiMobileVerticalLayoutAssigment__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileVerticalLayoutAssigmentAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiMobileVerticalLayoutAssigment"
-
-
-    // $ANTLR start "entryRuleUiMobileNavigationRoot"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1209:1: entryRuleUiMobileNavigationRoot : ruleUiMobileNavigationRoot EOF ;
-    public final void entryRuleUiMobileNavigationRoot() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1210:1: ( ruleUiMobileNavigationRoot EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1211:1: ruleUiMobileNavigationRoot EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileNavigationRootRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiMobileNavigationRoot_in_entryRuleUiMobileNavigationRoot2526);
-            ruleUiMobileNavigationRoot();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileNavigationRootRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiMobileNavigationRoot2533); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiMobileNavigationRoot"
-
-
-    // $ANTLR start "ruleUiMobileNavigationRoot"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1218:1: ruleUiMobileNavigationRoot : ( ( rule__UiMobileNavigationRoot__Group__0 ) ) ;
-    public final void ruleUiMobileNavigationRoot() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1222:2: ( ( ( rule__UiMobileNavigationRoot__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1223:1: ( ( rule__UiMobileNavigationRoot__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1223:1: ( ( rule__UiMobileNavigationRoot__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1224:1: ( rule__UiMobileNavigationRoot__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileNavigationRootAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1225:1: ( rule__UiMobileNavigationRoot__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1225:2: rule__UiMobileNavigationRoot__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiMobileNavigationRoot__Group__0_in_ruleUiMobileNavigationRoot2559);
-            rule__UiMobileNavigationRoot__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileNavigationRootAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiMobileNavigationRoot"
-
-
-    // $ANTLR start "entryRuleUiMobileNavigationRootAssigment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1237:1: entryRuleUiMobileNavigationRootAssigment : ruleUiMobileNavigationRootAssigment EOF ;
-    public final void entryRuleUiMobileNavigationRootAssigment() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1238:1: ( ruleUiMobileNavigationRootAssigment EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1239:1: ruleUiMobileNavigationRootAssigment EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileNavigationRootAssigmentRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiMobileNavigationRootAssigment_in_entryRuleUiMobileNavigationRootAssigment2586);
-            ruleUiMobileNavigationRootAssigment();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileNavigationRootAssigmentRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiMobileNavigationRootAssigment2593); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiMobileNavigationRootAssigment"
-
-
-    // $ANTLR start "ruleUiMobileNavigationRootAssigment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1246:1: ruleUiMobileNavigationRootAssigment : ( ( rule__UiMobileNavigationRootAssigment__ElementAssignment ) ) ;
-    public final void ruleUiMobileNavigationRootAssigment() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1250:2: ( ( ( rule__UiMobileNavigationRootAssigment__ElementAssignment ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1251:1: ( ( rule__UiMobileNavigationRootAssigment__ElementAssignment ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1251:1: ( ( rule__UiMobileNavigationRootAssigment__ElementAssignment ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1252:1: ( rule__UiMobileNavigationRootAssigment__ElementAssignment )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileNavigationRootAssigmentAccess().getElementAssignment()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1253:1: ( rule__UiMobileNavigationRootAssigment__ElementAssignment )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1253:2: rule__UiMobileNavigationRootAssigment__ElementAssignment
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiMobileNavigationRootAssigment__ElementAssignment_in_ruleUiMobileNavigationRootAssigment2619);
-            rule__UiMobileNavigationRootAssigment__ElementAssignment();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileNavigationRootAssigmentAccess().getElementAssignment()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiMobileNavigationRootAssigment"
-
-
-    // $ANTLR start "entryRuleUiHorizontalLayout"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1265:1: entryRuleUiHorizontalLayout : ruleUiHorizontalLayout EOF ;
-    public final void entryRuleUiHorizontalLayout() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1266:1: ( ruleUiHorizontalLayout EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1267:1: ruleUiHorizontalLayout EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiHorizontalLayoutRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiHorizontalLayout_in_entryRuleUiHorizontalLayout2646);
-            ruleUiHorizontalLayout();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiHorizontalLayoutRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiHorizontalLayout2653); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiHorizontalLayout"
-
-
-    // $ANTLR start "ruleUiHorizontalLayout"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1274:1: ruleUiHorizontalLayout : ( ( rule__UiHorizontalLayout__Group__0 ) ) ;
-    public final void ruleUiHorizontalLayout() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1278:2: ( ( ( rule__UiHorizontalLayout__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1279:1: ( ( rule__UiHorizontalLayout__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1279:1: ( ( rule__UiHorizontalLayout__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1280:1: ( rule__UiHorizontalLayout__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiHorizontalLayoutAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1281:1: ( rule__UiHorizontalLayout__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1281:2: rule__UiHorizontalLayout__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiHorizontalLayout__Group__0_in_ruleUiHorizontalLayout2679);
-            rule__UiHorizontalLayout__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiHorizontalLayoutAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiHorizontalLayout"
-
-
-    // $ANTLR start "entryRuleUiHorizontalLayoutAssigment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1293:1: entryRuleUiHorizontalLayoutAssigment : ruleUiHorizontalLayoutAssigment EOF ;
-    public final void entryRuleUiHorizontalLayoutAssigment() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1294:1: ( ruleUiHorizontalLayoutAssigment EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1295:1: ruleUiHorizontalLayoutAssigment EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiHorizontalLayoutAssigmentRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiHorizontalLayoutAssigment_in_entryRuleUiHorizontalLayoutAssigment2706);
-            ruleUiHorizontalLayoutAssigment();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiHorizontalLayoutAssigmentRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiHorizontalLayoutAssigment2713); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiHorizontalLayoutAssigment"
-
-
-    // $ANTLR start "ruleUiHorizontalLayoutAssigment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1302:1: ruleUiHorizontalLayoutAssigment : ( ( rule__UiHorizontalLayoutAssigment__Group__0 ) ) ;
-    public final void ruleUiHorizontalLayoutAssigment() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1306:2: ( ( ( rule__UiHorizontalLayoutAssigment__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1307:1: ( ( rule__UiHorizontalLayoutAssigment__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1307:1: ( ( rule__UiHorizontalLayoutAssigment__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1308:1: ( rule__UiHorizontalLayoutAssigment__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiHorizontalLayoutAssigmentAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1309:1: ( rule__UiHorizontalLayoutAssigment__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1309:2: rule__UiHorizontalLayoutAssigment__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiHorizontalLayoutAssigment__Group__0_in_ruleUiHorizontalLayoutAssigment2739);
-            rule__UiHorizontalLayoutAssigment__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiHorizontalLayoutAssigmentAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiHorizontalLayoutAssigment"
-
-
-    // $ANTLR start "entryRuleUiMobileHorizontalLayout"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1321:1: entryRuleUiMobileHorizontalLayout : ruleUiMobileHorizontalLayout EOF ;
-    public final void entryRuleUiMobileHorizontalLayout() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1322:1: ( ruleUiMobileHorizontalLayout EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1323:1: ruleUiMobileHorizontalLayout EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileHorizontalLayoutRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiMobileHorizontalLayout_in_entryRuleUiMobileHorizontalLayout2766);
-            ruleUiMobileHorizontalLayout();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileHorizontalLayoutRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiMobileHorizontalLayout2773); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiMobileHorizontalLayout"
-
-
-    // $ANTLR start "ruleUiMobileHorizontalLayout"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1330:1: ruleUiMobileHorizontalLayout : ( ( rule__UiMobileHorizontalLayout__Group__0 ) ) ;
-    public final void ruleUiMobileHorizontalLayout() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1334:2: ( ( ( rule__UiMobileHorizontalLayout__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1335:1: ( ( rule__UiMobileHorizontalLayout__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1335:1: ( ( rule__UiMobileHorizontalLayout__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1336:1: ( rule__UiMobileHorizontalLayout__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileHorizontalLayoutAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1337:1: ( rule__UiMobileHorizontalLayout__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1337:2: rule__UiMobileHorizontalLayout__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiMobileHorizontalLayout__Group__0_in_ruleUiMobileHorizontalLayout2799);
-            rule__UiMobileHorizontalLayout__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileHorizontalLayoutAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiMobileHorizontalLayout"
-
-
-    // $ANTLR start "entryRuleUiMobileHorizontalLayoutAssigment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1349:1: entryRuleUiMobileHorizontalLayoutAssigment : ruleUiMobileHorizontalLayoutAssigment EOF ;
-    public final void entryRuleUiMobileHorizontalLayoutAssigment() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1350:1: ( ruleUiMobileHorizontalLayoutAssigment EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1351:1: ruleUiMobileHorizontalLayoutAssigment EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileHorizontalLayoutAssigmentRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiMobileHorizontalLayoutAssigment_in_entryRuleUiMobileHorizontalLayoutAssigment2826);
-            ruleUiMobileHorizontalLayoutAssigment();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileHorizontalLayoutAssigmentRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiMobileHorizontalLayoutAssigment2833); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiMobileHorizontalLayoutAssigment"
-
-
-    // $ANTLR start "ruleUiMobileHorizontalLayoutAssigment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1358:1: ruleUiMobileHorizontalLayoutAssigment : ( ( rule__UiMobileHorizontalLayoutAssigment__Group__0 ) ) ;
-    public final void ruleUiMobileHorizontalLayoutAssigment() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1362:2: ( ( ( rule__UiMobileHorizontalLayoutAssigment__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1363:1: ( ( rule__UiMobileHorizontalLayoutAssigment__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1363:1: ( ( rule__UiMobileHorizontalLayoutAssigment__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1364:1: ( rule__UiMobileHorizontalLayoutAssigment__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileHorizontalLayoutAssigmentAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1365:1: ( rule__UiMobileHorizontalLayoutAssigment__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1365:2: rule__UiMobileHorizontalLayoutAssigment__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiMobileHorizontalLayoutAssigment__Group__0_in_ruleUiMobileHorizontalLayoutAssigment2859);
-            rule__UiMobileHorizontalLayoutAssigment__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileHorizontalLayoutAssigmentAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiMobileHorizontalLayoutAssigment"
-
-
-    // $ANTLR start "entryRuleUiMobileHorizontalButtonGroup"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1377:1: entryRuleUiMobileHorizontalButtonGroup : ruleUiMobileHorizontalButtonGroup EOF ;
-    public final void entryRuleUiMobileHorizontalButtonGroup() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1378:1: ( ruleUiMobileHorizontalButtonGroup EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1379:1: ruleUiMobileHorizontalButtonGroup EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileHorizontalButtonGroupRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiMobileHorizontalButtonGroup_in_entryRuleUiMobileHorizontalButtonGroup2886);
-            ruleUiMobileHorizontalButtonGroup();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileHorizontalButtonGroupRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiMobileHorizontalButtonGroup2893); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiMobileHorizontalButtonGroup"
-
-
-    // $ANTLR start "ruleUiMobileHorizontalButtonGroup"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1386:1: ruleUiMobileHorizontalButtonGroup : ( ( rule__UiMobileHorizontalButtonGroup__Group__0 ) ) ;
-    public final void ruleUiMobileHorizontalButtonGroup() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1390:2: ( ( ( rule__UiMobileHorizontalButtonGroup__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1391:1: ( ( rule__UiMobileHorizontalButtonGroup__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1391:1: ( ( rule__UiMobileHorizontalButtonGroup__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1392:1: ( rule__UiMobileHorizontalButtonGroup__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1393:1: ( rule__UiMobileHorizontalButtonGroup__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1393:2: rule__UiMobileHorizontalButtonGroup__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiMobileHorizontalButtonGroup__Group__0_in_ruleUiMobileHorizontalButtonGroup2919);
-            rule__UiMobileHorizontalButtonGroup__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiMobileHorizontalButtonGroup"
-
-
-    // $ANTLR start "entryRuleUiMobileHorizontalButtonGroupAssigment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1405:1: entryRuleUiMobileHorizontalButtonGroupAssigment : ruleUiMobileHorizontalButtonGroupAssigment EOF ;
-    public final void entryRuleUiMobileHorizontalButtonGroupAssigment() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1406:1: ( ruleUiMobileHorizontalButtonGroupAssigment EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1407:1: ruleUiMobileHorizontalButtonGroupAssigment EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileHorizontalButtonGroupAssigmentRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiMobileHorizontalButtonGroupAssigment_in_entryRuleUiMobileHorizontalButtonGroupAssigment2946);
-            ruleUiMobileHorizontalButtonGroupAssigment();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileHorizontalButtonGroupAssigmentRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiMobileHorizontalButtonGroupAssigment2953); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiMobileHorizontalButtonGroupAssigment"
-
-
-    // $ANTLR start "ruleUiMobileHorizontalButtonGroupAssigment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1414:1: ruleUiMobileHorizontalButtonGroupAssigment : ( ( rule__UiMobileHorizontalButtonGroupAssigment__ElementAssignment ) ) ;
-    public final void ruleUiMobileHorizontalButtonGroupAssigment() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1418:2: ( ( ( rule__UiMobileHorizontalButtonGroupAssigment__ElementAssignment ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1419:1: ( ( rule__UiMobileHorizontalButtonGroupAssigment__ElementAssignment ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1419:1: ( ( rule__UiMobileHorizontalButtonGroupAssigment__ElementAssignment ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1420:1: ( rule__UiMobileHorizontalButtonGroupAssigment__ElementAssignment )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileHorizontalButtonGroupAssigmentAccess().getElementAssignment()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1421:1: ( rule__UiMobileHorizontalButtonGroupAssigment__ElementAssignment )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1421:2: rule__UiMobileHorizontalButtonGroupAssigment__ElementAssignment
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiMobileHorizontalButtonGroupAssigment__ElementAssignment_in_ruleUiMobileHorizontalButtonGroupAssigment2979);
-            rule__UiMobileHorizontalButtonGroupAssigment__ElementAssignment();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileHorizontalButtonGroupAssigmentAccess().getElementAssignment()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiMobileHorizontalButtonGroupAssigment"
-
-
-    // $ANTLR start "entryRuleUiMobileVerticalComponentGroup"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1433:1: entryRuleUiMobileVerticalComponentGroup : ruleUiMobileVerticalComponentGroup EOF ;
-    public final void entryRuleUiMobileVerticalComponentGroup() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1434:1: ( ruleUiMobileVerticalComponentGroup EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1435:1: ruleUiMobileVerticalComponentGroup EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileVerticalComponentGroupRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiMobileVerticalComponentGroup_in_entryRuleUiMobileVerticalComponentGroup3006);
-            ruleUiMobileVerticalComponentGroup();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileVerticalComponentGroupRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiMobileVerticalComponentGroup3013); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiMobileVerticalComponentGroup"
-
-
-    // $ANTLR start "ruleUiMobileVerticalComponentGroup"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1442:1: ruleUiMobileVerticalComponentGroup : ( ( rule__UiMobileVerticalComponentGroup__Group__0 ) ) ;
-    public final void ruleUiMobileVerticalComponentGroup() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1446:2: ( ( ( rule__UiMobileVerticalComponentGroup__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1447:1: ( ( rule__UiMobileVerticalComponentGroup__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1447:1: ( ( rule__UiMobileVerticalComponentGroup__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1448:1: ( rule__UiMobileVerticalComponentGroup__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileVerticalComponentGroupAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1449:1: ( rule__UiMobileVerticalComponentGroup__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1449:2: rule__UiMobileVerticalComponentGroup__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiMobileVerticalComponentGroup__Group__0_in_ruleUiMobileVerticalComponentGroup3039);
-            rule__UiMobileVerticalComponentGroup__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileVerticalComponentGroupAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiMobileVerticalComponentGroup"
-
-
-    // $ANTLR start "entryRuleUiMobileVerticalComponentGroupAssigment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1461:1: entryRuleUiMobileVerticalComponentGroupAssigment : ruleUiMobileVerticalComponentGroupAssigment EOF ;
-    public final void entryRuleUiMobileVerticalComponentGroupAssigment() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1462:1: ( ruleUiMobileVerticalComponentGroupAssigment EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1463:1: ruleUiMobileVerticalComponentGroupAssigment EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileVerticalComponentGroupAssigmentRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiMobileVerticalComponentGroupAssigment_in_entryRuleUiMobileVerticalComponentGroupAssigment3066);
-            ruleUiMobileVerticalComponentGroupAssigment();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileVerticalComponentGroupAssigmentRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiMobileVerticalComponentGroupAssigment3073); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiMobileVerticalComponentGroupAssigment"
-
-
-    // $ANTLR start "ruleUiMobileVerticalComponentGroupAssigment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1470:1: ruleUiMobileVerticalComponentGroupAssigment : ( ( rule__UiMobileVerticalComponentGroupAssigment__ElementAssignment ) ) ;
-    public final void ruleUiMobileVerticalComponentGroupAssigment() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1474:2: ( ( ( rule__UiMobileVerticalComponentGroupAssigment__ElementAssignment ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1475:1: ( ( rule__UiMobileVerticalComponentGroupAssigment__ElementAssignment ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1475:1: ( ( rule__UiMobileVerticalComponentGroupAssigment__ElementAssignment ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1476:1: ( rule__UiMobileVerticalComponentGroupAssigment__ElementAssignment )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileVerticalComponentGroupAssigmentAccess().getElementAssignment()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1477:1: ( rule__UiMobileVerticalComponentGroupAssigment__ElementAssignment )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1477:2: rule__UiMobileVerticalComponentGroupAssigment__ElementAssignment
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiMobileVerticalComponentGroupAssigment__ElementAssignment_in_ruleUiMobileVerticalComponentGroupAssigment3099);
-            rule__UiMobileVerticalComponentGroupAssigment__ElementAssignment();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileVerticalComponentGroupAssigmentAccess().getElementAssignment()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiMobileVerticalComponentGroupAssigment"
-
-
-    // $ANTLR start "entryRuleUiSearchPanel"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1489:1: entryRuleUiSearchPanel : ruleUiSearchPanel EOF ;
-    public final void entryRuleUiSearchPanel() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1490:1: ( ruleUiSearchPanel EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1491:1: ruleUiSearchPanel EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiSearchPanelRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiSearchPanel_in_entryRuleUiSearchPanel3126);
-            ruleUiSearchPanel();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiSearchPanelRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiSearchPanel3133); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiSearchPanel"
-
-
-    // $ANTLR start "ruleUiSearchPanel"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1498:1: ruleUiSearchPanel : ( ( rule__UiSearchPanel__Group__0 ) ) ;
-    public final void ruleUiSearchPanel() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1502:2: ( ( ( rule__UiSearchPanel__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1503:1: ( ( rule__UiSearchPanel__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1503:1: ( ( rule__UiSearchPanel__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1504:1: ( rule__UiSearchPanel__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiSearchPanelAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1505:1: ( rule__UiSearchPanel__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1505:2: rule__UiSearchPanel__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiSearchPanel__Group__0_in_ruleUiSearchPanel3159);
-            rule__UiSearchPanel__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiSearchPanelAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiSearchPanel"
-
-
-    // $ANTLR start "entryRuleUiMobileSearchPanel"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1517:1: entryRuleUiMobileSearchPanel : ruleUiMobileSearchPanel EOF ;
-    public final void entryRuleUiMobileSearchPanel() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1518:1: ( ruleUiMobileSearchPanel EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1519:1: ruleUiMobileSearchPanel EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileSearchPanelRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiMobileSearchPanel_in_entryRuleUiMobileSearchPanel3186);
-            ruleUiMobileSearchPanel();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileSearchPanelRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiMobileSearchPanel3193); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiMobileSearchPanel"
-
-
-    // $ANTLR start "ruleUiMobileSearchPanel"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1526:1: ruleUiMobileSearchPanel : ( ( rule__UiMobileSearchPanel__Group__0 ) ) ;
-    public final void ruleUiMobileSearchPanel() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1530:2: ( ( ( rule__UiMobileSearchPanel__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1531:1: ( ( rule__UiMobileSearchPanel__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1531:1: ( ( rule__UiMobileSearchPanel__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1532:1: ( rule__UiMobileSearchPanel__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileSearchPanelAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1533:1: ( rule__UiMobileSearchPanel__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1533:2: rule__UiMobileSearchPanel__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiMobileSearchPanel__Group__0_in_ruleUiMobileSearchPanel3219);
-            rule__UiMobileSearchPanel__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileSearchPanelAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiMobileSearchPanel"
-
-
-    // $ANTLR start "entryRuleUiMobileTabSheet"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1545:1: entryRuleUiMobileTabSheet : ruleUiMobileTabSheet EOF ;
-    public final void entryRuleUiMobileTabSheet() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1546:1: ( ruleUiMobileTabSheet EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1547:1: ruleUiMobileTabSheet EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileTabSheetRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiMobileTabSheet_in_entryRuleUiMobileTabSheet3246);
-            ruleUiMobileTabSheet();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileTabSheetRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiMobileTabSheet3253); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiMobileTabSheet"
-
-
-    // $ANTLR start "ruleUiMobileTabSheet"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1554:1: ruleUiMobileTabSheet : ( ( rule__UiMobileTabSheet__Group__0 ) ) ;
-    public final void ruleUiMobileTabSheet() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1558:2: ( ( ( rule__UiMobileTabSheet__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1559:1: ( ( rule__UiMobileTabSheet__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1559:1: ( ( rule__UiMobileTabSheet__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1560:1: ( rule__UiMobileTabSheet__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileTabSheetAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1561:1: ( rule__UiMobileTabSheet__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1561:2: rule__UiMobileTabSheet__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiMobileTabSheet__Group__0_in_ruleUiMobileTabSheet3279);
-            rule__UiMobileTabSheet__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileTabSheetAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiMobileTabSheet"
-
-
-    // $ANTLR start "entryRuleUiMobileTabAssignment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1573:1: entryRuleUiMobileTabAssignment : ruleUiMobileTabAssignment EOF ;
-    public final void entryRuleUiMobileTabAssignment() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1574:1: ( ruleUiMobileTabAssignment EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1575:1: ruleUiMobileTabAssignment EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileTabAssignmentRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiMobileTabAssignment_in_entryRuleUiMobileTabAssignment3306);
-            ruleUiMobileTabAssignment();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileTabAssignmentRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiMobileTabAssignment3313); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiMobileTabAssignment"
-
-
-    // $ANTLR start "ruleUiMobileTabAssignment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1582:1: ruleUiMobileTabAssignment : ( ( rule__UiMobileTabAssignment__Group__0 ) ) ;
-    public final void ruleUiMobileTabAssignment() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1586:2: ( ( ( rule__UiMobileTabAssignment__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1587:1: ( ( rule__UiMobileTabAssignment__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1587:1: ( ( rule__UiMobileTabAssignment__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1588:1: ( rule__UiMobileTabAssignment__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileTabAssignmentAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1589:1: ( rule__UiMobileTabAssignment__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1589:2: rule__UiMobileTabAssignment__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiMobileTabAssignment__Group__0_in_ruleUiMobileTabAssignment3339);
-            rule__UiMobileTabAssignment__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileTabAssignmentAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiMobileTabAssignment"
-
-
-    // $ANTLR start "entryRuleUiTabSheet"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1601:1: entryRuleUiTabSheet : ruleUiTabSheet EOF ;
-    public final void entryRuleUiTabSheet() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1602:1: ( ruleUiTabSheet EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1603:1: ruleUiTabSheet EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiTabSheetRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiTabSheet_in_entryRuleUiTabSheet3366);
-            ruleUiTabSheet();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiTabSheetRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiTabSheet3373); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiTabSheet"
-
-
-    // $ANTLR start "ruleUiTabSheet"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1610:1: ruleUiTabSheet : ( ( rule__UiTabSheet__Group__0 ) ) ;
-    public final void ruleUiTabSheet() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1614:2: ( ( ( rule__UiTabSheet__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1615:1: ( ( rule__UiTabSheet__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1615:1: ( ( rule__UiTabSheet__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1616:1: ( rule__UiTabSheet__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiTabSheetAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1617:1: ( rule__UiTabSheet__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1617:2: rule__UiTabSheet__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiTabSheet__Group__0_in_ruleUiTabSheet3399);
-            rule__UiTabSheet__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiTabSheetAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiTabSheet"
-
-
-    // $ANTLR start "entryRuleUiTabAssignment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1629:1: entryRuleUiTabAssignment : ruleUiTabAssignment EOF ;
-    public final void entryRuleUiTabAssignment() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1630:1: ( ruleUiTabAssignment EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1631:1: ruleUiTabAssignment EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiTabAssignmentRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiTabAssignment_in_entryRuleUiTabAssignment3426);
-            ruleUiTabAssignment();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiTabAssignmentRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiTabAssignment3433); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiTabAssignment"
-
-
-    // $ANTLR start "ruleUiTabAssignment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1638:1: ruleUiTabAssignment : ( ( rule__UiTabAssignment__Group__0 ) ) ;
-    public final void ruleUiTabAssignment() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1642:2: ( ( ( rule__UiTabAssignment__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1643:1: ( ( rule__UiTabAssignment__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1643:1: ( ( rule__UiTabAssignment__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1644:1: ( rule__UiTabAssignment__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiTabAssignmentAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1645:1: ( rule__UiTabAssignment__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1645:2: rule__UiTabAssignment__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiTabAssignment__Group__0_in_ruleUiTabAssignment3459);
-            rule__UiTabAssignment__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiTabAssignmentAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiTabAssignment"
-
-
-    // $ANTLR start "entryRuleUiSplitpanel"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1657:1: entryRuleUiSplitpanel : ruleUiSplitpanel EOF ;
-    public final void entryRuleUiSplitpanel() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1658:1: ( ruleUiSplitpanel EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1659:1: ruleUiSplitpanel EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiSplitpanelRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiSplitpanel_in_entryRuleUiSplitpanel3486);
-            ruleUiSplitpanel();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiSplitpanelRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiSplitpanel3493); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiSplitpanel"
-
-
-    // $ANTLR start "ruleUiSplitpanel"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1666:1: ruleUiSplitpanel : ( ( rule__UiSplitpanel__Group__0 ) ) ;
-    public final void ruleUiSplitpanel() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1670:2: ( ( ( rule__UiSplitpanel__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1671:1: ( ( rule__UiSplitpanel__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1671:1: ( ( rule__UiSplitpanel__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1672:1: ( rule__UiSplitpanel__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiSplitpanelAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1673:1: ( rule__UiSplitpanel__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1673:2: rule__UiSplitpanel__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiSplitpanel__Group__0_in_ruleUiSplitpanel3519);
-            rule__UiSplitpanel__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiSplitpanelAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiSplitpanel"
-
-
-    // $ANTLR start "entryRuleUiSplitpanelAssigment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1685:1: entryRuleUiSplitpanelAssigment : ruleUiSplitpanelAssigment EOF ;
-    public final void entryRuleUiSplitpanelAssigment() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1686:1: ( ruleUiSplitpanelAssigment EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1687:1: ruleUiSplitpanelAssigment EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiSplitpanelAssigmentRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiSplitpanelAssigment_in_entryRuleUiSplitpanelAssigment3546);
-            ruleUiSplitpanelAssigment();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiSplitpanelAssigmentRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiSplitpanelAssigment3553); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiSplitpanelAssigment"
-
-
-    // $ANTLR start "ruleUiSplitpanelAssigment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1694:1: ruleUiSplitpanelAssigment : ( ( rule__UiSplitpanelAssigment__ElementAssignment ) ) ;
-    public final void ruleUiSplitpanelAssigment() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1698:2: ( ( ( rule__UiSplitpanelAssigment__ElementAssignment ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1699:1: ( ( rule__UiSplitpanelAssigment__ElementAssignment ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1699:1: ( ( rule__UiSplitpanelAssigment__ElementAssignment ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1700:1: ( rule__UiSplitpanelAssigment__ElementAssignment )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiSplitpanelAssigmentAccess().getElementAssignment()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1701:1: ( rule__UiSplitpanelAssigment__ElementAssignment )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1701:2: rule__UiSplitpanelAssigment__ElementAssignment
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiSplitpanelAssigment__ElementAssignment_in_ruleUiSplitpanelAssigment3579);
-            rule__UiSplitpanelAssigment__ElementAssignment();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiSplitpanelAssigmentAccess().getElementAssignment()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiSplitpanelAssigment"
-
-
-    // $ANTLR start "entryRuleUiPanel"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1713:1: entryRuleUiPanel : ruleUiPanel EOF ;
-    public final void entryRuleUiPanel() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1714:1: ( ruleUiPanel EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1715:1: ruleUiPanel EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiPanelRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiPanel_in_entryRuleUiPanel3606);
-            ruleUiPanel();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiPanelRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiPanel3613); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiPanel"
-
-
-    // $ANTLR start "ruleUiPanel"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1722:1: ruleUiPanel : ( ( rule__UiPanel__Group__0 ) ) ;
-    public final void ruleUiPanel() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1726:2: ( ( ( rule__UiPanel__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1727:1: ( ( rule__UiPanel__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1727:1: ( ( rule__UiPanel__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1728:1: ( rule__UiPanel__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiPanelAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1729:1: ( rule__UiPanel__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1729:2: rule__UiPanel__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiPanel__Group__0_in_ruleUiPanel3639);
-            rule__UiPanel__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiPanelAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiPanel"
-
-
-    // $ANTLR start "entryRuleUiDialog"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1741:1: entryRuleUiDialog : ruleUiDialog EOF ;
-    public final void entryRuleUiDialog() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1742:1: ( ruleUiDialog EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1743:1: ruleUiDialog EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiDialogRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiDialog_in_entryRuleUiDialog3666);
-            ruleUiDialog();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiDialogRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiDialog3673); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiDialog"
-
-
-    // $ANTLR start "ruleUiDialog"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1750:1: ruleUiDialog : ( ( rule__UiDialog__Group__0 ) ) ;
-    public final void ruleUiDialog() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1754:2: ( ( ( rule__UiDialog__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1755:1: ( ( rule__UiDialog__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1755:1: ( ( rule__UiDialog__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1756:1: ( rule__UiDialog__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiDialogAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1757:1: ( rule__UiDialog__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1757:2: rule__UiDialog__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiDialog__Group__0_in_ruleUiDialog3699);
-            rule__UiDialog__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiDialogAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiDialog"
-
-
-    // $ANTLR start "entryRuleUiDialogAssignment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1769:1: entryRuleUiDialogAssignment : ruleUiDialogAssignment EOF ;
-    public final void entryRuleUiDialogAssignment() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1770:1: ( ruleUiDialogAssignment EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1771:1: ruleUiDialogAssignment EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiDialogAssignmentRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiDialogAssignment_in_entryRuleUiDialogAssignment3726);
-            ruleUiDialogAssignment();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiDialogAssignmentRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiDialogAssignment3733); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiDialogAssignment"
-
-
-    // $ANTLR start "ruleUiDialogAssignment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1778:1: ruleUiDialogAssignment : ( ( rule__UiDialogAssignment__ElementAssignment ) ) ;
-    public final void ruleUiDialogAssignment() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1782:2: ( ( ( rule__UiDialogAssignment__ElementAssignment ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1783:1: ( ( rule__UiDialogAssignment__ElementAssignment ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1783:1: ( ( rule__UiDialogAssignment__ElementAssignment ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1784:1: ( rule__UiDialogAssignment__ElementAssignment )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiDialogAssignmentAccess().getElementAssignment()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1785:1: ( rule__UiDialogAssignment__ElementAssignment )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1785:2: rule__UiDialogAssignment__ElementAssignment
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiDialogAssignment__ElementAssignment_in_ruleUiDialogAssignment3759);
-            rule__UiDialogAssignment__ElementAssignment();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiDialogAssignmentAccess().getElementAssignment()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiDialogAssignment"
-
-
-    // $ANTLR start "entryRuleUiSearchDialog"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1797:1: entryRuleUiSearchDialog : ruleUiSearchDialog EOF ;
-    public final void entryRuleUiSearchDialog() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1798:1: ( ruleUiSearchDialog EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1799:1: ruleUiSearchDialog EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiSearchDialogRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiSearchDialog_in_entryRuleUiSearchDialog3786);
-            ruleUiSearchDialog();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiSearchDialogRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiSearchDialog3793); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiSearchDialog"
-
-
-    // $ANTLR start "ruleUiSearchDialog"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1806:1: ruleUiSearchDialog : ( ( rule__UiSearchDialog__Group__0 ) ) ;
-    public final void ruleUiSearchDialog() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1810:2: ( ( ( rule__UiSearchDialog__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1811:1: ( ( rule__UiSearchDialog__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1811:1: ( ( rule__UiSearchDialog__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1812:1: ( rule__UiSearchDialog__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiSearchDialogAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1813:1: ( rule__UiSearchDialog__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1813:2: rule__UiSearchDialog__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiSearchDialog__Group__0_in_ruleUiSearchDialog3819);
-            rule__UiSearchDialog__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiSearchDialogAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiSearchDialog"
-
-
-    // $ANTLR start "entryRuleUiDialogSearchFieldAssignment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1825:1: entryRuleUiDialogSearchFieldAssignment : ruleUiDialogSearchFieldAssignment EOF ;
-    public final void entryRuleUiDialogSearchFieldAssignment() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1826:1: ( ruleUiDialogSearchFieldAssignment EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1827:1: ruleUiDialogSearchFieldAssignment EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiDialogSearchFieldAssignmentRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiDialogSearchFieldAssignment_in_entryRuleUiDialogSearchFieldAssignment3846);
-            ruleUiDialogSearchFieldAssignment();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiDialogSearchFieldAssignmentRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiDialogSearchFieldAssignment3853); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiDialogSearchFieldAssignment"
-
-
-    // $ANTLR start "ruleUiDialogSearchFieldAssignment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1834:1: ruleUiDialogSearchFieldAssignment : ( ( rule__UiDialogSearchFieldAssignment__ElementAssignment ) ) ;
-    public final void ruleUiDialogSearchFieldAssignment() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1838:2: ( ( ( rule__UiDialogSearchFieldAssignment__ElementAssignment ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1839:1: ( ( rule__UiDialogSearchFieldAssignment__ElementAssignment ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1839:1: ( ( rule__UiDialogSearchFieldAssignment__ElementAssignment ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1840:1: ( rule__UiDialogSearchFieldAssignment__ElementAssignment )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiDialogSearchFieldAssignmentAccess().getElementAssignment()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1841:1: ( rule__UiDialogSearchFieldAssignment__ElementAssignment )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1841:2: rule__UiDialogSearchFieldAssignment__ElementAssignment
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiDialogSearchFieldAssignment__ElementAssignment_in_ruleUiDialogSearchFieldAssignment3879);
-            rule__UiDialogSearchFieldAssignment__ElementAssignment();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiDialogSearchFieldAssignmentAccess().getElementAssignment()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiDialogSearchFieldAssignment"
-
-
-    // $ANTLR start "entryRuleUiMobileNavigationPage"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1853:1: entryRuleUiMobileNavigationPage : ruleUiMobileNavigationPage EOF ;
-    public final void entryRuleUiMobileNavigationPage() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1854:1: ( ruleUiMobileNavigationPage EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1855:1: ruleUiMobileNavigationPage EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileNavigationPageRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiMobileNavigationPage_in_entryRuleUiMobileNavigationPage3906);
-            ruleUiMobileNavigationPage();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileNavigationPageRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiMobileNavigationPage3913); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiMobileNavigationPage"
-
-
-    // $ANTLR start "ruleUiMobileNavigationPage"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1862:1: ruleUiMobileNavigationPage : ( ( rule__UiMobileNavigationPage__Group__0 ) ) ;
-    public final void ruleUiMobileNavigationPage() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1866:2: ( ( ( rule__UiMobileNavigationPage__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1867:1: ( ( rule__UiMobileNavigationPage__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1867:1: ( ( rule__UiMobileNavigationPage__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1868:1: ( rule__UiMobileNavigationPage__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileNavigationPageAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1869:1: ( rule__UiMobileNavigationPage__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1869:2: rule__UiMobileNavigationPage__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiMobileNavigationPage__Group__0_in_ruleUiMobileNavigationPage3939);
-            rule__UiMobileNavigationPage__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileNavigationPageAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiMobileNavigationPage"
-
-
-    // $ANTLR start "entryRuleUiMobileNavigationPageAssignment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1881:1: entryRuleUiMobileNavigationPageAssignment : ruleUiMobileNavigationPageAssignment EOF ;
-    public final void entryRuleUiMobileNavigationPageAssignment() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1882:1: ( ruleUiMobileNavigationPageAssignment EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1883:1: ruleUiMobileNavigationPageAssignment EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileNavigationPageAssignmentRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiMobileNavigationPageAssignment_in_entryRuleUiMobileNavigationPageAssignment3966);
-            ruleUiMobileNavigationPageAssignment();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileNavigationPageAssignmentRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiMobileNavigationPageAssignment3973); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiMobileNavigationPageAssignment"
-
-
-    // $ANTLR start "ruleUiMobileNavigationPageAssignment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1890:1: ruleUiMobileNavigationPageAssignment : ( ( rule__UiMobileNavigationPageAssignment__Group__0 ) ) ;
-    public final void ruleUiMobileNavigationPageAssignment() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1894:2: ( ( ( rule__UiMobileNavigationPageAssignment__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1895:1: ( ( rule__UiMobileNavigationPageAssignment__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1895:1: ( ( rule__UiMobileNavigationPageAssignment__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1896:1: ( rule__UiMobileNavigationPageAssignment__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileNavigationPageAssignmentAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1897:1: ( rule__UiMobileNavigationPageAssignment__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1897:2: rule__UiMobileNavigationPageAssignment__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiMobileNavigationPageAssignment__Group__0_in_ruleUiMobileNavigationPageAssignment3999);
-            rule__UiMobileNavigationPageAssignment__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileNavigationPageAssignmentAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiMobileNavigationPageAssignment"
-
-
-    // $ANTLR start "entryRuleUiTextField"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1911:1: entryRuleUiTextField : ruleUiTextField EOF ;
-    public final void entryRuleUiTextField() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1912:1: ( ruleUiTextField EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1913:1: ruleUiTextField EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiTextFieldRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiTextField_in_entryRuleUiTextField4028);
-            ruleUiTextField();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiTextFieldRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiTextField4035); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiTextField"
-
-
-    // $ANTLR start "ruleUiTextField"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1920:1: ruleUiTextField : ( ( rule__UiTextField__Group__0 ) ) ;
-    public final void ruleUiTextField() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1924:2: ( ( ( rule__UiTextField__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1925:1: ( ( rule__UiTextField__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1925:1: ( ( rule__UiTextField__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1926:1: ( rule__UiTextField__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiTextFieldAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1927:1: ( rule__UiTextField__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1927:2: rule__UiTextField__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiTextField__Group__0_in_ruleUiTextField4061);
-            rule__UiTextField__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiTextFieldAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiTextField"
-
-
-    // $ANTLR start "entryRuleUiPasswordField"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1939:1: entryRuleUiPasswordField : ruleUiPasswordField EOF ;
-    public final void entryRuleUiPasswordField() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1940:1: ( ruleUiPasswordField EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1941:1: ruleUiPasswordField EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiPasswordFieldRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiPasswordField_in_entryRuleUiPasswordField4088);
-            ruleUiPasswordField();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiPasswordFieldRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiPasswordField4095); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiPasswordField"
-
-
-    // $ANTLR start "ruleUiPasswordField"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1948:1: ruleUiPasswordField : ( ( rule__UiPasswordField__Group__0 ) ) ;
-    public final void ruleUiPasswordField() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1952:2: ( ( ( rule__UiPasswordField__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1953:1: ( ( rule__UiPasswordField__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1953:1: ( ( rule__UiPasswordField__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1954:1: ( rule__UiPasswordField__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiPasswordFieldAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1955:1: ( rule__UiPasswordField__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1955:2: rule__UiPasswordField__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiPasswordField__Group__0_in_ruleUiPasswordField4121);
-            rule__UiPasswordField__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiPasswordFieldAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiPasswordField"
-
-
-    // $ANTLR start "entryRuleUiMaskedTextField"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1967:1: entryRuleUiMaskedTextField : ruleUiMaskedTextField EOF ;
-    public final void entryRuleUiMaskedTextField() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1968:1: ( ruleUiMaskedTextField EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1969:1: ruleUiMaskedTextField EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMaskedTextFieldRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiMaskedTextField_in_entryRuleUiMaskedTextField4148);
-            ruleUiMaskedTextField();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMaskedTextFieldRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiMaskedTextField4155); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiMaskedTextField"
-
-
-    // $ANTLR start "ruleUiMaskedTextField"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1976:1: ruleUiMaskedTextField : ( ( rule__UiMaskedTextField__Group__0 ) ) ;
-    public final void ruleUiMaskedTextField() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1980:2: ( ( ( rule__UiMaskedTextField__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1981:1: ( ( rule__UiMaskedTextField__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1981:1: ( ( rule__UiMaskedTextField__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1982:1: ( rule__UiMaskedTextField__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMaskedTextFieldAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1983:1: ( rule__UiMaskedTextField__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1983:2: rule__UiMaskedTextField__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiMaskedTextField__Group__0_in_ruleUiMaskedTextField4181);
-            rule__UiMaskedTextField__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMaskedTextFieldAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiMaskedTextField"
-
-
-    // $ANTLR start "entryRuleUiMaskedNumericField"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1995:1: entryRuleUiMaskedNumericField : ruleUiMaskedNumericField EOF ;
-    public final void entryRuleUiMaskedNumericField() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1996:1: ( ruleUiMaskedNumericField EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:1997:1: ruleUiMaskedNumericField EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMaskedNumericFieldRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiMaskedNumericField_in_entryRuleUiMaskedNumericField4208);
-            ruleUiMaskedNumericField();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMaskedNumericFieldRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiMaskedNumericField4215); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiMaskedNumericField"
-
-
-    // $ANTLR start "ruleUiMaskedNumericField"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2004:1: ruleUiMaskedNumericField : ( ( rule__UiMaskedNumericField__Group__0 ) ) ;
-    public final void ruleUiMaskedNumericField() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2008:2: ( ( ( rule__UiMaskedNumericField__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2009:1: ( ( rule__UiMaskedNumericField__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2009:1: ( ( rule__UiMaskedNumericField__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2010:1: ( rule__UiMaskedNumericField__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMaskedNumericFieldAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2011:1: ( rule__UiMaskedNumericField__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2011:2: rule__UiMaskedNumericField__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiMaskedNumericField__Group__0_in_ruleUiMaskedNumericField4241);
-            rule__UiMaskedNumericField__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMaskedNumericFieldAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiMaskedNumericField"
-
-
-    // $ANTLR start "entryRuleUiMaskedDecimalField"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2023:1: entryRuleUiMaskedDecimalField : ruleUiMaskedDecimalField EOF ;
-    public final void entryRuleUiMaskedDecimalField() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2024:1: ( ruleUiMaskedDecimalField EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2025:1: ruleUiMaskedDecimalField EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMaskedDecimalFieldRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiMaskedDecimalField_in_entryRuleUiMaskedDecimalField4268);
-            ruleUiMaskedDecimalField();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMaskedDecimalFieldRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiMaskedDecimalField4275); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiMaskedDecimalField"
-
-
-    // $ANTLR start "ruleUiMaskedDecimalField"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2032:1: ruleUiMaskedDecimalField : ( ( rule__UiMaskedDecimalField__Group__0 ) ) ;
-    public final void ruleUiMaskedDecimalField() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2036:2: ( ( ( rule__UiMaskedDecimalField__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2037:1: ( ( rule__UiMaskedDecimalField__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2037:1: ( ( rule__UiMaskedDecimalField__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2038:1: ( rule__UiMaskedDecimalField__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMaskedDecimalFieldAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2039:1: ( rule__UiMaskedDecimalField__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2039:2: rule__UiMaskedDecimalField__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiMaskedDecimalField__Group__0_in_ruleUiMaskedDecimalField4301);
-            rule__UiMaskedDecimalField__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMaskedDecimalFieldAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiMaskedDecimalField"
-
-
-    // $ANTLR start "entryRuleUiPrefixedMaskedTextField"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2051:1: entryRuleUiPrefixedMaskedTextField : ruleUiPrefixedMaskedTextField EOF ;
-    public final void entryRuleUiPrefixedMaskedTextField() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2052:1: ( ruleUiPrefixedMaskedTextField EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2053:1: ruleUiPrefixedMaskedTextField EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiPrefixedMaskedTextFieldRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiPrefixedMaskedTextField_in_entryRuleUiPrefixedMaskedTextField4328);
-            ruleUiPrefixedMaskedTextField();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiPrefixedMaskedTextFieldRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiPrefixedMaskedTextField4335); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiPrefixedMaskedTextField"
-
-
-    // $ANTLR start "ruleUiPrefixedMaskedTextField"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2060:1: ruleUiPrefixedMaskedTextField : ( ( rule__UiPrefixedMaskedTextField__Group__0 ) ) ;
-    public final void ruleUiPrefixedMaskedTextField() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2064:2: ( ( ( rule__UiPrefixedMaskedTextField__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2065:1: ( ( rule__UiPrefixedMaskedTextField__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2065:1: ( ( rule__UiPrefixedMaskedTextField__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2066:1: ( rule__UiPrefixedMaskedTextField__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2067:1: ( rule__UiPrefixedMaskedTextField__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2067:2: rule__UiPrefixedMaskedTextField__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiPrefixedMaskedTextField__Group__0_in_ruleUiPrefixedMaskedTextField4361);
-            rule__UiPrefixedMaskedTextField__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiPrefixedMaskedTextField"
-
-
-    // $ANTLR start "entryRuleUiPrefixToMaskMapEntry"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2079:1: entryRuleUiPrefixToMaskMapEntry : ruleUiPrefixToMaskMapEntry EOF ;
-    public final void entryRuleUiPrefixToMaskMapEntry() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2080:1: ( ruleUiPrefixToMaskMapEntry EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2081:1: ruleUiPrefixToMaskMapEntry EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiPrefixToMaskMapEntryRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiPrefixToMaskMapEntry_in_entryRuleUiPrefixToMaskMapEntry4388);
-            ruleUiPrefixToMaskMapEntry();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiPrefixToMaskMapEntryRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiPrefixToMaskMapEntry4395); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiPrefixToMaskMapEntry"
-
-
-    // $ANTLR start "ruleUiPrefixToMaskMapEntry"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2088:1: ruleUiPrefixToMaskMapEntry : ( ( rule__UiPrefixToMaskMapEntry__Group__0 ) ) ;
-    public final void ruleUiPrefixToMaskMapEntry() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2092:2: ( ( ( rule__UiPrefixToMaskMapEntry__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2093:1: ( ( rule__UiPrefixToMaskMapEntry__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2093:1: ( ( rule__UiPrefixToMaskMapEntry__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2094:1: ( rule__UiPrefixToMaskMapEntry__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiPrefixToMaskMapEntryAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2095:1: ( rule__UiPrefixToMaskMapEntry__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2095:2: rule__UiPrefixToMaskMapEntry__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiPrefixToMaskMapEntry__Group__0_in_ruleUiPrefixToMaskMapEntry4421);
-            rule__UiPrefixToMaskMapEntry__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiPrefixToMaskMapEntryAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiPrefixToMaskMapEntry"
-
-
-    // $ANTLR start "entryRuleUiRichTextArea"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2107:1: entryRuleUiRichTextArea : ruleUiRichTextArea EOF ;
-    public final void entryRuleUiRichTextArea() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2108:1: ( ruleUiRichTextArea EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2109:1: ruleUiRichTextArea EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiRichTextAreaRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiRichTextArea_in_entryRuleUiRichTextArea4448);
-            ruleUiRichTextArea();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiRichTextAreaRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiRichTextArea4455); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiRichTextArea"
-
-
-    // $ANTLR start "ruleUiRichTextArea"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2116:1: ruleUiRichTextArea : ( ( rule__UiRichTextArea__Group__0 ) ) ;
-    public final void ruleUiRichTextArea() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2120:2: ( ( ( rule__UiRichTextArea__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2121:1: ( ( rule__UiRichTextArea__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2121:1: ( ( rule__UiRichTextArea__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2122:1: ( rule__UiRichTextArea__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiRichTextAreaAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2123:1: ( rule__UiRichTextArea__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2123:2: rule__UiRichTextArea__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiRichTextArea__Group__0_in_ruleUiRichTextArea4481);
-            rule__UiRichTextArea__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiRichTextAreaAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiRichTextArea"
-
-
-    // $ANTLR start "entryRuleUiSuggestTextField"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2135:1: entryRuleUiSuggestTextField : ruleUiSuggestTextField EOF ;
-    public final void entryRuleUiSuggestTextField() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2136:1: ( ruleUiSuggestTextField EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2137:1: ruleUiSuggestTextField EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiSuggestTextFieldRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiSuggestTextField_in_entryRuleUiSuggestTextField4508);
-            ruleUiSuggestTextField();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiSuggestTextFieldRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiSuggestTextField4515); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiSuggestTextField"
-
-
-    // $ANTLR start "ruleUiSuggestTextField"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2144:1: ruleUiSuggestTextField : ( ( rule__UiSuggestTextField__Group__0 ) ) ;
-    public final void ruleUiSuggestTextField() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2148:2: ( ( ( rule__UiSuggestTextField__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2149:1: ( ( rule__UiSuggestTextField__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2149:1: ( ( rule__UiSuggestTextField__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2150:1: ( rule__UiSuggestTextField__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiSuggestTextFieldAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2151:1: ( rule__UiSuggestTextField__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2151:2: rule__UiSuggestTextField__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiSuggestTextField__Group__0_in_ruleUiSuggestTextField4541);
-            rule__UiSuggestTextField__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiSuggestTextFieldAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiSuggestTextField"
-
-
-    // $ANTLR start "entryRuleUiBeanReferenceField"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2163:1: entryRuleUiBeanReferenceField : ruleUiBeanReferenceField EOF ;
-    public final void entryRuleUiBeanReferenceField() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2164:1: ( ruleUiBeanReferenceField EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2165:1: ruleUiBeanReferenceField EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiBeanReferenceFieldRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiBeanReferenceField_in_entryRuleUiBeanReferenceField4568);
-            ruleUiBeanReferenceField();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiBeanReferenceFieldRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiBeanReferenceField4575); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiBeanReferenceField"
-
-
-    // $ANTLR start "ruleUiBeanReferenceField"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2172:1: ruleUiBeanReferenceField : ( ( rule__UiBeanReferenceField__Group__0 ) ) ;
-    public final void ruleUiBeanReferenceField() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2176:2: ( ( ( rule__UiBeanReferenceField__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2177:1: ( ( rule__UiBeanReferenceField__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2177:1: ( ( rule__UiBeanReferenceField__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2178:1: ( rule__UiBeanReferenceField__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiBeanReferenceFieldAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2179:1: ( rule__UiBeanReferenceField__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2179:2: rule__UiBeanReferenceField__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiBeanReferenceField__Group__0_in_ruleUiBeanReferenceField4601);
-            rule__UiBeanReferenceField__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiBeanReferenceFieldAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiBeanReferenceField"
-
-
-    // $ANTLR start "entryRuleUiSearchField"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2191:1: entryRuleUiSearchField : ruleUiSearchField EOF ;
-    public final void entryRuleUiSearchField() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2192:1: ( ruleUiSearchField EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2193:1: ruleUiSearchField EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiSearchFieldRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiSearchField_in_entryRuleUiSearchField4628);
-            ruleUiSearchField();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiSearchFieldRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiSearchField4635); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiSearchField"
-
-
-    // $ANTLR start "ruleUiSearchField"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2200:1: ruleUiSearchField : ( ( rule__UiSearchField__Group__0 ) ) ;
-    public final void ruleUiSearchField() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2204:2: ( ( ( rule__UiSearchField__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2205:1: ( ( rule__UiSearchField__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2205:1: ( ( rule__UiSearchField__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2206:1: ( rule__UiSearchField__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiSearchFieldAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2207:1: ( rule__UiSearchField__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2207:2: rule__UiSearchField__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiSearchField__Group__0_in_ruleUiSearchField4661);
-            rule__UiSearchField__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiSearchFieldAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiSearchField"
-
-
-    // $ANTLR start "entryRuleUiTextArea"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2219:1: entryRuleUiTextArea : ruleUiTextArea EOF ;
-    public final void entryRuleUiTextArea() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2220:1: ( ruleUiTextArea EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2221:1: ruleUiTextArea EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiTextAreaRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiTextArea_in_entryRuleUiTextArea4688);
-            ruleUiTextArea();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiTextAreaRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiTextArea4695); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiTextArea"
-
-
-    // $ANTLR start "ruleUiTextArea"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2228:1: ruleUiTextArea : ( ( rule__UiTextArea__Group__0 ) ) ;
-    public final void ruleUiTextArea() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2232:2: ( ( ( rule__UiTextArea__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2233:1: ( ( rule__UiTextArea__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2233:1: ( ( rule__UiTextArea__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2234:1: ( rule__UiTextArea__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiTextAreaAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2235:1: ( rule__UiTextArea__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2235:2: rule__UiTextArea__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiTextArea__Group__0_in_ruleUiTextArea4721);
-            rule__UiTextArea__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiTextAreaAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiTextArea"
-
-
-    // $ANTLR start "entryRuleUiDateField"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2247:1: entryRuleUiDateField : ruleUiDateField EOF ;
-    public final void entryRuleUiDateField() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2248:1: ( ruleUiDateField EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2249:1: ruleUiDateField EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiDateFieldRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiDateField_in_entryRuleUiDateField4748);
-            ruleUiDateField();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiDateFieldRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiDateField4755); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiDateField"
-
-
-    // $ANTLR start "ruleUiDateField"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2256:1: ruleUiDateField : ( ( rule__UiDateField__Group__0 ) ) ;
-    public final void ruleUiDateField() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2260:2: ( ( ( rule__UiDateField__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2261:1: ( ( rule__UiDateField__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2261:1: ( ( rule__UiDateField__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2262:1: ( rule__UiDateField__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiDateFieldAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2263:1: ( rule__UiDateField__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2263:2: rule__UiDateField__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiDateField__Group__0_in_ruleUiDateField4781);
-            rule__UiDateField__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiDateFieldAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiDateField"
-
-
-    // $ANTLR start "entryRuleUiBrowser"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2275:1: entryRuleUiBrowser : ruleUiBrowser EOF ;
-    public final void entryRuleUiBrowser() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2276:1: ( ruleUiBrowser EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2277:1: ruleUiBrowser EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiBrowserRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiBrowser_in_entryRuleUiBrowser4808);
-            ruleUiBrowser();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiBrowserRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiBrowser4815); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiBrowser"
-
-
-    // $ANTLR start "ruleUiBrowser"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2284:1: ruleUiBrowser : ( ( rule__UiBrowser__Group__0 ) ) ;
-    public final void ruleUiBrowser() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2288:2: ( ( ( rule__UiBrowser__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2289:1: ( ( rule__UiBrowser__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2289:1: ( ( rule__UiBrowser__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2290:1: ( rule__UiBrowser__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiBrowserAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2291:1: ( rule__UiBrowser__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2291:2: rule__UiBrowser__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiBrowser__Group__0_in_ruleUiBrowser4841);
-            rule__UiBrowser__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiBrowserAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiBrowser"
-
-
-    // $ANTLR start "entryRuleUiProgressBar"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2303:1: entryRuleUiProgressBar : ruleUiProgressBar EOF ;
-    public final void entryRuleUiProgressBar() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2304:1: ( ruleUiProgressBar EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2305:1: ruleUiProgressBar EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiProgressBarRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiProgressBar_in_entryRuleUiProgressBar4868);
-            ruleUiProgressBar();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiProgressBarRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiProgressBar4875); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiProgressBar"
-
-
-    // $ANTLR start "ruleUiProgressBar"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2312:1: ruleUiProgressBar : ( ( rule__UiProgressBar__Group__0 ) ) ;
-    public final void ruleUiProgressBar() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2316:2: ( ( ( rule__UiProgressBar__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2317:1: ( ( rule__UiProgressBar__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2317:1: ( ( rule__UiProgressBar__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2318:1: ( rule__UiProgressBar__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiProgressBarAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2319:1: ( rule__UiProgressBar__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2319:2: rule__UiProgressBar__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiProgressBar__Group__0_in_ruleUiProgressBar4901);
-            rule__UiProgressBar__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiProgressBarAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiProgressBar"
-
-
-    // $ANTLR start "entryRuleUiImage"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2331:1: entryRuleUiImage : ruleUiImage EOF ;
-    public final void entryRuleUiImage() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2332:1: ( ruleUiImage EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2333:1: ruleUiImage EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiImageRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiImage_in_entryRuleUiImage4928);
-            ruleUiImage();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiImageRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiImage4935); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiImage"
-
-
-    // $ANTLR start "ruleUiImage"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2340:1: ruleUiImage : ( ( rule__UiImage__Group__0 ) ) ;
-    public final void ruleUiImage() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2344:2: ( ( ( rule__UiImage__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2345:1: ( ( rule__UiImage__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2345:1: ( ( rule__UiImage__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2346:1: ( rule__UiImage__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiImageAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2347:1: ( rule__UiImage__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2347:2: rule__UiImage__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiImage__Group__0_in_ruleUiImage4961);
-            rule__UiImage__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiImageAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiImage"
-
-
-    // $ANTLR start "entryRuleUiTable"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2359:1: entryRuleUiTable : ruleUiTable EOF ;
-    public final void entryRuleUiTable() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2360:1: ( ruleUiTable EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2361:1: ruleUiTable EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiTableRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiTable_in_entryRuleUiTable4988);
-            ruleUiTable();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiTableRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiTable4995); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiTable"
-
-
-    // $ANTLR start "ruleUiTable"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2368:1: ruleUiTable : ( ( rule__UiTable__Group__0 ) ) ;
-    public final void ruleUiTable() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2372:2: ( ( ( rule__UiTable__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2373:1: ( ( rule__UiTable__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2373:1: ( ( rule__UiTable__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2374:1: ( rule__UiTable__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiTableAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2375:1: ( rule__UiTable__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2375:2: rule__UiTable__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiTable__Group__0_in_ruleUiTable5021);
-            rule__UiTable__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiTableAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiTable"
-
-
-    // $ANTLR start "entryRuleUiComboBox"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2387:1: entryRuleUiComboBox : ruleUiComboBox EOF ;
-    public final void entryRuleUiComboBox() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2388:1: ( ruleUiComboBox EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2389:1: ruleUiComboBox EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiComboBoxRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiComboBox_in_entryRuleUiComboBox5048);
-            ruleUiComboBox();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiComboBoxRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiComboBox5055); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiComboBox"
-
-
-    // $ANTLR start "ruleUiComboBox"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2396:1: ruleUiComboBox : ( ( rule__UiComboBox__Group__0 ) ) ;
-    public final void ruleUiComboBox() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2400:2: ( ( ( rule__UiComboBox__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2401:1: ( ( rule__UiComboBox__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2401:1: ( ( rule__UiComboBox__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2402:1: ( rule__UiComboBox__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiComboBoxAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2403:1: ( rule__UiComboBox__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2403:2: rule__UiComboBox__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiComboBox__Group__0_in_ruleUiComboBox5081);
-            rule__UiComboBox__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiComboBoxAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiComboBox"
-
-
-    // $ANTLR start "entryRuleUiButton"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2415:1: entryRuleUiButton : ruleUiButton EOF ;
-    public final void entryRuleUiButton() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2416:1: ( ruleUiButton EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2417:1: ruleUiButton EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiButtonRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiButton_in_entryRuleUiButton5108);
-            ruleUiButton();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiButtonRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiButton5115); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiButton"
-
-
-    // $ANTLR start "ruleUiButton"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2424:1: ruleUiButton : ( ( rule__UiButton__Group__0 ) ) ;
-    public final void ruleUiButton() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2428:2: ( ( ( rule__UiButton__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2429:1: ( ( rule__UiButton__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2429:1: ( ( rule__UiButton__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2430:1: ( rule__UiButton__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiButtonAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2431:1: ( rule__UiButton__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2431:2: rule__UiButton__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiButton__Group__0_in_ruleUiButton5141);
-            rule__UiButton__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiButtonAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiButton"
-
-
-    // $ANTLR start "entryRuleUiMobileNavigationButton"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2443:1: entryRuleUiMobileNavigationButton : ruleUiMobileNavigationButton EOF ;
-    public final void entryRuleUiMobileNavigationButton() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2444:1: ( ruleUiMobileNavigationButton EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2445:1: ruleUiMobileNavigationButton EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileNavigationButtonRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiMobileNavigationButton_in_entryRuleUiMobileNavigationButton5168);
-            ruleUiMobileNavigationButton();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileNavigationButtonRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiMobileNavigationButton5175); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiMobileNavigationButton"
-
-
-    // $ANTLR start "ruleUiMobileNavigationButton"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2452:1: ruleUiMobileNavigationButton : ( ( rule__UiMobileNavigationButton__Group__0 ) ) ;
-    public final void ruleUiMobileNavigationButton() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2456:2: ( ( ( rule__UiMobileNavigationButton__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2457:1: ( ( rule__UiMobileNavigationButton__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2457:1: ( ( rule__UiMobileNavigationButton__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2458:1: ( rule__UiMobileNavigationButton__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileNavigationButtonAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2459:1: ( rule__UiMobileNavigationButton__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2459:2: rule__UiMobileNavigationButton__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiMobileNavigationButton__Group__0_in_ruleUiMobileNavigationButton5201);
-            rule__UiMobileNavigationButton__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileNavigationButtonAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiMobileNavigationButton"
-
-
-    // $ANTLR start "entryRuleUiMobileSwitch"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2471:1: entryRuleUiMobileSwitch : ruleUiMobileSwitch EOF ;
-    public final void entryRuleUiMobileSwitch() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2472:1: ( ruleUiMobileSwitch EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2473:1: ruleUiMobileSwitch EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileSwitchRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiMobileSwitch_in_entryRuleUiMobileSwitch5228);
-            ruleUiMobileSwitch();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileSwitchRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiMobileSwitch5235); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiMobileSwitch"
-
-
-    // $ANTLR start "ruleUiMobileSwitch"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2480:1: ruleUiMobileSwitch : ( ( rule__UiMobileSwitch__Group__0 ) ) ;
-    public final void ruleUiMobileSwitch() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2484:2: ( ( ( rule__UiMobileSwitch__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2485:1: ( ( rule__UiMobileSwitch__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2485:1: ( ( rule__UiMobileSwitch__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2486:1: ( rule__UiMobileSwitch__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileSwitchAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2487:1: ( rule__UiMobileSwitch__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2487:2: rule__UiMobileSwitch__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiMobileSwitch__Group__0_in_ruleUiMobileSwitch5261);
-            rule__UiMobileSwitch__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileSwitchAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiMobileSwitch"
-
-
-    // $ANTLR start "entryRuleUiLabel"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2499:1: entryRuleUiLabel : ruleUiLabel EOF ;
-    public final void entryRuleUiLabel() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2500:1: ( ruleUiLabel EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2501:1: ruleUiLabel EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiLabelRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiLabel_in_entryRuleUiLabel5288);
-            ruleUiLabel();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiLabelRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiLabel5295); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiLabel"
-
-
-    // $ANTLR start "ruleUiLabel"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2508:1: ruleUiLabel : ( ( rule__UiLabel__Group__0 ) ) ;
-    public final void ruleUiLabel() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2512:2: ( ( ( rule__UiLabel__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2513:1: ( ( rule__UiLabel__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2513:1: ( ( rule__UiLabel__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2514:1: ( rule__UiLabel__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiLabelAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2515:1: ( rule__UiLabel__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2515:2: rule__UiLabel__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiLabel__Group__0_in_ruleUiLabel5321);
-            rule__UiLabel__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiLabelAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiLabel"
-
-
-    // $ANTLR start "entryRuleUiDecimalField"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2527:1: entryRuleUiDecimalField : ruleUiDecimalField EOF ;
-    public final void entryRuleUiDecimalField() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2528:1: ( ruleUiDecimalField EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2529:1: ruleUiDecimalField EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiDecimalFieldRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiDecimalField_in_entryRuleUiDecimalField5348);
-            ruleUiDecimalField();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiDecimalFieldRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiDecimalField5355); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiDecimalField"
-
-
-    // $ANTLR start "ruleUiDecimalField"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2536:1: ruleUiDecimalField : ( ( rule__UiDecimalField__Group__0 ) ) ;
-    public final void ruleUiDecimalField() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2540:2: ( ( ( rule__UiDecimalField__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2541:1: ( ( rule__UiDecimalField__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2541:1: ( ( rule__UiDecimalField__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2542:1: ( rule__UiDecimalField__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiDecimalFieldAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2543:1: ( rule__UiDecimalField__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2543:2: rule__UiDecimalField__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiDecimalField__Group__0_in_ruleUiDecimalField5381);
-            rule__UiDecimalField__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiDecimalFieldAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiDecimalField"
-
-
-    // $ANTLR start "entryRuleUiOptionsGroup"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2555:1: entryRuleUiOptionsGroup : ruleUiOptionsGroup EOF ;
-    public final void entryRuleUiOptionsGroup() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2556:1: ( ruleUiOptionsGroup EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2557:1: ruleUiOptionsGroup EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiOptionsGroupRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiOptionsGroup_in_entryRuleUiOptionsGroup5408);
-            ruleUiOptionsGroup();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiOptionsGroupRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiOptionsGroup5415); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiOptionsGroup"
-
-
-    // $ANTLR start "ruleUiOptionsGroup"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2564:1: ruleUiOptionsGroup : ( ( rule__UiOptionsGroup__Group__0 ) ) ;
-    public final void ruleUiOptionsGroup() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2568:2: ( ( ( rule__UiOptionsGroup__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2569:1: ( ( rule__UiOptionsGroup__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2569:1: ( ( rule__UiOptionsGroup__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2570:1: ( rule__UiOptionsGroup__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiOptionsGroupAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2571:1: ( rule__UiOptionsGroup__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2571:2: rule__UiOptionsGroup__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiOptionsGroup__Group__0_in_ruleUiOptionsGroup5441);
-            rule__UiOptionsGroup__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiOptionsGroupAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiOptionsGroup"
-
-
-    // $ANTLR start "entryRuleUiList"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2583:1: entryRuleUiList : ruleUiList EOF ;
-    public final void entryRuleUiList() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2584:1: ( ruleUiList EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2585:1: ruleUiList EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiListRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiList_in_entryRuleUiList5468);
-            ruleUiList();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiListRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiList5475); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiList"
-
-
-    // $ANTLR start "ruleUiList"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2592:1: ruleUiList : ( ( rule__UiList__Group__0 ) ) ;
-    public final void ruleUiList() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2596:2: ( ( ( rule__UiList__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2597:1: ( ( rule__UiList__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2597:1: ( ( rule__UiList__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2598:1: ( rule__UiList__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiListAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2599:1: ( rule__UiList__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2599:2: rule__UiList__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiList__Group__0_in_ruleUiList5501);
-            rule__UiList__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiListAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiList"
-
-
-    // $ANTLR start "entryRuleUiColumnsAssignment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2611:1: entryRuleUiColumnsAssignment : ruleUiColumnsAssignment EOF ;
-    public final void entryRuleUiColumnsAssignment() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2612:1: ( ruleUiColumnsAssignment EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2613:1: ruleUiColumnsAssignment EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiColumnsAssignmentRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiColumnsAssignment_in_entryRuleUiColumnsAssignment5528);
-            ruleUiColumnsAssignment();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiColumnsAssignmentRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiColumnsAssignment5535); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiColumnsAssignment"
-
-
-    // $ANTLR start "ruleUiColumnsAssignment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2620:1: ruleUiColumnsAssignment : ( ( rule__UiColumnsAssignment__Group__0 ) ) ;
-    public final void ruleUiColumnsAssignment() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2624:2: ( ( ( rule__UiColumnsAssignment__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2625:1: ( ( rule__UiColumnsAssignment__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2625:1: ( ( rule__UiColumnsAssignment__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2626:1: ( rule__UiColumnsAssignment__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiColumnsAssignmentAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2627:1: ( rule__UiColumnsAssignment__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2627:2: rule__UiColumnsAssignment__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiColumnsAssignment__Group__0_in_ruleUiColumnsAssignment5561);
-            rule__UiColumnsAssignment__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiColumnsAssignmentAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiColumnsAssignment"
-
-
-    // $ANTLR start "entryRuleUiSortOrderAssignment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2639:1: entryRuleUiSortOrderAssignment : ruleUiSortOrderAssignment EOF ;
-    public final void entryRuleUiSortOrderAssignment() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2640:1: ( ruleUiSortOrderAssignment EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2641:1: ruleUiSortOrderAssignment EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiSortOrderAssignmentRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiSortOrderAssignment_in_entryRuleUiSortOrderAssignment5588);
-            ruleUiSortOrderAssignment();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiSortOrderAssignmentRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiSortOrderAssignment5595); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiSortOrderAssignment"
-
-
-    // $ANTLR start "ruleUiSortOrderAssignment"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2648:1: ruleUiSortOrderAssignment : ( ( rule__UiSortOrderAssignment__Group__0 ) ) ;
-    public final void ruleUiSortOrderAssignment() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2652:2: ( ( ( rule__UiSortOrderAssignment__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2653:1: ( ( rule__UiSortOrderAssignment__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2653:1: ( ( rule__UiSortOrderAssignment__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2654:1: ( rule__UiSortOrderAssignment__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiSortOrderAssignmentAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2655:1: ( rule__UiSortOrderAssignment__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2655:2: rule__UiSortOrderAssignment__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiSortOrderAssignment__Group__0_in_ruleUiSortOrderAssignment5621);
-            rule__UiSortOrderAssignment__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiSortOrderAssignmentAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiSortOrderAssignment"
-
-
-    // $ANTLR start "entryRuleUiSortOrder"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2667:1: entryRuleUiSortOrder : ruleUiSortOrder EOF ;
-    public final void entryRuleUiSortOrder() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2668:1: ( ruleUiSortOrder EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2669:1: ruleUiSortOrder EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiSortOrderRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiSortOrder_in_entryRuleUiSortOrder5648);
-            ruleUiSortOrder();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiSortOrderRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiSortOrder5655); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiSortOrder"
-
-
-    // $ANTLR start "ruleUiSortOrder"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2676:1: ruleUiSortOrder : ( ( rule__UiSortOrder__Group__0 ) ) ;
-    public final void ruleUiSortOrder() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2680:2: ( ( ( rule__UiSortOrder__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2681:1: ( ( rule__UiSortOrder__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2681:1: ( ( rule__UiSortOrder__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2682:1: ( rule__UiSortOrder__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiSortOrderAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2683:1: ( rule__UiSortOrder__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2683:2: rule__UiSortOrder__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiSortOrder__Group__0_in_ruleUiSortOrder5681);
-            rule__UiSortOrder__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiSortOrderAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiSortOrder"
-
-
-    // $ANTLR start "entryRuleUiColumn"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2695:1: entryRuleUiColumn : ruleUiColumn EOF ;
-    public final void entryRuleUiColumn() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2696:1: ( ruleUiColumn EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2697:1: ruleUiColumn EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiColumnRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiColumn_in_entryRuleUiColumn5708);
-            ruleUiColumn();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiColumnRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiColumn5715); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiColumn"
-
-
-    // $ANTLR start "ruleUiColumn"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2704:1: ruleUiColumn : ( ( rule__UiColumn__Group__0 ) ) ;
-    public final void ruleUiColumn() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2708:2: ( ( ( rule__UiColumn__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2709:1: ( ( rule__UiColumn__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2709:1: ( ( rule__UiColumn__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2710:1: ( rule__UiColumn__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiColumnAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2711:1: ( rule__UiColumn__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2711:2: rule__UiColumn__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiColumn__Group__0_in_ruleUiColumn5741);
-            rule__UiColumn__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiColumnAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiColumn"
-
-
-    // $ANTLR start "entryRuleUiEmbeddable"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2723:1: entryRuleUiEmbeddable : ruleUiEmbeddable EOF ;
-    public final void entryRuleUiEmbeddable() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2724:1: ( ruleUiEmbeddable EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2725:1: ruleUiEmbeddable EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiEmbeddableRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiEmbeddable_in_entryRuleUiEmbeddable5768);
-            ruleUiEmbeddable();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiEmbeddableRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiEmbeddable5775); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiEmbeddable"
-
-
-    // $ANTLR start "ruleUiEmbeddable"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2732:1: ruleUiEmbeddable : ( ( rule__UiEmbeddable__Alternatives ) ) ;
-    public final void ruleUiEmbeddable() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2736:2: ( ( ( rule__UiEmbeddable__Alternatives ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2737:1: ( ( rule__UiEmbeddable__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2737:1: ( ( rule__UiEmbeddable__Alternatives ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2738:1: ( rule__UiEmbeddable__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiEmbeddableAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2739:1: ( rule__UiEmbeddable__Alternatives )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2739:2: rule__UiEmbeddable__Alternatives
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiEmbeddable__Alternatives_in_ruleUiEmbeddable5801);
-            rule__UiEmbeddable__Alternatives();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiEmbeddableAccess().getAlternatives()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiEmbeddable"
-
-
-    // $ANTLR start "entryRuleUiMobileEmbeddable"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2751:1: entryRuleUiMobileEmbeddable : ruleUiMobileEmbeddable EOF ;
-    public final void entryRuleUiMobileEmbeddable() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2752:1: ( ruleUiMobileEmbeddable EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2753:1: ruleUiMobileEmbeddable EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileEmbeddableRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiMobileEmbeddable_in_entryRuleUiMobileEmbeddable5828);
-            ruleUiMobileEmbeddable();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileEmbeddableRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiMobileEmbeddable5835); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiMobileEmbeddable"
-
-
-    // $ANTLR start "ruleUiMobileEmbeddable"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2760:1: ruleUiMobileEmbeddable : ( ( rule__UiMobileEmbeddable__Alternatives ) ) ;
-    public final void ruleUiMobileEmbeddable() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2764:2: ( ( ( rule__UiMobileEmbeddable__Alternatives ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2765:1: ( ( rule__UiMobileEmbeddable__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2765:1: ( ( rule__UiMobileEmbeddable__Alternatives ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2766:1: ( rule__UiMobileEmbeddable__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileEmbeddableAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2767:1: ( rule__UiMobileEmbeddable__Alternatives )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2767:2: rule__UiMobileEmbeddable__Alternatives
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiMobileEmbeddable__Alternatives_in_ruleUiMobileEmbeddable5861);
-            rule__UiMobileEmbeddable__Alternatives();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileEmbeddableAccess().getAlternatives()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiMobileEmbeddable"
-
-
-    // $ANTLR start "entryRuleUiMobileLayout"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2779:1: entryRuleUiMobileLayout : ruleUiMobileLayout EOF ;
-    public final void entryRuleUiMobileLayout() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2780:1: ( ruleUiMobileLayout EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2781:1: ruleUiMobileLayout EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileLayoutRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiMobileLayout_in_entryRuleUiMobileLayout5888);
-            ruleUiMobileLayout();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileLayoutRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiMobileLayout5895); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiMobileLayout"
-
-
-    // $ANTLR start "ruleUiMobileLayout"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2788:1: ruleUiMobileLayout : ( ( rule__UiMobileLayout__Alternatives ) ) ;
-    public final void ruleUiMobileLayout() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2792:2: ( ( ( rule__UiMobileLayout__Alternatives ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2793:1: ( ( rule__UiMobileLayout__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2793:1: ( ( rule__UiMobileLayout__Alternatives ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2794:1: ( rule__UiMobileLayout__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileLayoutAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2795:1: ( rule__UiMobileLayout__Alternatives )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2795:2: rule__UiMobileLayout__Alternatives
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiMobileLayout__Alternatives_in_ruleUiMobileLayout5921);
-            rule__UiMobileLayout__Alternatives();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileLayoutAccess().getAlternatives()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiMobileLayout"
-
-
-    // $ANTLR start "entryRuleUiMobileField"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2807:1: entryRuleUiMobileField : ruleUiMobileField EOF ;
-    public final void entryRuleUiMobileField() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2808:1: ( ruleUiMobileField EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2809:1: ruleUiMobileField EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileFieldRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiMobileField_in_entryRuleUiMobileField5948);
-            ruleUiMobileField();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileFieldRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiMobileField5955); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiMobileField"
-
-
-    // $ANTLR start "ruleUiMobileField"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2816:1: ruleUiMobileField : ( ( rule__UiMobileField__Alternatives ) ) ;
-    public final void ruleUiMobileField() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2820:2: ( ( ( rule__UiMobileField__Alternatives ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2821:1: ( ( rule__UiMobileField__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2821:1: ( ( rule__UiMobileField__Alternatives ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2822:1: ( rule__UiMobileField__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileFieldAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2823:1: ( rule__UiMobileField__Alternatives )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2823:2: rule__UiMobileField__Alternatives
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiMobileField__Alternatives_in_ruleUiMobileField5981);
-            rule__UiMobileField__Alternatives();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileFieldAccess().getAlternatives()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiMobileField"
-
-
-    // $ANTLR start "entryRuleUiLayout"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2835:1: entryRuleUiLayout : ruleUiLayout EOF ;
-    public final void entryRuleUiLayout() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2836:1: ( ruleUiLayout EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2837:1: ruleUiLayout EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiLayoutRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiLayout_in_entryRuleUiLayout6008);
-            ruleUiLayout();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiLayoutRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiLayout6015); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiLayout"
-
-
-    // $ANTLR start "ruleUiLayout"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2844:1: ruleUiLayout : ( ( rule__UiLayout__Alternatives ) ) ;
-    public final void ruleUiLayout() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2848:2: ( ( ( rule__UiLayout__Alternatives ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2849:1: ( ( rule__UiLayout__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2849:1: ( ( rule__UiLayout__Alternatives ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2850:1: ( rule__UiLayout__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiLayoutAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2851:1: ( rule__UiLayout__Alternatives )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2851:2: rule__UiLayout__Alternatives
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiLayout__Alternatives_in_ruleUiLayout6041);
-            rule__UiLayout__Alternatives();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiLayoutAccess().getAlternatives()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiLayout"
-
-
-    // $ANTLR start "entryRuleUiField"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2863:1: entryRuleUiField : ruleUiField EOF ;
-    public final void entryRuleUiField() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2864:1: ( ruleUiField EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2865:1: ruleUiField EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiFieldRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiField_in_entryRuleUiField6068);
-            ruleUiField();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiFieldRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiField6075); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiField"
-
-
-    // $ANTLR start "ruleUiField"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2872:1: ruleUiField : ( ( rule__UiField__Alternatives ) ) ;
-    public final void ruleUiField() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2876:2: ( ( ( rule__UiField__Alternatives ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2877:1: ( ( rule__UiField__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2877:1: ( ( rule__UiField__Alternatives ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2878:1: ( rule__UiField__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiFieldAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2879:1: ( rule__UiField__Alternatives )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2879:2: rule__UiField__Alternatives
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiField__Alternatives_in_ruleUiField6101);
-            rule__UiField__Alternatives();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiFieldAccess().getAlternatives()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiField"
-
-
-    // $ANTLR start "entryRuleUiAction"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2891:1: entryRuleUiAction : ruleUiAction EOF ;
-    public final void entryRuleUiAction() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2892:1: ( ruleUiAction EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2893:1: ruleUiAction EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiActionRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiAction_in_entryRuleUiAction6128);
-            ruleUiAction();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiActionRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiAction6135); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiAction"
-
-
-    // $ANTLR start "ruleUiAction"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2900:1: ruleUiAction : ( ruleUiButton ) ;
-    public final void ruleUiAction() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2904:2: ( ( ruleUiButton ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2905:1: ( ruleUiButton )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2905:1: ( ruleUiButton )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2906:1: ruleUiButton
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiActionAccess().getUiButtonParserRuleCall()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiButton_in_ruleUiAction6161);
-            ruleUiButton();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiActionAccess().getUiButtonParserRuleCall()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiAction"
-
-
-    // $ANTLR start "entryRuleUiMobileAction"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2919:1: entryRuleUiMobileAction : ruleUiMobileAction EOF ;
-    public final void entryRuleUiMobileAction() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2920:1: ( ruleUiMobileAction EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2921:1: ruleUiMobileAction EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileActionRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiMobileAction_in_entryRuleUiMobileAction6187);
-            ruleUiMobileAction();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileActionRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiMobileAction6194); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiMobileAction"
-
-
-    // $ANTLR start "ruleUiMobileAction"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2928:1: ruleUiMobileAction : ( ( rule__UiMobileAction__Alternatives ) ) ;
-    public final void ruleUiMobileAction() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2932:2: ( ( ( rule__UiMobileAction__Alternatives ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2933:1: ( ( rule__UiMobileAction__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2933:1: ( ( rule__UiMobileAction__Alternatives ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2934:1: ( rule__UiMobileAction__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMobileActionAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2935:1: ( rule__UiMobileAction__Alternatives )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2935:2: rule__UiMobileAction__Alternatives
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiMobileAction__Alternatives_in_ruleUiMobileAction6220);
-            rule__UiMobileAction__Alternatives();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMobileActionAccess().getAlternatives()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiMobileAction"
-
-
-    // $ANTLR start "entryRuleUiNumericField"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2947:1: entryRuleUiNumericField : ruleUiNumericField EOF ;
-    public final void entryRuleUiNumericField() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2948:1: ( ruleUiNumericField EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2949:1: ruleUiNumericField EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiNumericFieldRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiNumericField_in_entryRuleUiNumericField6247);
-            ruleUiNumericField();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiNumericFieldRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiNumericField6254); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiNumericField"
-
-
-    // $ANTLR start "ruleUiNumericField"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2956:1: ruleUiNumericField : ( ( rule__UiNumericField__Group__0 ) ) ;
-    public final void ruleUiNumericField() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2960:2: ( ( ( rule__UiNumericField__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2961:1: ( ( rule__UiNumericField__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2961:1: ( ( rule__UiNumericField__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2962:1: ( rule__UiNumericField__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiNumericFieldAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2963:1: ( rule__UiNumericField__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2963:2: rule__UiNumericField__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiNumericField__Group__0_in_ruleUiNumericField6280);
-            rule__UiNumericField__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiNumericFieldAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiNumericField"
-
-
-    // $ANTLR start "entryRuleUiCheckBox"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2975:1: entryRuleUiCheckBox : ruleUiCheckBox EOF ;
-    public final void entryRuleUiCheckBox() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2976:1: ( ruleUiCheckBox EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2977:1: ruleUiCheckBox EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiCheckBoxRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiCheckBox_in_entryRuleUiCheckBox6307);
-            ruleUiCheckBox();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiCheckBoxRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiCheckBox6314); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiCheckBox"
-
-
-    // $ANTLR start "ruleUiCheckBox"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2984:1: ruleUiCheckBox : ( ( rule__UiCheckBox__Group__0 ) ) ;
-    public final void ruleUiCheckBox() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2988:2: ( ( ( rule__UiCheckBox__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2989:1: ( ( rule__UiCheckBox__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2989:1: ( ( rule__UiCheckBox__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2990:1: ( rule__UiCheckBox__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiCheckBoxAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2991:1: ( rule__UiCheckBox__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:2991:2: rule__UiCheckBox__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiCheckBox__Group__0_in_ruleUiCheckBox6340);
-            rule__UiCheckBox__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiCheckBoxAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiCheckBox"
-
-
-    // $ANTLR start "entryRuleUiValidator"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3003:1: entryRuleUiValidator : ruleUiValidator EOF ;
-    public final void entryRuleUiValidator() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3004:1: ( ruleUiValidator EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3005:1: ruleUiValidator EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiValidatorRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiValidator_in_entryRuleUiValidator6367);
-            ruleUiValidator();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiValidatorRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiValidator6374); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiValidator"
-
-
-    // $ANTLR start "ruleUiValidator"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3012:1: ruleUiValidator : ( ( rule__UiValidator__Alternatives ) ) ;
-    public final void ruleUiValidator() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3016:2: ( ( ( rule__UiValidator__Alternatives ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3017:1: ( ( rule__UiValidator__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3017:1: ( ( rule__UiValidator__Alternatives ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3018:1: ( rule__UiValidator__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiValidatorAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3019:1: ( rule__UiValidator__Alternatives )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3019:2: rule__UiValidator__Alternatives
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiValidator__Alternatives_in_ruleUiValidator6400);
-            rule__UiValidator__Alternatives();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiValidatorAccess().getAlternatives()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiValidator"
-
-
-    // $ANTLR start "entryRuleUiMaxLengthValidator"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3031:1: entryRuleUiMaxLengthValidator : ruleUiMaxLengthValidator EOF ;
-    public final void entryRuleUiMaxLengthValidator() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3032:1: ( ruleUiMaxLengthValidator EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3033:1: ruleUiMaxLengthValidator EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMaxLengthValidatorRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiMaxLengthValidator_in_entryRuleUiMaxLengthValidator6427);
-            ruleUiMaxLengthValidator();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMaxLengthValidatorRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiMaxLengthValidator6434); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiMaxLengthValidator"
-
-
-    // $ANTLR start "ruleUiMaxLengthValidator"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3040:1: ruleUiMaxLengthValidator : ( ( rule__UiMaxLengthValidator__Group__0 ) ) ;
-    public final void ruleUiMaxLengthValidator() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3044:2: ( ( ( rule__UiMaxLengthValidator__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3045:1: ( ( rule__UiMaxLengthValidator__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3045:1: ( ( rule__UiMaxLengthValidator__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3046:1: ( rule__UiMaxLengthValidator__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMaxLengthValidatorAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3047:1: ( rule__UiMaxLengthValidator__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3047:2: rule__UiMaxLengthValidator__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiMaxLengthValidator__Group__0_in_ruleUiMaxLengthValidator6460);
-            rule__UiMaxLengthValidator__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMaxLengthValidatorAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiMaxLengthValidator"
-
-
-    // $ANTLR start "entryRuleUiMinLengthValidator"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3059:1: entryRuleUiMinLengthValidator : ruleUiMinLengthValidator EOF ;
-    public final void entryRuleUiMinLengthValidator() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3060:1: ( ruleUiMinLengthValidator EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3061:1: ruleUiMinLengthValidator EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMinLengthValidatorRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiMinLengthValidator_in_entryRuleUiMinLengthValidator6487);
-            ruleUiMinLengthValidator();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMinLengthValidatorRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiMinLengthValidator6494); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiMinLengthValidator"
-
-
-    // $ANTLR start "ruleUiMinLengthValidator"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3068:1: ruleUiMinLengthValidator : ( ( rule__UiMinLengthValidator__Group__0 ) ) ;
-    public final void ruleUiMinLengthValidator() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3072:2: ( ( ( rule__UiMinLengthValidator__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3073:1: ( ( rule__UiMinLengthValidator__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3073:1: ( ( rule__UiMinLengthValidator__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3074:1: ( rule__UiMinLengthValidator__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiMinLengthValidatorAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3075:1: ( rule__UiMinLengthValidator__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3075:2: rule__UiMinLengthValidator__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiMinLengthValidator__Group__0_in_ruleUiMinLengthValidator6520);
-            rule__UiMinLengthValidator__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiMinLengthValidatorAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiMinLengthValidator"
-
-
-    // $ANTLR start "entryRuleUiRegexpValidator"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3087:1: entryRuleUiRegexpValidator : ruleUiRegexpValidator EOF ;
-    public final void entryRuleUiRegexpValidator() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3088:1: ( ruleUiRegexpValidator EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3089:1: ruleUiRegexpValidator EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiRegexpValidatorRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiRegexpValidator_in_entryRuleUiRegexpValidator6547);
-            ruleUiRegexpValidator();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiRegexpValidatorRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiRegexpValidator6554); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiRegexpValidator"
-
-
-    // $ANTLR start "ruleUiRegexpValidator"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3096:1: ruleUiRegexpValidator : ( ( rule__UiRegexpValidator__Group__0 ) ) ;
-    public final void ruleUiRegexpValidator() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3100:2: ( ( ( rule__UiRegexpValidator__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3101:1: ( ( rule__UiRegexpValidator__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3101:1: ( ( rule__UiRegexpValidator__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3102:1: ( rule__UiRegexpValidator__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiRegexpValidatorAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3103:1: ( rule__UiRegexpValidator__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3103:2: rule__UiRegexpValidator__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiRegexpValidator__Group__0_in_ruleUiRegexpValidator6580);
-            rule__UiRegexpValidator__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiRegexpValidatorAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiRegexpValidator"
-
-
-    // $ANTLR start "entryRuleUiXbaseValidator"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3115:1: entryRuleUiXbaseValidator : ruleUiXbaseValidator EOF ;
-    public final void entryRuleUiXbaseValidator() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3116:1: ( ruleUiXbaseValidator EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3117:1: ruleUiXbaseValidator EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiXbaseValidatorRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiXbaseValidator_in_entryRuleUiXbaseValidator6607);
-            ruleUiXbaseValidator();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiXbaseValidatorRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiXbaseValidator6614); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiXbaseValidator"
-
-
-    // $ANTLR start "ruleUiXbaseValidator"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3124:1: ruleUiXbaseValidator : ( ( rule__UiXbaseValidator__Group__0 ) ) ;
-    public final void ruleUiXbaseValidator() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3128:2: ( ( ( rule__UiXbaseValidator__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3129:1: ( ( rule__UiXbaseValidator__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3129:1: ( ( rule__UiXbaseValidator__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3130:1: ( rule__UiXbaseValidator__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiXbaseValidatorAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3131:1: ( rule__UiXbaseValidator__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3131:2: rule__UiXbaseValidator__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiXbaseValidator__Group__0_in_ruleUiXbaseValidator6640);
-            rule__UiXbaseValidator__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiXbaseValidatorAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiXbaseValidator"
-
-
-    // $ANTLR start "entryRuleUiBeanValidationValidator"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3143:1: entryRuleUiBeanValidationValidator : ruleUiBeanValidationValidator EOF ;
-    public final void entryRuleUiBeanValidationValidator() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3144:1: ( ruleUiBeanValidationValidator EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3145:1: ruleUiBeanValidationValidator EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiBeanValidationValidatorRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiBeanValidationValidator_in_entryRuleUiBeanValidationValidator6667);
-            ruleUiBeanValidationValidator();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiBeanValidationValidatorRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiBeanValidationValidator6674); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiBeanValidationValidator"
-
-
-    // $ANTLR start "ruleUiBeanValidationValidator"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3152:1: ruleUiBeanValidationValidator : ( ( rule__UiBeanValidationValidator__Group__0 ) ) ;
-    public final void ruleUiBeanValidationValidator() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3156:2: ( ( ( rule__UiBeanValidationValidator__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3157:1: ( ( rule__UiBeanValidationValidator__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3157:1: ( ( rule__UiBeanValidationValidator__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3158:1: ( rule__UiBeanValidationValidator__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiBeanValidationValidatorAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3159:1: ( rule__UiBeanValidationValidator__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3159:2: rule__UiBeanValidationValidator__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiBeanValidationValidator__Group__0_in_ruleUiBeanValidationValidator6700);
-            rule__UiBeanValidationValidator__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiBeanValidationValidatorAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiBeanValidationValidator"
-
-
-    // $ANTLR start "entryRuleUiErrorCode"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3171:1: entryRuleUiErrorCode : ruleUiErrorCode EOF ;
-    public final void entryRuleUiErrorCode() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3172:1: ( ruleUiErrorCode EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3173:1: ruleUiErrorCode EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiErrorCodeRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiErrorCode_in_entryRuleUiErrorCode6727);
-            ruleUiErrorCode();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiErrorCodeRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiErrorCode6734); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiErrorCode"
-
-
-    // $ANTLR start "ruleUiErrorCode"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3180:1: ruleUiErrorCode : ( ( rule__UiErrorCode__Group__0 ) ) ;
-    public final void ruleUiErrorCode() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3184:2: ( ( ( rule__UiErrorCode__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3185:1: ( ( rule__UiErrorCode__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3185:1: ( ( rule__UiErrorCode__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3186:1: ( rule__UiErrorCode__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiErrorCodeAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3187:1: ( rule__UiErrorCode__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3187:2: rule__UiErrorCode__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiErrorCode__Group__0_in_ruleUiErrorCode6760);
-            rule__UiErrorCode__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiErrorCodeAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiErrorCode"
-
-
-    // $ANTLR start "entryRuleUiVisibilityProcessor"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3199:1: entryRuleUiVisibilityProcessor : ruleUiVisibilityProcessor EOF ;
-    public final void entryRuleUiVisibilityProcessor() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3200:1: ( ruleUiVisibilityProcessor EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3201:1: ruleUiVisibilityProcessor EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiVisibilityProcessorRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiVisibilityProcessor_in_entryRuleUiVisibilityProcessor6787);
-            ruleUiVisibilityProcessor();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiVisibilityProcessorRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiVisibilityProcessor6794); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiVisibilityProcessor"
-
-
-    // $ANTLR start "ruleUiVisibilityProcessor"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3208:1: ruleUiVisibilityProcessor : ( ( rule__UiVisibilityProcessor__Group__0 ) ) ;
-    public final void ruleUiVisibilityProcessor() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3212:2: ( ( ( rule__UiVisibilityProcessor__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3213:1: ( ( rule__UiVisibilityProcessor__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3213:1: ( ( rule__UiVisibilityProcessor__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3214:1: ( rule__UiVisibilityProcessor__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiVisibilityProcessorAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3215:1: ( rule__UiVisibilityProcessor__Group__0 )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3215:2: rule__UiVisibilityProcessor__Group__0
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiVisibilityProcessor__Group__0_in_ruleUiVisibilityProcessor6820);
-            rule__UiVisibilityProcessor__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiVisibilityProcessorAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiVisibilityProcessor"
-
-
-    // $ANTLR start "entryRuleUiXbaseVisibilityRule"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3227:1: entryRuleUiXbaseVisibilityRule : ruleUiXbaseVisibilityRule EOF ;
-    public final void entryRuleUiXbaseVisibilityRule() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3228:1: ( ruleUiXbaseVisibilityRule EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3229:1: ruleUiXbaseVisibilityRule EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiXbaseVisibilityRuleRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiXbaseVisibilityRule_in_entryRuleUiXbaseVisibilityRule6847);
-            ruleUiXbaseVisibilityRule();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiXbaseVisibilityRuleRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiXbaseVisibilityRule6854); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUiXbaseVisibilityRule"
-
-
-    // $ANTLR start "ruleUiXbaseVisibilityRule"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3236:1: ruleUiXbaseVisibilityRule : ( ( rule__UiXbaseVisibilityRule__ExpressionAssignment ) ) ;
-    public final void ruleUiXbaseVisibilityRule() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3240:2: ( ( ( rule__UiXbaseVisibilityRule__ExpressionAssignment ) ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3241:1: ( ( rule__UiXbaseVisibilityRule__ExpressionAssignment ) )
-            {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3241:1: ( ( rule__UiXbaseVisibilityRule__ExpressionAssignment ) )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3242:1: ( rule__UiXbaseVisibilityRule__ExpressionAssignment )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiXbaseVisibilityRuleAccess().getExpressionAssignment()); 
-            }
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3243:1: ( rule__UiXbaseVisibilityRule__ExpressionAssignment )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3243:2: rule__UiXbaseVisibilityRule__ExpressionAssignment
-            {
-            pushFollow(FollowSets000.FOLLOW_rule__UiXbaseVisibilityRule__ExpressionAssignment_in_ruleUiXbaseVisibilityRule6880);
-            rule__UiXbaseVisibilityRule__ExpressionAssignment();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiXbaseVisibilityRuleAccess().getExpressionAssignment()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUiXbaseVisibilityRule"
-
-
-    // $ANTLR start "entryRuleUiChangeTrigger"
-    // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3255:1: entryRuleUiChangeTrigger : ruleUiChangeTrigger EOF ;
-    public final void entryRuleUiChangeTrigger() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3256:1: ( ruleUiChangeTrigger EOF )
-            // ../org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/antlr/internal/InternalUIGrammar.g:3257:1: ruleUiChangeTrigger EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUiChangeTriggerRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiChangeTrigger_in_entryRuleUiChangeTrigger6907);
-            ruleUiChangeTrigger();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUiChangeTriggerRule()); 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiChangeTrigger6914); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
diff --git a/org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/internal/UIGrammarActivator.java b/org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/internal/UIGrammarActivator.java
deleted file mode 100644
index 41a59dc..0000000
--- a/org.eclipse.osbp.ecview.dsl.ui/src-gen/org/eclipse/osbp/ecview/dsl/ui/internal/UIGrammarActivator.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/**
- * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf), Loetz GmbH&Co.KG (Heidelberg)
- * 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:
- *         Florian Pirchner - Initial implementation
- */
-
-package org.eclipse.osbp.ecview.dsl.ui.internal;
-
-import java.util.Collections;
-import java.util.Map;
-
-import org.apache.log4j.Logger;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.eclipse.xtext.ui.shared.SharedStateModule;
-import org.eclipse.xtext.util.Modules2;
-import org.osgi.framework.BundleContext;
-
-import com.google.common.collect.Maps;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-import com.google.inject.Module;
-
-/**
- * This class was generated. Customizations should only happen in a newly
- * introduced subclass. 
- */
-public class UIGrammarActivator extends AbstractUIPlugin {
-	
-	public static final String ORG_ECLIPSE_OSBP_ECVIEW_DSL_UIGRAMMAR = "org.eclipse.osbp.ecview.dsl.UIGrammar";
-	
-	private static final Logger logger = Logger.getLogger(UIGrammarActivator.class);
-	
-	private static UIGrammarActivator 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 UIGrammarActivator 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_ECVIEW_DSL_UIGRAMMAR.equals(grammar)) {
-			return new org.eclipse.osbp.ecview.dsl.UIGrammarRuntimeModule();
-		}
-		
-		throw new IllegalArgumentException(grammar);
-	}
-	
-	protected Module getUiModule(String grammar) {
-		if (ORG_ECLIPSE_OSBP_ECVIEW_DSL_UIGRAMMAR.equals(grammar)) {
-			return new org.eclipse.osbp.ecview.dsl.ui.UIGrammarUiModule(this);
-		}
-		
-		throw new IllegalArgumentException(grammar);
-	}
-	
-	protected Module getSharedStateModule() {
-		return new SharedStateModule();
-	}
-	
-}
diff --git a/org.eclipse.osbp.ecview.dsl.ui/src/org/eclipse/osbp/ecview/dsl/ui/UIGrammarUiModule.java b/org.eclipse.osbp.ecview.dsl.ui/src/org/eclipse/osbp/ecview/dsl/ui/UIGrammarUiModule.java
index 2f276f6..803bca4 100644
--- a/org.eclipse.osbp.ecview.dsl.ui/src/org/eclipse/osbp/ecview/dsl/ui/UIGrammarUiModule.java
+++ b/org.eclipse.osbp.ecview.dsl.ui/src/org/eclipse/osbp/ecview/dsl/ui/UIGrammarUiModule.java
@@ -10,7 +10,6 @@
  */
 package org.eclipse.osbp.ecview.dsl.ui;
 
-import org.eclipse.ui.plugin.AbstractUIPlugin;
 import org.eclipse.osbp.ecview.dsl.ui.hover.UiGrammarHoverDocumentationProvider;
 import org.eclipse.osbp.ide.core.api.i18n.II18nRegistry;
 import org.eclipse.osbp.xtext.builder.types.loader.api.ITypeLoaderFactory;
@@ -19,6 +18,13 @@
 import org.eclipse.osbp.xtext.builder.ui.access.jdt.IJdtTypeLoaderProvider;
 import org.eclipse.osbp.xtext.builder.ui.access.jdt.impl.JdtTypeLoaderFactory;
 import org.eclipse.osbp.xtext.builder.ui.access.jdt.impl.JdtTypeLoaderProvider;
+import org.eclipse.osbp.xtext.oxtype.imports.IUnresolvedEObjectResolver;
+import org.eclipse.osbp.xtext.oxtype.ui.contentassist.OXTypeReplacingAppendable;
+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.xbase.ui.contentassist.ReplacingAppendable;
+import org.eclipse.xtext.xbase.ui.quickfix.JavaTypeQuickfixes;
 
 import com.google.inject.Binder;
 import com.google.inject.Singleton;
@@ -46,13 +52,25 @@
 		binder.bind(IJdtTypeLoaderProvider.class)
 				.to(JdtTypeLoaderProvider.class).in(Singleton.class);
 	}
- 
+
 	public Class<? extends org.eclipse.xtext.ui.editor.hover.html.IEObjectHoverDocumentationProvider> bindIEObjectHoverDocumentationProvider() {
 		return UiGrammarHoverDocumentationProvider.class;
 	}
- 
+
 	public com.google.inject.Provider<II18nRegistry> provideII18nRegistry() {
 		return org.eclipse.osbp.ide.core.ui.shared.Access.getII18nRegistry();
 	}
 
+	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.ecview.dsl.ui/src/org/eclipse/osbp/ecview/dsl/ui/labeling/UIGrammarLabelProvider.xtend b/org.eclipse.osbp.ecview.dsl.ui/src/org/eclipse/osbp/ecview/dsl/ui/labeling/UIGrammarLabelProvider.xtend
index 430db66..8269d7d 100644
--- a/org.eclipse.osbp.ecview.dsl.ui/src/org/eclipse/osbp/ecview/dsl/ui/labeling/UIGrammarLabelProvider.xtend
+++ b/org.eclipse.osbp.ecview.dsl.ui/src/org/eclipse/osbp/ecview/dsl/ui/labeling/UIGrammarLabelProvider.xtend
@@ -12,7 +12,6 @@
 
 import com.google.inject.Inject
 import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider
-import org.eclipse.xtext.xbase.ui.labeling.XbaseLabelProvider
 import org.eclipse.osbp.ecview.semantic.uimodel.UiBeanReferenceField
 import org.eclipse.osbp.ecview.semantic.uimodel.UiBeanSlot
 import org.eclipse.osbp.ecview.semantic.uimodel.UiBinding
@@ -35,7 +34,6 @@
 import org.eclipse.osbp.ecview.semantic.uimodel.UiI18nInfo
 import org.eclipse.osbp.ecview.semantic.uimodel.UiIDEView
 import org.eclipse.osbp.ecview.semantic.uimodel.UiImage
-import org.eclipse.osbp.ecview.semantic.uimodel.UiImports
 import org.eclipse.osbp.ecview.semantic.uimodel.UiLabel
 import org.eclipse.osbp.ecview.semantic.uimodel.UiList
 import org.eclipse.osbp.ecview.semantic.uimodel.UiMaxLengthValidator
@@ -67,13 +65,14 @@
 import org.eclipse.osbp.ecview.semantic.uimodel.UiViewSet
 import org.eclipse.osbp.ecview.semantic.uimodel.UiVisibilityProcessorAssignment
 import org.eclipse.osbp.ecview.semantic.uimodel.UiXbaseValidator
+import org.eclipse.osbp.xtext.oxtype.ui.labeling.OXtypeLabelProvider
 
 /**
  * Provides labels for a EObjects.
  * 
  * see http://www.eclipse.org/Xtext/documentation.html#labelProvider
  */
-class UIGrammarLabelProvider extends XbaseLabelProvider {
+class UIGrammarLabelProvider extends OXtypeLabelProvider {
 
 	@Inject
 	new(AdapterFactoryLabelProvider delegate) {
@@ -84,10 +83,6 @@
 		ele.name
 	}
 
-	def text(UiImports ele) {
-		if(ele.name != null) ele.name else "Import"
-	}
-
 	def text(UiIDEView ele) {
 		if(ele.name != null) ele.name else "IDE View"
 	}
@@ -247,10 +242,6 @@
 		'UiProgressBar.gif'
 	}
 
-	def image(UiImports ele) {
-		'UiImport.gif'
-	}
-
 	def image(UiIDEView ele) {
 		'UiView.gif'
 	}
diff --git a/org.eclipse.osbp.ecview.dsl.ui/src/org/eclipse/osbp/ecview/dsl/ui/quickfix/UIGrammarQuickfixProvider.xtend b/org.eclipse.osbp.ecview.dsl.ui/src/org/eclipse/osbp/ecview/dsl/ui/quickfix/UIGrammarQuickfixProvider.xtend
index a136b27..b810ad3 100644
--- a/org.eclipse.osbp.ecview.dsl.ui/src/org/eclipse/osbp/ecview/dsl/ui/quickfix/UIGrammarQuickfixProvider.xtend
+++ b/org.eclipse.osbp.ecview.dsl.ui/src/org/eclipse/osbp/ecview/dsl/ui/quickfix/UIGrammarQuickfixProvider.xtend
@@ -10,24 +10,24 @@
  */
 package org.eclipse.osbp.ecview.dsl.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 UIGrammarQuickfixProvider extends org.eclipse.xtext.xbase.ui.quickfix.XbaseQuickfixProvider {
-
-//	@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 UIGrammarQuickfixProvider 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.ecview.dsl.ui/xtend-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/UIGrammarProposalProvider.java b/org.eclipse.osbp.ecview.dsl.ui/xtend-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/UIGrammarProposalProvider.java
index 5108c13..1442ad5 100644
--- a/org.eclipse.osbp.ecview.dsl.ui/xtend-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/UIGrammarProposalProvider.java
+++ b/org.eclipse.osbp.ecview.dsl.ui/xtend-gen/org/eclipse/osbp/ecview/dsl/ui/contentassist/UIGrammarProposalProvider.java
@@ -13,10 +13,8 @@
 import com.google.common.base.Objects;
 import com.google.inject.Inject;
 import java.util.List;
-import java.util.Locale;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jface.text.Region;
 import org.eclipse.jface.viewers.StyledString;
 import org.eclipse.osbp.ecview.dsl.ui.contentassist.AbstractUIGrammarProposalProvider;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiModel;
@@ -31,7 +29,6 @@
 import org.eclipse.xtext.ui.editor.contentassist.ConfigurableCompletionProposal;
 import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext;
 import org.eclipse.xtext.ui.editor.contentassist.ICompletionProposalAcceptor;
-import org.eclipse.xtext.ui.editor.contentassist.PrefixMatcher;
 
 /**
  * see http://www.eclipse.org/Xtext/documentation.html#contentAssist on how to customize content assistant
@@ -50,17 +47,13 @@
   @Inject
   private BasicDSLProposalProviderHelper providerHelper;
   
+  @Override
   public void completeUiI18nInfo_Key(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
     final IProject project = this.util.getProject(model);
-    String _prefix = context.getPrefix();
-    final String searchString = _prefix.replaceAll("\"", "");
-    Locale _locale = this.util.getLocale();
-    String _findPackage = this.findPackage(model);
-    final List<II18nRegistry.Proposal> proposals = this.i18nRegistry.findContentProposals(project, _locale, _findPackage, searchString);
-    Region _replaceRegion = context.getReplaceRegion();
-    final int replacementOffset = _replaceRegion.getOffset();
-    Region _replaceRegion_1 = context.getReplaceRegion();
-    int _length = _replaceRegion_1.getLength();
+    final String searchString = context.getPrefix().replaceAll("\"", "");
+    final List<II18nRegistry.Proposal> proposals = this.i18nRegistry.findContentProposals(project, this.util.getLocale(), this.findPackage(model), searchString);
+    final int replacementOffset = context.getReplaceRegion().getOffset();
+    int _length = context.getReplaceRegion().getLength();
     final int replacementLength = (_length + 1);
     final boolean relativePath = searchString.startsWith(".");
     for (final II18nRegistry.Proposal proposal : proposals) {
@@ -68,13 +61,10 @@
         String _replacementString = this.toReplacementString(proposal, relativePath);
         String _plus = ("\"" + _replacementString);
         String _plus_1 = (_plus + "\"");
-        StyledString _displayString = this.displayString(proposal);
-        final ConfigurableCompletionProposal result = this.doCreateProposal(_plus_1, _displayString, null, replacementOffset, replacementLength);
+        final ConfigurableCompletionProposal result = this.doCreateProposal(_plus_1, this.displayString(proposal), null, replacementOffset, replacementLength);
         result.setPriority(1);
-        PrefixMatcher _matcher = context.getMatcher();
-        result.setMatcher(_matcher);
-        int _replaceContextLength = context.getReplaceContextLength();
-        result.setReplaceContextLength(_replaceContextLength);
+        result.setMatcher(context.getMatcher());
+        result.setReplaceContextLength(context.getReplaceContextLength());
         acceptor.accept(result);
       }
     }
@@ -84,8 +74,7 @@
     if ((!relative)) {
       return proposal.getI18nKey();
     } else {
-      String _i18nKey = proposal.getI18nKey();
-      final String[] pathTokens = _i18nKey.split("\\.");
+      final String[] pathTokens = proposal.getI18nKey().split("\\.");
       String _xifexpression = null;
       int _length = pathTokens.length;
       boolean _greaterThan = (_length > 0);
@@ -112,8 +101,7 @@
           final UiModel uiModel = ((UiModel) temp);
           return uiModel.getPackageName();
         }
-        EObject _eContainer = temp.eContainer();
-        temp = _eContainer;
+        temp = temp.eContainer();
         if ((temp instanceof UiModel)) {
           final UiModel uiModel_1 = ((UiModel) temp);
           return uiModel_1.getPackageName();
@@ -123,108 +111,89 @@
     return "";
   }
   
+  @Override
   public void completeUiMaxLengthValidator_MaxLength(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
     StyledString _styledString = new StyledString("any number");
-    ConfigurableCompletionProposal _doCreateProposal = this.doCreateProposal("1", _styledString, null, 0, context);
-    acceptor.accept(_doCreateProposal);
+    acceptor.accept(this.doCreateProposal("1", _styledString, null, 0, context));
     StyledString _styledString_1 = new StyledString("any number");
-    ConfigurableCompletionProposal _doCreateProposal_1 = this.doCreateProposal("2", _styledString_1, null, 0, context);
-    acceptor.accept(_doCreateProposal_1);
+    acceptor.accept(this.doCreateProposal("2", _styledString_1, null, 0, context));
     StyledString _styledString_2 = new StyledString("any number");
-    ConfigurableCompletionProposal _doCreateProposal_2 = this.doCreateProposal("3", _styledString_2, null, 0, context);
-    acceptor.accept(_doCreateProposal_2);
+    acceptor.accept(this.doCreateProposal("3", _styledString_2, null, 0, context));
     StyledString _styledString_3 = new StyledString("any number");
-    ConfigurableCompletionProposal _doCreateProposal_3 = this.doCreateProposal("4", _styledString_3, null, 0, context);
-    acceptor.accept(_doCreateProposal_3);
+    acceptor.accept(this.doCreateProposal("4", _styledString_3, null, 0, context));
     StyledString _styledString_4 = new StyledString("any number");
-    ConfigurableCompletionProposal _doCreateProposal_4 = this.doCreateProposal("10", _styledString_4, null, 0, context);
-    acceptor.accept(_doCreateProposal_4);
+    acceptor.accept(this.doCreateProposal("10", _styledString_4, null, 0, context));
     StyledString _styledString_5 = new StyledString("any number");
-    ConfigurableCompletionProposal _doCreateProposal_5 = this.doCreateProposal("12", _styledString_5, null, 0, context);
-    acceptor.accept(_doCreateProposal_5);
+    acceptor.accept(this.doCreateProposal("12", _styledString_5, null, 0, context));
     StyledString _styledString_6 = new StyledString("any number");
-    ConfigurableCompletionProposal _doCreateProposal_6 = this.doCreateProposal("15", _styledString_6, null, 0, context);
-    acceptor.accept(_doCreateProposal_6);
+    acceptor.accept(this.doCreateProposal("15", _styledString_6, null, 0, context));
     StyledString _styledString_7 = new StyledString("any number");
-    ConfigurableCompletionProposal _doCreateProposal_7 = this.doCreateProposal("20", _styledString_7, null, 0, context);
-    acceptor.accept(_doCreateProposal_7);
+    acceptor.accept(this.doCreateProposal("20", _styledString_7, null, 0, context));
     StyledString _styledString_8 = new StyledString("any number");
-    ConfigurableCompletionProposal _doCreateProposal_8 = this.doCreateProposal("25", _styledString_8, null, 0, context);
-    acceptor.accept(_doCreateProposal_8);
+    acceptor.accept(this.doCreateProposal("25", _styledString_8, null, 0, context));
     StyledString _styledString_9 = new StyledString("any number");
-    ConfigurableCompletionProposal _doCreateProposal_9 = this.doCreateProposal("125", _styledString_9, null, 0, context);
-    acceptor.accept(_doCreateProposal_9);
+    acceptor.accept(this.doCreateProposal("125", _styledString_9, null, 0, context));
   }
   
+  @Override
   public void completeUiMinLengthValidator_MinLength(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
     StyledString _styledString = new StyledString("any number");
-    ConfigurableCompletionProposal _doCreateProposal = this.doCreateProposal("1", _styledString, null, 0, context);
-    acceptor.accept(_doCreateProposal);
+    acceptor.accept(this.doCreateProposal("1", _styledString, null, 0, context));
     StyledString _styledString_1 = new StyledString("any number");
-    ConfigurableCompletionProposal _doCreateProposal_1 = this.doCreateProposal("2", _styledString_1, null, 0, context);
-    acceptor.accept(_doCreateProposal_1);
+    acceptor.accept(this.doCreateProposal("2", _styledString_1, null, 0, context));
     StyledString _styledString_2 = new StyledString("any number");
-    ConfigurableCompletionProposal _doCreateProposal_2 = this.doCreateProposal("3", _styledString_2, null, 0, context);
-    acceptor.accept(_doCreateProposal_2);
+    acceptor.accept(this.doCreateProposal("3", _styledString_2, null, 0, context));
     StyledString _styledString_3 = new StyledString("any number");
-    ConfigurableCompletionProposal _doCreateProposal_3 = this.doCreateProposal("4", _styledString_3, null, 0, context);
-    acceptor.accept(_doCreateProposal_3);
+    acceptor.accept(this.doCreateProposal("4", _styledString_3, null, 0, context));
     StyledString _styledString_4 = new StyledString("any number");
-    ConfigurableCompletionProposal _doCreateProposal_4 = this.doCreateProposal("10", _styledString_4, null, 0, context);
-    acceptor.accept(_doCreateProposal_4);
+    acceptor.accept(this.doCreateProposal("10", _styledString_4, null, 0, context));
     StyledString _styledString_5 = new StyledString("any number");
-    ConfigurableCompletionProposal _doCreateProposal_5 = this.doCreateProposal("12", _styledString_5, null, 0, context);
-    acceptor.accept(_doCreateProposal_5);
+    acceptor.accept(this.doCreateProposal("12", _styledString_5, null, 0, context));
     StyledString _styledString_6 = new StyledString("any number");
-    ConfigurableCompletionProposal _doCreateProposal_6 = this.doCreateProposal("15", _styledString_6, null, 0, context);
-    acceptor.accept(_doCreateProposal_6);
+    acceptor.accept(this.doCreateProposal("15", _styledString_6, null, 0, context));
     StyledString _styledString_7 = new StyledString("any number");
-    ConfigurableCompletionProposal _doCreateProposal_7 = this.doCreateProposal("20", _styledString_7, null, 0, context);
-    acceptor.accept(_doCreateProposal_7);
+    acceptor.accept(this.doCreateProposal("20", _styledString_7, null, 0, context));
     StyledString _styledString_8 = new StyledString("any number");
-    ConfigurableCompletionProposal _doCreateProposal_8 = this.doCreateProposal("25", _styledString_8, null, 0, context);
-    acceptor.accept(_doCreateProposal_8);
+    acceptor.accept(this.doCreateProposal("25", _styledString_8, null, 0, context));
     StyledString _styledString_9 = new StyledString("any number");
-    ConfigurableCompletionProposal _doCreateProposal_9 = this.doCreateProposal("125", _styledString_9, null, 0, context);
-    acceptor.accept(_doCreateProposal_9);
+    acceptor.accept(this.doCreateProposal("125", _styledString_9, null, 0, context));
   }
   
+  @Override
   public void completeUiRegexpValidator_RegExpression(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
     StyledString _styledString = new StyledString("any regular expression");
-    ConfigurableCompletionProposal _doCreateProposal = this.doCreateProposal("*abc", _styledString, null, 0, context);
-    acceptor.accept(_doCreateProposal);
+    acceptor.accept(this.doCreateProposal("*abc", _styledString, null, 0, context));
   }
   
   public StyledString displayString(final II18nRegistry.Proposal proposal) {
     String _i18nValue = proposal.getI18nValue();
-    StyledString _styledString = new StyledString(_i18nValue, StyledString.QUALIFIER_STYLER);
-    StyledString _append = _styledString.append(" : ");
-    Locale _locale = proposal.getLocale();
-    String _languageTag = _locale.toLanguageTag();
-    StyledString _append_1 = _append.append(_languageTag, StyledString.DECORATIONS_STYLER);
-    StyledString _append_2 = _append_1.append(" - ");
-    String _i18nKey = proposal.getI18nKey();
-    final StyledString displayText = _append_2.append(_i18nKey, StyledString.DECORATIONS_STYLER);
+    final StyledString displayText = new StyledString(_i18nValue, StyledString.QUALIFIER_STYLER).append(" : ").append(proposal.getLocale().toLanguageTag(), StyledString.DECORATIONS_STYLER).append(" - ").append(
+      proposal.getI18nKey(), StyledString.DECORATIONS_STYLER);
     return displayText;
   }
   
+  @Override
   public boolean isKeywordWorthyToPropose(final Keyword keyword) {
     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 completeUiModel_PackageName(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
     AbstractElement _terminal = assignment.getTerminal();
     this.providerHelper.complete_PackageName(model, ((RuleCall) _terminal), context, acceptor, this);
   }
   
+  @Override
   public void complete_QualifiedNameWithWildcard(final EObject model, final RuleCall ruleCall, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
     this.providerHelper.complete_PackageName(model, ruleCall, context, acceptor, this);
   }
diff --git a/org.eclipse.osbp.ecview.dsl.ui/xtend-gen/org/eclipse/osbp/ecview/dsl/ui/hover/UiGrammarHoverDocumentationProvider.java b/org.eclipse.osbp.ecview.dsl.ui/xtend-gen/org/eclipse/osbp/ecview/dsl/ui/hover/UiGrammarHoverDocumentationProvider.java
index be6fa53..f4c9e98 100644
--- a/org.eclipse.osbp.ecview.dsl.ui/xtend-gen/org/eclipse/osbp/ecview/dsl/ui/hover/UiGrammarHoverDocumentationProvider.java
+++ b/org.eclipse.osbp.ecview.dsl.ui/xtend-gen/org/eclipse/osbp/ecview/dsl/ui/hover/UiGrammarHoverDocumentationProvider.java
@@ -14,10 +14,7 @@
 import com.google.inject.Inject;
 import java.util.Arrays;
 import java.util.List;
-import java.util.Locale;
 import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.osbp.ecview.dsl.extensions.BindableTypeProvider;
@@ -35,12 +32,10 @@
 import org.eclipse.osbp.ecview.semantic.uisemantics.UiSemanticsPackage;
 import org.eclipse.osbp.ecview.semantic.uisemantics.UxBindingableOption;
 import org.eclipse.osbp.ecview.semantic.uisemantics.UxElementDefinition;
-import org.eclipse.osbp.ecview.semantic.uisemantics.UxElementURI;
 import org.eclipse.osbp.ide.core.api.i18n.II18nRegistry;
 import org.eclipse.osbp.ide.core.ui.util.CoreUiUtil;
 import org.eclipse.xtend2.lib.StringConcatenation;
 import org.eclipse.xtext.common.types.JvmType;
-import org.eclipse.xtext.common.types.JvmTypeReference;
 import org.eclipse.xtext.documentation.IEObjectDocumentationProvider;
 import org.eclipse.xtext.naming.IQualifiedNameProvider;
 import org.eclipse.xtext.resource.IEObjectDescription;
@@ -79,6 +74,7 @@
   @Extension
   private I18nKeyProvider _i18nKeyProvider;
   
+  @Override
   public String computeDocumentation(final EObject object) {
     final String superDocu = super.computeDocumentation(object);
     final String customDocu = this.getCustomDocumentation(object);
@@ -100,8 +96,7 @@
   
   protected String _getCustomDocumentation(final UiEmbeddable object) {
     final StringBuilder sb = new StringBuilder();
-    String _computeDocumentation = super.computeDocumentation(object);
-    sb.append(_computeDocumentation);
+    sb.append(super.computeDocumentation(object));
     final String semanticDocu = this.getSemanticElementDocumentation(object);
     boolean _notEquals = (!Objects.equal(semanticDocu, null));
     if (_notEquals) {
@@ -111,77 +106,40 @@
     boolean _notEquals_1 = (!Objects.equal(type, null));
     if (_notEquals_1) {
       sb.append("<p>type: ");
-      String _computeLinkToElement = this.computeLinkToElement(type);
-      sb.append(_computeLinkToElement);
+      sb.append(this.computeLinkToElement(type));
       sb.append("</p>");
     }
     sb.append("<h3>I18n Info</h3>");
-    boolean _and = false;
-    UiI18nInfo _i18nInfo = object.getI18nInfo();
-    boolean _notEquals_2 = (!Objects.equal(_i18nInfo, null));
-    if (!_notEquals_2) {
-      _and = false;
+    if (((!Objects.equal(object.getI18nInfo(), null)) && (!object.getI18nInfo().getKey().isEmpty()))) {
+      sb.append(this.getCustomDocumentation(object.getI18nInfo()));
     } else {
-      UiI18nInfo _i18nInfo_1 = object.getI18nInfo();
-      String _key = _i18nInfo_1.getKey();
-      boolean _isEmpty = _key.isEmpty();
-      boolean _not = (!_isEmpty);
-      _and = _not;
-    }
-    if (_and) {
-      UiI18nInfo _i18nInfo_2 = object.getI18nInfo();
-      String _customDocumentation = this.getCustomDocumentation(_i18nInfo_2);
-      sb.append(_customDocumentation);
-    } else {
-      String _i18nDefaultDocumentation = this.getI18nDefaultDocumentation(object);
-      sb.append(_i18nDefaultDocumentation);
+      sb.append(this.getI18nDefaultDocumentation(object));
     }
     return sb.toString();
   }
   
   protected String _getCustomDocumentation(final UiTabAssignment object) {
     final StringBuilder sb = new StringBuilder();
-    String _computeDocumentation = super.computeDocumentation(object);
-    sb.append(_computeDocumentation);
+    sb.append(super.computeDocumentation(object));
     sb.append("<h3>I18n Info</h3>");
-    boolean _and = false;
-    UiI18nInfo _i18nInfo = object.getI18nInfo();
-    boolean _notEquals = (!Objects.equal(_i18nInfo, null));
-    if (!_notEquals) {
-      _and = false;
+    if (((!Objects.equal(object.getI18nInfo(), null)) && (!object.getI18nInfo().getKey().isEmpty()))) {
+      sb.append(this.getCustomDocumentation(object.getI18nInfo()));
     } else {
-      UiI18nInfo _i18nInfo_1 = object.getI18nInfo();
-      String _key = _i18nInfo_1.getKey();
-      boolean _isEmpty = _key.isEmpty();
-      boolean _not = (!_isEmpty);
-      _and = _not;
-    }
-    if (_and) {
-      UiI18nInfo _i18nInfo_2 = object.getI18nInfo();
-      String _customDocumentation = this.getCustomDocumentation(_i18nInfo_2);
-      sb.append(_customDocumentation);
-    } else {
-      String _i18nDefaultDocumentation = this.getI18nDefaultDocumentation(object);
-      sb.append(_i18nDefaultDocumentation);
+      sb.append(this.getI18nDefaultDocumentation(object));
     }
     return sb.toString();
   }
   
   protected String _getCustomDocumentation(final UiErrorCode object) {
     final StringBuilder sb = new StringBuilder();
-    String _computeDocumentation = super.computeDocumentation(object);
-    sb.append(_computeDocumentation);
+    sb.append(super.computeDocumentation(object));
     sb.append("<h3>I18n Info</h3>");
     final String i18nKey = this._i18nKeyProvider.toI18nKey(object);
     sb.append((("Key: " + i18nKey) + "<p>"));
     String packageName = this.findPackage(object);
     IProject javaProject = this.util.getProject(object);
-    IProject _project = javaProject.getProject();
-    Locale _locale = this.util.getLocale();
-    final List<II18nRegistry.Proposal> proposals = this.i18nRegistry.findStrictKeyMatchingProposals(_project, _locale, packageName, i18nKey);
-    CharSequence _i18nLocaleDocumentation = this.getI18nLocaleDocumentation(proposals);
-    String _string = _i18nLocaleDocumentation.toString();
-    sb.append(_string);
+    final List<II18nRegistry.Proposal> proposals = this.i18nRegistry.findStrictKeyMatchingProposals(javaProject.getProject(), this.util.getLocale(), packageName, i18nKey);
+    sb.append(this.getI18nLocaleDocumentation(proposals).toString());
     return sb.toString();
   }
   
@@ -192,19 +150,14 @@
     IProject javaProject = this.util.getProject(model);
     final String i18nKey = this._i18nKeyProvider.toI18nKey(model);
     String packageName = this.findPackage(model);
-    IProject _project = javaProject.getProject();
-    Locale _locale = this.util.getLocale();
-    final List<II18nRegistry.Proposal> proposals = this.i18nRegistry.findStrictKeyMatchingProposals(_project, _locale, packageName, i18nKey);
+    final List<II18nRegistry.Proposal> proposals = this.i18nRegistry.findStrictKeyMatchingProposals(javaProject.getProject(), this.util.getLocale(), packageName, i18nKey);
     String result = (("Key: " + i18nKey) + "<p>");
-    CharSequence _i18nLocaleDocumentation = this.getI18nLocaleDocumentation(proposals);
-    String _string = _i18nLocaleDocumentation.toString();
+    String _string = this.getI18nLocaleDocumentation(proposals).toString();
     return (result + _string);
   }
   
   protected String _getCustomDocumentation(final UiBeanSlot object) {
-    JvmTypeReference _jvmType = object.getJvmType();
-    JvmType _type = _jvmType.getType();
-    String _computeLinkToElement = this.computeLinkToElement(_type);
+    String _computeLinkToElement = this.computeLinkToElement(object.getJvmType().getType());
     return ("<p><b>provides:</b> " + _computeLinkToElement);
   }
   
@@ -292,20 +245,15 @@
   protected String _getCustomDocumentation(final UiI18nInfo model) {
     IProject javaProject = this.util.getProject(model);
     String _xifexpression = null;
-    String _key = model.getKey();
-    boolean _startsWith = _key.startsWith(".");
+    boolean _startsWith = model.getKey().startsWith(".");
     if (_startsWith) {
       _xifexpression = this.findPackage(model);
     } else {
       _xifexpression = null;
     }
     String packageName = _xifexpression;
-    IProject _project = javaProject.getProject();
-    Locale _locale = this.util.getLocale();
-    String _key_1 = model.getKey();
-    final List<II18nRegistry.Proposal> proposals = this.i18nRegistry.findStrictKeyMatchingProposals(_project, _locale, packageName, _key_1);
-    CharSequence _i18nLocaleDocumentation = this.getI18nLocaleDocumentation(proposals);
-    return _i18nLocaleDocumentation.toString();
+    final List<II18nRegistry.Proposal> proposals = this.i18nRegistry.findStrictKeyMatchingProposals(javaProject.getProject(), this.util.getLocale(), packageName, model.getKey());
+    return this.getI18nLocaleDocumentation(proposals).toString();
   }
   
   /**
@@ -319,8 +267,7 @@
           final UiModel uiModel = ((UiModel) temp);
           return uiModel.getPackageName();
         }
-        EObject _eContainer = temp.eContainer();
-        temp = _eContainer;
+        temp = temp.eContainer();
         if ((temp instanceof UiModel)) {
           final UiModel uiModel_1 = ((UiModel) temp);
           return uiModel_1.getPackageName();
@@ -372,8 +319,7 @@
         _builder.append("\t");
         _builder.append("\t");
         _builder.append("<td>");
-        Locale _locale = proposal.getLocale();
-        String _languageTag = _locale.toLanguageTag();
+        String _languageTag = proposal.getLocale().toLanguageTag();
         _builder.append(_languageTag, "\t\t");
         _builder.append("</td> ");
         _builder.newLineIfNotEmpty();
@@ -408,8 +354,7 @@
   public String computeLinkToElement(final EObject jvmElement) {
     final String imageURL = this.hoverSignatureProvider.getImageTag(jvmElement);
     final String signature = this.hoverSignatureProvider.getDerivedOrSourceSignature(jvmElement);
-    URI _uRI = EcoreUtil.getURI(jvmElement);
-    String _createLinkWithLabel = HoverLinkHelper.createLinkWithLabel(XtextElementLinks.XTEXTDOC_SCHEME, _uRI, signature);
+    String _createLinkWithLabel = HoverLinkHelper.createLinkWithLabel(XtextElementLinks.XTEXTDOC_SCHEME, EcoreUtil.getURI(jvmElement), signature);
     return (imageURL + _createLinkWithLabel);
   }
   
@@ -421,10 +366,7 @@
         UxElementDefinition element = ((UxElementDefinition) _eObjectOrProxy);
         EObject _resolve = EcoreUtil.resolve(element, embeddable);
         element = ((UxElementDefinition) _resolve);
-        UxElementURI _uri = element.getUri();
-        EClass _eClass = _uri.getEClass();
-        EClass _eClass_1 = embeddable.eClass();
-        boolean _isSuperTypeOf = _eClass.isSuperTypeOf(_eClass_1);
+        boolean _isSuperTypeOf = element.getUri().getEClass().isSuperTypeOf(embeddable.eClass());
         if (_isSuperTypeOf) {
           return this.documentationProvider.getDocumentation(element);
         }
diff --git a/org.eclipse.osbp.ecview.dsl.ui/xtend-gen/org/eclipse/osbp/ecview/dsl/ui/labeling/UIGrammarDescriptionLabelProvider.java b/org.eclipse.osbp.ecview.dsl.ui/xtend-gen/org/eclipse/osbp/ecview/dsl/ui/labeling/UIGrammarDescriptionLabelProvider.java
index 06b1b72..b4d07e0 100644
--- a/org.eclipse.osbp.ecview.dsl.ui/xtend-gen/org/eclipse/osbp/ecview/dsl/ui/labeling/UIGrammarDescriptionLabelProvider.java
+++ b/org.eclipse.osbp.ecview.dsl.ui/xtend-gen/org/eclipse/osbp/ecview/dsl/ui/labeling/UIGrammarDescriptionLabelProvider.java
@@ -10,9 +10,7 @@
  */
 package org.eclipse.osbp.ecview.dsl.ui.labeling;
 
-import org.eclipse.emf.ecore.EClass;
 import org.eclipse.swt.graphics.Image;
-import org.eclipse.xtext.naming.QualifiedName;
 import org.eclipse.xtext.resource.IEObjectDescription;
 import org.eclipse.xtext.xbase.ui.labeling.XbaseDescriptionLabelProvider;
 
@@ -23,17 +21,18 @@
  */
 @SuppressWarnings("all")
 public class UIGrammarDescriptionLabelProvider extends XbaseDescriptionLabelProvider {
+  @Override
   public Object text(final IEObjectDescription ele) {
-    QualifiedName _name = ele.getName();
-    return _name.toString();
+    return ele.getName().toString();
   }
   
+  @Override
   public Object image(final IEObjectDescription ele) {
-    EClass _eClass = ele.getEClass();
-    String _name = _eClass.getName();
+    String _name = ele.getEClass().getName();
     return (_name + ".gif");
   }
   
+  @Override
   public Image getImage(final Object object) {
     return null;
   }
diff --git a/org.eclipse.osbp.ecview.dsl.ui/xtend-gen/org/eclipse/osbp/ecview/dsl/ui/labeling/UIGrammarLabelProvider.java b/org.eclipse.osbp.ecview.dsl.ui/xtend-gen/org/eclipse/osbp/ecview/dsl/ui/labeling/UIGrammarLabelProvider.java
index c2e937c..14b2c40 100644
--- a/org.eclipse.osbp.ecview.dsl.ui/xtend-gen/org/eclipse/osbp/ecview/dsl/ui/labeling/UIGrammarLabelProvider.java
+++ b/org.eclipse.osbp.ecview.dsl.ui/xtend-gen/org/eclipse/osbp/ecview/dsl/ui/labeling/UIGrammarLabelProvider.java
@@ -35,7 +35,6 @@
 import org.eclipse.osbp.ecview.semantic.uimodel.UiI18nInfo;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiIDEView;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiImage;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiImports;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiLabel;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiList;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiMaxLengthValidator;
@@ -68,7 +67,7 @@
 import org.eclipse.osbp.ecview.semantic.uimodel.UiVisibilityProcessor;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiVisibilityProcessorAssignment;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiXbaseValidator;
-import org.eclipse.xtext.xbase.ui.labeling.XbaseLabelProvider;
+import org.eclipse.osbp.xtext.oxtype.ui.labeling.OXtypeLabelProvider;
 
 /**
  * Provides labels for a EObjects.
@@ -76,7 +75,7 @@
  * see http://www.eclipse.org/Xtext/documentation.html#labelProvider
  */
 @SuppressWarnings("all")
-public class UIGrammarLabelProvider extends XbaseLabelProvider {
+public class UIGrammarLabelProvider extends OXtypeLabelProvider {
   @Inject
   public UIGrammarLabelProvider(final AdapterFactoryLabelProvider delegate) {
     super(delegate);
@@ -86,18 +85,6 @@
     return ele.getName();
   }
   
-  public String text(final UiImports ele) {
-    String _xifexpression = null;
-    String _name = ele.getName();
-    boolean _notEquals = (!Objects.equal(_name, null));
-    if (_notEquals) {
-      _xifexpression = ele.getName();
-    } else {
-      _xifexpression = "Import";
-    }
-    return _xifexpression;
-  }
-  
   public String text(final UiIDEView ele) {
     String _xifexpression = null;
     String _name = ele.getName();
@@ -267,12 +254,10 @@
         return "VisibilityProcessor";
       }
       String _xifexpression = null;
-      UiVisibilityProcessor _processor_1 = ele.getProcessor();
-      String _name = _processor_1.getName();
+      String _name = ele.getProcessor().getName();
       boolean _notEquals = (!Objects.equal(_name, null));
       if (_notEquals) {
-        UiVisibilityProcessor _processor_2 = ele.getProcessor();
-        String _name_1 = _processor_2.getName();
+        String _name_1 = ele.getProcessor().getName();
         _xifexpression = (_name_1 + "VisibilityProcessor");
       } else {
         _xifexpression = "VisibilityProcessor";
@@ -538,10 +523,6 @@
     return "UiProgressBar.gif";
   }
   
-  public String image(final UiImports ele) {
-    return "UiImport.gif";
-  }
-  
   public String image(final UiIDEView ele) {
     return "UiView.gif";
   }
diff --git a/org.eclipse.osbp.ecview.dsl.ui/xtend-gen/org/eclipse/osbp/ecview/dsl/ui/outline/UIGrammarOutlineTreeProvider.java b/org.eclipse.osbp.ecview.dsl.ui/xtend-gen/org/eclipse/osbp/ecview/dsl/ui/outline/UIGrammarOutlineTreeProvider.java
index 8f04425..9d17643 100644
--- a/org.eclipse.osbp.ecview.dsl.ui/xtend-gen/org/eclipse/osbp/ecview/dsl/ui/outline/UIGrammarOutlineTreeProvider.java
+++ b/org.eclipse.osbp.ecview.dsl.ui/xtend-gen/org/eclipse/osbp/ecview/dsl/ui/outline/UIGrammarOutlineTreeProvider.java
@@ -16,7 +16,6 @@
 import org.eclipse.osbp.ecview.semantic.uimodel.UiBinding;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiBindingEndpointAlias;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiComboBox;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiEmbeddable;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiFormLayout;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiFormLayoutAssigment;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiGridLayout;
@@ -26,7 +25,6 @@
 import org.eclipse.osbp.ecview.semantic.uimodel.UiHorizontalLayout;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiHorizontalLayoutAssigment;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiList;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiMobileEmbeddable;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationPage;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationPageAssignment;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationRoot;
@@ -92,8 +90,7 @@
   public void _createChildren(final IOutlineNode parentNode, final UiVerticalLayout modelElement) {
     EList<UiVerticalLayoutAssigment> _contents = modelElement.getContents();
     for (final UiVerticalLayoutAssigment childElement : _contents) {
-      UiEmbeddable _element = childElement.getElement();
-      this.createNode(parentNode, _element);
+      this.createNode(parentNode, childElement.getElement());
     }
     EList<UiBinding> _bindings = modelElement.getBindings();
     for (final UiBinding binding : _bindings) {
@@ -104,8 +101,7 @@
   public void _createChildren(final IOutlineNode parentNode, final UiHorizontalLayout modelElement) {
     EList<UiHorizontalLayoutAssigment> _contents = modelElement.getContents();
     for (final UiHorizontalLayoutAssigment childElement : _contents) {
-      UiEmbeddable _element = childElement.getElement();
-      this.createNode(parentNode, _element);
+      this.createNode(parentNode, childElement.getElement());
     }
     EList<UiBinding> _bindings = modelElement.getBindings();
     for (final UiBinding binding : _bindings) {
@@ -116,8 +112,7 @@
   public void _createChildren(final IOutlineNode parentNode, final UiMobileNavigationRoot modelElement) {
     EList<UiMobileNavigationRootAssigment> _contents = modelElement.getContents();
     for (final UiMobileNavigationRootAssigment childElement : _contents) {
-      UiMobileEmbeddable _element = childElement.getElement();
-      this.createNode(parentNode, _element);
+      this.createNode(parentNode, childElement.getElement());
     }
     EList<UiBinding> _bindings = modelElement.getBindings();
     for (final UiBinding binding : _bindings) {
@@ -128,8 +123,7 @@
   public void _createChildren(final IOutlineNode parentNode, final UiHorizontalButtonGroup modelElement) {
     EList<UiHorizontalButtonGroupAssigment> _contents = modelElement.getContents();
     for (final UiHorizontalButtonGroupAssigment childElement : _contents) {
-      UiEmbeddable _element = childElement.getElement();
-      this.createNode(parentNode, _element);
+      this.createNode(parentNode, childElement.getElement());
     }
     EList<UiBinding> _bindings = modelElement.getBindings();
     for (final UiBinding binding : _bindings) {
@@ -140,8 +134,7 @@
   public void _createChildren(final IOutlineNode parentNode, final UiVerticalComponentGroup modelElement) {
     EList<UiVerticalComponentGroupAssigment> _contents = modelElement.getContents();
     for (final UiVerticalComponentGroupAssigment childElement : _contents) {
-      UiEmbeddable _element = childElement.getElement();
-      this.createNode(parentNode, _element);
+      this.createNode(parentNode, childElement.getElement());
     }
     EList<UiBinding> _bindings = modelElement.getBindings();
     for (final UiBinding binding : _bindings) {
@@ -152,8 +145,7 @@
   public void _createChildren(final IOutlineNode parentNode, final UiGridLayout modelElement) {
     EList<UiGridLayoutAssigment> _contents = modelElement.getContents();
     for (final UiGridLayoutAssigment childElement : _contents) {
-      UiEmbeddable _element = childElement.getElement();
-      this.createNode(parentNode, _element);
+      this.createNode(parentNode, childElement.getElement());
     }
     EList<UiBinding> _bindings = modelElement.getBindings();
     for (final UiBinding binding : _bindings) {
@@ -164,8 +156,7 @@
   public void _createChildren(final IOutlineNode parentNode, final UiFormLayout modelElement) {
     EList<UiFormLayoutAssigment> _contents = modelElement.getContents();
     for (final UiFormLayoutAssigment childElement : _contents) {
-      UiEmbeddable _element = childElement.getElement();
-      this.createNode(parentNode, _element);
+      this.createNode(parentNode, childElement.getElement());
     }
     EList<UiBinding> _bindings = modelElement.getBindings();
     for (final UiBinding binding : _bindings) {
@@ -176,8 +167,7 @@
   public void _createChildren(final IOutlineNode parentNode, final UiMobileNavigationPage modelElement) {
     EList<UiMobileNavigationPageAssignment> _contents = modelElement.getContents();
     for (final UiMobileNavigationPageAssignment childElement : _contents) {
-      UiEmbeddable _element = childElement.getElement();
-      this.createNode(parentNode, _element);
+      this.createNode(parentNode, childElement.getElement());
     }
     EList<UiBinding> _bindings = modelElement.getBindings();
     for (final UiBinding binding : _bindings) {
@@ -210,8 +200,7 @@
   public void _createChildren(final IOutlineNode parentNode, final UiTabSheet modelElement) {
     EList<UiTabAssignment> _tabs = modelElement.getTabs();
     for (final UiTabAssignment childElement : _tabs) {
-      UiEmbeddable _element = childElement.getElement();
-      this.createNode(parentNode, _element);
+      this.createNode(parentNode, childElement.getElement());
     }
     EList<UiBinding> _bindings = modelElement.getBindings();
     for (final UiBinding binding : _bindings) {
@@ -222,8 +211,7 @@
   public void _createChildren(final IOutlineNode parentNode, final UiMobileTabSheet modelElement) {
     EList<UiMobileTabAssignment> _tabs = modelElement.getTabs();
     for (final UiMobileTabAssignment childElement : _tabs) {
-      UiEmbeddable _element = childElement.getElement();
-      this.createNode(parentNode, _element);
+      this.createNode(parentNode, childElement.getElement());
     }
     EList<UiBinding> _bindings = modelElement.getBindings();
     for (final UiBinding binding : _bindings) {
diff --git a/org.eclipse.osbp.ecview.dsl.ui/xtend-gen/org/eclipse/osbp/ecview/dsl/ui/quickfix/UIGrammarQuickfixProvider.java b/org.eclipse.osbp.ecview.dsl.ui/xtend-gen/org/eclipse/osbp/ecview/dsl/ui/quickfix/UIGrammarQuickfixProvider.java
index 4c0d925..1aa38a1 100644
--- a/org.eclipse.osbp.ecview.dsl.ui/xtend-gen/org/eclipse/osbp/ecview/dsl/ui/quickfix/UIGrammarQuickfixProvider.java
+++ b/org.eclipse.osbp.ecview.dsl.ui/xtend-gen/org/eclipse/osbp/ecview/dsl/ui/quickfix/UIGrammarQuickfixProvider.java
@@ -10,7 +10,7 @@
  */
 package org.eclipse.osbp.ecview.dsl.ui.quickfix;
 
-import org.eclipse.xtext.xbase.ui.quickfix.XbaseQuickfixProvider;
+import org.eclipse.osbp.xtext.oxtype.ui.quickfix.OXtypeQuickfixProvider;
 
 /**
  * Custom quickfixes.
@@ -18,5 +18,5 @@
  * see http://www.eclipse.org/Xtext/documentation.html#quickfixes
  */
 @SuppressWarnings("all")
-public class UIGrammarQuickfixProvider extends XbaseQuickfixProvider {
+public class UIGrammarQuickfixProvider extends OXtypeQuickfixProvider {
 }
diff --git a/org.eclipse.osbp.ecview.dsl/META-INF/MANIFEST.MF b/org.eclipse.osbp.ecview.dsl/META-INF/MANIFEST.MF
index c584974..fd53a55 100644
--- a/org.eclipse.osbp.ecview.dsl/META-INF/MANIFEST.MF
+++ b/org.eclipse.osbp.ecview.dsl/META-INF/MANIFEST.MF
@@ -4,19 +4,19 @@
 Bundle-Vendor: Eclipse OSBP
 Bundle-Localization: plugin
 Bundle-Version: 0.9.0.qualifier
-Bundle-ClassPath: .
+Bundle-ClassPath: .,model/,src/,src-gen/,xtend-gen/
 Bundle-SymbolicName: org.eclipse.osbp.ecview.dsl;singleton:=true
 Bundle-ActivationPolicy: lazy
-Require-Bundle: org.eclipse.xtext;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.generator;bundle-version="[2.7.3,2.8.0)";resolution:=optional,
+Require-Bundle: org.eclipse.xtext;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.generator;bundle-version="[2.11.0,2.12.0)";resolution:=optional,
  org.apache.commons.logging;bundle-version="1.0.4";resolution:=optional,
  org.eclipse.emf.codegen.ecore;bundle-version="2.10.2";resolution:=optional,
  org.eclipse.emf.mwe.utils;bundle-version="1.3.5";resolution:=optional,
- org.eclipse.emf.mwe2.launch;bundle-version="[2.7.1,2.8.0)";resolution:=optional,
+ org.eclipse.emf.mwe2.launch;bundle-version="[2.9.0,2.10.0)";resolution:=optional,
  org.eclipse.osbp.ecview.core.common.model;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.ecview.core.extension.model;bundle-version="[0.9.0,0.10.0)",
- org.eclipse.xtext.util;bundle-version="[2.7.3,2.8.0)",
+ org.eclipse.xtext.util;bundle-version="[2.11.0,2.12.0)",
  org.antlr.runtime,
  org.objectweb.asm;bundle-version="[5.0.1,6.0.0)";resolution:=optional,
  org.eclipse.osbp.xtext.builder.types.bundles;bundle-version="[0.9.0,0.10.0)";resolution:=optional,
@@ -24,8 +24,8 @@
  org.eclipse.osbp.ecview.uisemantics;bundle-version="[0.9.0,0.10.0)";visibility:=reexport,
  org.eclipse.emf.ecore;bundle-version="2.10.0";visibility:=reexport,
  org.eclipse.emf.common;bundle-version="2.10.0",
- org.eclipse.xtext.common.types;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.common.types;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.osbp.ecview.core.common;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.mobile.vaadin.ecview.model;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.xtext.builder.types.loader.api;bundle-version="[0.9.0,0.10.0)",
@@ -34,27 +34,35 @@
  org.eclipse.osbp.runtime.common;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.equinox.registry,
  org.eclipse.core.runtime;bundle-version="3.10.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.xtext.oxtype;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.ecview.extension.model;bundle-version="[0.9.0,0.10.0)",
+ org.eclipse.xtend.lib,
  org.apache.commons.lang3;bundle-version="3.4.0"
 Import-Package: org.apache.log4j,
+ org.eclipse.osbp.dsl.semantic.common;version="0.9.0",
+ org.eclipse.osbp.dsl.semantic.dto;version="0.9.0",
  org.slf4j;version="1.7.2"
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
-Export-Package: org.eclipse.osbp.ecview.dsl;version="0.9.0";x-internal:=true,
+Export-Package: org.eclipse.osbp.ecview.dsl;version="0.9.0",
  org.eclipse.osbp.ecview.dsl.autowire;version="0.9.0",
  org.eclipse.osbp.ecview.dsl.autowire.hook;version="0.9.0";x-internal:=true,
  org.eclipse.osbp.ecview.dsl.derivedstate;version="0.9.0";x-internal:=true,
  org.eclipse.osbp.ecview.dsl.extensions;version="0.9.0",
  org.eclipse.osbp.ecview.dsl.formatting;version="0.9.0";x-internal:=true,
+ org.eclipse.osbp.ecview.dsl.generator;version="0.9.0",
+ org.eclipse.osbp.ecview.dsl.imports;version="0.9.0",
  org.eclipse.osbp.ecview.dsl.jvmmodel;version="0.9.0";x-internal:=true,
  org.eclipse.osbp.ecview.dsl.name;version="0.9.0",
  org.eclipse.osbp.ecview.dsl.parser.antlr;version="0.9.0";x-internal:=true,
  org.eclipse.osbp.ecview.dsl.parser.antlr.internal;version="0.9.0";x-internal:=true,
+ org.eclipse.osbp.ecview.dsl.resource;version="0.9.0",
  org.eclipse.osbp.ecview.dsl.scope;version="0.9.0";x-internal:=true,
+ org.eclipse.osbp.ecview.dsl.scope.eobject;version="0.9.0",
+ org.eclipse.osbp.ecview.dsl.scope.jvmtype;version="0.9.0",
+ org.eclipse.osbp.ecview.dsl.scoping;version="0.9.0",
  org.eclipse.osbp.ecview.dsl.serializer;version="0.9.0";x-internal:=true,
- org.eclipse.osbp.ecview.dsl.services;version="0.9.0";x-internal:=true,
+ org.eclipse.osbp.ecview.dsl.services;version="0.9.0",
  org.eclipse.osbp.ecview.dsl.validation;version="0.9.0";x-internal:=true,
  org.eclipse.osbp.ecview.semantic.uimodel;version="0.9.0",
  org.eclipse.osbp.ecview.semantic.uimodel.impl;version="0.9.0",
  org.eclipse.osbp.ecview.semantic.uimodel.util;version="0.9.0"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
diff --git a/org.eclipse.osbp.ecview.dsl/build.properties b/org.eclipse.osbp.ecview.dsl/build.properties
index 7e297fa..0665607 100644
--- a/org.eclipse.osbp.ecview.dsl/build.properties
+++ b/org.eclipse.osbp.ecview.dsl/build.properties
@@ -14,7 +14,11 @@
                .project,\
                .classpath,\
                schema/,\
-               plugin.properties
+               plugin.properties,\
+               model/,\
+               src/,\
+               src-gen/,\
+               xtend-gen/
 output.. = target/classes
 src.includes = about.properties,  about.mappings,  about.ini,  about.html,  LICENSE.txt,\
                license.html
diff --git a/org.eclipse.osbp.ecview.dsl/model/UIGrammarCore.ecore b/org.eclipse.osbp.ecview.dsl/model/UIGrammarCore.ecore
index fd8c00e..d9e2860 100644
--- a/org.eclipse.osbp.ecview.dsl/model/UIGrammarCore.ecore
+++ b/org.eclipse.osbp.ecview.dsl/model/UIGrammarCore.ecore
@@ -11,12 +11,8 @@
         eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="roots" upperBound="-1"
         eType="#//UiRootElements" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="imports" upperBound="-1"
-        eType="#//UiImports" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="UiImports" eSuperTypes="#//UiNamedElement">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="importedNamespace" lowerBound="1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="importSection" eType="ecore:EClass ../../org.eclipse.xtext.xbase/model/Xtype.ecore#//XImportSection"
+        containment="true"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="UiContext" eSuperTypes="#//UiRootElements">
     <eStructuralFeatures xsi:type="ecore:EReference" name="beanSlots" upperBound="-1"
@@ -56,6 +52,7 @@
     <eStructuralFeatures xsi:type="ecore:EReference" name="exposedActions" upperBound="-1"
         eType="#//UiExposedAction" containment="true"/>
   </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="UiDisplayView" eSuperTypes="#//UiIDEView"/>
   <eClassifiers xsi:type="ecore:EClass" name="UiMobileView" eSuperTypes="#//UiView"/>
   <eClassifiers xsi:type="ecore:EClass" name="UiPoint">
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="x" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
@@ -291,6 +288,7 @@
     <eStructuralFeatures xsi:type="ecore:EReference" name="itemImageProperty" eType="ecore:EClass ../../org.eclipse.xtext.common.types/model/JavaVMTypes.ecore#//JvmOperation"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="sortOrderAssignment" eType="#//UiSortOrderAssignment"
         containment="true"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="scrollToBottom" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="UiComboBox" eSuperTypes="#//UiField #//UiTypeProvider #//UiMobileField #//UiBeanServiceConsumer">
     <eStructuralFeatures xsi:type="ecore:EReference" name="itemCaptionProperty" eType="ecore:EClass ../../org.eclipse.xtext.common.types/model/JavaVMTypes.ecore#//JvmOperation"/>
@@ -552,6 +550,7 @@
   <eClassifiers xsi:type="ecore:EClass" name="UiProgressBar" eSuperTypes="#//UiField #//UiMobileField"/>
   <eClassifiers xsi:type="ecore:EClass" name="UiI18nInfo">
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="key" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="noCaption" eType="ecore:EDataType ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EBoolean"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="UiI18nInfoable" abstract="true" interface="true">
     <eStructuralFeatures xsi:type="ecore:EReference" name="i18nInfo" eType="#//UiI18nInfo"
diff --git a/org.eclipse.osbp.ecview.dsl/model/UIGrammarCore.genmodel b/org.eclipse.osbp.ecview.dsl/model/UIGrammarCore.genmodel
index 48e5d61..9291374 100644
--- a/org.eclipse.osbp.ecview.dsl/model/UIGrammarCore.genmodel
+++ b/org.eclipse.osbp.ecview.dsl/model/UIGrammarCore.genmodel
@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <genmodel:GenModel xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" modelDirectory="/org.eclipse.osbp.ecview.dsl/src" editDirectory="/org.eclipse.osbp.ecview.dsl.edit/src"
+    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" copyrightText=" * Copyright (c) 2011, 2017 - Lunifera GmbH (Gross Enzersdorf, Austria), Loetz GmbH&amp;Co.KG (69115 Heidelberg, Germany)&#xA; * All rights reserved. This program and the accompanying materials&#xA; * are made available under the terms of the Eclipse Public License v1.0&#xA; * which accompanies this distribution, and is available at&#xA; * http://www.eclipse.org/legal/epl-v10.html&#xA; *&#xA; * Contributors:&#xA; *         Florian Pirchner - Initial implementation"
+    modelDirectory="/org.eclipse.osbp.ecview.dsl/src" editDirectory="/org.eclipse.osbp.ecview.dsl.edit/src"
     editorDirectory="/org.eclipse.osbp.ecview.dsl.editor/src" modelPluginID="org.eclipse.osbp.ecview.dsl"
     modelName="UIGrammar" modelPluginClass="" editPluginClass="org.eclipse.osbp.ecview.dsl.provider.UIGrammarEditPlugin"
     editorPluginClass="org.eclipse.osbp.ecview.dsl.presentation.UIGrammarEditorPlugin"
@@ -62,10 +63,7 @@
     <genClasses ecoreClass="UIGrammarCore.ecore#//UiModel">
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UIGrammarCore.ecore#//UiModel/packageName"/>
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference UIGrammarCore.ecore#//UiModel/roots"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference UIGrammarCore.ecore#//UiModel/imports"/>
-    </genClasses>
-    <genClasses ecoreClass="UIGrammarCore.ecore#//UiImports">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UIGrammarCore.ecore#//UiImports/importedNamespace"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference UIGrammarCore.ecore#//UiModel/importSection"/>
     </genClasses>
     <genClasses ecoreClass="UIGrammarCore.ecore#//UiContext">
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference UIGrammarCore.ecore#//UiContext/beanSlots"/>
@@ -97,6 +95,7 @@
     <genClasses ecoreClass="UIGrammarCore.ecore#//UiIDEView">
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference UIGrammarCore.ecore#//UiIDEView/exposedActions"/>
     </genClasses>
+    <genClasses ecoreClass="UIGrammarCore.ecore#//UiDisplayView"/>
     <genClasses ecoreClass="UIGrammarCore.ecore#//UiMobileView"/>
     <genClasses ecoreClass="UIGrammarCore.ecore#//UiPoint">
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UIGrammarCore.ecore#//UiPoint/x"/>
@@ -228,6 +227,12 @@
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UIGrammarCore.ecore#//UiTextField/minLength"/>
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UIGrammarCore.ecore#//UiTextField/regex"/>
     </genClasses>
+    <genClasses ecoreClass="UIGrammarCore.ecore#//UiSuggestTextField">
+      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference UIGrammarCore.ecore#//UiSuggestTextField/itemCaptionProperty"/>
+      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference UIGrammarCore.ecore#//UiSuggestTextField/itemFilterProperty"/>
+      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference UIGrammarCore.ecore#//UiSuggestTextField/itemUUIDProperty"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UIGrammarCore.ecore#//UiSuggestTextField/autoHidePopup"/>
+    </genClasses>
     <genClasses ecoreClass="UIGrammarCore.ecore#//UiImage">
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UIGrammarCore.ecore#//UiImage/value"/>
     </genClasses>
@@ -241,6 +246,8 @@
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference UIGrammarCore.ecore#//UiTable/columnAssignment"/>
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UIGrammarCore.ecore#//UiTable/selectionType"/>
       <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference UIGrammarCore.ecore#//UiTable/itemImageProperty"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference UIGrammarCore.ecore#//UiTable/sortOrderAssignment"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UIGrammarCore.ecore#//UiTable/scrollToBottom"/>
     </genClasses>
     <genClasses ecoreClass="UIGrammarCore.ecore#//UiComboBox">
       <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference UIGrammarCore.ecore#//UiComboBox/itemCaptionProperty"/>
@@ -260,6 +267,13 @@
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UIGrammarCore.ecore#//UiColumn/expandRatio"/>
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference UIGrammarCore.ecore#//UiColumn/property"/>
     </genClasses>
+    <genClasses ecoreClass="UIGrammarCore.ecore#//UiSortOrderAssignment">
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference UIGrammarCore.ecore#//UiSortOrderAssignment/columns"/>
+    </genClasses>
+    <genClasses ecoreClass="UIGrammarCore.ecore#//UiSortOrder">
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference UIGrammarCore.ecore#//UiSortOrder/property"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UIGrammarCore.ecore#//UiSortOrder/asc"/>
+    </genClasses>
     <genClasses ecoreClass="UIGrammarCore.ecore#//UiColumnsAssignment">
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference UIGrammarCore.ecore#//UiColumnsAssignment/columns"/>
     </genClasses>
@@ -415,6 +429,7 @@
     <genClasses ecoreClass="UIGrammarCore.ecore#//UiProgressBar"/>
     <genClasses ecoreClass="UIGrammarCore.ecore#//UiI18nInfo">
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UIGrammarCore.ecore#//UiI18nInfo/key"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UIGrammarCore.ecore#//UiI18nInfo/noCaption"/>
     </genClasses>
     <genClasses image="false" ecoreClass="UIGrammarCore.ecore#//UiI18nInfoable">
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference UIGrammarCore.ecore#//UiI18nInfoable/i18nInfo"/>
@@ -467,5 +482,28 @@
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference UIGrammarCore.ecore#//UiSetNewInstanceCommand/target"/>
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference UIGrammarCore.ecore#//UiSetNewInstanceCommand/jvmType"/>
     </genClasses>
+    <genClasses ecoreClass="UIGrammarCore.ecore#//UiPasswordField"/>
+    <genClasses ecoreClass="UIGrammarCore.ecore#//UiMaskedTextField">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UIGrammarCore.ecore#//UiMaskedTextField/mask"/>
+    </genClasses>
+    <genClasses ecoreClass="UIGrammarCore.ecore#//UiPrefixedMaskedTextField">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UIGrammarCore.ecore#//UiPrefixedMaskedTextField/mask"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference UIGrammarCore.ecore#//UiPrefixedMaskedTextField/prefixMasks"/>
+    </genClasses>
+    <genClasses ecoreClass="UIGrammarCore.ecore#//UiMaskedNumericField"/>
+    <genClasses ecoreClass="UIGrammarCore.ecore#//UiMaskedDecimalField">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UIGrammarCore.ecore#//UiMaskedDecimalField/mask"/>
+    </genClasses>
+    <genClasses ecoreClass="UIGrammarCore.ecore#//UiStringToStringMapEntry">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UIGrammarCore.ecore#//UiStringToStringMapEntry/key"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UIGrammarCore.ecore#//UiStringToStringMapEntry/value"/>
+    </genClasses>
+    <genClasses ecoreClass="UIGrammarCore.ecore#//UiRichTextArea">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UIGrammarCore.ecore#//UiRichTextArea/asBlob"/>
+    </genClasses>
+    <genClasses ecoreClass="UIGrammarCore.ecore#//UiPrefixToMaskMapEntry">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UIGrammarCore.ecore#//UiPrefixToMaskMapEntry/key"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UIGrammarCore.ecore#//UiPrefixToMaskMapEntry/value"/>
+    </genClasses>
   </genPackages>
 </genmodel:GenModel>
diff --git a/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/AbstractUIGrammarRuntimeModule.java b/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/AbstractUIGrammarRuntimeModule.java
index ed978a0..2352ff3 100644
--- a/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/AbstractUIGrammarRuntimeModule.java
+++ b/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/AbstractUIGrammarRuntimeModule.java
@@ -7,23 +7,78 @@
  *
  * Contributors:
  *         Florian Pirchner - Initial implementation
+ *
+ * generated by Xtext 2.11.0
+ *
  */
 
 package org.eclipse.osbp.ecview.dsl;
 
-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.ecview.dsl.jvmmodel.UIGrammarJvmModelInferrer;
+import org.eclipse.osbp.ecview.dsl.parser.antlr.UIGrammarAntlrTokenFileProvider;
+import org.eclipse.osbp.ecview.dsl.parser.antlr.UIGrammarParser;
+import org.eclipse.osbp.ecview.dsl.parser.antlr.internal.InternalUIGrammarLexer;
+import org.eclipse.osbp.ecview.dsl.scoping.UIGrammarScopeProvider;
+import org.eclipse.osbp.ecview.dsl.serializer.UIGrammarSemanticSequencer;
+import org.eclipse.osbp.ecview.dsl.serializer.UIGrammarSyntacticSequencer;
+import org.eclipse.osbp.ecview.dsl.services.UIGrammarGrammarAccess;
+import org.eclipse.osbp.ecview.dsl.validation.UIGrammarValidator;
+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.ecview.dsl.UIGrammarRuntimeModule}
+ * Manual modifications go to {@link UIGrammarRuntimeModule}.
  */
- @SuppressWarnings("all")
-public abstract class AbstractUIGrammarRuntimeModule extends DefaultRuntimeModule {
+@SuppressWarnings("all")
+public abstract class AbstractUIGrammarRuntimeModule extends DefaultXbaseWithAnnotationsRuntimeModule {
 
 	protected Properties properties = null;
 
@@ -42,309 +97,152 @@
 			binder.bind(String.class).annotatedWith(Names.named(Constants.FILE_EXTENSIONS)).toInstance("ui");
 	}
 	
-	// contributed by org.eclipse.xtext.generator.grammarAccess.GrammarAccessFragment
-	public Class<? extends org.eclipse.xtext.IGrammarAccess> bindIGrammarAccess() {
-		return org.eclipse.osbp.ecview.dsl.services.UIGrammarGrammarAccess.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.serializer.SerializerFragment
-	public Class<? extends org.eclipse.xtext.serializer.sequencer.ISemanticSequencer> bindISemanticSequencer() {
-		return org.eclipse.osbp.ecview.dsl.serializer.UIGrammarSemanticSequencer.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.serializer.SerializerFragment
-	public Class<? extends org.eclipse.xtext.serializer.sequencer.ISyntacticSequencer> bindISyntacticSequencer() {
-		return org.eclipse.osbp.ecview.dsl.serializer.UIGrammarSyntacticSequencer.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.ecview.dsl.parser.antlr.UIGrammarParser.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.ecview.dsl.parser.antlr.UIGrammarAntlrTokenFileProvider.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment
-	public Class<? extends org.eclipse.xtext.parser.antlr.Lexer> bindLexer() {
-		return org.eclipse.osbp.ecview.dsl.parser.antlr.internal.InternalUIGrammarLexer.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment
-	public com.google.inject.Provider<org.eclipse.osbp.ecview.dsl.parser.antlr.internal.InternalUIGrammarLexer> provideInternalUIGrammarLexer() {
-		return org.eclipse.xtext.parser.antlr.LexerProvider.create(org.eclipse.osbp.ecview.dsl.parser.antlr.internal.InternalUIGrammarLexer.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.ecview.dsl.parser.antlr.internal.InternalUIGrammarLexer.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.parser.antlr.XtextAntlrGeneratorFragment
-	public Class<? extends org.eclipse.xtext.parser.antlr.IUnorderedGroupHelper> bindIUnorderedGroupHelper() {
-		return org.eclipse.xtext.parser.antlr.UnorderedGroupHelper.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.validation.ValidatorFragment
-	@org.eclipse.xtext.service.SingletonBinding(eager=true)	public Class<? extends org.eclipse.osbp.ecview.dsl.validation.UIGrammarValidator> bindUIGrammarValidator() {
-		return org.eclipse.osbp.ecview.dsl.validation.UIGrammarValidator.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.ecview.dsl.formatting.UIGrammarFormatter.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.types.TypesGeneratorFragment
-	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.types.TypesGeneratorFragment
-	public org.eclipse.xtext.common.types.TypesFactory bindTypesFactoryToInstance() {
-		return org.eclipse.xtext.common.types.TypesFactory.eINSTANCE;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.grammarAccess.GrammarAccessFragment2
+	public Class<? extends IGrammarAccess> bindIGrammarAccess() {
+		return UIGrammarGrammarAccess.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.ClasspathTypeProviderFactory.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.serializer.SerializerFragment2
+	public Class<? extends ISemanticSequencer> bindISemanticSequencer() {
+		return UIGrammarSemanticSequencer.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.xtext.generator.serializer.SerializerFragment2
+	public Class<? extends ISyntacticSequencer> bindISyntacticSequencer() {
+		return UIGrammarSyntacticSequencer.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.xtext.generator.serializer.SerializerFragment2
+	public Class<? extends ISerializer> bindISerializer() {
+		return Serializer.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.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends IParser> bindIParser() {
+		return UIGrammarParser.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.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends ITokenToStringConverter> bindITokenToStringConverter() {
+		return AntlrTokenToStringConverter.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.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends IAntlrTokenFileProvider> bindIAntlrTokenFileProvider() {
+		return UIGrammarAntlrTokenFileProvider.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.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends Lexer> bindLexer() {
+		return InternalUIGrammarLexer.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.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends ITokenDefProvider> bindITokenDefProvider() {
+		return AntlrTokenDefProvider.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.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Provider<? extends InternalUIGrammarLexer> provideInternalUIGrammarLexer() {
+		return LexerProvider.create(InternalUIGrammarLexer.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.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public void configureRuntimeLexer(Binder binder) {
+		binder.bind(Lexer.class)
+			.annotatedWith(Names.named(LexerBindings.RUNTIME))
+			.to(InternalUIGrammarLexer.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.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends IUnorderedGroupHelper> bindIUnorderedGroupHelper() {
+		return UnorderedGroupHelper.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.xtext.generator.validation.ValidatorFragment2
+	@SingletonBinding(eager=true)
+	public Class<? extends UIGrammarValidator> bindUIGrammarValidator() {
+		return UIGrammarValidator.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.xtext.generator.scoping.ImportNamespacesScopingFragment2
+	public Class<? extends IBatchScopeProvider> bindIBatchScopeProvider() {
+		return UIGrammarScopeProvider.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.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.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.xtext.generator.scoping.ImportNamespacesScopingFragment2
+	public void configureIgnoreCaseLinking(Binder binder) {
+		binder.bindConstant().annotatedWith(IgnoreCaseLinking.class).to(false);
 	}
-
-	// 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.xtext.generator.builder.BuilderIntegrationFragment2
+	public Class<? extends IContainer.Manager> bindIContainer$Manager() {
+		return StateBasedContainerManager.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.xtext.generator.builder.BuilderIntegrationFragment2
+	public Class<? extends IAllContainersState.Provider> bindIAllContainersState$Provider() {
+		return ResourceSetBasedAllContainersStateProvider.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.xtext.generator.builder.BuilderIntegrationFragment2
+	public void configureIResourceDescriptions(Binder binder) {
+		binder.bind(IResourceDescriptions.class).to(ResourceSetBasedResourceDescriptions.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.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.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.xtext.generator.xbase.XbaseGeneratorFragment2
+	public Class<? extends IQualifiedNameProvider> bindIQualifiedNameProvider() {
+		return XbaseQualifiedNameProvider.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.xtext.generator.xbase.XbaseGeneratorFragment2
+	public Class<? extends ILocationInFileProvider> bindILocationInFileProvider() {
+		return JvmLocationInFileProvider.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.xtext.generator.xbase.XbaseGeneratorFragment2
+	public Class<? extends IGlobalScopeProvider> bindIGlobalScopeProvider() {
+		return TypesAwareDefaultGlobalScopeProvider.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.xtext.generator.xbase.XbaseGeneratorFragment2
+	public Class<? extends FeatureNameValidator> bindFeatureNameValidator() {
+		return LogicalContainerAwareFeatureNameValidator.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.xtext.generator.xbase.XbaseGeneratorFragment2
+	public Class<? extends DefaultBatchTypeResolver> bindDefaultBatchTypeResolver() {
+		return LogicalContainerAwareBatchTypeResolver.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.xtext.generator.xbase.XbaseGeneratorFragment2
+	public Class<? extends DefaultReentrantTypeResolver> bindDefaultReentrantTypeResolver() {
+		return LogicalContainerAwareReentrantTypeResolver.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.xtext.generator.xbase.XbaseGeneratorFragment2
+	public Class<? extends IResourceValidator> bindIResourceValidator() {
+		return DerivedStateAwareResourceValidator.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.xtext.generator.xbase.XbaseGeneratorFragment2
+	public Class<? extends IJvmModelInferrer> bindIJvmModelInferrer() {
+		return UIGrammarJvmModelInferrer.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.ecview.dsl.jvmmodel.UIGrammarJvmModelInferrer.class;
-	}
-
+	
 }
diff --git a/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/UIGrammarStandaloneSetupGenerated.java b/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/UIGrammarStandaloneSetupGenerated.java
index e684fc9..d6f13b5 100644
--- a/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/UIGrammarStandaloneSetupGenerated.java
+++ b/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/UIGrammarStandaloneSetupGenerated.java
@@ -7,25 +7,27 @@
  *
  * Contributors:
  *         Florian Pirchner - Initial implementation
+ *
+ * generated by Xtext 2.11.0
+ *
  */
 
 package org.eclipse.osbp.ecview.dsl;
 
-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 UIGrammarStandaloneSetupGenerated implements ISetup {
 
+	@Override
 	public Injector createInjectorAndDoEMFRegistration() {
-		org.eclipse.xtext.xbase.XbaseStandaloneSetup.doSetup();
+		OXtypeStandaloneSetup.doSetup();
 
 		Injector injector = createInjector();
 		register(injector);
@@ -33,18 +35,14 @@
 	}
 	
 	public Injector createInjector() {
-		return Guice.createInjector(new org.eclipse.osbp.ecview.dsl.UIGrammarRuntimeModule());
+		return Guice.createInjector(new UIGrammarRuntimeModule());
 	}
 	
 	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("ui", resourceFactory);
-		org.eclipse.xtext.resource.IResourceServiceProvider.Registry.INSTANCE.getExtensionToFactoryMap().put("ui", serviceProvider);
+		IResourceFactory resourceFactory = injector.getInstance(IResourceFactory.class);
+		IResourceServiceProvider serviceProvider = injector.getInstance(IResourceServiceProvider.class);
 		
-
-
-
+		Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("ui", resourceFactory);
+		IResourceServiceProvider.Registry.INSTANCE.getExtensionToFactoryMap().put("ui", serviceProvider);
 	}
 }
diff --git a/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/UIGrammarAntlrTokenFileProvider.java b/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/UIGrammarAntlrTokenFileProvider.java
index 1729fb2..db3ea46 100644
--- a/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/UIGrammarAntlrTokenFileProvider.java
+++ b/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/UIGrammarAntlrTokenFileProvider.java
@@ -7,6 +7,9 @@
  *
  * Contributors:
  *         Florian Pirchner - Initial implementation
+ *
+ * generated by Xtext 2.11.0
+ *
  */
 
 package org.eclipse.osbp.ecview.dsl.parser.antlr;
@@ -15,9 +18,10 @@
 import org.eclipse.xtext.parser.antlr.IAntlrTokenFileProvider;
 
 public class UIGrammarAntlrTokenFileProvider implements IAntlrTokenFileProvider {
-	
+
+	@Override
 	public InputStream getAntlrTokenFile() {
 		ClassLoader classLoader = getClass().getClassLoader();
-    	return classLoader.getResourceAsStream("org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.tokens");
+		return classLoader.getResourceAsStream("org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.tokens");
 	}
 }
diff --git a/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/UIGrammarParser.java b/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/UIGrammarParser.java
index 02e5e3e..a7f43ea 100644
--- a/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/UIGrammarParser.java
+++ b/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/UIGrammarParser.java
@@ -7,41 +7,45 @@
  *
  * Contributors:
  *         Florian Pirchner - Initial implementation
+ *
+ * generated by Xtext 2.11.0
+ *
  */
 
 package org.eclipse.osbp.ecview.dsl.parser.antlr;
 
 import com.google.inject.Inject;
-
-import org.eclipse.xtext.parser.antlr.XtextTokenStream;
+import org.eclipse.osbp.ecview.dsl.parser.antlr.internal.InternalUIGrammarParser;
 import org.eclipse.osbp.ecview.dsl.services.UIGrammarGrammarAccess;
+import org.eclipse.xtext.parser.antlr.AbstractAntlrParser;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream;
 
-public class UIGrammarParser extends org.eclipse.xtext.parser.antlr.AbstractAntlrParser {
-	
+public class UIGrammarParser extends AbstractAntlrParser {
+
 	@Inject
 	private UIGrammarGrammarAccess grammarAccess;
-	
+
 	@Override
 	protected void setInitialHiddenTokens(XtextTokenStream tokenStream) {
 		tokenStream.setInitialHiddenTokens("RULE_WS", "RULE_ML_COMMENT", "RULE_SL_COMMENT");
 	}
 	
+
 	@Override
-	protected org.eclipse.osbp.ecview.dsl.parser.antlr.internal.InternalUIGrammarParser createParser(XtextTokenStream stream) {
-		return new org.eclipse.osbp.ecview.dsl.parser.antlr.internal.InternalUIGrammarParser(stream, getGrammarAccess());
+	protected InternalUIGrammarParser createParser(XtextTokenStream stream) {
+		return new InternalUIGrammarParser(stream, getGrammarAccess());
 	}
-	
+
 	@Override 
 	protected String getDefaultRuleName() {
 		return "UiModel";
 	}
-	
+
 	public UIGrammarGrammarAccess getGrammarAccess() {
 		return this.grammarAccess;
 	}
-	
+
 	public void setGrammarAccess(UIGrammarGrammarAccess grammarAccess) {
 		this.grammarAccess = grammarAccess;
 	}
-	
 }
diff --git a/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g b/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g
index 58e88da..9e987a2 100644
--- a/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g
+++ b/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g
@@ -7,13 +7,15 @@
  *
  * Contributors:
  *         Florian Pirchner - Initial implementation
+ *
+ * generated by Xtext 2.11.0
+ *
  */
 
 grammar InternalUIGrammar;
 
 options {
 	superClass=AbstractInternalAntlrParser;
-	
 }
 
 @lexer::header {
@@ -25,7 +27,7 @@
 }
 
 @parser::header {
-package org.eclipse.osbp.ecview.dsl.parser.antlr.internal; 
+package org.eclipse.osbp.ecview.dsl.parser.antlr.internal;
 
 import org.eclipse.xtext.*;
 import org.eclipse.xtext.parser.*;
@@ -44,9969 +46,24327 @@
 @parser::members {
 
  	private UIGrammarGrammarAccess grammarAccess;
- 	
+
     public InternalUIGrammarParser(TokenStream input, UIGrammarGrammarAccess grammarAccess) {
         this(input);
         this.grammarAccess = grammarAccess;
         registerRules(grammarAccess.getGrammar());
     }
-    
+
     @Override
     protected String getFirstRuleName() {
-    	return "UiModel";	
+    	return "UiModel";
    	}
-   	
+
    	@Override
    	protected UIGrammarGrammarAccess getGrammarAccess() {
    		return grammarAccess;
    	}
+
 }
 
-@rulecatch { 
-    catch (RecognitionException re) { 
-        recover(input,re); 
+@rulecatch {
+    catch (RecognitionException re) {
+        recover(input,re);
         appendSkippedTokens();
-    } 
+    }
 }
 
-
-
-
 // Entry rule entryRuleUiModel
-entryRuleUiModel returns [EObject current=null] 
-	:
+entryRuleUiModel returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiModelRule()); }
-	 iv_ruleUiModel=ruleUiModel 
-	 { $current=$iv_ruleUiModel.current; } 
-	 EOF 
-;
+	iv_ruleUiModel=ruleUiModel
+	{ $current=$iv_ruleUiModel.current; }
+	EOF;
 
 // Rule UiModel
-ruleUiModel returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='package' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getUiModelAccess().getPackageKeyword_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiModelAccess().getPackageNameQualifiedNameParserRuleCall_1_0()); 
-	    }
-		lv_packageName_1_0=ruleQualifiedName		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiModelRule());
-	        }
-       		set(
-       			$current, 
-       			"packageName",
-        		lv_packageName_1_0, 
-        		"QualifiedName");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiModelAccess().getImportsUiImportsParserRuleCall_2_0()); 
-	    }
-		lv_imports_2_0=ruleUiImports		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiModelRule());
-	        }
-       		add(
-       			$current, 
-       			"imports",
-        		lv_imports_2_0, 
-        		"UiImports");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiModelAccess().getRootsUiRootElementsParserRuleCall_3_0()); 
-	    }
-		lv_roots_3_0=ruleUiRootElements		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiModelRule());
-	        }
-       		add(
-       			$current, 
-       			"roots",
-        		lv_roots_3_0, 
-        		"UiRootElements");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*)
+ruleUiModel returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='package'
+		{
+			newLeafNode(otherlv_0, grammarAccess.getUiModelAccess().getPackageKeyword_0());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiModelAccess().getPackageNameQualifiedNameParserRuleCall_1_0());
+				}
+				lv_packageName_1_0=ruleQualifiedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiModelRule());
+					}
+					set(
+						$current,
+						"packageName",
+						lv_packageName_1_0,
+						"org.eclipse.xtext.xbase.Xbase.QualifiedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiModelAccess().getImportSectionXImportSectionParserRuleCall_2_0());
+				}
+				lv_importSection_2_0=ruleXImportSection
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiModelRule());
+					}
+					set(
+						$current,
+						"importSection",
+						lv_importSection_2_0,
+						"org.eclipse.xtext.xbase.Xtype.XImportSection");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiModelAccess().getRootsUiRootElementsParserRuleCall_3_0());
+				}
+				lv_roots_3_0=ruleUiRootElements
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiModelRule());
+					}
+					add(
+						$current,
+						"roots",
+						lv_roots_3_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiRootElements");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+	)
 ;
 
-
-
-
-
-// Entry rule entryRuleUiImports
-entryRuleUiImports returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getUiImportsRule()); }
-	 iv_ruleUiImports=ruleUiImports 
-	 { $current=$iv_ruleUiImports.current; } 
-	 EOF 
-;
-
-// Rule UiImports
-ruleUiImports returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='import' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getUiImportsAccess().getImportKeyword_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiImportsAccess().getImportedNamespaceQualifiedNameWithWildcardParserRuleCall_1_0()); 
-	    }
-		lv_importedNamespace_1_0=ruleQualifiedNameWithWildcard		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiImportsRule());
-	        }
-       		set(
-       			$current, 
-       			"importedNamespace",
-        		lv_importedNamespace_1_0, 
-        		"QualifiedNameWithWildcard");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_2=';' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getUiImportsAccess().getSemicolonKeyword_2());
-    }
-)?)
-;
-
-
-
-
-
 // Entry rule entryRuleUiRootElements
-entryRuleUiRootElements returns [EObject current=null] 
-	:
+entryRuleUiRootElements returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiRootElementsRule()); }
-	 iv_ruleUiRootElements=ruleUiRootElements 
-	 { $current=$iv_ruleUiRootElements.current; } 
-	 EOF 
-;
+	iv_ruleUiRootElements=ruleUiRootElements
+	{ $current=$iv_ruleUiRootElements.current; }
+	EOF;
 
 // Rule UiRootElements
-ruleUiRootElements returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-    { 
-        newCompositeNode(grammarAccess.getUiRootElementsAccess().getUiViewParserRuleCall_0()); 
-    }
-    this_UiView_0=ruleUiView
-    { 
-        $current = $this_UiView_0.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getUiRootElementsAccess().getUiViewSetParserRuleCall_1()); 
-    }
-    this_UiViewSet_1=ruleUiViewSet
-    { 
-        $current = $this_UiViewSet_1.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getUiRootElementsAccess().getUiValidatorAliasParserRuleCall_2()); 
-    }
-    this_UiValidatorAlias_2=ruleUiValidatorAlias
-    { 
-        $current = $this_UiValidatorAlias_2.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getUiRootElementsAccess().getUiMobileViewParserRuleCall_3()); 
-    }
-    this_UiMobileView_3=ruleUiMobileView
-    { 
-        $current = $this_UiMobileView_3.current; 
-        afterParserOrEnumRuleCall();
-    }
-)
+ruleUiRootElements returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getUiRootElementsAccess().getUiViewParserRuleCall_0());
+		}
+		this_UiView_0=ruleUiView
+		{
+			$current = $this_UiView_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiRootElementsAccess().getUiDisplayViewParserRuleCall_1());
+		}
+		this_UiDisplayView_1=ruleUiDisplayView
+		{
+			$current = $this_UiDisplayView_1.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiRootElementsAccess().getUiViewSetParserRuleCall_2());
+		}
+		this_UiViewSet_2=ruleUiViewSet
+		{
+			$current = $this_UiViewSet_2.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiRootElementsAccess().getUiValidatorAliasParserRuleCall_3());
+		}
+		this_UiValidatorAlias_3=ruleUiValidatorAlias
+		{
+			$current = $this_UiValidatorAlias_3.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiRootElementsAccess().getUiMobileViewParserRuleCall_4());
+		}
+		this_UiMobileView_4=ruleUiMobileView
+		{
+			$current = $this_UiMobileView_4.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiValidatorAlias
-entryRuleUiValidatorAlias returns [EObject current=null] 
-	:
+entryRuleUiValidatorAlias returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiValidatorAliasRule()); }
-	 iv_ruleUiValidatorAlias=ruleUiValidatorAlias 
-	 { $current=$iv_ruleUiValidatorAlias.current; } 
-	 EOF 
-;
+	iv_ruleUiValidatorAlias=ruleUiValidatorAlias
+	{ $current=$iv_ruleUiValidatorAlias.current; }
+	EOF;
 
 // Rule UiValidatorAlias
-ruleUiValidatorAlias returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='validatorAlias' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getUiValidatorAliasAccess().getValidatorAliasKeyword_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiValidatorAliasAccess().getValidatorUiValidatorParserRuleCall_1_0()); 
-	    }
-		lv_validator_1_0=ruleUiValidator		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiValidatorAliasRule());
-	        }
-       		set(
-       			$current, 
-       			"validator",
-        		lv_validator_1_0, 
-        		"UiValidator");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_2='as' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getUiValidatorAliasAccess().getAsKeyword_2());
-    }
-(
-(
-		lv_alias_3_0=RULE_ID
+ruleUiValidatorAlias returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='validatorAlias'
 		{
-			newLeafNode(lv_alias_3_0, grammarAccess.getUiValidatorAliasAccess().getAliasIDTerminalRuleCall_3_0()); 
+			newLeafNode(otherlv_0, grammarAccess.getUiValidatorAliasAccess().getValidatorAliasKeyword_0());
 		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiValidatorAliasAccess().getValidatorUiValidatorParserRuleCall_1_0());
+				}
+				lv_validator_1_0=ruleUiValidator
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiValidatorAliasRule());
+					}
+					set(
+						$current,
+						"validator",
+						lv_validator_1_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_2='as'
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiValidatorAliasRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"alias",
-        		lv_alias_3_0, 
-        		"ID");
-	    }
-
-)
-)(	otherlv_4=';' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getUiValidatorAliasAccess().getSemicolonKeyword_4());
-    }
-)?)
+			newLeafNode(otherlv_2, grammarAccess.getUiValidatorAliasAccess().getAsKeyword_2());
+		}
+		(
+			(
+				lv_alias_3_0=RULE_ID
+				{
+					newLeafNode(lv_alias_3_0, grammarAccess.getUiValidatorAliasAccess().getAliasIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiValidatorAliasRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"alias",
+						lv_alias_3_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)
+		(
+			otherlv_4=';'
+			{
+				newLeafNode(otherlv_4, grammarAccess.getUiValidatorAliasAccess().getSemicolonKeyword_4());
+			}
+		)?
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiValidatorAssignment
-entryRuleUiValidatorAssignment returns [EObject current=null] 
-	:
+entryRuleUiValidatorAssignment returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiValidatorAssignmentRule()); }
-	 iv_ruleUiValidatorAssignment=ruleUiValidatorAssignment 
-	 { $current=$iv_ruleUiValidatorAssignment.current; } 
-	 EOF 
-;
+	iv_ruleUiValidatorAssignment=ruleUiValidatorAssignment
+	{ $current=$iv_ruleUiValidatorAssignment.current; }
+	EOF;
 
 // Rule UiValidatorAssignment
-ruleUiValidatorAssignment returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='fieldValidation' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getUiValidatorAssignmentAccess().getFieldValidationKeyword_0());
-    }
-(
-(
+ruleUiValidatorAssignment returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='fieldValidation'
 		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiValidatorAssignmentRule());
-	        }
-        }
-	otherlv_1=RULE_ID
-	{
-		newLeafNode(otherlv_1, grammarAccess.getUiValidatorAssignmentAccess().getFieldUiFieldCrossReference_1_0()); 
-	}
-
-)
-)	otherlv_2='+=' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getUiValidatorAssignmentAccess().getPlusSignEqualsSignKeyword_2());
-    }
-((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiValidatorAssignmentAccess().getValidatorDefUiValidatorDefParserRuleCall_3_0_0()); 
-	    }
-		lv_validatorDef_3_0=ruleUiValidatorDef		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiValidatorAssignmentRule());
-	        }
-       		set(
-       			$current, 
-       			"validatorDef",
-        		lv_validatorDef_3_0, 
-        		"UiValidatorDef");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
-    |((
-(
+			newLeafNode(otherlv_0, grammarAccess.getUiValidatorAssignmentAccess().getFieldValidationKeyword_0());
+		}
+		(
+			(
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiValidatorAssignmentRule());
+					}
+				}
+				otherlv_1=RULE_ID
+				{
+					newLeafNode(otherlv_1, grammarAccess.getUiValidatorAssignmentAccess().getFieldUiFieldCrossReference_1_0());
+				}
+			)
+		)
+		otherlv_2='+='
 		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiValidatorAssignmentRule());
-	        }
-        }
-		{ 
-	        newCompositeNode(grammarAccess.getUiValidatorAssignmentAccess().getValidatorAliasUiValidatorAliasCrossReference_3_1_0_0()); 
-	    }
-		ruleQualifiedName		{ 
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_5=';' 
-    {
-    	newLeafNode(otherlv_5, grammarAccess.getUiValidatorAssignmentAccess().getSemicolonKeyword_3_1_1());
-    }
-)?)))
+			newLeafNode(otherlv_2, grammarAccess.getUiValidatorAssignmentAccess().getPlusSignEqualsSignKeyword_2());
+		}
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiValidatorAssignmentAccess().getValidatorDefUiValidatorDefParserRuleCall_3_0_0());
+					}
+					lv_validatorDef_3_0=ruleUiValidatorDef
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiValidatorAssignmentRule());
+						}
+						set(
+							$current,
+							"validatorDef",
+							lv_validatorDef_3_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidatorDef");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			    |
+			(
+				(
+					(
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getUiValidatorAssignmentRule());
+							}
+						}
+						{
+							newCompositeNode(grammarAccess.getUiValidatorAssignmentAccess().getValidatorAliasUiValidatorAliasCrossReference_3_1_0_0());
+						}
+						ruleQualifiedName
+						{
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				(
+					otherlv_5=';'
+					{
+						newLeafNode(otherlv_5, grammarAccess.getUiValidatorAssignmentAccess().getSemicolonKeyword_3_1_1());
+					}
+				)?
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiValidatorDef
-entryRuleUiValidatorDef returns [EObject current=null] 
-	:
+entryRuleUiValidatorDef returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiValidatorDefRule()); }
-	 iv_ruleUiValidatorDef=ruleUiValidatorDef 
-	 { $current=$iv_ruleUiValidatorDef.current; } 
-	 EOF 
-;
+	iv_ruleUiValidatorDef=ruleUiValidatorDef
+	{ $current=$iv_ruleUiValidatorDef.current; }
+	EOF;
 
 // Rule UiValidatorDef
-ruleUiValidatorDef returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiValidatorDefAccess().getValidatorUiValidatorParserRuleCall_0()); 
-	    }
-		lv_validator_0_0=ruleUiValidator		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiValidatorDefRule());
-	        }
-       		set(
-       			$current, 
-       			"validator",
-        		lv_validator_0_0, 
-        		"UiValidator");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
+ruleUiValidatorDef returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				newCompositeNode(grammarAccess.getUiValidatorDefAccess().getValidatorUiValidatorParserRuleCall_0());
+			}
+			lv_validator_0_0=ruleUiValidator
+			{
+				if ($current==null) {
+					$current = createModelElementForParent(grammarAccess.getUiValidatorDefRule());
+				}
+				set(
+					$current,
+					"validator",
+					lv_validator_0_0,
+					"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+				afterParserOrEnumRuleCall();
+			}
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiViewSet
-entryRuleUiViewSet returns [EObject current=null] 
-	:
+entryRuleUiViewSet returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiViewSetRule()); }
-	 iv_ruleUiViewSet=ruleUiViewSet 
-	 { $current=$iv_ruleUiViewSet.current; } 
-	 EOF 
-;
+	iv_ruleUiViewSet=ruleUiViewSet
+	{ $current=$iv_ruleUiViewSet.current; }
+	EOF;
 
 // Rule UiViewSet
-ruleUiViewSet returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='viewset' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getUiViewSetAccess().getViewsetKeyword_0());
-    }
-(
-(
-		lv_name_1_0=RULE_ID
+ruleUiViewSet returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='viewset'
 		{
-			newLeafNode(lv_name_1_0, grammarAccess.getUiViewSetAccess().getNameIDTerminalRuleCall_1_0()); 
+			newLeafNode(otherlv_0, grammarAccess.getUiViewSetAccess().getViewsetKeyword_0());
 		}
+		(
+			(
+				lv_name_1_0=RULE_ID
+				{
+					newLeafNode(lv_name_1_0, grammarAccess.getUiViewSetAccess().getNameIDTerminalRuleCall_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiViewSetRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_1_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)
+		otherlv_2='{'
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiViewSetRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"name",
-        		lv_name_1_0, 
-        		"ID");
-	    }
-
-)
-)	otherlv_2='{' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getUiViewSetAccess().getLeftCurlyBracketKeyword_2());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiViewSetAccess().getBeanSlotsUiBeanSlotParserRuleCall_3_0()); 
-	    }
-		lv_beanSlots_3_0=ruleUiBeanSlot		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiViewSetRule());
-	        }
-       		add(
-       			$current, 
-       			"beanSlots",
-        		lv_beanSlots_3_0, 
-        		"UiBeanSlot");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiViewSetAccess().getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_4_0()); 
-	    }
-		lv_bindingEndpointAlias_4_0=ruleUiBindingEndpointAlias		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiViewSetRule());
-	        }
-       		add(
-       			$current, 
-       			"bindingEndpointAlias",
-        		lv_bindingEndpointAlias_4_0, 
-        		"UiBindingEndpointAlias");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_5='}' 
-    {
-    	newLeafNode(otherlv_5, grammarAccess.getUiViewSetAccess().getRightCurlyBracketKeyword_5());
-    }
-)
+			newLeafNode(otherlv_2, grammarAccess.getUiViewSetAccess().getLeftCurlyBracketKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiViewSetAccess().getBeanSlotsUiBeanSlotParserRuleCall_3_0());
+				}
+				lv_beanSlots_3_0=ruleUiBeanSlot
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiViewSetRule());
+					}
+					add(
+						$current,
+						"beanSlots",
+						lv_beanSlots_3_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBeanSlot");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiViewSetAccess().getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_4_0());
+				}
+				lv_bindingEndpointAlias_4_0=ruleUiBindingEndpointAlias
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiViewSetRule());
+					}
+					add(
+						$current,
+						"bindingEndpointAlias",
+						lv_bindingEndpointAlias_4_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAlias");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		otherlv_5='}'
+		{
+			newLeafNode(otherlv_5, grammarAccess.getUiViewSetAccess().getRightCurlyBracketKeyword_5());
+		}
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiBindingEndpointAlias
-entryRuleUiBindingEndpointAlias returns [EObject current=null] 
-	:
+entryRuleUiBindingEndpointAlias returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiBindingEndpointAliasRule()); }
-	 iv_ruleUiBindingEndpointAlias=ruleUiBindingEndpointAlias 
-	 { $current=$iv_ruleUiBindingEndpointAlias.current; } 
-	 EOF 
-;
+	iv_ruleUiBindingEndpointAlias=ruleUiBindingEndpointAlias
+	{ $current=$iv_ruleUiBindingEndpointAlias.current; }
+	EOF;
 
 // Rule UiBindingEndpointAlias
-ruleUiBindingEndpointAlias returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='dataAlias' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getUiBindingEndpointAliasAccess().getDataAliasKeyword_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiBindingEndpointAliasAccess().getEndpointUiBindingEndpointAssignmentParserRuleCall_1_0()); 
-	    }
-		lv_endpoint_1_0=ruleUiBindingEndpointAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiBindingEndpointAliasRule());
-	        }
-       		set(
-       			$current, 
-       			"endpoint",
-        		lv_endpoint_1_0, 
-        		"UiBindingEndpointAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_2='as' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getUiBindingEndpointAliasAccess().getAsKeyword_2());
-    }
-(
-(
-		lv_alias_3_0=RULE_ID
+ruleUiBindingEndpointAlias returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='dataAlias'
 		{
-			newLeafNode(lv_alias_3_0, grammarAccess.getUiBindingEndpointAliasAccess().getAliasIDTerminalRuleCall_3_0()); 
+			newLeafNode(otherlv_0, grammarAccess.getUiBindingEndpointAliasAccess().getDataAliasKeyword_0());
 		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiBindingEndpointAliasAccess().getEndpointUiBindingEndpointAssignmentParserRuleCall_1_0());
+				}
+				lv_endpoint_1_0=ruleUiBindingEndpointAssignment
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiBindingEndpointAliasRule());
+					}
+					set(
+						$current,
+						"endpoint",
+						lv_endpoint_1_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAssignment");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_2='as'
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiBindingEndpointAliasRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"alias",
-        		lv_alias_3_0, 
-        		"ID");
-	    }
-
-)
-)(	otherlv_4=';' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getUiBindingEndpointAliasAccess().getSemicolonKeyword_4());
-    }
-)?)
+			newLeafNode(otherlv_2, grammarAccess.getUiBindingEndpointAliasAccess().getAsKeyword_2());
+		}
+		(
+			(
+				lv_alias_3_0=RULE_ID
+				{
+					newLeafNode(lv_alias_3_0, grammarAccess.getUiBindingEndpointAliasAccess().getAliasIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiBindingEndpointAliasRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"alias",
+						lv_alias_3_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)
+		(
+			otherlv_4=';'
+			{
+				newLeafNode(otherlv_4, grammarAccess.getUiBindingEndpointAliasAccess().getSemicolonKeyword_4());
+			}
+		)?
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiBeanSlot
-entryRuleUiBeanSlot returns [EObject current=null] 
-	:
+entryRuleUiBeanSlot returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiBeanSlotRule()); }
-	 iv_ruleUiBeanSlot=ruleUiBeanSlot 
-	 { $current=$iv_ruleUiBeanSlot.current; } 
-	 EOF 
-;
+	iv_ruleUiBeanSlot=ruleUiBeanSlot
+	{ $current=$iv_ruleUiBeanSlot.current; }
+	EOF;
 
 // Rule UiBeanSlot
-ruleUiBeanSlot returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='datasource' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getUiBeanSlotAccess().getDatasourceKeyword_0());
-    }
-(
-(
-		lv_name_1_0=RULE_ID
+ruleUiBeanSlot returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='datasource'
 		{
-			newLeafNode(lv_name_1_0, grammarAccess.getUiBeanSlotAccess().getNameIDTerminalRuleCall_1_0()); 
+			newLeafNode(otherlv_0, grammarAccess.getUiBeanSlotAccess().getDatasourceKeyword_0());
 		}
+		(
+			(
+				lv_name_1_0=RULE_ID
+				{
+					newLeafNode(lv_name_1_0, grammarAccess.getUiBeanSlotAccess().getNameIDTerminalRuleCall_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiBeanSlotRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_1_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)
+		otherlv_2=':'
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiBeanSlotRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"name",
-        		lv_name_1_0, 
-        		"ID");
-	    }
-
-)
-)	otherlv_2=':' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getUiBeanSlotAccess().getColonKeyword_2());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiBeanSlotAccess().getJvmTypeJvmTypeReferenceParserRuleCall_3_0()); 
-	    }
-		lv_jvmType_3_0=ruleJvmTypeReference		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiBeanSlotRule());
-	        }
-       		set(
-       			$current, 
-       			"jvmType",
-        		lv_jvmType_3_0, 
-        		"JvmTypeReference");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_4='eventTopic' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getUiBeanSlotAccess().getEventTopicKeyword_4_0());
-    }
-(
-(
-		lv_eventTopic_5_0=RULE_STRING
-		{
-			newLeafNode(lv_eventTopic_5_0, grammarAccess.getUiBeanSlotAccess().getEventTopicSTRINGTerminalRuleCall_4_1_0()); 
+			newLeafNode(otherlv_2, grammarAccess.getUiBeanSlotAccess().getColonKeyword_2());
 		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiBeanSlotRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"eventTopic",
-        		lv_eventTopic_5_0, 
-        		"STRING");
-	    }
-
-)
-))?(	otherlv_6=';' 
-    {
-    	newLeafNode(otherlv_6, grammarAccess.getUiBeanSlotAccess().getSemicolonKeyword_5());
-    }
-)?)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiBeanSlotAccess().getJvmTypeJvmTypeReferenceParserRuleCall_3_0());
+				}
+				lv_jvmType_3_0=ruleJvmTypeReference
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiBeanSlotRule());
+					}
+					set(
+						$current,
+						"jvmType",
+						lv_jvmType_3_0,
+						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_4='eventTopic'
+			{
+				newLeafNode(otherlv_4, grammarAccess.getUiBeanSlotAccess().getEventTopicKeyword_4_0());
+			}
+			(
+				(
+					lv_eventTopic_5_0=RULE_STRING
+					{
+						newLeafNode(lv_eventTopic_5_0, grammarAccess.getUiBeanSlotAccess().getEventTopicSTRINGTerminalRuleCall_4_1_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getUiBeanSlotRule());
+						}
+						setWithLastConsumed(
+							$current,
+							"eventTopic",
+							lv_eventTopic_5_0,
+							"org.eclipse.xtext.xbase.Xtype.STRING");
+					}
+				)
+			)
+		)?
+		(
+			otherlv_6=';'
+			{
+				newLeafNode(otherlv_6, grammarAccess.getUiBeanSlotAccess().getSemicolonKeyword_5());
+			}
+		)?
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiBinding
-entryRuleUiBinding returns [EObject current=null] 
-	:
+entryRuleUiBinding returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiBindingRule()); }
-	 iv_ruleUiBinding=ruleUiBinding 
-	 { $current=$iv_ruleUiBinding.current; } 
-	 EOF 
-;
+	iv_ruleUiBinding=ruleUiBinding
+	{ $current=$iv_ruleUiBinding.current; }
+	EOF;
 
 // Rule UiBinding
-ruleUiBinding returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='bind' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getUiBindingAccess().getBindKeyword_0());
-    }
-(
-(
-		lv_listBinding_1_0=	'list' 
-    {
-        newLeafNode(lv_listBinding_1_0, grammarAccess.getUiBindingAccess().getListBindingListKeyword_1_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiBindingRule());
-	        }
-       		setWithLastConsumed($current, "listBinding", true, "list");
-	    }
-
-)
-)?(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiBindingAccess().getSourceUiBindingEndpointAssignmentParserRuleCall_2_0()); 
-	    }
-		lv_source_2_0=ruleUiBindingEndpointAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiBindingRule());
-	        }
-       		set(
-       			$current, 
-       			"source",
-        		lv_source_2_0, 
-        		"UiBindingEndpointAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)((
-(
-		lv_targetToSource_3_0=	'<' 
-    {
-        newLeafNode(lv_targetToSource_3_0, grammarAccess.getUiBindingAccess().getTargetToSourceLessThanSignKeyword_3_0_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiBindingRule());
-	        }
-       		setWithLastConsumed($current, "targetToSource", true, "<");
-	    }
-
-)
-)?	otherlv_4='--' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getUiBindingAccess().getHyphenMinusHyphenMinusKeyword_3_1());
-    }
-(
-(
-		lv_sourceToTarget_5_0=	'>' 
-    {
-        newLeafNode(lv_sourceToTarget_5_0, grammarAccess.getUiBindingAccess().getSourceToTargetGreaterThanSignKeyword_3_2_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiBindingRule());
-	        }
-       		setWithLastConsumed($current, "sourceToTarget", true, ">");
-	    }
-
-)
-)?)(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiBindingAccess().getTargetUiBindingEndpointAssignmentParserRuleCall_4_0()); 
-	    }
-		lv_target_6_0=ruleUiBindingEndpointAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiBindingRule());
-	        }
-       		set(
-       			$current, 
-       			"target",
-        		lv_target_6_0, 
-        		"UiBindingEndpointAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_7=';' 
-    {
-    	newLeafNode(otherlv_7, grammarAccess.getUiBindingAccess().getSemicolonKeyword_5());
-    }
-)?)
+ruleUiBinding returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='bind'
+		{
+			newLeafNode(otherlv_0, grammarAccess.getUiBindingAccess().getBindKeyword_0());
+		}
+		(
+			(
+				lv_listBinding_1_0='list'
+				{
+					newLeafNode(lv_listBinding_1_0, grammarAccess.getUiBindingAccess().getListBindingListKeyword_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiBindingRule());
+					}
+					setWithLastConsumed($current, "listBinding", true, "list");
+				}
+			)
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiBindingAccess().getSourceUiBindingEndpointAssignmentParserRuleCall_2_0());
+				}
+				lv_source_2_0=ruleUiBindingEndpointAssignment
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiBindingRule());
+					}
+					set(
+						$current,
+						"source",
+						lv_source_2_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAssignment");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				(
+					lv_targetToSource_3_0='<'
+					{
+						newLeafNode(lv_targetToSource_3_0, grammarAccess.getUiBindingAccess().getTargetToSourceLessThanSignKeyword_3_0_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getUiBindingRule());
+						}
+						setWithLastConsumed($current, "targetToSource", true, "<");
+					}
+				)
+			)?
+			otherlv_4='--'
+			{
+				newLeafNode(otherlv_4, grammarAccess.getUiBindingAccess().getHyphenMinusHyphenMinusKeyword_3_1());
+			}
+			(
+				(
+					lv_sourceToTarget_5_0='>'
+					{
+						newLeafNode(lv_sourceToTarget_5_0, grammarAccess.getUiBindingAccess().getSourceToTargetGreaterThanSignKeyword_3_2_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getUiBindingRule());
+						}
+						setWithLastConsumed($current, "sourceToTarget", true, ">");
+					}
+				)
+			)?
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiBindingAccess().getTargetUiBindingEndpointAssignmentParserRuleCall_4_0());
+				}
+				lv_target_6_0=ruleUiBindingEndpointAssignment
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiBindingRule());
+					}
+					set(
+						$current,
+						"target",
+						lv_target_6_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAssignment");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_7=';'
+			{
+				newLeafNode(otherlv_7, grammarAccess.getUiBindingAccess().getSemicolonKeyword_5());
+			}
+		)?
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiBindingEndpointAssignment
-entryRuleUiBindingEndpointAssignment returns [EObject current=null] 
-	:
+entryRuleUiBindingEndpointAssignment returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiBindingEndpointAssignmentRule()); }
-	 iv_ruleUiBindingEndpointAssignment=ruleUiBindingEndpointAssignment 
-	 { $current=$iv_ruleUiBindingEndpointAssignment.current; } 
-	 EOF 
-;
+	iv_ruleUiBindingEndpointAssignment=ruleUiBindingEndpointAssignment
+	{ $current=$iv_ruleUiBindingEndpointAssignment.current; }
+	EOF;
 
 // Rule UiBindingEndpointAssignment
-ruleUiBindingEndpointAssignment returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    { 
-        newCompositeNode(grammarAccess.getUiBindingEndpointAssignmentAccess().getUiTypedBindableDefParserRuleCall_0_0()); 
-    }
-    this_UiTypedBindableDef_0=ruleUiTypedBindableDef
-    { 
-        $current = $this_UiTypedBindableDef_0.current; 
-        afterParserOrEnumRuleCall();
-    }
-(
-    {
-        $current = forceCreateModelElementAndSet(
-            grammarAccess.getUiBindingEndpointAssignmentAccess().getUiBindingEndpointAssignmentTypedBindableDefAction_0_1(),
-            $current);
-    }
-)(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiBindingEndpointAssignmentAccess().getPathUiPathSegmentParserRuleCall_0_2_0()); 
-	    }
-		lv_path_2_0=ruleUiPathSegment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiBindingEndpointAssignmentRule());
-	        }
-       		set(
-       			$current, 
-       			"path",
-        		lv_path_2_0, 
-        		"UiPathSegment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)?)
-    |(
-    { 
-        newCompositeNode(grammarAccess.getUiBindingEndpointAssignmentAccess().getUiCommandBindableDefParserRuleCall_1_0()); 
-    }
-    this_UiCommandBindableDef_3=ruleUiCommandBindableDef
-    { 
-        $current = $this_UiCommandBindableDef_3.current; 
-        afterParserOrEnumRuleCall();
-    }
-(
-    {
-        $current = forceCreateModelElementAndSet(
-            grammarAccess.getUiBindingEndpointAssignmentAccess().getUiBindingEndpointAssignmentTypedBindableDefAction_1_1(),
-            $current);
-    }
-))
-    |((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUiBindingEndpointAssignmentAccess().getUiBindingEndpointAssignmentAction_2_0(),
-            $current);
-    }
-)(
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiBindingEndpointAssignmentRule());
-	        }
-        }
-	otherlv_6=RULE_ID
-	{
-		newLeafNode(otherlv_6, grammarAccess.getUiBindingEndpointAssignmentAccess().getTypedBindableAliasUiTypedBindableCrossReference_2_1_0()); 
-	}
-
-)
-)(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiBindingEndpointAssignmentAccess().getPathUiPathSegmentParserRuleCall_2_2_0()); 
-	    }
-		lv_path_7_0=ruleUiPathSegment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiBindingEndpointAssignmentRule());
-	        }
-       		set(
-       			$current, 
-       			"path",
-        		lv_path_7_0, 
-        		"UiPathSegment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)?))
+ruleUiBindingEndpointAssignment returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				newCompositeNode(grammarAccess.getUiBindingEndpointAssignmentAccess().getUiTypedBindableDefParserRuleCall_0_0());
+			}
+			this_UiTypedBindableDef_0=ruleUiTypedBindableDef
+			{
+				$current = $this_UiTypedBindableDef_0.current;
+				afterParserOrEnumRuleCall();
+			}
+			(
+				{
+					$current = forceCreateModelElementAndSet(
+						grammarAccess.getUiBindingEndpointAssignmentAccess().getUiBindingEndpointAssignmentTypedBindableDefAction_0_1(),
+						$current);
+				}
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiBindingEndpointAssignmentAccess().getPathUiPathSegmentParserRuleCall_0_2_0());
+					}
+					lv_path_2_0=ruleUiPathSegment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiBindingEndpointAssignmentRule());
+						}
+						set(
+							$current,
+							"path",
+							lv_path_2_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiPathSegment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)?
+		)
+		    |
+		(
+			{
+				newCompositeNode(grammarAccess.getUiBindingEndpointAssignmentAccess().getUiCommandBindableDefParserRuleCall_1_0());
+			}
+			this_UiCommandBindableDef_3=ruleUiCommandBindableDef
+			{
+				$current = $this_UiCommandBindableDef_3.current;
+				afterParserOrEnumRuleCall();
+			}
+			(
+				{
+					$current = forceCreateModelElementAndSet(
+						grammarAccess.getUiBindingEndpointAssignmentAccess().getUiBindingEndpointAssignmentTypedBindableDefAction_1_1(),
+						$current);
+				}
+			)
+		)
+		    |
+		(
+			(
+				{
+					$current = forceCreateModelElement(
+						grammarAccess.getUiBindingEndpointAssignmentAccess().getUiBindingEndpointAssignmentAction_2_0(),
+						$current);
+				}
+			)
+			(
+				(
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getUiBindingEndpointAssignmentRule());
+						}
+					}
+					otherlv_6=RULE_ID
+					{
+						newLeafNode(otherlv_6, grammarAccess.getUiBindingEndpointAssignmentAccess().getTypedBindableAliasUiTypedBindableCrossReference_2_1_0());
+					}
+				)
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiBindingEndpointAssignmentAccess().getPathUiPathSegmentParserRuleCall_2_2_0());
+					}
+					lv_path_7_0=ruleUiPathSegment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiBindingEndpointAssignmentRule());
+						}
+						set(
+							$current,
+							"path",
+							lv_path_7_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiPathSegment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)?
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiPathSegment
-entryRuleUiPathSegment returns [EObject current=null] 
-	:
+entryRuleUiPathSegment returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiPathSegmentRule()); }
-	 iv_ruleUiPathSegment=ruleUiPathSegment 
-	 { $current=$iv_ruleUiPathSegment.current; } 
-	 EOF 
-;
+	iv_ruleUiPathSegment=ruleUiPathSegment
+	{ $current=$iv_ruleUiPathSegment.current; }
+	EOF;
 
 // Rule UiPathSegment
-ruleUiPathSegment returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUiPathSegmentAccess().getUiPathSegmentAction_0(),
-            $current);
-    }
-)	otherlv_1='.' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiPathSegmentAccess().getFullStopKeyword_1());
-    }
-(
-(
+ruleUiPathSegment returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiPathSegmentAccess().getUiPathSegmentAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='.'
 		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiPathSegmentRule());
-	        }
-        }
-	otherlv_2=RULE_ID
-	{
-		newLeafNode(otherlv_2, grammarAccess.getUiPathSegmentAccess().getGetterJvmOperationCrossReference_2_0()); 
-	}
-
-)
-)(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiPathSegmentAccess().getPathUiPathSegmentParserRuleCall_3_0()); 
-	    }
-		lv_path_3_0=ruleUiPathSegment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiPathSegmentRule());
-	        }
-       		set(
-       			$current, 
-       			"path",
-        		lv_path_3_0, 
-        		"UiPathSegment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)?)
+			newLeafNode(otherlv_1, grammarAccess.getUiPathSegmentAccess().getFullStopKeyword_1());
+		}
+		(
+			(
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiPathSegmentRule());
+					}
+				}
+				otherlv_2=RULE_ID
+				{
+					newLeafNode(otherlv_2, grammarAccess.getUiPathSegmentAccess().getGetterJvmOperationCrossReference_2_0());
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiPathSegmentAccess().getPathUiPathSegmentParserRuleCall_3_0());
+				}
+				lv_path_3_0=ruleUiPathSegment
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiPathSegmentRule());
+					}
+					set(
+						$current,
+						"path",
+						lv_path_3_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiPathSegment");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiNestedProperty
-entryRuleUiNestedProperty returns [EObject current=null] 
-	:
+entryRuleUiNestedProperty returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiNestedPropertyRule()); }
-	 iv_ruleUiNestedProperty=ruleUiNestedProperty 
-	 { $current=$iv_ruleUiNestedProperty.current; } 
-	 EOF 
-;
+	iv_ruleUiNestedProperty=ruleUiNestedProperty
+	{ $current=$iv_ruleUiNestedProperty.current; }
+	EOF;
 
 // Rule UiNestedProperty
-ruleUiNestedProperty returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUiNestedPropertyAccess().getUiNestedPropertyAction_0(),
-            $current);
-    }
-)(
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiNestedPropertyRule());
-	        }
-        }
-	otherlv_1=RULE_ID
-	{
-		newLeafNode(otherlv_1, grammarAccess.getUiNestedPropertyAccess().getGetterJvmOperationCrossReference_1_0()); 
-	}
-
-)
-)(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiNestedPropertyAccess().getPathUiPathSegmentParserRuleCall_2_0()); 
-	    }
-		lv_path_2_0=ruleUiPathSegment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiNestedPropertyRule());
-	        }
-       		set(
-       			$current, 
-       			"path",
-        		lv_path_2_0, 
-        		"UiPathSegment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)?)
+ruleUiNestedProperty returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiNestedPropertyAccess().getUiNestedPropertyAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiNestedPropertyRule());
+					}
+				}
+				otherlv_1=RULE_ID
+				{
+					newLeafNode(otherlv_1, grammarAccess.getUiNestedPropertyAccess().getGetterJvmOperationCrossReference_1_0());
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiNestedPropertyAccess().getPathUiPathSegmentParserRuleCall_2_0());
+				}
+				lv_path_2_0=ruleUiPathSegment
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiNestedPropertyRule());
+					}
+					set(
+						$current,
+						"path",
+						lv_path_2_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiPathSegment");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiTypedBindableDef
-entryRuleUiTypedBindableDef returns [EObject current=null] 
-	:
+entryRuleUiTypedBindableDef returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiTypedBindableDefRule()); }
-	 iv_ruleUiTypedBindableDef=ruleUiTypedBindableDef 
-	 { $current=$iv_ruleUiTypedBindableDef.current; } 
-	 EOF 
-;
+	iv_ruleUiTypedBindableDef=ruleUiTypedBindableDef
+	{ $current=$iv_ruleUiTypedBindableDef.current; }
+	EOF;
 
 // Rule UiTypedBindableDef
-ruleUiTypedBindableDef returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUiTypedBindableDefAccess().getUiTypedBindableDefAction_0(),
-            $current);
-    }
-)(	otherlv_1='[' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiTypedBindableDefAccess().getLeftSquareBracketKeyword_1_0());
-    }
-(
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiTypedBindableDefRule());
-	        }
-        }
-	otherlv_2=RULE_ID
-	{
-		newLeafNode(otherlv_2, grammarAccess.getUiTypedBindableDefAccess().getRawBindableUiRawBindableCrossReference_1_1_0()); 
-	}
-
-)
-)(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiTypedBindableDefAccess().getRawBindablePathUiRawBindablePathSegmentParserRuleCall_1_2_0()); 
-	    }
-		lv_rawBindablePath_3_0=ruleUiRawBindablePathSegment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiTypedBindableDefRule());
-	        }
-       		set(
-       			$current, 
-       			"rawBindablePath",
-        		lv_rawBindablePath_3_0, 
-        		"UiRawBindablePathSegment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)?	otherlv_4=']' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getUiTypedBindableDefAccess().getRightSquareBracketKeyword_1_3());
-    }
-	otherlv_5='.' 
-    {
-    	newLeafNode(otherlv_5, grammarAccess.getUiTypedBindableDefAccess().getFullStopKeyword_1_4());
-    }
-(
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiTypedBindableDefRule());
-	        }
-        }
-	otherlv_6=RULE_ID
-	{
-		newLeafNode(otherlv_6, grammarAccess.getUiTypedBindableDefAccess().getMethodUxEndpointDefCrossReference_1_5_0()); 
-	}
-
-)
-)))
+ruleUiTypedBindableDef returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiTypedBindableDefAccess().getUiTypedBindableDefAction_0(),
+					$current);
+			}
+		)
+		(
+			otherlv_1='['
+			{
+				newLeafNode(otherlv_1, grammarAccess.getUiTypedBindableDefAccess().getLeftSquareBracketKeyword_1_0());
+			}
+			(
+				(
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getUiTypedBindableDefRule());
+						}
+					}
+					otherlv_2=RULE_ID
+					{
+						newLeafNode(otherlv_2, grammarAccess.getUiTypedBindableDefAccess().getRawBindableUiRawBindableCrossReference_1_1_0());
+					}
+				)
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiTypedBindableDefAccess().getRawBindablePathUiRawBindablePathSegmentParserRuleCall_1_2_0());
+					}
+					lv_rawBindablePath_3_0=ruleUiRawBindablePathSegment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiTypedBindableDefRule());
+						}
+						set(
+							$current,
+							"rawBindablePath",
+							lv_rawBindablePath_3_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiRawBindablePathSegment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)?
+			otherlv_4=']'
+			{
+				newLeafNode(otherlv_4, grammarAccess.getUiTypedBindableDefAccess().getRightSquareBracketKeyword_1_3());
+			}
+			otherlv_5='.'
+			{
+				newLeafNode(otherlv_5, grammarAccess.getUiTypedBindableDefAccess().getFullStopKeyword_1_4());
+			}
+			(
+				(
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getUiTypedBindableDefRule());
+						}
+					}
+					otherlv_6=RULE_ID
+					{
+						newLeafNode(otherlv_6, grammarAccess.getUiTypedBindableDefAccess().getMethodUxEndpointDefCrossReference_1_5_0());
+					}
+				)
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiTypedBindableRawType
-entryRuleUiTypedBindableRawType returns [EObject current=null] 
-	:
+entryRuleUiTypedBindableRawType returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiTypedBindableRawTypeRule()); }
-	 iv_ruleUiTypedBindableRawType=ruleUiTypedBindableRawType 
-	 { $current=$iv_ruleUiTypedBindableRawType.current; } 
-	 EOF 
-;
+	iv_ruleUiTypedBindableRawType=ruleUiTypedBindableRawType
+	{ $current=$iv_ruleUiTypedBindableRawType.current; }
+	EOF;
 
 // Rule UiTypedBindableRawType
-ruleUiTypedBindableRawType returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUiTypedBindableRawTypeAccess().getUiTypedBindableRawTypeAction_0(),
-            $current);
-    }
-)	otherlv_1='[' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiTypedBindableRawTypeAccess().getLeftSquareBracketKeyword_1());
-    }
-(
-(
+ruleUiTypedBindableRawType returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiTypedBindableRawTypeAccess().getUiTypedBindableRawTypeAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='['
 		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiTypedBindableRawTypeRule());
-	        }
-        }
-	otherlv_2=RULE_ID
-	{
-		newLeafNode(otherlv_2, grammarAccess.getUiTypedBindableRawTypeAccess().getRawBindableUiRawBindableCrossReference_2_0()); 
-	}
-
-)
-)(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiTypedBindableRawTypeAccess().getRawBindablePathUiRawBindablePathSegmentParserRuleCall_3_0()); 
-	    }
-		lv_rawBindablePath_3_0=ruleUiRawBindablePathSegment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiTypedBindableRawTypeRule());
-	        }
-       		set(
-       			$current, 
-       			"rawBindablePath",
-        		lv_rawBindablePath_3_0, 
-        		"UiRawBindablePathSegment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)?	otherlv_4=']' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getUiTypedBindableRawTypeAccess().getRightSquareBracketKeyword_4());
-    }
-)
+			newLeafNode(otherlv_1, grammarAccess.getUiTypedBindableRawTypeAccess().getLeftSquareBracketKeyword_1());
+		}
+		(
+			(
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiTypedBindableRawTypeRule());
+					}
+				}
+				otherlv_2=RULE_ID
+				{
+					newLeafNode(otherlv_2, grammarAccess.getUiTypedBindableRawTypeAccess().getRawBindableUiRawBindableCrossReference_2_0());
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiTypedBindableRawTypeAccess().getRawBindablePathUiRawBindablePathSegmentParserRuleCall_3_0());
+				}
+				lv_rawBindablePath_3_0=ruleUiRawBindablePathSegment
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiTypedBindableRawTypeRule());
+					}
+					set(
+						$current,
+						"rawBindablePath",
+						lv_rawBindablePath_3_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiRawBindablePathSegment");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		otherlv_4=']'
+		{
+			newLeafNode(otherlv_4, grammarAccess.getUiTypedBindableRawTypeAccess().getRightSquareBracketKeyword_4());
+		}
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiTypedBindableRawTypeAlias
-entryRuleUiTypedBindableRawTypeAlias returns [EObject current=null] 
-	:
+entryRuleUiTypedBindableRawTypeAlias returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiTypedBindableRawTypeAliasRule()); }
-	 iv_ruleUiTypedBindableRawTypeAlias=ruleUiTypedBindableRawTypeAlias 
-	 { $current=$iv_ruleUiTypedBindableRawTypeAlias.current; } 
-	 EOF 
-;
+	iv_ruleUiTypedBindableRawTypeAlias=ruleUiTypedBindableRawTypeAlias
+	{ $current=$iv_ruleUiTypedBindableRawTypeAlias.current; }
+	EOF;
 
 // Rule UiTypedBindableRawTypeAlias
-ruleUiTypedBindableRawTypeAlias returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='ui' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getUiTypedBindableRawTypeAliasAccess().getUiKeyword_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiTypedBindableRawTypeAliasAccess().getTypeUiTypedBindableRawTypeParserRuleCall_1_0()); 
-	    }
-		lv_type_1_0=ruleUiTypedBindableRawType		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiTypedBindableRawTypeAliasRule());
-	        }
-       		set(
-       			$current, 
-       			"type",
-        		lv_type_1_0, 
-        		"UiTypedBindableRawType");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_2='as' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getUiTypedBindableRawTypeAliasAccess().getAsKeyword_2());
-    }
-(
-(
-		lv_alias_3_0=RULE_ID
+ruleUiTypedBindableRawTypeAlias returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='ui'
 		{
-			newLeafNode(lv_alias_3_0, grammarAccess.getUiTypedBindableRawTypeAliasAccess().getAliasIDTerminalRuleCall_3_0()); 
+			newLeafNode(otherlv_0, grammarAccess.getUiTypedBindableRawTypeAliasAccess().getUiKeyword_0());
 		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiTypedBindableRawTypeAliasAccess().getTypeUiTypedBindableRawTypeParserRuleCall_1_0());
+				}
+				lv_type_1_0=ruleUiTypedBindableRawType
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiTypedBindableRawTypeAliasRule());
+					}
+					set(
+						$current,
+						"type",
+						lv_type_1_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiTypedBindableRawType");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_2='as'
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiTypedBindableRawTypeAliasRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"alias",
-        		lv_alias_3_0, 
-        		"ID");
-	    }
-
-)
-)(	otherlv_4=';' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getUiTypedBindableRawTypeAliasAccess().getSemicolonKeyword_4());
-    }
-)?)
+			newLeafNode(otherlv_2, grammarAccess.getUiTypedBindableRawTypeAliasAccess().getAsKeyword_2());
+		}
+		(
+			(
+				lv_alias_3_0=RULE_ID
+				{
+					newLeafNode(lv_alias_3_0, grammarAccess.getUiTypedBindableRawTypeAliasAccess().getAliasIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiTypedBindableRawTypeAliasRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"alias",
+						lv_alias_3_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)
+		(
+			otherlv_4=';'
+			{
+				newLeafNode(otherlv_4, grammarAccess.getUiTypedBindableRawTypeAliasAccess().getSemicolonKeyword_4());
+			}
+		)?
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiRawBindablePathSegment
-entryRuleUiRawBindablePathSegment returns [EObject current=null] 
-	:
+entryRuleUiRawBindablePathSegment returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiRawBindablePathSegmentRule()); }
-	 iv_ruleUiRawBindablePathSegment=ruleUiRawBindablePathSegment 
-	 { $current=$iv_ruleUiRawBindablePathSegment.current; } 
-	 EOF 
-;
+	iv_ruleUiRawBindablePathSegment=ruleUiRawBindablePathSegment
+	{ $current=$iv_ruleUiRawBindablePathSegment.current; }
+	EOF;
 
 // Rule UiRawBindablePathSegment
-ruleUiRawBindablePathSegment returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUiRawBindablePathSegmentAccess().getUiRawBindablePathSegmentAction_0(),
-            $current);
-    }
-)(	otherlv_1='.' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiRawBindablePathSegmentAccess().getFullStopKeyword_1_0());
-    }
-
-    |(
-(
-		lv_toParent_2_0=	'..' 
-    {
-        newLeafNode(lv_toParent_2_0, grammarAccess.getUiRawBindablePathSegmentAccess().getToParentFullStopFullStopKeyword_1_1_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiRawBindablePathSegmentRule());
-	        }
-       		setWithLastConsumed($current, "toParent", true, "..");
-	    }
-
-)
-))(
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiRawBindablePathSegmentRule());
-	        }
-        }
-	otherlv_3=RULE_ID
-	{
-		newLeafNode(otherlv_3, grammarAccess.getUiRawBindablePathSegmentAccess().getRawBindableUiRawBindableCrossReference_2_0()); 
-	}
-
-)
-)(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiRawBindablePathSegmentAccess().getPathUiRawBindablePathSegmentParserRuleCall_3_0()); 
-	    }
-		lv_path_4_0=ruleUiRawBindablePathSegment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiRawBindablePathSegmentRule());
-	        }
-       		set(
-       			$current, 
-       			"path",
-        		lv_path_4_0, 
-        		"UiRawBindablePathSegment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)?)
+ruleUiRawBindablePathSegment returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiRawBindablePathSegmentAccess().getUiRawBindablePathSegmentAction_0(),
+					$current);
+			}
+		)
+		(
+			otherlv_1='.'
+			{
+				newLeafNode(otherlv_1, grammarAccess.getUiRawBindablePathSegmentAccess().getFullStopKeyword_1_0());
+			}
+			    |
+			(
+				(
+					lv_toParent_2_0='..'
+					{
+						newLeafNode(lv_toParent_2_0, grammarAccess.getUiRawBindablePathSegmentAccess().getToParentFullStopFullStopKeyword_1_1_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getUiRawBindablePathSegmentRule());
+						}
+						setWithLastConsumed($current, "toParent", true, "..");
+					}
+				)
+			)
+		)
+		(
+			(
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiRawBindablePathSegmentRule());
+					}
+				}
+				otherlv_3=RULE_ID
+				{
+					newLeafNode(otherlv_3, grammarAccess.getUiRawBindablePathSegmentAccess().getRawBindableUiRawBindableCrossReference_2_0());
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiRawBindablePathSegmentAccess().getPathUiRawBindablePathSegmentParserRuleCall_3_0());
+				}
+				lv_path_4_0=ruleUiRawBindablePathSegment
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiRawBindablePathSegmentRule());
+					}
+					set(
+						$current,
+						"path",
+						lv_path_4_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiRawBindablePathSegment");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiCommandBindableDef
-entryRuleUiCommandBindableDef returns [EObject current=null] 
-	:
+entryRuleUiCommandBindableDef returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiCommandBindableDefRule()); }
-	 iv_ruleUiCommandBindableDef=ruleUiCommandBindableDef 
-	 { $current=$iv_ruleUiCommandBindableDef.current; } 
-	 EOF 
-;
+	iv_ruleUiCommandBindableDef=ruleUiCommandBindableDef
+	{ $current=$iv_ruleUiCommandBindableDef.current; }
+	EOF;
 
 // Rule UiCommandBindableDef
-ruleUiCommandBindableDef returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUiCommandBindableDefAccess().getUiCommandBindableDefAction_0(),
-            $current);
-    }
-)(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiCommandBindableDefAccess().getCommandUiCommandParserRuleCall_1_0()); 
-	    }
-		lv_command_1_0=ruleUiCommand		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiCommandBindableDefRule());
-	        }
-       		set(
-       			$current, 
-       			"command",
-        		lv_command_1_0, 
-        		"UiCommand");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
+ruleUiCommandBindableDef returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiCommandBindableDefAccess().getUiCommandBindableDefAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiCommandBindableDefAccess().getCommandUiCommandParserRuleCall_1_0());
+				}
+				lv_command_1_0=ruleUiCommand
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiCommandBindableDefRule());
+					}
+					set(
+						$current,
+						"command",
+						lv_command_1_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiCommand");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiCommand
-entryRuleUiCommand returns [EObject current=null] 
-	:
+entryRuleUiCommand returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiCommandRule()); }
-	 iv_ruleUiCommand=ruleUiCommand 
-	 { $current=$iv_ruleUiCommand.current; } 
-	 EOF 
-;
+	iv_ruleUiCommand=ruleUiCommand
+	{ $current=$iv_ruleUiCommand.current; }
+	EOF;
 
 // Rule UiCommand
-ruleUiCommand returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-    { 
-        newCompositeNode(grammarAccess.getUiCommandAccess().getUiMobileNavigationCommandParserRuleCall_0()); 
-    }
-    this_UiMobileNavigationCommand_0=ruleUiMobileNavigationCommand
-    { 
-        $current = $this_UiMobileNavigationCommand_0.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getUiCommandAccess().getUiOpenDialogCommandParserRuleCall_1()); 
-    }
-    this_UiOpenDialogCommand_1=ruleUiOpenDialogCommand
-    { 
-        $current = $this_UiOpenDialogCommand_1.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getUiCommandAccess().getUiSearchWithDialogCommandParserRuleCall_2()); 
-    }
-    this_UiSearchWithDialogCommand_2=ruleUiSearchWithDialogCommand
-    { 
-        $current = $this_UiSearchWithDialogCommand_2.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getUiCommandAccess().getUiAddToTableCommandParserRuleCall_3()); 
-    }
-    this_UiAddToTableCommand_3=ruleUiAddToTableCommand
-    { 
-        $current = $this_UiAddToTableCommand_3.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getUiCommandAccess().getUiRemoveFromTableCommandParserRuleCall_4()); 
-    }
-    this_UiRemoveFromTableCommand_4=ruleUiRemoveFromTableCommand
-    { 
-        $current = $this_UiRemoveFromTableCommand_4.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getUiCommandAccess().getUiSendEventCommandParserRuleCall_5()); 
-    }
-    this_UiSendEventCommand_5=ruleUiSendEventCommand
-    { 
-        $current = $this_UiSendEventCommand_5.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getUiCommandAccess().getUiSetNewInstanceCommandParserRuleCall_6()); 
-    }
-    this_UiSetNewInstanceCommand_6=ruleUiSetNewInstanceCommand
-    { 
-        $current = $this_UiSetNewInstanceCommand_6.current; 
-        afterParserOrEnumRuleCall();
-    }
-)
+ruleUiCommand returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getUiCommandAccess().getUiMobileNavigationCommandParserRuleCall_0());
+		}
+		this_UiMobileNavigationCommand_0=ruleUiMobileNavigationCommand
+		{
+			$current = $this_UiMobileNavigationCommand_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiCommandAccess().getUiOpenDialogCommandParserRuleCall_1());
+		}
+		this_UiOpenDialogCommand_1=ruleUiOpenDialogCommand
+		{
+			$current = $this_UiOpenDialogCommand_1.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiCommandAccess().getUiSearchWithDialogCommandParserRuleCall_2());
+		}
+		this_UiSearchWithDialogCommand_2=ruleUiSearchWithDialogCommand
+		{
+			$current = $this_UiSearchWithDialogCommand_2.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiCommandAccess().getUiAddToTableCommandParserRuleCall_3());
+		}
+		this_UiAddToTableCommand_3=ruleUiAddToTableCommand
+		{
+			$current = $this_UiAddToTableCommand_3.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiCommandAccess().getUiRemoveFromTableCommandParserRuleCall_4());
+		}
+		this_UiRemoveFromTableCommand_4=ruleUiRemoveFromTableCommand
+		{
+			$current = $this_UiRemoveFromTableCommand_4.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiCommandAccess().getUiSendEventCommandParserRuleCall_5());
+		}
+		this_UiSendEventCommand_5=ruleUiSendEventCommand
+		{
+			$current = $this_UiSendEventCommand_5.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiCommandAccess().getUiSetNewInstanceCommandParserRuleCall_6());
+		}
+		this_UiSetNewInstanceCommand_6=ruleUiSetNewInstanceCommand
+		{
+			$current = $this_UiSetNewInstanceCommand_6.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiMobileNavigationCommand
-entryRuleUiMobileNavigationCommand returns [EObject current=null] 
-	:
+entryRuleUiMobileNavigationCommand returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiMobileNavigationCommandRule()); }
-	 iv_ruleUiMobileNavigationCommand=ruleUiMobileNavigationCommand 
-	 { $current=$iv_ruleUiMobileNavigationCommand.current; } 
-	 EOF 
-;
+	iv_ruleUiMobileNavigationCommand=ruleUiMobileNavigationCommand
+	{ $current=$iv_ruleUiMobileNavigationCommand.current; }
+	EOF;
 
 // Rule UiMobileNavigationCommand
-ruleUiMobileNavigationCommand returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUiMobileNavigationCommandAccess().getUiMobileNavigationCommandAction_0(),
-            $current);
-    }
-)	otherlv_1='navigateTo' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiMobileNavigationCommandAccess().getNavigateToKeyword_1());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileNavigationCommandAccess().getTargetPageUiMobileNavigationPageParserRuleCall_2_0()); 
-	    }
-		lv_targetPage_2_0=ruleUiMobileNavigationPage		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileNavigationCommandRule());
-	        }
-       		set(
-       			$current, 
-       			"targetPage",
-        		lv_targetPage_2_0, 
-        		"UiMobileNavigationPage");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
+ruleUiMobileNavigationCommand returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiMobileNavigationCommandAccess().getUiMobileNavigationCommandAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='navigateTo'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getUiMobileNavigationCommandAccess().getNavigateToKeyword_1());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiMobileNavigationCommandAccess().getTargetPageUiMobileNavigationPageParserRuleCall_2_0());
+				}
+				lv_targetPage_2_0=ruleUiMobileNavigationPage
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiMobileNavigationCommandRule());
+					}
+					set(
+						$current,
+						"targetPage",
+						lv_targetPage_2_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileNavigationPage");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiOpenDialogCommand
-entryRuleUiOpenDialogCommand returns [EObject current=null] 
-	:
+entryRuleUiOpenDialogCommand returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiOpenDialogCommandRule()); }
-	 iv_ruleUiOpenDialogCommand=ruleUiOpenDialogCommand 
-	 { $current=$iv_ruleUiOpenDialogCommand.current; } 
-	 EOF 
-;
+	iv_ruleUiOpenDialogCommand=ruleUiOpenDialogCommand
+	{ $current=$iv_ruleUiOpenDialogCommand.current; }
+	EOF;
 
 // Rule UiOpenDialogCommand
-ruleUiOpenDialogCommand returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUiOpenDialogCommandAccess().getUiOpenDialogCommandAction_0(),
-            $current);
-    }
-)	otherlv_1='openDialog' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiOpenDialogCommandAccess().getOpenDialogKeyword_1());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiOpenDialogCommandAccess().getDialogUiDialogParserRuleCall_2_0()); 
-	    }
-		lv_dialog_2_0=ruleUiDialog		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiOpenDialogCommandRule());
-	        }
-       		set(
-       			$current, 
-       			"dialog",
-        		lv_dialog_2_0, 
-        		"UiDialog");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
+ruleUiOpenDialogCommand returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiOpenDialogCommandAccess().getUiOpenDialogCommandAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='openDialog'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getUiOpenDialogCommandAccess().getOpenDialogKeyword_1());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiOpenDialogCommandAccess().getDialogUiDialogParserRuleCall_2_0());
+				}
+				lv_dialog_2_0=ruleUiDialog
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiOpenDialogCommandRule());
+					}
+					set(
+						$current,
+						"dialog",
+						lv_dialog_2_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiDialog");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiSearchWithDialogCommand
-entryRuleUiSearchWithDialogCommand returns [EObject current=null] 
-	:
+entryRuleUiSearchWithDialogCommand returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiSearchWithDialogCommandRule()); }
-	 iv_ruleUiSearchWithDialogCommand=ruleUiSearchWithDialogCommand 
-	 { $current=$iv_ruleUiSearchWithDialogCommand.current; } 
-	 EOF 
-;
+	iv_ruleUiSearchWithDialogCommand=ruleUiSearchWithDialogCommand
+	{ $current=$iv_ruleUiSearchWithDialogCommand.current; }
+	EOF;
 
 // Rule UiSearchWithDialogCommand
-ruleUiSearchWithDialogCommand returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUiSearchWithDialogCommandAccess().getUiSearchWithDialogCommandAction_0(),
-            $current);
-    }
-)	otherlv_1='searchWith' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiSearchWithDialogCommandAccess().getSearchWithKeyword_1());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiSearchWithDialogCommandAccess().getDialogUiSearchDialogParserRuleCall_2_0()); 
-	    }
-		lv_dialog_2_0=ruleUiSearchDialog		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiSearchWithDialogCommandRule());
-	        }
-       		set(
-       			$current, 
-       			"dialog",
-        		lv_dialog_2_0, 
-        		"UiSearchDialog");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
+ruleUiSearchWithDialogCommand returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiSearchWithDialogCommandAccess().getUiSearchWithDialogCommandAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='searchWith'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getUiSearchWithDialogCommandAccess().getSearchWithKeyword_1());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiSearchWithDialogCommandAccess().getDialogUiSearchDialogParserRuleCall_2_0());
+				}
+				lv_dialog_2_0=ruleUiSearchDialog
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiSearchWithDialogCommandRule());
+					}
+					set(
+						$current,
+						"dialog",
+						lv_dialog_2_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiSearchDialog");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiAddToTableCommand
-entryRuleUiAddToTableCommand returns [EObject current=null] 
-	:
+entryRuleUiAddToTableCommand returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiAddToTableCommandRule()); }
-	 iv_ruleUiAddToTableCommand=ruleUiAddToTableCommand 
-	 { $current=$iv_ruleUiAddToTableCommand.current; } 
-	 EOF 
-;
+	iv_ruleUiAddToTableCommand=ruleUiAddToTableCommand
+	{ $current=$iv_ruleUiAddToTableCommand.current; }
+	EOF;
 
 // Rule UiAddToTableCommand
-ruleUiAddToTableCommand returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUiAddToTableCommandAccess().getUiAddToTableCommandAction_0(),
-            $current);
-    }
-)	otherlv_1='addToTable' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiAddToTableCommandAccess().getAddToTableKeyword_1());
-    }
-(
-(
+ruleUiAddToTableCommand returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiAddToTableCommandAccess().getUiAddToTableCommandAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='addToTable'
 		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiAddToTableCommandRule());
-	        }
-        }
-	otherlv_2=RULE_ID
-	{
-		newLeafNode(otherlv_2, grammarAccess.getUiAddToTableCommandAccess().getTableUiTableCrossReference_2_0()); 
-	}
-
-)
-))
+			newLeafNode(otherlv_1, grammarAccess.getUiAddToTableCommandAccess().getAddToTableKeyword_1());
+		}
+		(
+			(
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiAddToTableCommandRule());
+					}
+				}
+				otherlv_2=RULE_ID
+				{
+					newLeafNode(otherlv_2, grammarAccess.getUiAddToTableCommandAccess().getTableUiTableCrossReference_2_0());
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiRemoveFromTableCommand
-entryRuleUiRemoveFromTableCommand returns [EObject current=null] 
-	:
+entryRuleUiRemoveFromTableCommand returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiRemoveFromTableCommandRule()); }
-	 iv_ruleUiRemoveFromTableCommand=ruleUiRemoveFromTableCommand 
-	 { $current=$iv_ruleUiRemoveFromTableCommand.current; } 
-	 EOF 
-;
+	iv_ruleUiRemoveFromTableCommand=ruleUiRemoveFromTableCommand
+	{ $current=$iv_ruleUiRemoveFromTableCommand.current; }
+	EOF;
 
 // Rule UiRemoveFromTableCommand
-ruleUiRemoveFromTableCommand returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUiRemoveFromTableCommandAccess().getUiRemoveFromTableCommandAction_0(),
-            $current);
-    }
-)	otherlv_1='removeFromTable' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiRemoveFromTableCommandAccess().getRemoveFromTableKeyword_1());
-    }
-(
-(
+ruleUiRemoveFromTableCommand returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiRemoveFromTableCommandAccess().getUiRemoveFromTableCommandAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='removeFromTable'
 		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiRemoveFromTableCommandRule());
-	        }
-        }
-	otherlv_2=RULE_ID
-	{
-		newLeafNode(otherlv_2, grammarAccess.getUiRemoveFromTableCommandAccess().getTableUiTableCrossReference_2_0()); 
-	}
-
-)
-))
+			newLeafNode(otherlv_1, grammarAccess.getUiRemoveFromTableCommandAccess().getRemoveFromTableKeyword_1());
+		}
+		(
+			(
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiRemoveFromTableCommandRule());
+					}
+				}
+				otherlv_2=RULE_ID
+				{
+					newLeafNode(otherlv_2, grammarAccess.getUiRemoveFromTableCommandAccess().getTableUiTableCrossReference_2_0());
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiSetNewInstanceCommand
-entryRuleUiSetNewInstanceCommand returns [EObject current=null] 
-	:
+entryRuleUiSetNewInstanceCommand returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiSetNewInstanceCommandRule()); }
-	 iv_ruleUiSetNewInstanceCommand=ruleUiSetNewInstanceCommand 
-	 { $current=$iv_ruleUiSetNewInstanceCommand.current; } 
-	 EOF 
-;
+	iv_ruleUiSetNewInstanceCommand=ruleUiSetNewInstanceCommand
+	{ $current=$iv_ruleUiSetNewInstanceCommand.current; }
+	EOF;
 
 // Rule UiSetNewInstanceCommand
-ruleUiSetNewInstanceCommand returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUiSetNewInstanceCommandAccess().getUiSetNewInstanceCommandAction_0(),
-            $current);
-    }
-)	otherlv_1='newInstance' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiSetNewInstanceCommandAccess().getNewInstanceKeyword_1());
-    }
-(	otherlv_2='for' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getUiSetNewInstanceCommandAccess().getForKeyword_2_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiSetNewInstanceCommandAccess().getJvmTypeJvmTypeReferenceParserRuleCall_2_1_0()); 
-	    }
-		lv_jvmType_3_0=ruleJvmTypeReference		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiSetNewInstanceCommandRule());
-	        }
-       		set(
-       			$current, 
-       			"jvmType",
-        		lv_jvmType_3_0, 
-        		"JvmTypeReference");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))?(	otherlv_4='at' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getUiSetNewInstanceCommandAccess().getAtKeyword_3_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiSetNewInstanceCommandAccess().getTargetUiBindingEndpointAssignmentParserRuleCall_3_1_0()); 
-	    }
-		lv_target_5_0=ruleUiBindingEndpointAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiSetNewInstanceCommandRule());
-	        }
-       		set(
-       			$current, 
-       			"target",
-        		lv_target_5_0, 
-        		"UiBindingEndpointAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)))
+ruleUiSetNewInstanceCommand returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiSetNewInstanceCommandAccess().getUiSetNewInstanceCommandAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='newInstance'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getUiSetNewInstanceCommandAccess().getNewInstanceKeyword_1());
+		}
+		(
+			otherlv_2='for'
+			{
+				newLeafNode(otherlv_2, grammarAccess.getUiSetNewInstanceCommandAccess().getForKeyword_2_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiSetNewInstanceCommandAccess().getJvmTypeJvmTypeReferenceParserRuleCall_2_1_0());
+					}
+					lv_jvmType_3_0=ruleJvmTypeReference
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiSetNewInstanceCommandRule());
+						}
+						set(
+							$current,
+							"jvmType",
+							lv_jvmType_3_0,
+							"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)?
+		(
+			otherlv_4='at'
+			{
+				newLeafNode(otherlv_4, grammarAccess.getUiSetNewInstanceCommandAccess().getAtKeyword_3_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiSetNewInstanceCommandAccess().getTargetUiBindingEndpointAssignmentParserRuleCall_3_1_0());
+					}
+					lv_target_5_0=ruleUiBindingEndpointAssignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiSetNewInstanceCommandRule());
+						}
+						set(
+							$current,
+							"target",
+							lv_target_5_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAssignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiSendEventCommand
-entryRuleUiSendEventCommand returns [EObject current=null] 
-	:
+entryRuleUiSendEventCommand returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiSendEventCommandRule()); }
-	 iv_ruleUiSendEventCommand=ruleUiSendEventCommand 
-	 { $current=$iv_ruleUiSendEventCommand.current; } 
-	 EOF 
-;
+	iv_ruleUiSendEventCommand=ruleUiSendEventCommand
+	{ $current=$iv_ruleUiSendEventCommand.current; }
+	EOF;
 
 // Rule UiSendEventCommand
-ruleUiSendEventCommand returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUiSendEventCommandAccess().getUiSendEventCommandAction_0(),
-            $current);
-    }
-)	otherlv_1='sendEvent' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiSendEventCommandAccess().getSendEventKeyword_1());
-    }
-	otherlv_2='(' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getUiSendEventCommandAccess().getLeftParenthesisKeyword_2());
-    }
-(
-(
-		lv_noAutoTrigger_3_0=	'noAutoTrigger' 
-    {
-        newLeafNode(lv_noAutoTrigger_3_0, grammarAccess.getUiSendEventCommandAccess().getNoAutoTriggerNoAutoTriggerKeyword_3_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiSendEventCommandRule());
-	        }
-       		setWithLastConsumed($current, "noAutoTrigger", true, "noAutoTrigger");
-	    }
-
-)
-)?(
-(
-		lv_eventTopic_4_0=RULE_STRING
+ruleUiSendEventCommand returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiSendEventCommandAccess().getUiSendEventCommandAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='sendEvent'
 		{
-			newLeafNode(lv_eventTopic_4_0, grammarAccess.getUiSendEventCommandAccess().getEventTopicSTRINGTerminalRuleCall_4_0()); 
+			newLeafNode(otherlv_1, grammarAccess.getUiSendEventCommandAccess().getSendEventKeyword_1());
 		}
+		otherlv_2='('
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiSendEventCommandRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"eventTopic",
-        		lv_eventTopic_4_0, 
-        		"STRING");
-	    }
-
-)
-)	otherlv_5=')' 
-    {
-    	newLeafNode(otherlv_5, grammarAccess.getUiSendEventCommandAccess().getRightParenthesisKeyword_5());
-    }
-)
+			newLeafNode(otherlv_2, grammarAccess.getUiSendEventCommandAccess().getLeftParenthesisKeyword_2());
+		}
+		(
+			(
+				lv_noAutoTrigger_3_0='noAutoTrigger'
+				{
+					newLeafNode(lv_noAutoTrigger_3_0, grammarAccess.getUiSendEventCommandAccess().getNoAutoTriggerNoAutoTriggerKeyword_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiSendEventCommandRule());
+					}
+					setWithLastConsumed($current, "noAutoTrigger", true, "noAutoTrigger");
+				}
+			)
+		)?
+		(
+			(
+				lv_eventTopic_4_0=RULE_STRING
+				{
+					newLeafNode(lv_eventTopic_4_0, grammarAccess.getUiSendEventCommandAccess().getEventTopicSTRINGTerminalRuleCall_4_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiSendEventCommandRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"eventTopic",
+						lv_eventTopic_4_0,
+						"org.eclipse.xtext.xbase.Xtype.STRING");
+				}
+			)
+		)
+		otherlv_5=')'
+		{
+			newLeafNode(otherlv_5, grammarAccess.getUiSendEventCommandAccess().getRightParenthesisKeyword_5());
+		}
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiView
-entryRuleUiView returns [EObject current=null] 
-	:
+entryRuleUiView returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiViewRule()); }
-	 iv_ruleUiView=ruleUiView 
-	 { $current=$iv_ruleUiView.current; } 
-	 EOF 
-;
+	iv_ruleUiView=ruleUiView
+	{ $current=$iv_ruleUiView.current; }
+	EOF;
 
 // Rule UiView
-ruleUiView returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-
-    { 
-        newCompositeNode(grammarAccess.getUiViewAccess().getUiIDEViewParserRuleCall()); 
-    }
-    this_UiIDEView_0=ruleUiIDEView
-    { 
-        $current = $this_UiIDEView_0.current; 
-        afterParserOrEnumRuleCall();
-    }
-
+ruleUiView returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	{
+		newCompositeNode(grammarAccess.getUiViewAccess().getUiIDEViewParserRuleCall());
+	}
+	this_UiIDEView_0=ruleUiIDEView
+	{
+		$current = $this_UiIDEView_0.current;
+		afterParserOrEnumRuleCall();
+	}
 ;
 
-
-
-
-
 // Entry rule entryRuleUiIDEView
-entryRuleUiIDEView returns [EObject current=null] 
-	:
+entryRuleUiIDEView returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiIDEViewRule()); }
-	 iv_ruleUiIDEView=ruleUiIDEView 
-	 { $current=$iv_ruleUiIDEView.current; } 
-	 EOF 
-;
+	iv_ruleUiIDEView=ruleUiIDEView
+	{ $current=$iv_ruleUiIDEView.current; }
+	EOF;
 
 // Rule UiIDEView
-ruleUiIDEView returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='ideview' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getUiIDEViewAccess().getIdeviewKeyword_0());
-    }
-(
-(
-		lv_name_1_0=RULE_ID
-		{
-			newLeafNode(lv_name_1_0, grammarAccess.getUiIDEViewAccess().getNameIDTerminalRuleCall_1_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiIDEViewRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"name",
-        		lv_name_1_0, 
-        		"ID");
-	    }
-
-)
-)	otherlv_2='{' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getUiIDEViewAccess().getLeftCurlyBracketKeyword_2());
-    }
-(
-
-(
-	{ 
-	  getUnorderedGroupHelper().enter(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3());
-	}
+ruleUiIDEView returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
 	(
-		(
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 0)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 0);
-	 				}
-					({true}?=>(	otherlv_4='sharedStateGroup' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getUiIDEViewAccess().getSharedStateGroupKeyword_3_0_0());
-    }
-(
-(
-		lv_sharedStateGroup_5_0=RULE_STRING
+		otherlv_0='ideview'
 		{
-			newLeafNode(lv_sharedStateGroup_5_0, grammarAccess.getUiIDEViewAccess().getSharedStateGroupSTRINGTerminalRuleCall_3_0_1_0()); 
+			newLeafNode(otherlv_0, grammarAccess.getUiIDEViewAccess().getIdeviewKeyword_0());
 		}
+		(
+			(
+				lv_name_1_0=RULE_ID
+				{
+					newLeafNode(lv_name_1_0, grammarAccess.getUiIDEViewAccess().getNameIDTerminalRuleCall_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiIDEViewRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_1_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)
+		otherlv_2='{'
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiIDEViewRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"sharedStateGroup",
-        		lv_sharedStateGroup_5_0, 
-        		"STRING");
-	    }
-
-)
-)(	otherlv_6=';' 
-    {
-    	newLeafNode(otherlv_6, grammarAccess.getUiIDEViewAccess().getSemicolonKeyword_3_0_2());
-    }
-)?))
+			newLeafNode(otherlv_2, grammarAccess.getUiIDEViewAccess().getLeftCurlyBracketKeyword_2());
+		}
+		(
+			(
+				{ 
+				  getUnorderedGroupHelper().enter(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3());
+				}
+				(
+					(
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 0)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 0);
+					}
+								({true}?=>(otherlv_4='sharedStateGroup'
+								{
+									newLeafNode(otherlv_4, grammarAccess.getUiIDEViewAccess().getSharedStateGroupKeyword_3_0_0());
+								}
+								(
+									(
+										lv_sharedStateGroup_5_0=RULE_STRING
+										{
+											newLeafNode(lv_sharedStateGroup_5_0, grammarAccess.getUiIDEViewAccess().getSharedStateGroupSTRINGTerminalRuleCall_3_0_1_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiIDEViewRule());
+											}
+											setWithLastConsumed(
+												$current,
+												"sharedStateGroup",
+												lv_sharedStateGroup_5_0,
+												"org.eclipse.xtext.xbase.Xtype.STRING");
+										}
+									)
+								)
+								(
+									otherlv_6=';'
+									{
+										newLeafNode(otherlv_6, grammarAccess.getUiIDEViewAccess().getSemicolonKeyword_3_0_2());
+									}
+								)?
+								))
 					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3());
-	 				}
- 				)
-			)  |
-
-			( 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3());
+					}
+				)
+			)|
+			(
 				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 1)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 1);
+					}
+								({true}?=>(otherlv_7='category'
+								{
+									newLeafNode(otherlv_7, grammarAccess.getUiIDEViewAccess().getCategoryKeyword_3_1_0());
+								}
+								(
+									(
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiIDEViewRule());
+											}
+										}
+										{
+											newCompositeNode(grammarAccess.getUiIDEViewAccess().getViewCategoryUxViewCategoryCrossReference_3_1_1_0());
+										}
+										ruleQualifiedName
+										{
+											afterParserOrEnumRuleCall();
+										}
+									)
+								)
+								(
+									otherlv_9=';'
+									{
+										newLeafNode(otherlv_9, grammarAccess.getUiIDEViewAccess().getSemicolonKeyword_3_1_2());
+									}
+								)?
+								))
 					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 1);
-	 				}
-					({true}?=>(	otherlv_7='category' 
-    {
-    	newLeafNode(otherlv_7, grammarAccess.getUiIDEViewAccess().getCategoryKeyword_3_1_0());
-    }
-(
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiIDEViewRule());
-	        }
-        }
-		{ 
-	        newCompositeNode(grammarAccess.getUiIDEViewAccess().getViewCategoryUxViewCategoryCrossReference_3_1_1_0()); 
-	    }
-		ruleQualifiedName		{ 
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_9=';' 
-    {
-    	newLeafNode(otherlv_9, grammarAccess.getUiIDEViewAccess().getSemicolonKeyword_3_1_2());
-    }
-)?))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3());
-	 				}
- 				)
-			)  |
-
-			( 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3());
+					}
+				)
+			)|
+			(
 				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 2)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 2);
+					}
+								({true}?=>(otherlv_10='rootType'
+								{
+									newLeafNode(otherlv_10, grammarAccess.getUiIDEViewAccess().getRootTypeKeyword_3_2_0());
+								}
+								(
+									(
+										{
+											newCompositeNode(grammarAccess.getUiIDEViewAccess().getJvmTypeJvmTypeReferenceParserRuleCall_3_2_1_0());
+										}
+										lv_jvmType_11_0=ruleJvmTypeReference
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
+											}
+											set(
+												$current,
+												"jvmType",
+												lv_jvmType_11_0,
+												"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+											afterParserOrEnumRuleCall();
+										}
+									)
+								)
+								(
+									otherlv_12=';'
+									{
+										newLeafNode(otherlv_12, grammarAccess.getUiIDEViewAccess().getSemicolonKeyword_3_2_2());
+									}
+								)?
+								))
 					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 2);
-	 				}
-					({true}?=>(	otherlv_10='rootType' 
-    {
-    	newLeafNode(otherlv_10, grammarAccess.getUiIDEViewAccess().getRootTypeKeyword_3_2_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiIDEViewAccess().getJvmTypeJvmTypeReferenceParserRuleCall_3_2_1_0()); 
-	    }
-		lv_jvmType_11_0=ruleJvmTypeReference		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
-	        }
-       		set(
-       			$current, 
-       			"jvmType",
-        		lv_jvmType_11_0, 
-        		"JvmTypeReference");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_12=';' 
-    {
-    	newLeafNode(otherlv_12, grammarAccess.getUiIDEViewAccess().getSemicolonKeyword_3_2_2());
-    }
-)?))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3());
-	 				}
- 				)
-			)  |
-
-			( 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3());
+					}
+				)
+			)|
+			(
 				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 3)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 3);
+					}
+								({true}?=>(otherlv_13='exposedActions'
+								{
+									newLeafNode(otherlv_13, grammarAccess.getUiIDEViewAccess().getExposedActionsKeyword_3_3_0());
+								}
+								otherlv_14='{'
+								{
+									newLeafNode(otherlv_14, grammarAccess.getUiIDEViewAccess().getLeftCurlyBracketKeyword_3_3_1());
+								}
+								(
+									(
+										{
+											newCompositeNode(grammarAccess.getUiIDEViewAccess().getExposedActionsUiExposedActionParserRuleCall_3_3_2_0());
+										}
+										lv_exposedActions_15_0=ruleUiExposedAction
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
+											}
+											add(
+												$current,
+												"exposedActions",
+												lv_exposedActions_15_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiExposedAction");
+											afterParserOrEnumRuleCall();
+										}
+									)
+								)*
+								otherlv_16='}'
+								{
+									newLeafNode(otherlv_16, grammarAccess.getUiIDEViewAccess().getRightCurlyBracketKeyword_3_3_3());
+								}
+								))
 					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 3);
-	 				}
-					({true}?=>(	otherlv_13='exposedActions' 
-    {
-    	newLeafNode(otherlv_13, grammarAccess.getUiIDEViewAccess().getExposedActionsKeyword_3_3_0());
-    }
-	otherlv_14='{' 
-    {
-    	newLeafNode(otherlv_14, grammarAccess.getUiIDEViewAccess().getLeftCurlyBracketKeyword_3_3_1());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiIDEViewAccess().getExposedActionsUiExposedActionParserRuleCall_3_3_2_0()); 
-	    }
-		lv_exposedActions_15_0=ruleUiExposedAction		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
-	        }
-       		add(
-       			$current, 
-       			"exposedActions",
-        		lv_exposedActions_15_0, 
-        		"UiExposedAction");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_16='}' 
-    {
-    	newLeafNode(otherlv_16, grammarAccess.getUiIDEViewAccess().getRightCurlyBracketKeyword_3_3_3());
-    }
-))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3());
-	 				}
- 				)
-			)  
-
-		)*	
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3());
+					}
+				)
+			)
+					)*
+				)
+			)
+				{ 
+				  getUnorderedGroupHelper().leave(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3());
+				}
+		)
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiIDEViewAccess().getBeanSlotsUiBeanSlotParserRuleCall_4_0_0());
+					}
+					lv_beanSlots_17_0=ruleUiBeanSlot
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
+						}
+						add(
+							$current,
+							"beanSlots",
+							lv_beanSlots_17_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBeanSlot");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			    |
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiIDEViewAccess().getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_4_1_0());
+					}
+					lv_bindingEndpointAlias_18_0=ruleUiBindingEndpointAlias
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
+						}
+						add(
+							$current,
+							"bindingEndpointAlias",
+							lv_bindingEndpointAlias_18_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAlias");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			    |
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiIDEViewAccess().getBindingsUiBindingParserRuleCall_4_2_0());
+					}
+					lv_bindings_19_0=ruleUiBinding
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
+						}
+						add(
+							$current,
+							"bindings",
+							lv_bindings_19_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)*
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiIDEViewAccess().getContentUiEmbeddableParserRuleCall_5_0());
+				}
+				lv_content_20_0=ruleUiEmbeddable
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
+					}
+					set(
+						$current,
+						"content",
+						lv_content_20_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiEmbeddable");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_21='align'
+			{
+				newLeafNode(otherlv_21, grammarAccess.getUiIDEViewAccess().getAlignKeyword_6_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiIDEViewAccess().getContentAlignmentUiAlignmentEnumRuleCall_6_1_0());
+					}
+					lv_contentAlignment_22_0=ruleUiAlignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
+						}
+						set(
+							$current,
+							"contentAlignment",
+							lv_contentAlignment_22_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiAlignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)?
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiIDEViewAccess().getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_7_0_0());
+					}
+					lv_bindingEndpointAlias_23_0=ruleUiBindingEndpointAlias
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
+						}
+						add(
+							$current,
+							"bindingEndpointAlias",
+							lv_bindingEndpointAlias_23_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAlias");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			    |
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiIDEViewAccess().getBindingsUiBindingParserRuleCall_7_1_0());
+					}
+					lv_bindings_24_0=ruleUiBinding
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
+						}
+						add(
+							$current,
+							"bindings",
+							lv_bindings_24_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			    |
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiIDEViewAccess().getValidatorAssignmentsUiValidatorAssignmentParserRuleCall_7_2_0());
+					}
+					lv_validatorAssignments_25_0=ruleUiValidatorAssignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
+						}
+						add(
+							$current,
+							"validatorAssignments",
+							lv_validatorAssignments_25_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidatorAssignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			    |
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiIDEViewAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_3_0());
+					}
+					lv_processorAssignments_26_0=ruleUiVisibilityProcessorAssignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
+						}
+						add(
+							$current,
+							"processorAssignments",
+							lv_processorAssignments_26_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)*
+		otherlv_27='}'
+		{
+			newLeafNode(otherlv_27, grammarAccess.getUiIDEViewAccess().getRightCurlyBracketKeyword_8());
+		}
 	)
-)
-	{ 
-	  getUnorderedGroupHelper().leave(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3());
-	}
-
-)((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiIDEViewAccess().getBeanSlotsUiBeanSlotParserRuleCall_4_0_0()); 
-	    }
-		lv_beanSlots_17_0=ruleUiBeanSlot		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
-	        }
-       		add(
-       			$current, 
-       			"beanSlots",
-        		lv_beanSlots_17_0, 
-        		"UiBeanSlot");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
-    |(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiIDEViewAccess().getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_4_1_0()); 
-	    }
-		lv_bindingEndpointAlias_18_0=ruleUiBindingEndpointAlias		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
-	        }
-       		add(
-       			$current, 
-       			"bindingEndpointAlias",
-        		lv_bindingEndpointAlias_18_0, 
-        		"UiBindingEndpointAlias");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
-    |(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiIDEViewAccess().getBindingsUiBindingParserRuleCall_4_2_0()); 
-	    }
-		lv_bindings_19_0=ruleUiBinding		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
-	        }
-       		add(
-       			$current, 
-       			"bindings",
-        		lv_bindings_19_0, 
-        		"UiBinding");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiIDEViewAccess().getContentUiEmbeddableParserRuleCall_5_0()); 
-	    }
-		lv_content_20_0=ruleUiEmbeddable		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
-	        }
-       		set(
-       			$current, 
-       			"content",
-        		lv_content_20_0, 
-        		"UiEmbeddable");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_21='align' 
-    {
-    	newLeafNode(otherlv_21, grammarAccess.getUiIDEViewAccess().getAlignKeyword_6_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiIDEViewAccess().getContentAlignmentUiAlignmentEnumRuleCall_6_1_0()); 
-	    }
-		lv_contentAlignment_22_0=ruleUiAlignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
-	        }
-       		set(
-       			$current, 
-       			"contentAlignment",
-        		lv_contentAlignment_22_0, 
-        		"UiAlignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))?((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiIDEViewAccess().getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_7_0_0()); 
-	    }
-		lv_bindingEndpointAlias_23_0=ruleUiBindingEndpointAlias		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
-	        }
-       		add(
-       			$current, 
-       			"bindingEndpointAlias",
-        		lv_bindingEndpointAlias_23_0, 
-        		"UiBindingEndpointAlias");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
-    |(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiIDEViewAccess().getBindingsUiBindingParserRuleCall_7_1_0()); 
-	    }
-		lv_bindings_24_0=ruleUiBinding		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
-	        }
-       		add(
-       			$current, 
-       			"bindings",
-        		lv_bindings_24_0, 
-        		"UiBinding");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
-    |(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiIDEViewAccess().getValidatorAssignmentsUiValidatorAssignmentParserRuleCall_7_2_0()); 
-	    }
-		lv_validatorAssignments_25_0=ruleUiValidatorAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
-	        }
-       		add(
-       			$current, 
-       			"validatorAssignments",
-        		lv_validatorAssignments_25_0, 
-        		"UiValidatorAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
-    |(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiIDEViewAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_3_0()); 
-	    }
-		lv_processorAssignments_26_0=ruleUiVisibilityProcessorAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
-	        }
-       		add(
-       			$current, 
-       			"processorAssignments",
-        		lv_processorAssignments_26_0, 
-        		"UiVisibilityProcessorAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))*	otherlv_27='}' 
-    {
-    	newLeafNode(otherlv_27, grammarAccess.getUiIDEViewAccess().getRightCurlyBracketKeyword_8());
-    }
-)
 ;
 
+// Entry rule entryRuleUiDisplayView
+entryRuleUiDisplayView returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiDisplayViewRule()); }
+	iv_ruleUiDisplayView=ruleUiDisplayView
+	{ $current=$iv_ruleUiDisplayView.current; }
+	EOF;
 
-
-
+// Rule UiDisplayView
+ruleUiDisplayView returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='display'
+		{
+			newLeafNode(otherlv_0, grammarAccess.getUiDisplayViewAccess().getDisplayKeyword_0());
+		}
+		(
+			(
+				lv_name_1_0=RULE_ID
+				{
+					newLeafNode(lv_name_1_0, grammarAccess.getUiDisplayViewAccess().getNameIDTerminalRuleCall_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiDisplayViewRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_1_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)
+		otherlv_2='{'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getUiDisplayViewAccess().getLeftCurlyBracketKeyword_2());
+		}
+		otherlv_3='rootType'
+		{
+			newLeafNode(otherlv_3, grammarAccess.getUiDisplayViewAccess().getRootTypeKeyword_3());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiDisplayViewAccess().getJvmTypeJvmTypeReferenceParserRuleCall_4_0());
+				}
+				lv_jvmType_4_0=ruleJvmTypeReference
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiDisplayViewRule());
+					}
+					set(
+						$current,
+						"jvmType",
+						lv_jvmType_4_0,
+						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiDisplayViewAccess().getBeanSlotsUiBeanSlotParserRuleCall_5_0_0());
+					}
+					lv_beanSlots_5_0=ruleUiBeanSlot
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiDisplayViewRule());
+						}
+						add(
+							$current,
+							"beanSlots",
+							lv_beanSlots_5_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBeanSlot");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			    |
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiDisplayViewAccess().getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_5_1_0());
+					}
+					lv_bindingEndpointAlias_6_0=ruleUiBindingEndpointAlias
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiDisplayViewRule());
+						}
+						add(
+							$current,
+							"bindingEndpointAlias",
+							lv_bindingEndpointAlias_6_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAlias");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			    |
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiDisplayViewAccess().getBindingsUiBindingParserRuleCall_5_2_0());
+					}
+					lv_bindings_7_0=ruleUiBinding
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiDisplayViewRule());
+						}
+						add(
+							$current,
+							"bindings",
+							lv_bindings_7_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)*
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiDisplayViewAccess().getContentUiEmbeddableParserRuleCall_6_0());
+				}
+				lv_content_8_0=ruleUiEmbeddable
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiDisplayViewRule());
+					}
+					set(
+						$current,
+						"content",
+						lv_content_8_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiEmbeddable");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_9='align'
+			{
+				newLeafNode(otherlv_9, grammarAccess.getUiDisplayViewAccess().getAlignKeyword_7_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiDisplayViewAccess().getContentAlignmentUiAlignmentEnumRuleCall_7_1_0());
+					}
+					lv_contentAlignment_10_0=ruleUiAlignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiDisplayViewRule());
+						}
+						set(
+							$current,
+							"contentAlignment",
+							lv_contentAlignment_10_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiAlignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)?
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiDisplayViewAccess().getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_8_0_0());
+					}
+					lv_bindingEndpointAlias_11_0=ruleUiBindingEndpointAlias
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiDisplayViewRule());
+						}
+						add(
+							$current,
+							"bindingEndpointAlias",
+							lv_bindingEndpointAlias_11_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAlias");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			    |
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiDisplayViewAccess().getBindingsUiBindingParserRuleCall_8_1_0());
+					}
+					lv_bindings_12_0=ruleUiBinding
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiDisplayViewRule());
+						}
+						add(
+							$current,
+							"bindings",
+							lv_bindings_12_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			    |
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiDisplayViewAccess().getValidatorAssignmentsUiValidatorAssignmentParserRuleCall_8_2_0());
+					}
+					lv_validatorAssignments_13_0=ruleUiValidatorAssignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiDisplayViewRule());
+						}
+						add(
+							$current,
+							"validatorAssignments",
+							lv_validatorAssignments_13_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidatorAssignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			    |
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiDisplayViewAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_8_3_0());
+					}
+					lv_processorAssignments_14_0=ruleUiVisibilityProcessorAssignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiDisplayViewRule());
+						}
+						add(
+							$current,
+							"processorAssignments",
+							lv_processorAssignments_14_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)*
+		otherlv_15='}'
+		{
+			newLeafNode(otherlv_15, grammarAccess.getUiDisplayViewAccess().getRightCurlyBracketKeyword_9());
+		}
+	)
+;
 
 // Entry rule entryRuleUiExposedAction
-entryRuleUiExposedAction returns [EObject current=null] 
-	:
+entryRuleUiExposedAction returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiExposedActionRule()); }
-	 iv_ruleUiExposedAction=ruleUiExposedAction 
-	 { $current=$iv_ruleUiExposedAction.current; } 
-	 EOF 
-;
+	iv_ruleUiExposedAction=ruleUiExposedAction
+	{ $current=$iv_ruleUiExposedAction.current; }
+	EOF;
 
 // Rule UiExposedAction
-ruleUiExposedAction returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-(
-		lv_name_0_0=RULE_ID
+ruleUiExposedAction returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				lv_name_0_0=RULE_ID
+				{
+					newLeafNode(lv_name_0_0, grammarAccess.getUiExposedActionAccess().getNameIDTerminalRuleCall_0_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiExposedActionRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_0_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)
+		(
+			otherlv_1='icon'
+			{
+				newLeafNode(otherlv_1, grammarAccess.getUiExposedActionAccess().getIconKeyword_1_0());
+			}
+			(
+				(
+					lv_iconName_2_0=RULE_STRING
+					{
+						newLeafNode(lv_iconName_2_0, grammarAccess.getUiExposedActionAccess().getIconNameSTRINGTerminalRuleCall_1_1_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getUiExposedActionRule());
+						}
+						setWithLastConsumed(
+							$current,
+							"iconName",
+							lv_iconName_2_0,
+							"org.eclipse.xtext.xbase.Xtype.STRING");
+					}
+				)
+			)
+		)?
+		otherlv_3='id'
 		{
-			newLeafNode(lv_name_0_0, grammarAccess.getUiExposedActionAccess().getNameIDTerminalRuleCall_0_0()); 
+			newLeafNode(otherlv_3, grammarAccess.getUiExposedActionAccess().getIdKeyword_2());
 		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiExposedActionRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"name",
-        		lv_name_0_0, 
-        		"ID");
-	    }
-
-)
-)(	otherlv_1='icon' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiExposedActionAccess().getIconKeyword_1_0());
-    }
-(
-(
-		lv_iconName_2_0=RULE_STRING
-		{
-			newLeafNode(lv_iconName_2_0, grammarAccess.getUiExposedActionAccess().getIconNameSTRINGTerminalRuleCall_1_1_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiExposedActionRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"iconName",
-        		lv_iconName_2_0, 
-        		"STRING");
-	    }
-
-)
-))?	otherlv_3='id' 
-    {
-    	newLeafNode(otherlv_3, grammarAccess.getUiExposedActionAccess().getIdKeyword_2());
-    }
-(((
-(
-		ruleQualifiedName
-)
-)=>
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiExposedActionRule());
-	        }
-        }
-		{ 
-	        newCompositeNode(grammarAccess.getUiExposedActionAccess().getActionReferenceUxActionCrossReference_3_0_0()); 
-	    }
-		ruleQualifiedName		{ 
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
-    |(
-(
-		lv_actionID_5_0=RULE_STRING
-		{
-			newLeafNode(lv_actionID_5_0, grammarAccess.getUiExposedActionAccess().getActionIDSTRINGTerminalRuleCall_3_1_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiExposedActionRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"actionID",
-        		lv_actionID_5_0, 
-        		"STRING");
-	    }
-
-)
-))(
-(
-		lv_checkDirty_6_0=	'checkDirty' 
-    {
-        newLeafNode(lv_checkDirty_6_0, grammarAccess.getUiExposedActionAccess().getCheckDirtyCheckDirtyKeyword_4_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiExposedActionRule());
-	        }
-       		setWithLastConsumed($current, "checkDirty", true, "checkDirty");
-	    }
-
-)
-)?(	otherlv_7='externalCommand' 
-    {
-    	newLeafNode(otherlv_7, grammarAccess.getUiExposedActionAccess().getExternalCommandKeyword_5_0());
-    }
-(
-(
-		lv_externalCommandId_8_0=RULE_STRING
-		{
-			newLeafNode(lv_externalCommandId_8_0, grammarAccess.getUiExposedActionAccess().getExternalCommandIdSTRINGTerminalRuleCall_5_1_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiExposedActionRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"externalCommandId",
-        		lv_externalCommandId_8_0, 
-        		"STRING");
-	    }
-
-)
-))?(	otherlv_9=';' 
-    {
-    	newLeafNode(otherlv_9, grammarAccess.getUiExposedActionAccess().getSemicolonKeyword_6());
-    }
-)?)
+		(
+			(
+				((
+					ruleQualifiedName
+				)
+				)=>
+				(
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getUiExposedActionRule());
+						}
+					}
+					{
+						newCompositeNode(grammarAccess.getUiExposedActionAccess().getActionReferenceUxActionCrossReference_3_0_0());
+					}
+					ruleQualifiedName
+					{
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			    |
+			(
+				(
+					lv_actionID_5_0=RULE_STRING
+					{
+						newLeafNode(lv_actionID_5_0, grammarAccess.getUiExposedActionAccess().getActionIDSTRINGTerminalRuleCall_3_1_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getUiExposedActionRule());
+						}
+						setWithLastConsumed(
+							$current,
+							"actionID",
+							lv_actionID_5_0,
+							"org.eclipse.xtext.xbase.Xtype.STRING");
+					}
+				)
+			)
+		)
+		(
+			(
+				lv_checkDirty_6_0='checkDirty'
+				{
+					newLeafNode(lv_checkDirty_6_0, grammarAccess.getUiExposedActionAccess().getCheckDirtyCheckDirtyKeyword_4_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiExposedActionRule());
+					}
+					setWithLastConsumed($current, "checkDirty", true, "checkDirty");
+				}
+			)
+		)?
+		(
+			otherlv_7='externalCommand'
+			{
+				newLeafNode(otherlv_7, grammarAccess.getUiExposedActionAccess().getExternalCommandKeyword_5_0());
+			}
+			(
+				(
+					lv_externalCommandId_8_0=RULE_STRING
+					{
+						newLeafNode(lv_externalCommandId_8_0, grammarAccess.getUiExposedActionAccess().getExternalCommandIdSTRINGTerminalRuleCall_5_1_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getUiExposedActionRule());
+						}
+						setWithLastConsumed(
+							$current,
+							"externalCommandId",
+							lv_externalCommandId_8_0,
+							"org.eclipse.xtext.xbase.Xtype.STRING");
+					}
+				)
+			)
+		)?
+		(
+			otherlv_9=';'
+			{
+				newLeafNode(otherlv_9, grammarAccess.getUiExposedActionAccess().getSemicolonKeyword_6());
+			}
+		)?
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiMobileNavBarAction
-entryRuleUiMobileNavBarAction returns [EObject current=null] 
-	:
+entryRuleUiMobileNavBarAction returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiMobileNavBarActionRule()); }
-	 iv_ruleUiMobileNavBarAction=ruleUiMobileNavBarAction 
-	 { $current=$iv_ruleUiMobileNavBarAction.current; } 
-	 EOF 
-;
+	iv_ruleUiMobileNavBarAction=ruleUiMobileNavBarAction
+	{ $current=$iv_ruleUiMobileNavBarAction.current; }
+	EOF;
 
 // Rule UiMobileNavBarAction
-ruleUiMobileNavBarAction returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-(
-		lv_name_0_0=RULE_ID
+ruleUiMobileNavBarAction returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				lv_name_0_0=RULE_ID
+				{
+					newLeafNode(lv_name_0_0, grammarAccess.getUiMobileNavBarActionAccess().getNameIDTerminalRuleCall_0_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiMobileNavBarActionRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_0_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)
+		(
+			otherlv_1='icon'
+			{
+				newLeafNode(otherlv_1, grammarAccess.getUiMobileNavBarActionAccess().getIconKeyword_1_0());
+			}
+			(
+				(
+					lv_iconName_2_0=RULE_STRING
+					{
+						newLeafNode(lv_iconName_2_0, grammarAccess.getUiMobileNavBarActionAccess().getIconNameSTRINGTerminalRuleCall_1_1_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getUiMobileNavBarActionRule());
+						}
+						setWithLastConsumed(
+							$current,
+							"iconName",
+							lv_iconName_2_0,
+							"org.eclipse.xtext.xbase.Xtype.STRING");
+					}
+				)
+			)
+		)?
+		otherlv_3='id'
 		{
-			newLeafNode(lv_name_0_0, grammarAccess.getUiMobileNavBarActionAccess().getNameIDTerminalRuleCall_0_0()); 
+			newLeafNode(otherlv_3, grammarAccess.getUiMobileNavBarActionAccess().getIdKeyword_2());
 		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiMobileNavBarActionRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"name",
-        		lv_name_0_0, 
-        		"ID");
-	    }
-
-)
-)(	otherlv_1='icon' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiMobileNavBarActionAccess().getIconKeyword_1_0());
-    }
-(
-(
-		lv_iconName_2_0=RULE_STRING
-		{
-			newLeafNode(lv_iconName_2_0, grammarAccess.getUiMobileNavBarActionAccess().getIconNameSTRINGTerminalRuleCall_1_1_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiMobileNavBarActionRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"iconName",
-        		lv_iconName_2_0, 
-        		"STRING");
-	    }
-
-)
-))?	otherlv_3='id' 
-    {
-    	newLeafNode(otherlv_3, grammarAccess.getUiMobileNavBarActionAccess().getIdKeyword_2());
-    }
-(((
-(
-		ruleQualifiedName
-)
-)=>
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiMobileNavBarActionRule());
-	        }
-        }
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileNavBarActionAccess().getActionReferenceUxActionCrossReference_3_0_0()); 
-	    }
-		ruleQualifiedName		{ 
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
-    |(
-(
-		lv_actionID_5_0=RULE_STRING
-		{
-			newLeafNode(lv_actionID_5_0, grammarAccess.getUiMobileNavBarActionAccess().getActionIDSTRINGTerminalRuleCall_3_1_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiMobileNavBarActionRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"actionID",
-        		lv_actionID_5_0, 
-        		"STRING");
-	    }
-
-)
-))(	otherlv_6=';' 
-    {
-    	newLeafNode(otherlv_6, grammarAccess.getUiMobileNavBarActionAccess().getSemicolonKeyword_4());
-    }
-)?)
+		(
+			(
+				((
+					ruleQualifiedName
+				)
+				)=>
+				(
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getUiMobileNavBarActionRule());
+						}
+					}
+					{
+						newCompositeNode(grammarAccess.getUiMobileNavBarActionAccess().getActionReferenceUxActionCrossReference_3_0_0());
+					}
+					ruleQualifiedName
+					{
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			    |
+			(
+				(
+					lv_actionID_5_0=RULE_STRING
+					{
+						newLeafNode(lv_actionID_5_0, grammarAccess.getUiMobileNavBarActionAccess().getActionIDSTRINGTerminalRuleCall_3_1_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getUiMobileNavBarActionRule());
+						}
+						setWithLastConsumed(
+							$current,
+							"actionID",
+							lv_actionID_5_0,
+							"org.eclipse.xtext.xbase.Xtype.STRING");
+					}
+				)
+			)
+		)
+		(
+			otherlv_6=';'
+			{
+				newLeafNode(otherlv_6, grammarAccess.getUiMobileNavBarActionAccess().getSemicolonKeyword_4());
+			}
+		)?
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiMobileView
-entryRuleUiMobileView returns [EObject current=null] 
-	:
+entryRuleUiMobileView returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiMobileViewRule()); }
-	 iv_ruleUiMobileView=ruleUiMobileView 
-	 { $current=$iv_ruleUiMobileView.current; } 
-	 EOF 
-;
+	iv_ruleUiMobileView=ruleUiMobileView
+	{ $current=$iv_ruleUiMobileView.current; }
+	EOF;
 
 // Rule UiMobileView
-ruleUiMobileView returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='mobile' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getUiMobileViewAccess().getMobileKeyword_0());
-    }
-(
-(
-		lv_name_1_0=RULE_ID
-		{
-			newLeafNode(lv_name_1_0, grammarAccess.getUiMobileViewAccess().getNameIDTerminalRuleCall_1_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiMobileViewRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"name",
-        		lv_name_1_0, 
-        		"ID");
-	    }
-
-)
-)	otherlv_2='{' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getUiMobileViewAccess().getLeftCurlyBracketKeyword_2());
-    }
-(
-
-(
-	{ 
-	  getUnorderedGroupHelper().enter(grammarAccess.getUiMobileViewAccess().getUnorderedGroup_3());
-	}
+ruleUiMobileView returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
 	(
-		(
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileViewAccess().getUnorderedGroup_3(), 0)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiMobileViewAccess().getUnorderedGroup_3(), 0);
-	 				}
-					({true}?=>(	otherlv_4='sharedStateGroup' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getUiMobileViewAccess().getSharedStateGroupKeyword_3_0_0());
-    }
-(
-(
-		lv_sharedStateGroup_5_0=RULE_STRING
+		otherlv_0='mobile'
 		{
-			newLeafNode(lv_sharedStateGroup_5_0, grammarAccess.getUiMobileViewAccess().getSharedStateGroupSTRINGTerminalRuleCall_3_0_1_0()); 
+			newLeafNode(otherlv_0, grammarAccess.getUiMobileViewAccess().getMobileKeyword_0());
 		}
+		(
+			(
+				lv_name_1_0=RULE_ID
+				{
+					newLeafNode(lv_name_1_0, grammarAccess.getUiMobileViewAccess().getNameIDTerminalRuleCall_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiMobileViewRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_1_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)
+		otherlv_2='{'
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiMobileViewRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"sharedStateGroup",
-        		lv_sharedStateGroup_5_0, 
-        		"STRING");
-	    }
-
-)
-)(	otherlv_6=';' 
-    {
-    	newLeafNode(otherlv_6, grammarAccess.getUiMobileViewAccess().getSemicolonKeyword_3_0_2());
-    }
-)?))
+			newLeafNode(otherlv_2, grammarAccess.getUiMobileViewAccess().getLeftCurlyBracketKeyword_2());
+		}
+		(
+			(
+				{ 
+				  getUnorderedGroupHelper().enter(grammarAccess.getUiMobileViewAccess().getUnorderedGroup_3());
+				}
+				(
+					(
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileViewAccess().getUnorderedGroup_3(), 0)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getUiMobileViewAccess().getUnorderedGroup_3(), 0);
+					}
+								({true}?=>(otherlv_4='sharedStateGroup'
+								{
+									newLeafNode(otherlv_4, grammarAccess.getUiMobileViewAccess().getSharedStateGroupKeyword_3_0_0());
+								}
+								(
+									(
+										lv_sharedStateGroup_5_0=RULE_STRING
+										{
+											newLeafNode(lv_sharedStateGroup_5_0, grammarAccess.getUiMobileViewAccess().getSharedStateGroupSTRINGTerminalRuleCall_3_0_1_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiMobileViewRule());
+											}
+											setWithLastConsumed(
+												$current,
+												"sharedStateGroup",
+												lv_sharedStateGroup_5_0,
+												"org.eclipse.xtext.xbase.Xtype.STRING");
+										}
+									)
+								)
+								(
+									otherlv_6=';'
+									{
+										newLeafNode(otherlv_6, grammarAccess.getUiMobileViewAccess().getSemicolonKeyword_3_0_2());
+									}
+								)?
+								))
 					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileViewAccess().getUnorderedGroup_3());
-	 				}
- 				)
-			)  |
-
-			( 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileViewAccess().getUnorderedGroup_3());
+					}
+				)
+			)|
+			(
 				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileViewAccess().getUnorderedGroup_3(), 1)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getUiMobileViewAccess().getUnorderedGroup_3(), 1);
+					}
+								({true}?=>(otherlv_7='rootType'
+								{
+									newLeafNode(otherlv_7, grammarAccess.getUiMobileViewAccess().getRootTypeKeyword_3_1_0());
+								}
+								(
+									(
+										{
+											newCompositeNode(grammarAccess.getUiMobileViewAccess().getJvmTypeJvmTypeReferenceParserRuleCall_3_1_1_0());
+										}
+										lv_jvmType_8_0=ruleJvmTypeReference
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
+											}
+											set(
+												$current,
+												"jvmType",
+												lv_jvmType_8_0,
+												"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+											afterParserOrEnumRuleCall();
+										}
+									)
+								)
+								(
+									otherlv_9=';'
+									{
+										newLeafNode(otherlv_9, grammarAccess.getUiMobileViewAccess().getSemicolonKeyword_3_1_2());
+									}
+								)?
+								))
 					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiMobileViewAccess().getUnorderedGroup_3(), 1);
-	 				}
-					({true}?=>(	otherlv_7='rootType' 
-    {
-    	newLeafNode(otherlv_7, grammarAccess.getUiMobileViewAccess().getRootTypeKeyword_3_1_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileViewAccess().getJvmTypeJvmTypeReferenceParserRuleCall_3_1_1_0()); 
-	    }
-		lv_jvmType_8_0=ruleJvmTypeReference		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
-	        }
-       		set(
-       			$current, 
-       			"jvmType",
-        		lv_jvmType_8_0, 
-        		"JvmTypeReference");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_9=';' 
-    {
-    	newLeafNode(otherlv_9, grammarAccess.getUiMobileViewAccess().getSemicolonKeyword_3_1_2());
-    }
-)?))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileViewAccess().getUnorderedGroup_3());
-	 				}
- 				)
-			)  
-
-		)*	
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileViewAccess().getUnorderedGroup_3());
+					}
+				)
+			)
+					)*
+				)
+			)
+				{ 
+				  getUnorderedGroupHelper().leave(grammarAccess.getUiMobileViewAccess().getUnorderedGroup_3());
+				}
+		)
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiMobileViewAccess().getBeanSlotsUiBeanSlotParserRuleCall_4_0_0());
+					}
+					lv_beanSlots_10_0=ruleUiBeanSlot
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
+						}
+						add(
+							$current,
+							"beanSlots",
+							lv_beanSlots_10_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBeanSlot");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			    |
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiMobileViewAccess().getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_4_1_0());
+					}
+					lv_bindingEndpointAlias_11_0=ruleUiBindingEndpointAlias
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
+						}
+						add(
+							$current,
+							"bindingEndpointAlias",
+							lv_bindingEndpointAlias_11_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAlias");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)*
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiMobileViewAccess().getContentUiMobileEmbeddableParserRuleCall_5_0());
+				}
+				lv_content_12_0=ruleUiMobileEmbeddable
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
+					}
+					set(
+						$current,
+						"content",
+						lv_content_12_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileEmbeddable");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_13='align'
+			{
+				newLeafNode(otherlv_13, grammarAccess.getUiMobileViewAccess().getAlignKeyword_6_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiMobileViewAccess().getContentAlignmentUiAlignmentEnumRuleCall_6_1_0());
+					}
+					lv_contentAlignment_14_0=ruleUiAlignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
+						}
+						set(
+							$current,
+							"contentAlignment",
+							lv_contentAlignment_14_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiAlignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)?
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiMobileViewAccess().getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_7_0_0());
+					}
+					lv_bindingEndpointAlias_15_0=ruleUiBindingEndpointAlias
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
+						}
+						add(
+							$current,
+							"bindingEndpointAlias",
+							lv_bindingEndpointAlias_15_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAlias");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			    |
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiMobileViewAccess().getBindingsUiBindingParserRuleCall_7_1_0());
+					}
+					lv_bindings_16_0=ruleUiBinding
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
+						}
+						add(
+							$current,
+							"bindings",
+							lv_bindings_16_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			    |
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiMobileViewAccess().getValidatorAssignmentsUiValidatorAssignmentParserRuleCall_7_2_0());
+					}
+					lv_validatorAssignments_17_0=ruleUiValidatorAssignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
+						}
+						add(
+							$current,
+							"validatorAssignments",
+							lv_validatorAssignments_17_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidatorAssignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			    |
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiMobileViewAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_3_0());
+					}
+					lv_processorAssignments_18_0=ruleUiVisibilityProcessorAssignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
+						}
+						add(
+							$current,
+							"processorAssignments",
+							lv_processorAssignments_18_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)*
+		otherlv_19='}'
+		{
+			newLeafNode(otherlv_19, grammarAccess.getUiMobileViewAccess().getRightCurlyBracketKeyword_8());
+		}
 	)
-)
-	{ 
-	  getUnorderedGroupHelper().leave(grammarAccess.getUiMobileViewAccess().getUnorderedGroup_3());
-	}
-
-)((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileViewAccess().getBeanSlotsUiBeanSlotParserRuleCall_4_0_0()); 
-	    }
-		lv_beanSlots_10_0=ruleUiBeanSlot		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
-	        }
-       		add(
-       			$current, 
-       			"beanSlots",
-        		lv_beanSlots_10_0, 
-        		"UiBeanSlot");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
-    |(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileViewAccess().getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_4_1_0()); 
-	    }
-		lv_bindingEndpointAlias_11_0=ruleUiBindingEndpointAlias		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
-	        }
-       		add(
-       			$current, 
-       			"bindingEndpointAlias",
-        		lv_bindingEndpointAlias_11_0, 
-        		"UiBindingEndpointAlias");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileViewAccess().getContentUiMobileEmbeddableParserRuleCall_5_0()); 
-	    }
-		lv_content_12_0=ruleUiMobileEmbeddable		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
-	        }
-       		set(
-       			$current, 
-       			"content",
-        		lv_content_12_0, 
-        		"UiMobileEmbeddable");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_13='align' 
-    {
-    	newLeafNode(otherlv_13, grammarAccess.getUiMobileViewAccess().getAlignKeyword_6_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileViewAccess().getContentAlignmentUiAlignmentEnumRuleCall_6_1_0()); 
-	    }
-		lv_contentAlignment_14_0=ruleUiAlignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
-	        }
-       		set(
-       			$current, 
-       			"contentAlignment",
-        		lv_contentAlignment_14_0, 
-        		"UiAlignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))?((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileViewAccess().getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_7_0_0()); 
-	    }
-		lv_bindingEndpointAlias_15_0=ruleUiBindingEndpointAlias		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
-	        }
-       		add(
-       			$current, 
-       			"bindingEndpointAlias",
-        		lv_bindingEndpointAlias_15_0, 
-        		"UiBindingEndpointAlias");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
-    |(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileViewAccess().getBindingsUiBindingParserRuleCall_7_1_0()); 
-	    }
-		lv_bindings_16_0=ruleUiBinding		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
-	        }
-       		add(
-       			$current, 
-       			"bindings",
-        		lv_bindings_16_0, 
-        		"UiBinding");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
-    |(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileViewAccess().getValidatorAssignmentsUiValidatorAssignmentParserRuleCall_7_2_0()); 
-	    }
-		lv_validatorAssignments_17_0=ruleUiValidatorAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
-	        }
-       		add(
-       			$current, 
-       			"validatorAssignments",
-        		lv_validatorAssignments_17_0, 
-        		"UiValidatorAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
-    |(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileViewAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_3_0()); 
-	    }
-		lv_processorAssignments_18_0=ruleUiVisibilityProcessorAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
-	        }
-       		add(
-       			$current, 
-       			"processorAssignments",
-        		lv_processorAssignments_18_0, 
-        		"UiVisibilityProcessorAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))*	otherlv_19='}' 
-    {
-    	newLeafNode(otherlv_19, grammarAccess.getUiMobileViewAccess().getRightCurlyBracketKeyword_8());
-    }
-)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiI18nInfo
-entryRuleUiI18nInfo returns [EObject current=null] 
-	:
+entryRuleUiI18nInfo returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiI18nInfoRule()); }
-	 iv_ruleUiI18nInfo=ruleUiI18nInfo 
-	 { $current=$iv_ruleUiI18nInfo.current; } 
-	 EOF 
-;
+	iv_ruleUiI18nInfo=ruleUiI18nInfo
+	{ $current=$iv_ruleUiI18nInfo.current; }
+	EOF;
 
 // Rule UiI18nInfo
-ruleUiI18nInfo returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='i18n' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getUiI18nInfoAccess().getI18nKeyword_0());
-    }
-(
-(
-		lv_key_1_0=RULE_STRING
+ruleUiI18nInfo returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='i18n'
 		{
-			newLeafNode(lv_key_1_0, grammarAccess.getUiI18nInfoAccess().getKeySTRINGTerminalRuleCall_1_0()); 
+			newLeafNode(otherlv_0, grammarAccess.getUiI18nInfoAccess().getI18nKeyword_0());
 		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiI18nInfoRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"key",
-        		lv_key_1_0, 
-        		"STRING");
-	    }
-
-)
-))
+		(
+			(
+				(
+					lv_noCaption_1_0='noCaption'
+					{
+						newLeafNode(lv_noCaption_1_0, grammarAccess.getUiI18nInfoAccess().getNoCaptionNoCaptionKeyword_1_0_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getUiI18nInfoRule());
+						}
+						setWithLastConsumed($current, "noCaption", true, "noCaption");
+					}
+				)
+			)
+			    |
+			(
+				(
+					lv_key_2_0=RULE_STRING
+					{
+						newLeafNode(lv_key_2_0, grammarAccess.getUiI18nInfoAccess().getKeySTRINGTerminalRuleCall_1_1_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getUiI18nInfoRule());
+						}
+						setWithLastConsumed(
+							$current,
+							"key",
+							lv_key_2_0,
+							"org.eclipse.xtext.xbase.Xtype.STRING");
+					}
+				)
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiGridLayout
-entryRuleUiGridLayout returns [EObject current=null] 
-	:
+entryRuleUiGridLayout returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiGridLayoutRule()); }
-	 iv_ruleUiGridLayout=ruleUiGridLayout 
-	 { $current=$iv_ruleUiGridLayout.current; } 
-	 EOF 
-;
+	iv_ruleUiGridLayout=ruleUiGridLayout
+	{ $current=$iv_ruleUiGridLayout.current; }
+	EOF;
 
 // Rule UiGridLayout
-ruleUiGridLayout returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUiGridLayoutAccess().getUiGridLayoutAction_0(),
-            $current);
-    }
-)	otherlv_1='gridlayout' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiGridLayoutAccess().getGridlayoutKeyword_1());
-    }
-(	otherlv_2='(' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getUiGridLayoutAccess().getLeftParenthesisKeyword_2_0());
-    }
-(
-
-(
-	{ 
-	  getUnorderedGroupHelper().enter(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1());
-	}
+ruleUiGridLayout returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
 	(
 		(
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 0)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 0);
-	 				}
-					({true}?=>(	otherlv_4='columns=' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getUiGridLayoutAccess().getColumnsKeyword_2_1_0_0());
-    }
-(
-(
-		lv_columns_5_0=RULE_INT
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiGridLayoutAccess().getUiGridLayoutAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='gridlayout'
 		{
-			newLeafNode(lv_columns_5_0, grammarAccess.getUiGridLayoutAccess().getColumnsINTTerminalRuleCall_2_1_0_1_0()); 
+			newLeafNode(otherlv_1, grammarAccess.getUiGridLayoutAccess().getGridlayoutKeyword_1());
 		}
+		(
+			otherlv_2='('
+			{
+				newLeafNode(otherlv_2, grammarAccess.getUiGridLayoutAccess().getLeftParenthesisKeyword_2_0());
+			}
+			(
+				(
+					{ 
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 0);
+						}
+									({true}?=>(otherlv_4='columns='
+									{
+										newLeafNode(otherlv_4, grammarAccess.getUiGridLayoutAccess().getColumnsKeyword_2_1_0_0());
+									}
+									(
+										(
+											lv_columns_5_0=RULE_INT
+											{
+												newLeafNode(lv_columns_5_0, grammarAccess.getUiGridLayoutAccess().getColumnsINTTerminalRuleCall_2_1_0_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiGridLayoutRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"columns",
+													lv_columns_5_0,
+													"org.eclipse.xtext.xbase.Xbase.INT");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 1);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getUiGridLayoutAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_1_0());
+										}
+										lv_i18nInfo_6_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiGridLayoutRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_6_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 2)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 2);
+						}
+									({true}?=>(otherlv_7='styles'
+									{
+										newLeafNode(otherlv_7, grammarAccess.getUiGridLayoutAccess().getStylesKeyword_2_1_2_0());
+									}
+									(
+										(
+											lv_styles_8_0=RULE_STRING
+											{
+												newLeafNode(lv_styles_8_0, grammarAccess.getUiGridLayoutAccess().getStylesSTRINGTerminalRuleCall_2_1_2_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiGridLayoutRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"styles",
+													lv_styles_8_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 3)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 3);
+						}
+									({true}?=>((
+										lv_readonly_9_0='readonly'
+										{
+											newLeafNode(lv_readonly_9_0, grammarAccess.getUiGridLayoutAccess().getReadonlyReadonlyKeyword_2_1_3_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiGridLayoutRule());
+											}
+											setWithLastConsumed($current, "readonly", true, "readonly");
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)
+						)*
+					)
+				)
+					{ 
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1());
+					}
+			)
+			otherlv_10=')'
+			{
+				newLeafNode(otherlv_10, grammarAccess.getUiGridLayoutAccess().getRightParenthesisKeyword_2_2());
+			}
+		)?
+		(
+			(
+				lv_name_11_0=RULE_ID
+				{
+					newLeafNode(lv_name_11_0, grammarAccess.getUiGridLayoutAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiGridLayoutRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_11_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		otherlv_12='{'
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiGridLayoutRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"columns",
-        		lv_columns_5_0, 
-        		"INT");
-	    }
-
-)
-)))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 1)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 1);
-	 				}
-					({true}?=>(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiGridLayoutAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_1_0()); 
-	    }
-		lv_i18nInfo_6_0=ruleUiI18nInfo		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiGridLayoutRule());
-	        }
-       		set(
-       			$current, 
-       			"i18nInfo",
-        		lv_i18nInfo_6_0, 
-        		"UiI18nInfo");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 2)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 2);
-	 				}
-					({true}?=>(	otherlv_7='styles' 
-    {
-    	newLeafNode(otherlv_7, grammarAccess.getUiGridLayoutAccess().getStylesKeyword_2_1_2_0());
-    }
-(
-(
-		lv_styles_8_0=RULE_STRING
-		{
-			newLeafNode(lv_styles_8_0, grammarAccess.getUiGridLayoutAccess().getStylesSTRINGTerminalRuleCall_2_1_2_1_0()); 
+			newLeafNode(otherlv_12, grammarAccess.getUiGridLayoutAccess().getLeftCurlyBracketKeyword_4());
 		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiGridLayoutAccess().getContentsUiGridLayoutAssigmentParserRuleCall_5_0());
+				}
+				lv_contents_13_0=ruleUiGridLayoutAssigment
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiGridLayoutRule());
+					}
+					add(
+						$current,
+						"contents",
+						lv_contents_13_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiGridLayoutAssigment");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiGridLayoutAccess().getBindingsUiBindingParserRuleCall_6_0());
+				}
+				lv_bindings_14_0=ruleUiBinding
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiGridLayoutRule());
+					}
+					add(
+						$current,
+						"bindings",
+						lv_bindings_14_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiGridLayoutAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0());
+				}
+				lv_processorAssignments_15_0=ruleUiVisibilityProcessorAssignment
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiGridLayoutRule());
+					}
+					add(
+						$current,
+						"processorAssignments",
+						lv_processorAssignments_15_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		otherlv_16='}'
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiGridLayoutRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"styles",
-        		lv_styles_8_0, 
-        		"STRING");
-	    }
-
-)
-)))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 3)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 3);
-	 				}
-					({true}?=>(
-(
-		lv_readonly_9_0=	'readonly' 
-    {
-        newLeafNode(lv_readonly_9_0, grammarAccess.getUiGridLayoutAccess().getReadonlyReadonlyKeyword_2_1_3_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiGridLayoutRule());
-	        }
-       		setWithLastConsumed($current, "readonly", true, "readonly");
-	    }
-
-)
-))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  
-
-		)*	
+			newLeafNode(otherlv_16, grammarAccess.getUiGridLayoutAccess().getRightCurlyBracketKeyword_8());
+		}
 	)
-)
-	{ 
-	  getUnorderedGroupHelper().leave(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1());
-	}
-
-)	otherlv_10=')' 
-    {
-    	newLeafNode(otherlv_10, grammarAccess.getUiGridLayoutAccess().getRightParenthesisKeyword_2_2());
-    }
-)?(
-(
-		lv_name_11_0=RULE_ID
-		{
-			newLeafNode(lv_name_11_0, grammarAccess.getUiGridLayoutAccess().getNameIDTerminalRuleCall_3_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiGridLayoutRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"name",
-        		lv_name_11_0, 
-        		"ID");
-	    }
-
-)
-)?	otherlv_12='{' 
-    {
-    	newLeafNode(otherlv_12, grammarAccess.getUiGridLayoutAccess().getLeftCurlyBracketKeyword_4());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiGridLayoutAccess().getContentsUiGridLayoutAssigmentParserRuleCall_5_0()); 
-	    }
-		lv_contents_13_0=ruleUiGridLayoutAssigment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiGridLayoutRule());
-	        }
-       		add(
-       			$current, 
-       			"contents",
-        		lv_contents_13_0, 
-        		"UiGridLayoutAssigment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiGridLayoutAccess().getBindingsUiBindingParserRuleCall_6_0()); 
-	    }
-		lv_bindings_14_0=ruleUiBinding		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiGridLayoutRule());
-	        }
-       		add(
-       			$current, 
-       			"bindings",
-        		lv_bindings_14_0, 
-        		"UiBinding");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiGridLayoutAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0()); 
-	    }
-		lv_processorAssignments_15_0=ruleUiVisibilityProcessorAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiGridLayoutRule());
-	        }
-       		add(
-       			$current, 
-       			"processorAssignments",
-        		lv_processorAssignments_15_0, 
-        		"UiVisibilityProcessorAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_16='}' 
-    {
-    	newLeafNode(otherlv_16, grammarAccess.getUiGridLayoutAccess().getRightCurlyBracketKeyword_8());
-    }
-)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiVisibilityProcessorAssignment
-entryRuleUiVisibilityProcessorAssignment returns [EObject current=null] 
-	:
+entryRuleUiVisibilityProcessorAssignment returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiVisibilityProcessorAssignmentRule()); }
-	 iv_ruleUiVisibilityProcessorAssignment=ruleUiVisibilityProcessorAssignment 
-	 { $current=$iv_ruleUiVisibilityProcessorAssignment.current; } 
-	 EOF 
-;
+	iv_ruleUiVisibilityProcessorAssignment=ruleUiVisibilityProcessorAssignment
+	{ $current=$iv_ruleUiVisibilityProcessorAssignment.current; }
+	EOF;
 
 // Rule UiVisibilityProcessorAssignment
-ruleUiVisibilityProcessorAssignment returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUiVisibilityProcessorAssignmentAccess().getUiVisibilityProcessorAssignmentAction_0(),
-            $current);
-    }
-)(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiVisibilityProcessorAssignmentAccess().getProcessorUiVisibilityProcessorParserRuleCall_1_0()); 
-	    }
-		lv_processor_1_0=ruleUiVisibilityProcessor		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiVisibilityProcessorAssignmentRule());
-	        }
-       		set(
-       			$current, 
-       			"processor",
-        		lv_processor_1_0, 
-        		"UiVisibilityProcessor");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
+ruleUiVisibilityProcessorAssignment returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiVisibilityProcessorAssignmentAccess().getUiVisibilityProcessorAssignmentAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiVisibilityProcessorAssignmentAccess().getProcessorUiVisibilityProcessorParserRuleCall_1_0());
+				}
+				lv_processor_1_0=ruleUiVisibilityProcessor
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiVisibilityProcessorAssignmentRule());
+					}
+					set(
+						$current,
+						"processor",
+						lv_processor_1_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessor");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiGridLayoutAssigment
-entryRuleUiGridLayoutAssigment returns [EObject current=null] 
-	:
+entryRuleUiGridLayoutAssigment returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiGridLayoutAssigmentRule()); }
-	 iv_ruleUiGridLayoutAssigment=ruleUiGridLayoutAssigment 
-	 { $current=$iv_ruleUiGridLayoutAssigment.current; } 
-	 EOF 
-;
+	iv_ruleUiGridLayoutAssigment=ruleUiGridLayoutAssigment
+	{ $current=$iv_ruleUiGridLayoutAssigment.current; }
+	EOF;
 
 // Rule UiGridLayoutAssigment
-ruleUiGridLayoutAssigment returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiGridLayoutAssigmentAccess().getElementUiEmbeddableParserRuleCall_0_0()); 
-	    }
-		lv_element_0_0=ruleUiEmbeddable		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiGridLayoutAssigmentRule());
-	        }
-       		set(
-       			$current, 
-       			"element",
-        		lv_element_0_0, 
-        		"UiEmbeddable");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_1='align' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiGridLayoutAssigmentAccess().getAlignKeyword_1_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiGridLayoutAssigmentAccess().getAlignmentUiAlignmentEnumRuleCall_1_1_0()); 
-	    }
-		lv_alignment_2_0=ruleUiAlignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiGridLayoutAssigmentRule());
-	        }
-       		set(
-       			$current, 
-       			"alignment",
-        		lv_alignment_2_0, 
-        		"UiAlignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))?)
+ruleUiGridLayoutAssigment returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiGridLayoutAssigmentAccess().getElementUiEmbeddableParserRuleCall_0_0());
+				}
+				lv_element_0_0=ruleUiEmbeddable
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiGridLayoutAssigmentRule());
+					}
+					set(
+						$current,
+						"element",
+						lv_element_0_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiEmbeddable");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_1='align'
+			{
+				newLeafNode(otherlv_1, grammarAccess.getUiGridLayoutAssigmentAccess().getAlignKeyword_1_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiGridLayoutAssigmentAccess().getAlignmentUiAlignmentEnumRuleCall_1_1_0());
+					}
+					lv_alignment_2_0=ruleUiAlignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiGridLayoutAssigmentRule());
+						}
+						set(
+							$current,
+							"alignment",
+							lv_alignment_2_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiAlignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)?
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiFormLayout
-entryRuleUiFormLayout returns [EObject current=null] 
-	:
+entryRuleUiFormLayout returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiFormLayoutRule()); }
-	 iv_ruleUiFormLayout=ruleUiFormLayout 
-	 { $current=$iv_ruleUiFormLayout.current; } 
-	 EOF 
-;
+	iv_ruleUiFormLayout=ruleUiFormLayout
+	{ $current=$iv_ruleUiFormLayout.current; }
+	EOF;
 
 // Rule UiFormLayout
-ruleUiFormLayout returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUiFormLayoutAccess().getUiFormLayoutAction_0(),
-            $current);
-    }
-)	otherlv_1='form' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiFormLayoutAccess().getFormKeyword_1());
-    }
-(
-
-(
-	{ 
-	  getUnorderedGroupHelper().enter(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2());
-	}
+ruleUiFormLayout returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
 	(
 		(
-
-			( 
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiFormLayoutAccess().getUiFormLayoutAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='form'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getUiFormLayoutAccess().getFormKeyword_1());
+		}
+		(
+			(
+				{ 
+				  getUnorderedGroupHelper().enter(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2());
+				}
+				(
+					(
+			(
 				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2(), 0)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2(), 0);
+					}
+								({true}?=>(otherlv_3='('
+								{
+									newLeafNode(otherlv_3, grammarAccess.getUiFormLayoutAccess().getLeftParenthesisKeyword_2_0_0());
+								}
+								(
+									(
+										{
+											newCompositeNode(grammarAccess.getUiFormLayoutAccess().getI18nInfoUiI18nInfoParserRuleCall_2_0_1_0());
+										}
+										lv_i18nInfo_4_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiFormLayoutRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_4_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+								)?
+								))
 					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2(), 0);
-	 				}
-					({true}?=>(	otherlv_3='(' 
-    {
-    	newLeafNode(otherlv_3, grammarAccess.getUiFormLayoutAccess().getLeftParenthesisKeyword_2_0_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiFormLayoutAccess().getI18nInfoUiI18nInfoParserRuleCall_2_0_1_0()); 
-	    }
-		lv_i18nInfo_4_0=ruleUiI18nInfo		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiFormLayoutRule());
-	        }
-       		set(
-       			$current, 
-       			"i18nInfo",
-        		lv_i18nInfo_4_0, 
-        		"UiI18nInfo");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)?))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2());
-	 				}
- 				)
-			)  |
-
-			( 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2());
+					}
+				)
+			)|
+			(
 				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2(), 1)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2(), 1);
+					}
+								({true}?=>(otherlv_5='styles'
+								{
+									newLeafNode(otherlv_5, grammarAccess.getUiFormLayoutAccess().getStylesKeyword_2_1_0());
+								}
+								(
+									(
+										lv_styles_6_0=RULE_STRING
+										{
+											newLeafNode(lv_styles_6_0, grammarAccess.getUiFormLayoutAccess().getStylesSTRINGTerminalRuleCall_2_1_1_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiFormLayoutRule());
+											}
+											setWithLastConsumed(
+												$current,
+												"styles",
+												lv_styles_6_0,
+												"org.eclipse.xtext.xbase.Xtype.STRING");
+										}
+									)
+								)
+								))
 					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2(), 1);
-	 				}
-					({true}?=>(	otherlv_5='styles' 
-    {
-    	newLeafNode(otherlv_5, grammarAccess.getUiFormLayoutAccess().getStylesKeyword_2_1_0());
-    }
-(
-(
-		lv_styles_6_0=RULE_STRING
-		{
-			newLeafNode(lv_styles_6_0, grammarAccess.getUiFormLayoutAccess().getStylesSTRINGTerminalRuleCall_2_1_1_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiFormLayoutRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"styles",
-        		lv_styles_6_0, 
-        		"STRING");
-	    }
-
-)
-)))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2());
-	 				}
- 				)
-			)  |
-
-			( 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2());
+					}
+				)
+			)|
+			(
 				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2(), 2)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2(), 2);
+					}
+								({true}?=>((
+									(
+										lv_readonly_7_0='readonly'
+										{
+											newLeafNode(lv_readonly_7_0, grammarAccess.getUiFormLayoutAccess().getReadonlyReadonlyKeyword_2_2_0_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiFormLayoutRule());
+											}
+											setWithLastConsumed($current, "readonly", true, "readonly");
+										}
+									)
+								)?
+								otherlv_8=')'
+								{
+									newLeafNode(otherlv_8, grammarAccess.getUiFormLayoutAccess().getRightParenthesisKeyword_2_2_1());
+								}
+								))
 					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2(), 2);
-	 				}
-					({true}?=>((
-(
-		lv_readonly_7_0=	'readonly' 
-    {
-        newLeafNode(lv_readonly_7_0, grammarAccess.getUiFormLayoutAccess().getReadonlyReadonlyKeyword_2_2_0_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiFormLayoutRule());
-	        }
-       		setWithLastConsumed($current, "readonly", true, "readonly");
-	    }
-
-)
-)?	otherlv_8=')' 
-    {
-    	newLeafNode(otherlv_8, grammarAccess.getUiFormLayoutAccess().getRightParenthesisKeyword_2_2_1());
-    }
-))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2());
-	 				}
- 				)
-			)  
-
-		)+
-	  	{getUnorderedGroupHelper().canLeave(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2())}?	
-	)
-)
-	{ 
-	  getUnorderedGroupHelper().leave(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2());
-	}
-
-)?(
-(
-		lv_name_9_0=RULE_ID
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2());
+					}
+				)
+			)
+					)+
+					{getUnorderedGroupHelper().canLeave(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2())}?
+				)
+			)
+				{ 
+				  getUnorderedGroupHelper().leave(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2());
+				}
+		)?
+		(
+			(
+				lv_name_9_0=RULE_ID
+				{
+					newLeafNode(lv_name_9_0, grammarAccess.getUiFormLayoutAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiFormLayoutRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_9_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		otherlv_10='{'
 		{
-			newLeafNode(lv_name_9_0, grammarAccess.getUiFormLayoutAccess().getNameIDTerminalRuleCall_3_0()); 
+			newLeafNode(otherlv_10, grammarAccess.getUiFormLayoutAccess().getLeftCurlyBracketKeyword_4());
 		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiFormLayoutAccess().getContentsUiFormLayoutAssigmentParserRuleCall_5_0());
+				}
+				lv_contents_11_0=ruleUiFormLayoutAssigment
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiFormLayoutRule());
+					}
+					add(
+						$current,
+						"contents",
+						lv_contents_11_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiFormLayoutAssigment");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiFormLayoutAccess().getBindingsUiBindingParserRuleCall_6_0());
+				}
+				lv_bindings_12_0=ruleUiBinding
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiFormLayoutRule());
+					}
+					add(
+						$current,
+						"bindings",
+						lv_bindings_12_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiFormLayoutAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0());
+				}
+				lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiFormLayoutRule());
+					}
+					add(
+						$current,
+						"processorAssignments",
+						lv_processorAssignments_13_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		otherlv_14='}'
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiFormLayoutRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"name",
-        		lv_name_9_0, 
-        		"ID");
-	    }
-
-)
-)?	otherlv_10='{' 
-    {
-    	newLeafNode(otherlv_10, grammarAccess.getUiFormLayoutAccess().getLeftCurlyBracketKeyword_4());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiFormLayoutAccess().getContentsUiFormLayoutAssigmentParserRuleCall_5_0()); 
-	    }
-		lv_contents_11_0=ruleUiFormLayoutAssigment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiFormLayoutRule());
-	        }
-       		add(
-       			$current, 
-       			"contents",
-        		lv_contents_11_0, 
-        		"UiFormLayoutAssigment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiFormLayoutAccess().getBindingsUiBindingParserRuleCall_6_0()); 
-	    }
-		lv_bindings_12_0=ruleUiBinding		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiFormLayoutRule());
-	        }
-       		add(
-       			$current, 
-       			"bindings",
-        		lv_bindings_12_0, 
-        		"UiBinding");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiFormLayoutAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0()); 
-	    }
-		lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiFormLayoutRule());
-	        }
-       		add(
-       			$current, 
-       			"processorAssignments",
-        		lv_processorAssignments_13_0, 
-        		"UiVisibilityProcessorAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_14='}' 
-    {
-    	newLeafNode(otherlv_14, grammarAccess.getUiFormLayoutAccess().getRightCurlyBracketKeyword_8());
-    }
-)
+			newLeafNode(otherlv_14, grammarAccess.getUiFormLayoutAccess().getRightCurlyBracketKeyword_8());
+		}
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiFormLayoutAssigment
-entryRuleUiFormLayoutAssigment returns [EObject current=null] 
-	:
+entryRuleUiFormLayoutAssigment returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiFormLayoutAssigmentRule()); }
-	 iv_ruleUiFormLayoutAssigment=ruleUiFormLayoutAssigment 
-	 { $current=$iv_ruleUiFormLayoutAssigment.current; } 
-	 EOF 
-;
+	iv_ruleUiFormLayoutAssigment=ruleUiFormLayoutAssigment
+	{ $current=$iv_ruleUiFormLayoutAssigment.current; }
+	EOF;
 
 // Rule UiFormLayoutAssigment
-ruleUiFormLayoutAssigment returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiFormLayoutAssigmentAccess().getElementUiEmbeddableParserRuleCall_0()); 
-	    }
-		lv_element_0_0=ruleUiEmbeddable		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiFormLayoutAssigmentRule());
-	        }
-       		set(
-       			$current, 
-       			"element",
-        		lv_element_0_0, 
-        		"UiEmbeddable");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
+ruleUiFormLayoutAssigment returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				newCompositeNode(grammarAccess.getUiFormLayoutAssigmentAccess().getElementUiEmbeddableParserRuleCall_0());
+			}
+			lv_element_0_0=ruleUiEmbeddable
+			{
+				if ($current==null) {
+					$current = createModelElementForParent(grammarAccess.getUiFormLayoutAssigmentRule());
+				}
+				set(
+					$current,
+					"element",
+					lv_element_0_0,
+					"org.eclipse.osbp.ecview.dsl.UIGrammar.UiEmbeddable");
+				afterParserOrEnumRuleCall();
+			}
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiVerticalLayout
-entryRuleUiVerticalLayout returns [EObject current=null] 
-	:
+entryRuleUiVerticalLayout returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiVerticalLayoutRule()); }
-	 iv_ruleUiVerticalLayout=ruleUiVerticalLayout 
-	 { $current=$iv_ruleUiVerticalLayout.current; } 
-	 EOF 
-;
+	iv_ruleUiVerticalLayout=ruleUiVerticalLayout
+	{ $current=$iv_ruleUiVerticalLayout.current; }
+	EOF;
 
 // Rule UiVerticalLayout
-ruleUiVerticalLayout returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUiVerticalLayoutAccess().getUiVerticalLayoutAction_0(),
-            $current);
-    }
-)	otherlv_1='verticalLayout' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiVerticalLayoutAccess().getVerticalLayoutKeyword_1());
-    }
-(
-
-(
-	{ 
-	  getUnorderedGroupHelper().enter(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2());
-	}
+ruleUiVerticalLayout returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
 	(
 		(
-
-			( 
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiVerticalLayoutAccess().getUiVerticalLayoutAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='verticalLayout'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getUiVerticalLayoutAccess().getVerticalLayoutKeyword_1());
+		}
+		(
+			(
+				{ 
+				  getUnorderedGroupHelper().enter(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2());
+				}
+				(
+					(
+			(
 				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2(), 0)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2(), 0);
+					}
+								({true}?=>(otherlv_3='('
+								{
+									newLeafNode(otherlv_3, grammarAccess.getUiVerticalLayoutAccess().getLeftParenthesisKeyword_2_0_0());
+								}
+								(
+									(
+										{
+											newCompositeNode(grammarAccess.getUiVerticalLayoutAccess().getI18nInfoUiI18nInfoParserRuleCall_2_0_1_0());
+										}
+										lv_i18nInfo_4_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiVerticalLayoutRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_4_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+								)?
+								))
 					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2(), 0);
-	 				}
-					({true}?=>(	otherlv_3='(' 
-    {
-    	newLeafNode(otherlv_3, grammarAccess.getUiVerticalLayoutAccess().getLeftParenthesisKeyword_2_0_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiVerticalLayoutAccess().getI18nInfoUiI18nInfoParserRuleCall_2_0_1_0()); 
-	    }
-		lv_i18nInfo_4_0=ruleUiI18nInfo		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiVerticalLayoutRule());
-	        }
-       		set(
-       			$current, 
-       			"i18nInfo",
-        		lv_i18nInfo_4_0, 
-        		"UiI18nInfo");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)?))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2());
-	 				}
- 				)
-			)  |
-
-			( 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2());
+					}
+				)
+			)|
+			(
 				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2(), 1)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2(), 1);
+					}
+								({true}?=>(otherlv_5='styles'
+								{
+									newLeafNode(otherlv_5, grammarAccess.getUiVerticalLayoutAccess().getStylesKeyword_2_1_0());
+								}
+								(
+									(
+										lv_styles_6_0=RULE_STRING
+										{
+											newLeafNode(lv_styles_6_0, grammarAccess.getUiVerticalLayoutAccess().getStylesSTRINGTerminalRuleCall_2_1_1_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiVerticalLayoutRule());
+											}
+											setWithLastConsumed(
+												$current,
+												"styles",
+												lv_styles_6_0,
+												"org.eclipse.xtext.xbase.Xtype.STRING");
+										}
+									)
+								)
+								))
 					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2(), 1);
-	 				}
-					({true}?=>(	otherlv_5='styles' 
-    {
-    	newLeafNode(otherlv_5, grammarAccess.getUiVerticalLayoutAccess().getStylesKeyword_2_1_0());
-    }
-(
-(
-		lv_styles_6_0=RULE_STRING
-		{
-			newLeafNode(lv_styles_6_0, grammarAccess.getUiVerticalLayoutAccess().getStylesSTRINGTerminalRuleCall_2_1_1_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiVerticalLayoutRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"styles",
-        		lv_styles_6_0, 
-        		"STRING");
-	    }
-
-)
-)))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2());
-	 				}
- 				)
-			)  |
-
-			( 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2());
+					}
+				)
+			)|
+			(
 				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2(), 2)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2(), 2);
+					}
+								({true}?=>((
+									(
+										lv_readonly_7_0='readonly'
+										{
+											newLeafNode(lv_readonly_7_0, grammarAccess.getUiVerticalLayoutAccess().getReadonlyReadonlyKeyword_2_2_0_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiVerticalLayoutRule());
+											}
+											setWithLastConsumed($current, "readonly", true, "readonly");
+										}
+									)
+								)?
+								otherlv_8=')'
+								{
+									newLeafNode(otherlv_8, grammarAccess.getUiVerticalLayoutAccess().getRightParenthesisKeyword_2_2_1());
+								}
+								))
 					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2(), 2);
-	 				}
-					({true}?=>((
-(
-		lv_readonly_7_0=	'readonly' 
-    {
-        newLeafNode(lv_readonly_7_0, grammarAccess.getUiVerticalLayoutAccess().getReadonlyReadonlyKeyword_2_2_0_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiVerticalLayoutRule());
-	        }
-       		setWithLastConsumed($current, "readonly", true, "readonly");
-	    }
-
-)
-)?	otherlv_8=')' 
-    {
-    	newLeafNode(otherlv_8, grammarAccess.getUiVerticalLayoutAccess().getRightParenthesisKeyword_2_2_1());
-    }
-))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2());
-	 				}
- 				)
-			)  
-
-		)+
-	  	{getUnorderedGroupHelper().canLeave(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2())}?	
-	)
-)
-	{ 
-	  getUnorderedGroupHelper().leave(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2());
-	}
-
-)?(
-(
-		lv_name_9_0=RULE_ID
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2());
+					}
+				)
+			)
+					)+
+					{getUnorderedGroupHelper().canLeave(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2())}?
+				)
+			)
+				{ 
+				  getUnorderedGroupHelper().leave(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2());
+				}
+		)?
+		(
+			(
+				lv_name_9_0=RULE_ID
+				{
+					newLeafNode(lv_name_9_0, grammarAccess.getUiVerticalLayoutAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiVerticalLayoutRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_9_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		otherlv_10='{'
 		{
-			newLeafNode(lv_name_9_0, grammarAccess.getUiVerticalLayoutAccess().getNameIDTerminalRuleCall_3_0()); 
+			newLeafNode(otherlv_10, grammarAccess.getUiVerticalLayoutAccess().getLeftCurlyBracketKeyword_4());
 		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiVerticalLayoutAccess().getContentsUiVerticalLayoutAssigmentParserRuleCall_5_0());
+				}
+				lv_contents_11_0=ruleUiVerticalLayoutAssigment
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiVerticalLayoutRule());
+					}
+					add(
+						$current,
+						"contents",
+						lv_contents_11_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVerticalLayoutAssigment");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiVerticalLayoutAccess().getBindingsUiBindingParserRuleCall_6_0());
+				}
+				lv_bindings_12_0=ruleUiBinding
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiVerticalLayoutRule());
+					}
+					add(
+						$current,
+						"bindings",
+						lv_bindings_12_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiVerticalLayoutAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0());
+				}
+				lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiVerticalLayoutRule());
+					}
+					add(
+						$current,
+						"processorAssignments",
+						lv_processorAssignments_13_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		otherlv_14='}'
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiVerticalLayoutRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"name",
-        		lv_name_9_0, 
-        		"ID");
-	    }
-
-)
-)?	otherlv_10='{' 
-    {
-    	newLeafNode(otherlv_10, grammarAccess.getUiVerticalLayoutAccess().getLeftCurlyBracketKeyword_4());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiVerticalLayoutAccess().getContentsUiVerticalLayoutAssigmentParserRuleCall_5_0()); 
-	    }
-		lv_contents_11_0=ruleUiVerticalLayoutAssigment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiVerticalLayoutRule());
-	        }
-       		add(
-       			$current, 
-       			"contents",
-        		lv_contents_11_0, 
-        		"UiVerticalLayoutAssigment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiVerticalLayoutAccess().getBindingsUiBindingParserRuleCall_6_0()); 
-	    }
-		lv_bindings_12_0=ruleUiBinding		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiVerticalLayoutRule());
-	        }
-       		add(
-       			$current, 
-       			"bindings",
-        		lv_bindings_12_0, 
-        		"UiBinding");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiVerticalLayoutAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0()); 
-	    }
-		lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiVerticalLayoutRule());
-	        }
-       		add(
-       			$current, 
-       			"processorAssignments",
-        		lv_processorAssignments_13_0, 
-        		"UiVisibilityProcessorAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_14='}' 
-    {
-    	newLeafNode(otherlv_14, grammarAccess.getUiVerticalLayoutAccess().getRightCurlyBracketKeyword_8());
-    }
-)
+			newLeafNode(otherlv_14, grammarAccess.getUiVerticalLayoutAccess().getRightCurlyBracketKeyword_8());
+		}
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiVerticalLayoutAssigment
-entryRuleUiVerticalLayoutAssigment returns [EObject current=null] 
-	:
+entryRuleUiVerticalLayoutAssigment returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiVerticalLayoutAssigmentRule()); }
-	 iv_ruleUiVerticalLayoutAssigment=ruleUiVerticalLayoutAssigment 
-	 { $current=$iv_ruleUiVerticalLayoutAssigment.current; } 
-	 EOF 
-;
+	iv_ruleUiVerticalLayoutAssigment=ruleUiVerticalLayoutAssigment
+	{ $current=$iv_ruleUiVerticalLayoutAssigment.current; }
+	EOF;
 
 // Rule UiVerticalLayoutAssigment
-ruleUiVerticalLayoutAssigment returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiVerticalLayoutAssigmentAccess().getElementUiEmbeddableParserRuleCall_0_0()); 
-	    }
-		lv_element_0_0=ruleUiEmbeddable		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiVerticalLayoutAssigmentRule());
-	        }
-       		set(
-       			$current, 
-       			"element",
-        		lv_element_0_0, 
-        		"UiEmbeddable");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_1='align' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiVerticalLayoutAssigmentAccess().getAlignKeyword_1_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiVerticalLayoutAssigmentAccess().getAlignmentUiAlignmentEnumRuleCall_1_1_0()); 
-	    }
-		lv_alignment_2_0=ruleUiAlignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiVerticalLayoutAssigmentRule());
-	        }
-       		set(
-       			$current, 
-       			"alignment",
-        		lv_alignment_2_0, 
-        		"UiAlignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))?)
+ruleUiVerticalLayoutAssigment returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiVerticalLayoutAssigmentAccess().getElementUiEmbeddableParserRuleCall_0_0());
+				}
+				lv_element_0_0=ruleUiEmbeddable
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiVerticalLayoutAssigmentRule());
+					}
+					set(
+						$current,
+						"element",
+						lv_element_0_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiEmbeddable");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_1='align'
+			{
+				newLeafNode(otherlv_1, grammarAccess.getUiVerticalLayoutAssigmentAccess().getAlignKeyword_1_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiVerticalLayoutAssigmentAccess().getAlignmentUiAlignmentEnumRuleCall_1_1_0());
+					}
+					lv_alignment_2_0=ruleUiAlignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiVerticalLayoutAssigmentRule());
+						}
+						set(
+							$current,
+							"alignment",
+							lv_alignment_2_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiAlignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)?
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiMobileVerticalLayout
-entryRuleUiMobileVerticalLayout returns [EObject current=null] 
-	:
+entryRuleUiMobileVerticalLayout returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiMobileVerticalLayoutRule()); }
-	 iv_ruleUiMobileVerticalLayout=ruleUiMobileVerticalLayout 
-	 { $current=$iv_ruleUiMobileVerticalLayout.current; } 
-	 EOF 
-;
+	iv_ruleUiMobileVerticalLayout=ruleUiMobileVerticalLayout
+	{ $current=$iv_ruleUiMobileVerticalLayout.current; }
+	EOF;
 
 // Rule UiMobileVerticalLayout
-ruleUiMobileVerticalLayout returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUiMobileVerticalLayoutAccess().getUiVerticalLayoutAction_0(),
-            $current);
-    }
-)	otherlv_1='mobileVerticalLayout' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiMobileVerticalLayoutAccess().getMobileVerticalLayoutKeyword_1());
-    }
-(
-
-(
-	{ 
-	  getUnorderedGroupHelper().enter(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2());
-	}
+ruleUiMobileVerticalLayout returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
 	(
 		(
-
-			( 
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiMobileVerticalLayoutAccess().getUiVerticalLayoutAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='mobileVerticalLayout'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getUiMobileVerticalLayoutAccess().getMobileVerticalLayoutKeyword_1());
+		}
+		(
+			(
+				{ 
+				  getUnorderedGroupHelper().enter(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2());
+				}
+				(
+					(
+			(
 				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2(), 0)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2(), 0);
+					}
+								({true}?=>(otherlv_3='('
+								{
+									newLeafNode(otherlv_3, grammarAccess.getUiMobileVerticalLayoutAccess().getLeftParenthesisKeyword_2_0_0());
+								}
+								(
+									(
+										{
+											newCompositeNode(grammarAccess.getUiMobileVerticalLayoutAccess().getI18nInfoUiI18nInfoParserRuleCall_2_0_1_0());
+										}
+										lv_i18nInfo_4_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiMobileVerticalLayoutRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_4_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+								)?
+								))
 					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2(), 0);
-	 				}
-					({true}?=>(	otherlv_3='(' 
-    {
-    	newLeafNode(otherlv_3, grammarAccess.getUiMobileVerticalLayoutAccess().getLeftParenthesisKeyword_2_0_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileVerticalLayoutAccess().getI18nInfoUiI18nInfoParserRuleCall_2_0_1_0()); 
-	    }
-		lv_i18nInfo_4_0=ruleUiI18nInfo		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileVerticalLayoutRule());
-	        }
-       		set(
-       			$current, 
-       			"i18nInfo",
-        		lv_i18nInfo_4_0, 
-        		"UiI18nInfo");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)?))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2());
-	 				}
- 				)
-			)  |
-
-			( 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2());
+					}
+				)
+			)|
+			(
 				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2(), 1)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2(), 1);
+					}
+								({true}?=>(otherlv_5='styles'
+								{
+									newLeafNode(otherlv_5, grammarAccess.getUiMobileVerticalLayoutAccess().getStylesKeyword_2_1_0());
+								}
+								(
+									(
+										lv_styles_6_0=RULE_STRING
+										{
+											newLeafNode(lv_styles_6_0, grammarAccess.getUiMobileVerticalLayoutAccess().getStylesSTRINGTerminalRuleCall_2_1_1_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiMobileVerticalLayoutRule());
+											}
+											setWithLastConsumed(
+												$current,
+												"styles",
+												lv_styles_6_0,
+												"org.eclipse.xtext.xbase.Xtype.STRING");
+										}
+									)
+								)
+								))
 					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2(), 1);
-	 				}
-					({true}?=>(	otherlv_5='styles' 
-    {
-    	newLeafNode(otherlv_5, grammarAccess.getUiMobileVerticalLayoutAccess().getStylesKeyword_2_1_0());
-    }
-(
-(
-		lv_styles_6_0=RULE_STRING
-		{
-			newLeafNode(lv_styles_6_0, grammarAccess.getUiMobileVerticalLayoutAccess().getStylesSTRINGTerminalRuleCall_2_1_1_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiMobileVerticalLayoutRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"styles",
-        		lv_styles_6_0, 
-        		"STRING");
-	    }
-
-)
-)))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2());
-	 				}
- 				)
-			)  |
-
-			( 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2());
+					}
+				)
+			)|
+			(
 				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2(), 2)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2(), 2);
+					}
+								({true}?=>((
+									(
+										lv_readonly_7_0='readonly'
+										{
+											newLeafNode(lv_readonly_7_0, grammarAccess.getUiMobileVerticalLayoutAccess().getReadonlyReadonlyKeyword_2_2_0_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiMobileVerticalLayoutRule());
+											}
+											setWithLastConsumed($current, "readonly", true, "readonly");
+										}
+									)
+								)?
+								otherlv_8=')'
+								{
+									newLeafNode(otherlv_8, grammarAccess.getUiMobileVerticalLayoutAccess().getRightParenthesisKeyword_2_2_1());
+								}
+								))
 					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2(), 2);
-	 				}
-					({true}?=>((
-(
-		lv_readonly_7_0=	'readonly' 
-    {
-        newLeafNode(lv_readonly_7_0, grammarAccess.getUiMobileVerticalLayoutAccess().getReadonlyReadonlyKeyword_2_2_0_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiMobileVerticalLayoutRule());
-	        }
-       		setWithLastConsumed($current, "readonly", true, "readonly");
-	    }
-
-)
-)?	otherlv_8=')' 
-    {
-    	newLeafNode(otherlv_8, grammarAccess.getUiMobileVerticalLayoutAccess().getRightParenthesisKeyword_2_2_1());
-    }
-))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2());
-	 				}
- 				)
-			)  
-
-		)+
-	  	{getUnorderedGroupHelper().canLeave(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2())}?	
-	)
-)
-	{ 
-	  getUnorderedGroupHelper().leave(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2());
-	}
-
-)?(
-(
-		lv_name_9_0=RULE_ID
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2());
+					}
+				)
+			)
+					)+
+					{getUnorderedGroupHelper().canLeave(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2())}?
+				)
+			)
+				{ 
+				  getUnorderedGroupHelper().leave(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2());
+				}
+		)?
+		(
+			(
+				lv_name_9_0=RULE_ID
+				{
+					newLeafNode(lv_name_9_0, grammarAccess.getUiMobileVerticalLayoutAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiMobileVerticalLayoutRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_9_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		otherlv_10='{'
 		{
-			newLeafNode(lv_name_9_0, grammarAccess.getUiMobileVerticalLayoutAccess().getNameIDTerminalRuleCall_3_0()); 
+			newLeafNode(otherlv_10, grammarAccess.getUiMobileVerticalLayoutAccess().getLeftCurlyBracketKeyword_4());
 		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiMobileVerticalLayoutAccess().getContentsUiMobileVerticalLayoutAssigmentParserRuleCall_5_0());
+				}
+				lv_contents_11_0=ruleUiMobileVerticalLayoutAssigment
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiMobileVerticalLayoutRule());
+					}
+					add(
+						$current,
+						"contents",
+						lv_contents_11_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileVerticalLayoutAssigment");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiMobileVerticalLayoutAccess().getBindingsUiBindingParserRuleCall_6_0());
+				}
+				lv_bindings_12_0=ruleUiBinding
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiMobileVerticalLayoutRule());
+					}
+					add(
+						$current,
+						"bindings",
+						lv_bindings_12_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiMobileVerticalLayoutAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0());
+				}
+				lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiMobileVerticalLayoutRule());
+					}
+					add(
+						$current,
+						"processorAssignments",
+						lv_processorAssignments_13_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		otherlv_14='}'
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiMobileVerticalLayoutRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"name",
-        		lv_name_9_0, 
-        		"ID");
-	    }
-
-)
-)?	otherlv_10='{' 
-    {
-    	newLeafNode(otherlv_10, grammarAccess.getUiMobileVerticalLayoutAccess().getLeftCurlyBracketKeyword_4());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileVerticalLayoutAccess().getContentsUiMobileVerticalLayoutAssigmentParserRuleCall_5_0()); 
-	    }
-		lv_contents_11_0=ruleUiMobileVerticalLayoutAssigment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileVerticalLayoutRule());
-	        }
-       		add(
-       			$current, 
-       			"contents",
-        		lv_contents_11_0, 
-        		"UiMobileVerticalLayoutAssigment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileVerticalLayoutAccess().getBindingsUiBindingParserRuleCall_6_0()); 
-	    }
-		lv_bindings_12_0=ruleUiBinding		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileVerticalLayoutRule());
-	        }
-       		add(
-       			$current, 
-       			"bindings",
-        		lv_bindings_12_0, 
-        		"UiBinding");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileVerticalLayoutAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0()); 
-	    }
-		lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileVerticalLayoutRule());
-	        }
-       		add(
-       			$current, 
-       			"processorAssignments",
-        		lv_processorAssignments_13_0, 
-        		"UiVisibilityProcessorAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_14='}' 
-    {
-    	newLeafNode(otherlv_14, grammarAccess.getUiMobileVerticalLayoutAccess().getRightCurlyBracketKeyword_8());
-    }
-)
+			newLeafNode(otherlv_14, grammarAccess.getUiMobileVerticalLayoutAccess().getRightCurlyBracketKeyword_8());
+		}
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiMobileVerticalLayoutAssigment
-entryRuleUiMobileVerticalLayoutAssigment returns [EObject current=null] 
-	:
+entryRuleUiMobileVerticalLayoutAssigment returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiMobileVerticalLayoutAssigmentRule()); }
-	 iv_ruleUiMobileVerticalLayoutAssigment=ruleUiMobileVerticalLayoutAssigment 
-	 { $current=$iv_ruleUiMobileVerticalLayoutAssigment.current; } 
-	 EOF 
-;
+	iv_ruleUiMobileVerticalLayoutAssigment=ruleUiMobileVerticalLayoutAssigment
+	{ $current=$iv_ruleUiMobileVerticalLayoutAssigment.current; }
+	EOF;
 
 // Rule UiMobileVerticalLayoutAssigment
-ruleUiMobileVerticalLayoutAssigment returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileVerticalLayoutAssigmentAccess().getElementUiMobileEmbeddableParserRuleCall_0_0()); 
-	    }
-		lv_element_0_0=ruleUiMobileEmbeddable		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileVerticalLayoutAssigmentRule());
-	        }
-       		set(
-       			$current, 
-       			"element",
-        		lv_element_0_0, 
-        		"UiMobileEmbeddable");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_1='align' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiMobileVerticalLayoutAssigmentAccess().getAlignKeyword_1_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileVerticalLayoutAssigmentAccess().getAlignmentUiAlignmentEnumRuleCall_1_1_0()); 
-	    }
-		lv_alignment_2_0=ruleUiAlignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileVerticalLayoutAssigmentRule());
-	        }
-       		set(
-       			$current, 
-       			"alignment",
-        		lv_alignment_2_0, 
-        		"UiAlignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))?)
+ruleUiMobileVerticalLayoutAssigment returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiMobileVerticalLayoutAssigmentAccess().getElementUiMobileEmbeddableParserRuleCall_0_0());
+				}
+				lv_element_0_0=ruleUiMobileEmbeddable
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiMobileVerticalLayoutAssigmentRule());
+					}
+					set(
+						$current,
+						"element",
+						lv_element_0_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileEmbeddable");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_1='align'
+			{
+				newLeafNode(otherlv_1, grammarAccess.getUiMobileVerticalLayoutAssigmentAccess().getAlignKeyword_1_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiMobileVerticalLayoutAssigmentAccess().getAlignmentUiAlignmentEnumRuleCall_1_1_0());
+					}
+					lv_alignment_2_0=ruleUiAlignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiMobileVerticalLayoutAssigmentRule());
+						}
+						set(
+							$current,
+							"alignment",
+							lv_alignment_2_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiAlignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)?
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiMobileNavigationRoot
-entryRuleUiMobileNavigationRoot returns [EObject current=null] 
-	:
+entryRuleUiMobileNavigationRoot returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiMobileNavigationRootRule()); }
-	 iv_ruleUiMobileNavigationRoot=ruleUiMobileNavigationRoot 
-	 { $current=$iv_ruleUiMobileNavigationRoot.current; } 
-	 EOF 
-;
+	iv_ruleUiMobileNavigationRoot=ruleUiMobileNavigationRoot
+	{ $current=$iv_ruleUiMobileNavigationRoot.current; }
+	EOF;
 
 // Rule UiMobileNavigationRoot
-ruleUiMobileNavigationRoot returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUiMobileNavigationRootAccess().getUiMobileNavigationRootAction_0(),
-            $current);
-    }
-)	otherlv_1='navRoot' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiMobileNavigationRootAccess().getNavRootKeyword_1());
-    }
-(
-(
-		lv_name_2_0=RULE_ID
+ruleUiMobileNavigationRoot returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiMobileNavigationRootAccess().getUiMobileNavigationRootAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='navRoot'
 		{
-			newLeafNode(lv_name_2_0, grammarAccess.getUiMobileNavigationRootAccess().getNameIDTerminalRuleCall_2_0()); 
+			newLeafNode(otherlv_1, grammarAccess.getUiMobileNavigationRootAccess().getNavRootKeyword_1());
 		}
+		(
+			(
+				lv_name_2_0=RULE_ID
+				{
+					newLeafNode(lv_name_2_0, grammarAccess.getUiMobileNavigationRootAccess().getNameIDTerminalRuleCall_2_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiMobileNavigationRootRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_2_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		otherlv_3='{'
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiMobileNavigationRootRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"name",
-        		lv_name_2_0, 
-        		"ID");
-	    }
-
-)
-)?	otherlv_3='{' 
-    {
-    	newLeafNode(otherlv_3, grammarAccess.getUiMobileNavigationRootAccess().getLeftCurlyBracketKeyword_3());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileNavigationRootAccess().getContentsUiMobileNavigationRootAssigmentParserRuleCall_4_0()); 
-	    }
-		lv_contents_4_0=ruleUiMobileNavigationRootAssigment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileNavigationRootRule());
-	        }
-       		add(
-       			$current, 
-       			"contents",
-        		lv_contents_4_0, 
-        		"UiMobileNavigationRootAssigment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_5='}' 
-    {
-    	newLeafNode(otherlv_5, grammarAccess.getUiMobileNavigationRootAccess().getRightCurlyBracketKeyword_5());
-    }
-)
+			newLeafNode(otherlv_3, grammarAccess.getUiMobileNavigationRootAccess().getLeftCurlyBracketKeyword_3());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiMobileNavigationRootAccess().getContentsUiMobileNavigationRootAssigmentParserRuleCall_4_0());
+				}
+				lv_contents_4_0=ruleUiMobileNavigationRootAssigment
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiMobileNavigationRootRule());
+					}
+					add(
+						$current,
+						"contents",
+						lv_contents_4_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileNavigationRootAssigment");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_5='}'
+		{
+			newLeafNode(otherlv_5, grammarAccess.getUiMobileNavigationRootAccess().getRightCurlyBracketKeyword_5());
+		}
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiMobileNavigationRootAssigment
-entryRuleUiMobileNavigationRootAssigment returns [EObject current=null] 
-	:
+entryRuleUiMobileNavigationRootAssigment returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiMobileNavigationRootAssigmentRule()); }
-	 iv_ruleUiMobileNavigationRootAssigment=ruleUiMobileNavigationRootAssigment 
-	 { $current=$iv_ruleUiMobileNavigationRootAssigment.current; } 
-	 EOF 
-;
+	iv_ruleUiMobileNavigationRootAssigment=ruleUiMobileNavigationRootAssigment
+	{ $current=$iv_ruleUiMobileNavigationRootAssigment.current; }
+	EOF;
 
 // Rule UiMobileNavigationRootAssigment
-ruleUiMobileNavigationRootAssigment returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileNavigationRootAssigmentAccess().getElementUiMobileNavigationPageParserRuleCall_0()); 
-	    }
-		lv_element_0_0=ruleUiMobileNavigationPage		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileNavigationRootAssigmentRule());
-	        }
-       		set(
-       			$current, 
-       			"element",
-        		lv_element_0_0, 
-        		"UiMobileNavigationPage");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
+ruleUiMobileNavigationRootAssigment returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				newCompositeNode(grammarAccess.getUiMobileNavigationRootAssigmentAccess().getElementUiMobileNavigationPageParserRuleCall_0());
+			}
+			lv_element_0_0=ruleUiMobileNavigationPage
+			{
+				if ($current==null) {
+					$current = createModelElementForParent(grammarAccess.getUiMobileNavigationRootAssigmentRule());
+				}
+				set(
+					$current,
+					"element",
+					lv_element_0_0,
+					"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileNavigationPage");
+				afterParserOrEnumRuleCall();
+			}
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiHorizontalLayout
-entryRuleUiHorizontalLayout returns [EObject current=null] 
-	:
+entryRuleUiHorizontalLayout returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiHorizontalLayoutRule()); }
-	 iv_ruleUiHorizontalLayout=ruleUiHorizontalLayout 
-	 { $current=$iv_ruleUiHorizontalLayout.current; } 
-	 EOF 
-;
+	iv_ruleUiHorizontalLayout=ruleUiHorizontalLayout
+	{ $current=$iv_ruleUiHorizontalLayout.current; }
+	EOF;
 
 // Rule UiHorizontalLayout
-ruleUiHorizontalLayout returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUiHorizontalLayoutAccess().getUiHorizontalLayoutAction_0(),
-            $current);
-    }
-)	otherlv_1='horizontalLayout' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiHorizontalLayoutAccess().getHorizontalLayoutKeyword_1());
-    }
-(
-
-(
-	{ 
-	  getUnorderedGroupHelper().enter(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2());
-	}
+ruleUiHorizontalLayout returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
 	(
 		(
-
-			( 
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiHorizontalLayoutAccess().getUiHorizontalLayoutAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='horizontalLayout'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getUiHorizontalLayoutAccess().getHorizontalLayoutKeyword_1());
+		}
+		(
+			(
+				{ 
+				  getUnorderedGroupHelper().enter(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2());
+				}
+				(
+					(
+			(
 				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2(), 0)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2(), 0);
+					}
+								({true}?=>(otherlv_3='('
+								{
+									newLeafNode(otherlv_3, grammarAccess.getUiHorizontalLayoutAccess().getLeftParenthesisKeyword_2_0_0());
+								}
+								(
+									(
+										{
+											newCompositeNode(grammarAccess.getUiHorizontalLayoutAccess().getI18nInfoUiI18nInfoParserRuleCall_2_0_1_0());
+										}
+										lv_i18nInfo_4_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiHorizontalLayoutRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_4_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+								)?
+								))
 					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2(), 0);
-	 				}
-					({true}?=>(	otherlv_3='(' 
-    {
-    	newLeafNode(otherlv_3, grammarAccess.getUiHorizontalLayoutAccess().getLeftParenthesisKeyword_2_0_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiHorizontalLayoutAccess().getI18nInfoUiI18nInfoParserRuleCall_2_0_1_0()); 
-	    }
-		lv_i18nInfo_4_0=ruleUiI18nInfo		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiHorizontalLayoutRule());
-	        }
-       		set(
-       			$current, 
-       			"i18nInfo",
-        		lv_i18nInfo_4_0, 
-        		"UiI18nInfo");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)?))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2());
-	 				}
- 				)
-			)  |
-
-			( 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2());
+					}
+				)
+			)|
+			(
 				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2(), 1)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2(), 1);
+					}
+								({true}?=>((
+									lv_readonly_5_0='readonly'
+									{
+										newLeafNode(lv_readonly_5_0, grammarAccess.getUiHorizontalLayoutAccess().getReadonlyReadonlyKeyword_2_1_0());
+									}
+									{
+										if ($current==null) {
+											$current = createModelElement(grammarAccess.getUiHorizontalLayoutRule());
+										}
+										setWithLastConsumed($current, "readonly", true, "readonly");
+									}
+								)
+								))
 					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2(), 1);
-	 				}
-					({true}?=>(
-(
-		lv_readonly_5_0=	'readonly' 
-    {
-        newLeafNode(lv_readonly_5_0, grammarAccess.getUiHorizontalLayoutAccess().getReadonlyReadonlyKeyword_2_1_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiHorizontalLayoutRule());
-	        }
-       		setWithLastConsumed($current, "readonly", true, "readonly");
-	    }
-
-)
-))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2());
-	 				}
- 				)
-			)  |
-
-			( 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2());
+					}
+				)
+			)|
+			(
 				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2(), 2)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2(), 2);
+					}
+								({true}?=>((
+									otherlv_6='styles'
+									{
+										newLeafNode(otherlv_6, grammarAccess.getUiHorizontalLayoutAccess().getStylesKeyword_2_2_0_0());
+									}
+									(
+										(
+											lv_styles_7_0=RULE_STRING
+											{
+												newLeafNode(lv_styles_7_0, grammarAccess.getUiHorizontalLayoutAccess().getStylesSTRINGTerminalRuleCall_2_2_0_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiHorizontalLayoutRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"styles",
+													lv_styles_7_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+								)?
+								otherlv_8=')'
+								{
+									newLeafNode(otherlv_8, grammarAccess.getUiHorizontalLayoutAccess().getRightParenthesisKeyword_2_2_1());
+								}
+								))
 					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2(), 2);
-	 				}
-					({true}?=>((	otherlv_6='styles' 
-    {
-    	newLeafNode(otherlv_6, grammarAccess.getUiHorizontalLayoutAccess().getStylesKeyword_2_2_0_0());
-    }
-(
-(
-		lv_styles_7_0=RULE_STRING
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2());
+					}
+				)
+			)
+					)+
+					{getUnorderedGroupHelper().canLeave(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2())}?
+				)
+			)
+				{ 
+				  getUnorderedGroupHelper().leave(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2());
+				}
+		)?
+		(
+			(
+				lv_name_9_0=RULE_ID
+				{
+					newLeafNode(lv_name_9_0, grammarAccess.getUiHorizontalLayoutAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiHorizontalLayoutRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_9_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		otherlv_10='{'
 		{
-			newLeafNode(lv_styles_7_0, grammarAccess.getUiHorizontalLayoutAccess().getStylesSTRINGTerminalRuleCall_2_2_0_1_0()); 
+			newLeafNode(otherlv_10, grammarAccess.getUiHorizontalLayoutAccess().getLeftCurlyBracketKeyword_4());
 		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiHorizontalLayoutAccess().getContentsUiHorizontalLayoutAssigmentParserRuleCall_5_0());
+				}
+				lv_contents_11_0=ruleUiHorizontalLayoutAssigment
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiHorizontalLayoutRule());
+					}
+					add(
+						$current,
+						"contents",
+						lv_contents_11_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiHorizontalLayoutAssigment");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiHorizontalLayoutAccess().getBindingsUiBindingParserRuleCall_6_0());
+				}
+				lv_bindings_12_0=ruleUiBinding
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiHorizontalLayoutRule());
+					}
+					add(
+						$current,
+						"bindings",
+						lv_bindings_12_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiHorizontalLayoutAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0());
+				}
+				lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiHorizontalLayoutRule());
+					}
+					add(
+						$current,
+						"processorAssignments",
+						lv_processorAssignments_13_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		otherlv_14='}'
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiHorizontalLayoutRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"styles",
-        		lv_styles_7_0, 
-        		"STRING");
-	    }
-
-)
-))?	otherlv_8=')' 
-    {
-    	newLeafNode(otherlv_8, grammarAccess.getUiHorizontalLayoutAccess().getRightParenthesisKeyword_2_2_1());
-    }
-))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2());
-	 				}
- 				)
-			)  
-
-		)+
-	  	{getUnorderedGroupHelper().canLeave(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2())}?	
+			newLeafNode(otherlv_14, grammarAccess.getUiHorizontalLayoutAccess().getRightCurlyBracketKeyword_8());
+		}
 	)
-)
-	{ 
-	  getUnorderedGroupHelper().leave(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2());
-	}
-
-)?(
-(
-		lv_name_9_0=RULE_ID
-		{
-			newLeafNode(lv_name_9_0, grammarAccess.getUiHorizontalLayoutAccess().getNameIDTerminalRuleCall_3_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiHorizontalLayoutRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"name",
-        		lv_name_9_0, 
-        		"ID");
-	    }
-
-)
-)?	otherlv_10='{' 
-    {
-    	newLeafNode(otherlv_10, grammarAccess.getUiHorizontalLayoutAccess().getLeftCurlyBracketKeyword_4());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiHorizontalLayoutAccess().getContentsUiHorizontalLayoutAssigmentParserRuleCall_5_0()); 
-	    }
-		lv_contents_11_0=ruleUiHorizontalLayoutAssigment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiHorizontalLayoutRule());
-	        }
-       		add(
-       			$current, 
-       			"contents",
-        		lv_contents_11_0, 
-        		"UiHorizontalLayoutAssigment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiHorizontalLayoutAccess().getBindingsUiBindingParserRuleCall_6_0()); 
-	    }
-		lv_bindings_12_0=ruleUiBinding		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiHorizontalLayoutRule());
-	        }
-       		add(
-       			$current, 
-       			"bindings",
-        		lv_bindings_12_0, 
-        		"UiBinding");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiHorizontalLayoutAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0()); 
-	    }
-		lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiHorizontalLayoutRule());
-	        }
-       		add(
-       			$current, 
-       			"processorAssignments",
-        		lv_processorAssignments_13_0, 
-        		"UiVisibilityProcessorAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_14='}' 
-    {
-    	newLeafNode(otherlv_14, grammarAccess.getUiHorizontalLayoutAccess().getRightCurlyBracketKeyword_8());
-    }
-)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiHorizontalLayoutAssigment
-entryRuleUiHorizontalLayoutAssigment returns [EObject current=null] 
-	:
+entryRuleUiHorizontalLayoutAssigment returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiHorizontalLayoutAssigmentRule()); }
-	 iv_ruleUiHorizontalLayoutAssigment=ruleUiHorizontalLayoutAssigment 
-	 { $current=$iv_ruleUiHorizontalLayoutAssigment.current; } 
-	 EOF 
-;
+	iv_ruleUiHorizontalLayoutAssigment=ruleUiHorizontalLayoutAssigment
+	{ $current=$iv_ruleUiHorizontalLayoutAssigment.current; }
+	EOF;
 
 // Rule UiHorizontalLayoutAssigment
-ruleUiHorizontalLayoutAssigment returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiHorizontalLayoutAssigmentAccess().getElementUiEmbeddableParserRuleCall_0_0()); 
-	    }
-		lv_element_0_0=ruleUiEmbeddable		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiHorizontalLayoutAssigmentRule());
-	        }
-       		set(
-       			$current, 
-       			"element",
-        		lv_element_0_0, 
-        		"UiEmbeddable");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_1='align' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiHorizontalLayoutAssigmentAccess().getAlignKeyword_1_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiHorizontalLayoutAssigmentAccess().getAlignmentUiAlignmentEnumRuleCall_1_1_0()); 
-	    }
-		lv_alignment_2_0=ruleUiAlignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiHorizontalLayoutAssigmentRule());
-	        }
-       		set(
-       			$current, 
-       			"alignment",
-        		lv_alignment_2_0, 
-        		"UiAlignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))?)
+ruleUiHorizontalLayoutAssigment returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiHorizontalLayoutAssigmentAccess().getElementUiEmbeddableParserRuleCall_0_0());
+				}
+				lv_element_0_0=ruleUiEmbeddable
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiHorizontalLayoutAssigmentRule());
+					}
+					set(
+						$current,
+						"element",
+						lv_element_0_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiEmbeddable");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_1='align'
+			{
+				newLeafNode(otherlv_1, grammarAccess.getUiHorizontalLayoutAssigmentAccess().getAlignKeyword_1_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiHorizontalLayoutAssigmentAccess().getAlignmentUiAlignmentEnumRuleCall_1_1_0());
+					}
+					lv_alignment_2_0=ruleUiAlignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiHorizontalLayoutAssigmentRule());
+						}
+						set(
+							$current,
+							"alignment",
+							lv_alignment_2_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiAlignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)?
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiMobileHorizontalLayout
-entryRuleUiMobileHorizontalLayout returns [EObject current=null] 
-	:
+entryRuleUiMobileHorizontalLayout returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiMobileHorizontalLayoutRule()); }
-	 iv_ruleUiMobileHorizontalLayout=ruleUiMobileHorizontalLayout 
-	 { $current=$iv_ruleUiMobileHorizontalLayout.current; } 
-	 EOF 
-;
+	iv_ruleUiMobileHorizontalLayout=ruleUiMobileHorizontalLayout
+	{ $current=$iv_ruleUiMobileHorizontalLayout.current; }
+	EOF;
 
 // Rule UiMobileHorizontalLayout
-ruleUiMobileHorizontalLayout returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUiMobileHorizontalLayoutAccess().getUiHorizontalLayoutAction_0(),
-            $current);
-    }
-)	otherlv_1='mobileHorizontalLayout' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiMobileHorizontalLayoutAccess().getMobileHorizontalLayoutKeyword_1());
-    }
-(
-
-(
-	{ 
-	  getUnorderedGroupHelper().enter(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2());
-	}
+ruleUiMobileHorizontalLayout returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
 	(
 		(
-
-			( 
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiMobileHorizontalLayoutAccess().getUiHorizontalLayoutAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='mobileHorizontalLayout'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getUiMobileHorizontalLayoutAccess().getMobileHorizontalLayoutKeyword_1());
+		}
+		(
+			(
+				{ 
+				  getUnorderedGroupHelper().enter(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2());
+				}
+				(
+					(
+			(
 				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2(), 0)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2(), 0);
+					}
+								({true}?=>(otherlv_3='('
+								{
+									newLeafNode(otherlv_3, grammarAccess.getUiMobileHorizontalLayoutAccess().getLeftParenthesisKeyword_2_0_0());
+								}
+								(
+									(
+										{
+											newCompositeNode(grammarAccess.getUiMobileHorizontalLayoutAccess().getI18nInfoUiI18nInfoParserRuleCall_2_0_1_0());
+										}
+										lv_i18nInfo_4_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiMobileHorizontalLayoutRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_4_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+								)?
+								))
 					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2(), 0);
-	 				}
-					({true}?=>(	otherlv_3='(' 
-    {
-    	newLeafNode(otherlv_3, grammarAccess.getUiMobileHorizontalLayoutAccess().getLeftParenthesisKeyword_2_0_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileHorizontalLayoutAccess().getI18nInfoUiI18nInfoParserRuleCall_2_0_1_0()); 
-	    }
-		lv_i18nInfo_4_0=ruleUiI18nInfo		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileHorizontalLayoutRule());
-	        }
-       		set(
-       			$current, 
-       			"i18nInfo",
-        		lv_i18nInfo_4_0, 
-        		"UiI18nInfo");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)?))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2());
-	 				}
- 				)
-			)  |
-
-			( 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2());
+					}
+				)
+			)|
+			(
 				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2(), 1)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2(), 1);
+					}
+								({true}?=>(otherlv_5='styles'
+								{
+									newLeafNode(otherlv_5, grammarAccess.getUiMobileHorizontalLayoutAccess().getStylesKeyword_2_1_0());
+								}
+								(
+									(
+										lv_styles_6_0=RULE_STRING
+										{
+											newLeafNode(lv_styles_6_0, grammarAccess.getUiMobileHorizontalLayoutAccess().getStylesSTRINGTerminalRuleCall_2_1_1_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiMobileHorizontalLayoutRule());
+											}
+											setWithLastConsumed(
+												$current,
+												"styles",
+												lv_styles_6_0,
+												"org.eclipse.xtext.xbase.Xtype.STRING");
+										}
+									)
+								)
+								))
 					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2(), 1);
-	 				}
-					({true}?=>(	otherlv_5='styles' 
-    {
-    	newLeafNode(otherlv_5, grammarAccess.getUiMobileHorizontalLayoutAccess().getStylesKeyword_2_1_0());
-    }
-(
-(
-		lv_styles_6_0=RULE_STRING
-		{
-			newLeafNode(lv_styles_6_0, grammarAccess.getUiMobileHorizontalLayoutAccess().getStylesSTRINGTerminalRuleCall_2_1_1_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiMobileHorizontalLayoutRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"styles",
-        		lv_styles_6_0, 
-        		"STRING");
-	    }
-
-)
-)))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2());
-	 				}
- 				)
-			)  |
-
-			( 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2());
+					}
+				)
+			)|
+			(
 				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2(), 2)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2(), 2);
+					}
+								({true}?=>((
+									(
+										lv_readonly_7_0='readonly'
+										{
+											newLeafNode(lv_readonly_7_0, grammarAccess.getUiMobileHorizontalLayoutAccess().getReadonlyReadonlyKeyword_2_2_0_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiMobileHorizontalLayoutRule());
+											}
+											setWithLastConsumed($current, "readonly", true, "readonly");
+										}
+									)
+								)?
+								otherlv_8=')'
+								{
+									newLeafNode(otherlv_8, grammarAccess.getUiMobileHorizontalLayoutAccess().getRightParenthesisKeyword_2_2_1());
+								}
+								))
 					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2(), 2);
-	 				}
-					({true}?=>((
-(
-		lv_readonly_7_0=	'readonly' 
-    {
-        newLeafNode(lv_readonly_7_0, grammarAccess.getUiMobileHorizontalLayoutAccess().getReadonlyReadonlyKeyword_2_2_0_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiMobileHorizontalLayoutRule());
-	        }
-       		setWithLastConsumed($current, "readonly", true, "readonly");
-	    }
-
-)
-)?	otherlv_8=')' 
-    {
-    	newLeafNode(otherlv_8, grammarAccess.getUiMobileHorizontalLayoutAccess().getRightParenthesisKeyword_2_2_1());
-    }
-))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2());
-	 				}
- 				)
-			)  
-
-		)+
-	  	{getUnorderedGroupHelper().canLeave(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2())}?	
-	)
-)
-	{ 
-	  getUnorderedGroupHelper().leave(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2());
-	}
-
-)?(
-(
-		lv_name_9_0=RULE_ID
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2());
+					}
+				)
+			)
+					)+
+					{getUnorderedGroupHelper().canLeave(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2())}?
+				)
+			)
+				{ 
+				  getUnorderedGroupHelper().leave(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2());
+				}
+		)?
+		(
+			(
+				lv_name_9_0=RULE_ID
+				{
+					newLeafNode(lv_name_9_0, grammarAccess.getUiMobileHorizontalLayoutAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiMobileHorizontalLayoutRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_9_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		otherlv_10='{'
 		{
-			newLeafNode(lv_name_9_0, grammarAccess.getUiMobileHorizontalLayoutAccess().getNameIDTerminalRuleCall_3_0()); 
+			newLeafNode(otherlv_10, grammarAccess.getUiMobileHorizontalLayoutAccess().getLeftCurlyBracketKeyword_4());
 		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiMobileHorizontalLayoutAccess().getContentsUiMobileHorizontalLayoutAssigmentParserRuleCall_5_0());
+				}
+				lv_contents_11_0=ruleUiMobileHorizontalLayoutAssigment
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiMobileHorizontalLayoutRule());
+					}
+					add(
+						$current,
+						"contents",
+						lv_contents_11_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileHorizontalLayoutAssigment");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiMobileHorizontalLayoutAccess().getBindingsUiBindingParserRuleCall_6_0());
+				}
+				lv_bindings_12_0=ruleUiBinding
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiMobileHorizontalLayoutRule());
+					}
+					add(
+						$current,
+						"bindings",
+						lv_bindings_12_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiMobileHorizontalLayoutAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0());
+				}
+				lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiMobileHorizontalLayoutRule());
+					}
+					add(
+						$current,
+						"processorAssignments",
+						lv_processorAssignments_13_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		otherlv_14='}'
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiMobileHorizontalLayoutRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"name",
-        		lv_name_9_0, 
-        		"ID");
-	    }
-
-)
-)?	otherlv_10='{' 
-    {
-    	newLeafNode(otherlv_10, grammarAccess.getUiMobileHorizontalLayoutAccess().getLeftCurlyBracketKeyword_4());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileHorizontalLayoutAccess().getContentsUiMobileHorizontalLayoutAssigmentParserRuleCall_5_0()); 
-	    }
-		lv_contents_11_0=ruleUiMobileHorizontalLayoutAssigment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileHorizontalLayoutRule());
-	        }
-       		add(
-       			$current, 
-       			"contents",
-        		lv_contents_11_0, 
-        		"UiMobileHorizontalLayoutAssigment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileHorizontalLayoutAccess().getBindingsUiBindingParserRuleCall_6_0()); 
-	    }
-		lv_bindings_12_0=ruleUiBinding		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileHorizontalLayoutRule());
-	        }
-       		add(
-       			$current, 
-       			"bindings",
-        		lv_bindings_12_0, 
-        		"UiBinding");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileHorizontalLayoutAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0()); 
-	    }
-		lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileHorizontalLayoutRule());
-	        }
-       		add(
-       			$current, 
-       			"processorAssignments",
-        		lv_processorAssignments_13_0, 
-        		"UiVisibilityProcessorAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_14='}' 
-    {
-    	newLeafNode(otherlv_14, grammarAccess.getUiMobileHorizontalLayoutAccess().getRightCurlyBracketKeyword_8());
-    }
-)
+			newLeafNode(otherlv_14, grammarAccess.getUiMobileHorizontalLayoutAccess().getRightCurlyBracketKeyword_8());
+		}
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiMobileHorizontalLayoutAssigment
-entryRuleUiMobileHorizontalLayoutAssigment returns [EObject current=null] 
-	:
+entryRuleUiMobileHorizontalLayoutAssigment returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiMobileHorizontalLayoutAssigmentRule()); }
-	 iv_ruleUiMobileHorizontalLayoutAssigment=ruleUiMobileHorizontalLayoutAssigment 
-	 { $current=$iv_ruleUiMobileHorizontalLayoutAssigment.current; } 
-	 EOF 
-;
+	iv_ruleUiMobileHorizontalLayoutAssigment=ruleUiMobileHorizontalLayoutAssigment
+	{ $current=$iv_ruleUiMobileHorizontalLayoutAssigment.current; }
+	EOF;
 
 // Rule UiMobileHorizontalLayoutAssigment
-ruleUiMobileHorizontalLayoutAssigment returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileHorizontalLayoutAssigmentAccess().getElementUiMobileEmbeddableParserRuleCall_0_0()); 
-	    }
-		lv_element_0_0=ruleUiMobileEmbeddable		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileHorizontalLayoutAssigmentRule());
-	        }
-       		set(
-       			$current, 
-       			"element",
-        		lv_element_0_0, 
-        		"UiMobileEmbeddable");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_1='align' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiMobileHorizontalLayoutAssigmentAccess().getAlignKeyword_1_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileHorizontalLayoutAssigmentAccess().getAlignmentUiAlignmentEnumRuleCall_1_1_0()); 
-	    }
-		lv_alignment_2_0=ruleUiAlignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileHorizontalLayoutAssigmentRule());
-	        }
-       		set(
-       			$current, 
-       			"alignment",
-        		lv_alignment_2_0, 
-        		"UiAlignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))?)
+ruleUiMobileHorizontalLayoutAssigment returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiMobileHorizontalLayoutAssigmentAccess().getElementUiMobileEmbeddableParserRuleCall_0_0());
+				}
+				lv_element_0_0=ruleUiMobileEmbeddable
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiMobileHorizontalLayoutAssigmentRule());
+					}
+					set(
+						$current,
+						"element",
+						lv_element_0_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileEmbeddable");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_1='align'
+			{
+				newLeafNode(otherlv_1, grammarAccess.getUiMobileHorizontalLayoutAssigmentAccess().getAlignKeyword_1_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiMobileHorizontalLayoutAssigmentAccess().getAlignmentUiAlignmentEnumRuleCall_1_1_0());
+					}
+					lv_alignment_2_0=ruleUiAlignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiMobileHorizontalLayoutAssigmentRule());
+						}
+						set(
+							$current,
+							"alignment",
+							lv_alignment_2_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiAlignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)?
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiMobileHorizontalButtonGroup
-entryRuleUiMobileHorizontalButtonGroup returns [EObject current=null] 
-	:
+entryRuleUiMobileHorizontalButtonGroup returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiMobileHorizontalButtonGroupRule()); }
-	 iv_ruleUiMobileHorizontalButtonGroup=ruleUiMobileHorizontalButtonGroup 
-	 { $current=$iv_ruleUiMobileHorizontalButtonGroup.current; } 
-	 EOF 
-;
+	iv_ruleUiMobileHorizontalButtonGroup=ruleUiMobileHorizontalButtonGroup
+	{ $current=$iv_ruleUiMobileHorizontalButtonGroup.current; }
+	EOF;
 
 // Rule UiMobileHorizontalButtonGroup
-ruleUiMobileHorizontalButtonGroup returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUiHorizontalButtonGroupAction_0(),
-            $current);
-    }
-)	otherlv_1='horizontalButtonGroup' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiMobileHorizontalButtonGroupAccess().getHorizontalButtonGroupKeyword_1());
-    }
-(	otherlv_2='(' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getUiMobileHorizontalButtonGroupAccess().getLeftParenthesisKeyword_2_0());
-    }
-(
-
-(
-	{ 
-	  getUnorderedGroupHelper().enter(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1());
-	}
+ruleUiMobileHorizontalButtonGroup returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
 	(
 		(
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1(), 0)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1(), 0);
-	 				}
-					({true}?=>(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0()); 
-	    }
-		lv_i18nInfo_4_0=ruleUiI18nInfo		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileHorizontalButtonGroupRule());
-	        }
-       		set(
-       			$current, 
-       			"i18nInfo",
-        		lv_i18nInfo_4_0, 
-        		"UiI18nInfo");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1(), 1)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1(), 1);
-	 				}
-					({true}?=>(	otherlv_5='styles' 
-    {
-    	newLeafNode(otherlv_5, grammarAccess.getUiMobileHorizontalButtonGroupAccess().getStylesKeyword_2_1_1_0());
-    }
-(
-(
-		lv_styles_6_0=RULE_STRING
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUiHorizontalButtonGroupAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='horizontalButtonGroup'
 		{
-			newLeafNode(lv_styles_6_0, grammarAccess.getUiMobileHorizontalButtonGroupAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0()); 
+			newLeafNode(otherlv_1, grammarAccess.getUiMobileHorizontalButtonGroupAccess().getHorizontalButtonGroupKeyword_1());
 		}
+		(
+			otherlv_2='('
+			{
+				newLeafNode(otherlv_2, grammarAccess.getUiMobileHorizontalButtonGroupAccess().getLeftParenthesisKeyword_2_0());
+			}
+			(
+				(
+					{ 
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1(), 0);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+										}
+										lv_i18nInfo_4_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiMobileHorizontalButtonGroupRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_4_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1(), 1);
+						}
+									({true}?=>(otherlv_5='styles'
+									{
+										newLeafNode(otherlv_5, grammarAccess.getUiMobileHorizontalButtonGroupAccess().getStylesKeyword_2_1_1_0());
+									}
+									(
+										(
+											lv_styles_6_0=RULE_STRING
+											{
+												newLeafNode(lv_styles_6_0, grammarAccess.getUiMobileHorizontalButtonGroupAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiMobileHorizontalButtonGroupRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"styles",
+													lv_styles_6_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1(), 2)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1(), 2);
+						}
+									({true}?=>((
+										lv_readonly_7_0='readonly'
+										{
+											newLeafNode(lv_readonly_7_0, grammarAccess.getUiMobileHorizontalButtonGroupAccess().getReadonlyReadonlyKeyword_2_1_2_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiMobileHorizontalButtonGroupRule());
+											}
+											setWithLastConsumed($current, "readonly", true, "readonly");
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)
+						)*
+					)
+				)
+					{ 
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1());
+					}
+			)
+			otherlv_8=')'
+			{
+				newLeafNode(otherlv_8, grammarAccess.getUiMobileHorizontalButtonGroupAccess().getRightParenthesisKeyword_2_2());
+			}
+		)?
+		(
+			(
+				lv_name_9_0=RULE_ID
+				{
+					newLeafNode(lv_name_9_0, grammarAccess.getUiMobileHorizontalButtonGroupAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiMobileHorizontalButtonGroupRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_9_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		otherlv_10='{'
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiMobileHorizontalButtonGroupRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"styles",
-        		lv_styles_6_0, 
-        		"STRING");
-	    }
-
-)
-)))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1(), 2)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1(), 2);
-	 				}
-					({true}?=>(
-(
-		lv_readonly_7_0=	'readonly' 
-    {
-        newLeafNode(lv_readonly_7_0, grammarAccess.getUiMobileHorizontalButtonGroupAccess().getReadonlyReadonlyKeyword_2_1_2_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiMobileHorizontalButtonGroupRule());
-	        }
-       		setWithLastConsumed($current, "readonly", true, "readonly");
-	    }
-
-)
-))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  
-
-		)*	
+			newLeafNode(otherlv_10, grammarAccess.getUiMobileHorizontalButtonGroupAccess().getLeftCurlyBracketKeyword_4());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getContentsUiMobileHorizontalButtonGroupAssigmentParserRuleCall_5_0());
+				}
+				lv_contents_11_0=ruleUiMobileHorizontalButtonGroupAssigment
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiMobileHorizontalButtonGroupRule());
+					}
+					add(
+						$current,
+						"contents",
+						lv_contents_11_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileHorizontalButtonGroupAssigment");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getBindingsUiBindingParserRuleCall_6_0());
+				}
+				lv_bindings_12_0=ruleUiBinding
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiMobileHorizontalButtonGroupRule());
+					}
+					add(
+						$current,
+						"bindings",
+						lv_bindings_12_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0());
+				}
+				lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiMobileHorizontalButtonGroupRule());
+					}
+					add(
+						$current,
+						"processorAssignments",
+						lv_processorAssignments_13_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		otherlv_14='}'
+		{
+			newLeafNode(otherlv_14, grammarAccess.getUiMobileHorizontalButtonGroupAccess().getRightCurlyBracketKeyword_8());
+		}
 	)
-)
-	{ 
-	  getUnorderedGroupHelper().leave(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1());
-	}
-
-)	otherlv_8=')' 
-    {
-    	newLeafNode(otherlv_8, grammarAccess.getUiMobileHorizontalButtonGroupAccess().getRightParenthesisKeyword_2_2());
-    }
-)?(
-(
-		lv_name_9_0=RULE_ID
-		{
-			newLeafNode(lv_name_9_0, grammarAccess.getUiMobileHorizontalButtonGroupAccess().getNameIDTerminalRuleCall_3_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiMobileHorizontalButtonGroupRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"name",
-        		lv_name_9_0, 
-        		"ID");
-	    }
-
-)
-)?	otherlv_10='{' 
-    {
-    	newLeafNode(otherlv_10, grammarAccess.getUiMobileHorizontalButtonGroupAccess().getLeftCurlyBracketKeyword_4());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getContentsUiMobileHorizontalButtonGroupAssigmentParserRuleCall_5_0()); 
-	    }
-		lv_contents_11_0=ruleUiMobileHorizontalButtonGroupAssigment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileHorizontalButtonGroupRule());
-	        }
-       		add(
-       			$current, 
-       			"contents",
-        		lv_contents_11_0, 
-        		"UiMobileHorizontalButtonGroupAssigment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getBindingsUiBindingParserRuleCall_6_0()); 
-	    }
-		lv_bindings_12_0=ruleUiBinding		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileHorizontalButtonGroupRule());
-	        }
-       		add(
-       			$current, 
-       			"bindings",
-        		lv_bindings_12_0, 
-        		"UiBinding");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0()); 
-	    }
-		lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileHorizontalButtonGroupRule());
-	        }
-       		add(
-       			$current, 
-       			"processorAssignments",
-        		lv_processorAssignments_13_0, 
-        		"UiVisibilityProcessorAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_14='}' 
-    {
-    	newLeafNode(otherlv_14, grammarAccess.getUiMobileHorizontalButtonGroupAccess().getRightCurlyBracketKeyword_8());
-    }
-)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiMobileHorizontalButtonGroupAssigment
-entryRuleUiMobileHorizontalButtonGroupAssigment returns [EObject current=null] 
-	:
+entryRuleUiMobileHorizontalButtonGroupAssigment returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiMobileHorizontalButtonGroupAssigmentRule()); }
-	 iv_ruleUiMobileHorizontalButtonGroupAssigment=ruleUiMobileHorizontalButtonGroupAssigment 
-	 { $current=$iv_ruleUiMobileHorizontalButtonGroupAssigment.current; } 
-	 EOF 
-;
+	iv_ruleUiMobileHorizontalButtonGroupAssigment=ruleUiMobileHorizontalButtonGroupAssigment
+	{ $current=$iv_ruleUiMobileHorizontalButtonGroupAssigment.current; }
+	EOF;
 
 // Rule UiMobileHorizontalButtonGroupAssigment
-ruleUiMobileHorizontalButtonGroupAssigment returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileHorizontalButtonGroupAssigmentAccess().getElementUiMobileEmbeddableParserRuleCall_0()); 
-	    }
-		lv_element_0_0=ruleUiMobileEmbeddable		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileHorizontalButtonGroupAssigmentRule());
-	        }
-       		set(
-       			$current, 
-       			"element",
-        		lv_element_0_0, 
-        		"UiMobileEmbeddable");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
+ruleUiMobileHorizontalButtonGroupAssigment returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				newCompositeNode(grammarAccess.getUiMobileHorizontalButtonGroupAssigmentAccess().getElementUiMobileEmbeddableParserRuleCall_0());
+			}
+			lv_element_0_0=ruleUiMobileEmbeddable
+			{
+				if ($current==null) {
+					$current = createModelElementForParent(grammarAccess.getUiMobileHorizontalButtonGroupAssigmentRule());
+				}
+				set(
+					$current,
+					"element",
+					lv_element_0_0,
+					"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileEmbeddable");
+				afterParserOrEnumRuleCall();
+			}
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiMobileVerticalComponentGroup
-entryRuleUiMobileVerticalComponentGroup returns [EObject current=null] 
-	:
+entryRuleUiMobileVerticalComponentGroup returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiMobileVerticalComponentGroupRule()); }
-	 iv_ruleUiMobileVerticalComponentGroup=ruleUiMobileVerticalComponentGroup 
-	 { $current=$iv_ruleUiMobileVerticalComponentGroup.current; } 
-	 EOF 
-;
+	iv_ruleUiMobileVerticalComponentGroup=ruleUiMobileVerticalComponentGroup
+	{ $current=$iv_ruleUiMobileVerticalComponentGroup.current; }
+	EOF;
 
 // Rule UiMobileVerticalComponentGroup
-ruleUiMobileVerticalComponentGroup returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUiMobileVerticalComponentGroupAccess().getUiVerticalComponentGroupAction_0(),
-            $current);
-    }
-)	otherlv_1='verticalGroup' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiMobileVerticalComponentGroupAccess().getVerticalGroupKeyword_1());
-    }
-(	otherlv_2='(' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getUiMobileVerticalComponentGroupAccess().getLeftParenthesisKeyword_2_0());
-    }
-(
-
-(
-	{ 
-	  getUnorderedGroupHelper().enter(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1());
-	}
+ruleUiMobileVerticalComponentGroup returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
 	(
 		(
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1(), 0)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1(), 0);
-	 				}
-					({true}?=>(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileVerticalComponentGroupAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0()); 
-	    }
-		lv_i18nInfo_4_0=ruleUiI18nInfo		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileVerticalComponentGroupRule());
-	        }
-       		set(
-       			$current, 
-       			"i18nInfo",
-        		lv_i18nInfo_4_0, 
-        		"UiI18nInfo");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1(), 1)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1(), 1);
-	 				}
-					({true}?=>(
-(
-		lv_readonly_5_0=	'readonly' 
-    {
-        newLeafNode(lv_readonly_5_0, grammarAccess.getUiMobileVerticalComponentGroupAccess().getReadonlyReadonlyKeyword_2_1_1_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiMobileVerticalComponentGroupRule());
-	        }
-       		setWithLastConsumed($current, "readonly", true, "readonly");
-	    }
-
-)
-))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1(), 2)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1(), 2);
-	 				}
-					({true}?=>(	otherlv_6='styles' 
-    {
-    	newLeafNode(otherlv_6, grammarAccess.getUiMobileVerticalComponentGroupAccess().getStylesKeyword_2_1_2_0());
-    }
-(
-(
-		lv_styles_7_0=RULE_STRING
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiMobileVerticalComponentGroupAccess().getUiVerticalComponentGroupAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='verticalGroup'
 		{
-			newLeafNode(lv_styles_7_0, grammarAccess.getUiMobileVerticalComponentGroupAccess().getStylesSTRINGTerminalRuleCall_2_1_2_1_0()); 
+			newLeafNode(otherlv_1, grammarAccess.getUiMobileVerticalComponentGroupAccess().getVerticalGroupKeyword_1());
 		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiMobileVerticalComponentGroupRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"styles",
-        		lv_styles_7_0, 
-        		"STRING");
-	    }
-
-)
-)))
+		(
+			otherlv_2='('
+			{
+				newLeafNode(otherlv_2, grammarAccess.getUiMobileVerticalComponentGroupAccess().getLeftParenthesisKeyword_2_0());
+			}
+			(
+				(
 					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  
-
-		)*	
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1(), 0);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getUiMobileVerticalComponentGroupAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+										}
+										lv_i18nInfo_4_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiMobileVerticalComponentGroupRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_4_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1(), 1);
+						}
+									({true}?=>((
+										lv_readonly_5_0='readonly'
+										{
+											newLeafNode(lv_readonly_5_0, grammarAccess.getUiMobileVerticalComponentGroupAccess().getReadonlyReadonlyKeyword_2_1_1_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiMobileVerticalComponentGroupRule());
+											}
+											setWithLastConsumed($current, "readonly", true, "readonly");
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1(), 2)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1(), 2);
+						}
+									({true}?=>(otherlv_6='styles'
+									{
+										newLeafNode(otherlv_6, grammarAccess.getUiMobileVerticalComponentGroupAccess().getStylesKeyword_2_1_2_0());
+									}
+									(
+										(
+											lv_styles_7_0=RULE_STRING
+											{
+												newLeafNode(lv_styles_7_0, grammarAccess.getUiMobileVerticalComponentGroupAccess().getStylesSTRINGTerminalRuleCall_2_1_2_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiMobileVerticalComponentGroupRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"styles",
+													lv_styles_7_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)
+						)*
+					)
+				)
+					{ 
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1());
+					}
+			)
+			otherlv_8=')'
+			{
+				newLeafNode(otherlv_8, grammarAccess.getUiMobileVerticalComponentGroupAccess().getRightParenthesisKeyword_2_2());
+			}
+		)?
+		(
+			(
+				lv_name_9_0=RULE_ID
+				{
+					newLeafNode(lv_name_9_0, grammarAccess.getUiMobileVerticalComponentGroupAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiMobileVerticalComponentGroupRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_9_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		otherlv_10='{'
+		{
+			newLeafNode(otherlv_10, grammarAccess.getUiMobileVerticalComponentGroupAccess().getLeftCurlyBracketKeyword_4());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiMobileVerticalComponentGroupAccess().getContentsUiMobileVerticalComponentGroupAssigmentParserRuleCall_5_0());
+				}
+				lv_contents_11_0=ruleUiMobileVerticalComponentGroupAssigment
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiMobileVerticalComponentGroupRule());
+					}
+					add(
+						$current,
+						"contents",
+						lv_contents_11_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileVerticalComponentGroupAssigment");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiMobileVerticalComponentGroupAccess().getBindingsUiBindingParserRuleCall_6_0());
+				}
+				lv_bindings_12_0=ruleUiBinding
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiMobileVerticalComponentGroupRule());
+					}
+					add(
+						$current,
+						"bindings",
+						lv_bindings_12_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiMobileVerticalComponentGroupAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0());
+				}
+				lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiMobileVerticalComponentGroupRule());
+					}
+					add(
+						$current,
+						"processorAssignments",
+						lv_processorAssignments_13_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		otherlv_14='}'
+		{
+			newLeafNode(otherlv_14, grammarAccess.getUiMobileVerticalComponentGroupAccess().getRightCurlyBracketKeyword_8());
+		}
 	)
-)
-	{ 
-	  getUnorderedGroupHelper().leave(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1());
-	}
-
-)	otherlv_8=')' 
-    {
-    	newLeafNode(otherlv_8, grammarAccess.getUiMobileVerticalComponentGroupAccess().getRightParenthesisKeyword_2_2());
-    }
-)?(
-(
-		lv_name_9_0=RULE_ID
-		{
-			newLeafNode(lv_name_9_0, grammarAccess.getUiMobileVerticalComponentGroupAccess().getNameIDTerminalRuleCall_3_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiMobileVerticalComponentGroupRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"name",
-        		lv_name_9_0, 
-        		"ID");
-	    }
-
-)
-)?	otherlv_10='{' 
-    {
-    	newLeafNode(otherlv_10, grammarAccess.getUiMobileVerticalComponentGroupAccess().getLeftCurlyBracketKeyword_4());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileVerticalComponentGroupAccess().getContentsUiMobileVerticalComponentGroupAssigmentParserRuleCall_5_0()); 
-	    }
-		lv_contents_11_0=ruleUiMobileVerticalComponentGroupAssigment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileVerticalComponentGroupRule());
-	        }
-       		add(
-       			$current, 
-       			"contents",
-        		lv_contents_11_0, 
-        		"UiMobileVerticalComponentGroupAssigment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileVerticalComponentGroupAccess().getBindingsUiBindingParserRuleCall_6_0()); 
-	    }
-		lv_bindings_12_0=ruleUiBinding		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileVerticalComponentGroupRule());
-	        }
-       		add(
-       			$current, 
-       			"bindings",
-        		lv_bindings_12_0, 
-        		"UiBinding");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileVerticalComponentGroupAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0()); 
-	    }
-		lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileVerticalComponentGroupRule());
-	        }
-       		add(
-       			$current, 
-       			"processorAssignments",
-        		lv_processorAssignments_13_0, 
-        		"UiVisibilityProcessorAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_14='}' 
-    {
-    	newLeafNode(otherlv_14, grammarAccess.getUiMobileVerticalComponentGroupAccess().getRightCurlyBracketKeyword_8());
-    }
-)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiMobileVerticalComponentGroupAssigment
-entryRuleUiMobileVerticalComponentGroupAssigment returns [EObject current=null] 
-	:
+entryRuleUiMobileVerticalComponentGroupAssigment returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiMobileVerticalComponentGroupAssigmentRule()); }
-	 iv_ruleUiMobileVerticalComponentGroupAssigment=ruleUiMobileVerticalComponentGroupAssigment 
-	 { $current=$iv_ruleUiMobileVerticalComponentGroupAssigment.current; } 
-	 EOF 
-;
+	iv_ruleUiMobileVerticalComponentGroupAssigment=ruleUiMobileVerticalComponentGroupAssigment
+	{ $current=$iv_ruleUiMobileVerticalComponentGroupAssigment.current; }
+	EOF;
 
 // Rule UiMobileVerticalComponentGroupAssigment
-ruleUiMobileVerticalComponentGroupAssigment returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileVerticalComponentGroupAssigmentAccess().getElementUiMobileEmbeddableParserRuleCall_0()); 
-	    }
-		lv_element_0_0=ruleUiMobileEmbeddable		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileVerticalComponentGroupAssigmentRule());
-	        }
-       		set(
-       			$current, 
-       			"element",
-        		lv_element_0_0, 
-        		"UiMobileEmbeddable");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
+ruleUiMobileVerticalComponentGroupAssigment returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				newCompositeNode(grammarAccess.getUiMobileVerticalComponentGroupAssigmentAccess().getElementUiMobileEmbeddableParserRuleCall_0());
+			}
+			lv_element_0_0=ruleUiMobileEmbeddable
+			{
+				if ($current==null) {
+					$current = createModelElementForParent(grammarAccess.getUiMobileVerticalComponentGroupAssigmentRule());
+				}
+				set(
+					$current,
+					"element",
+					lv_element_0_0,
+					"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileEmbeddable");
+				afterParserOrEnumRuleCall();
+			}
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiSearchPanel
-entryRuleUiSearchPanel returns [EObject current=null] 
-	:
+entryRuleUiSearchPanel returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiSearchPanelRule()); }
-	 iv_ruleUiSearchPanel=ruleUiSearchPanel 
-	 { $current=$iv_ruleUiSearchPanel.current; } 
-	 EOF 
-;
+	iv_ruleUiSearchPanel=ruleUiSearchPanel
+	{ $current=$iv_ruleUiSearchPanel.current; }
+	EOF;
 
 // Rule UiSearchPanel
-ruleUiSearchPanel returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUiSearchPanelAccess().getUiSearchPanelAction_0(),
-            $current);
-    }
-)	otherlv_1='searchPanel' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiSearchPanelAccess().getSearchPanelKeyword_1());
-    }
-(	otherlv_2='(' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getUiSearchPanelAccess().getLeftParenthesisKeyword_2_0());
-    }
-(
-
-(
-	{ 
-	  getUnorderedGroupHelper().enter(grammarAccess.getUiSearchPanelAccess().getUnorderedGroup_2_1());
-	}
+ruleUiSearchPanel returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
 	(
 		(
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSearchPanelAccess().getUnorderedGroup_2_1(), 0)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiSearchPanelAccess().getUnorderedGroup_2_1(), 0);
-	 				}
-					({true}?=>(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiSearchPanelAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0()); 
-	    }
-		lv_i18nInfo_4_0=ruleUiI18nInfo		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiSearchPanelRule());
-	        }
-       		set(
-       			$current, 
-       			"i18nInfo",
-        		lv_i18nInfo_4_0, 
-        		"UiI18nInfo");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSearchPanelAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSearchPanelAccess().getUnorderedGroup_2_1(), 1)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiSearchPanelAccess().getUnorderedGroup_2_1(), 1);
-	 				}
-					({true}?=>(	otherlv_5='styles' 
-    {
-    	newLeafNode(otherlv_5, grammarAccess.getUiSearchPanelAccess().getStylesKeyword_2_1_1_0());
-    }
-(
-(
-		lv_styles_6_0=RULE_STRING
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiSearchPanelAccess().getUiSearchPanelAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='searchPanel'
 		{
-			newLeafNode(lv_styles_6_0, grammarAccess.getUiSearchPanelAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0()); 
+			newLeafNode(otherlv_1, grammarAccess.getUiSearchPanelAccess().getSearchPanelKeyword_1());
 		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiSearchPanelRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"styles",
-        		lv_styles_6_0, 
-        		"STRING");
-	    }
-
-)
-)))
+		(
+			otherlv_2='('
+			{
+				newLeafNode(otherlv_2, grammarAccess.getUiSearchPanelAccess().getLeftParenthesisKeyword_2_0());
+			}
+			(
+				(
 					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSearchPanelAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  
-
-		)*	
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiSearchPanelAccess().getUnorderedGroup_2_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSearchPanelAccess().getUnorderedGroup_2_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiSearchPanelAccess().getUnorderedGroup_2_1(), 0);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getUiSearchPanelAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+										}
+										lv_i18nInfo_4_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiSearchPanelRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_4_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSearchPanelAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSearchPanelAccess().getUnorderedGroup_2_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiSearchPanelAccess().getUnorderedGroup_2_1(), 1);
+						}
+									({true}?=>(otherlv_5='styles'
+									{
+										newLeafNode(otherlv_5, grammarAccess.getUiSearchPanelAccess().getStylesKeyword_2_1_1_0());
+									}
+									(
+										(
+											lv_styles_6_0=RULE_STRING
+											{
+												newLeafNode(lv_styles_6_0, grammarAccess.getUiSearchPanelAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiSearchPanelRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"styles",
+													lv_styles_6_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSearchPanelAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)
+						)*
+					)
+				)
+					{ 
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiSearchPanelAccess().getUnorderedGroup_2_1());
+					}
+			)
+			otherlv_7=')'
+			{
+				newLeafNode(otherlv_7, grammarAccess.getUiSearchPanelAccess().getRightParenthesisKeyword_2_2());
+			}
+		)?
+		(
+			(
+				lv_name_8_0=RULE_ID
+				{
+					newLeafNode(lv_name_8_0, grammarAccess.getUiSearchPanelAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiSearchPanelRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_8_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		otherlv_9='{'
+		{
+			newLeafNode(otherlv_9, grammarAccess.getUiSearchPanelAccess().getLeftCurlyBracketKeyword_4());
+		}
+		otherlv_10='type'
+		{
+			newLeafNode(otherlv_10, grammarAccess.getUiSearchPanelAccess().getTypeKeyword_5());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiSearchPanelAccess().getJvmTypeJvmTypeReferenceParserRuleCall_6_0());
+				}
+				lv_jvmType_11_0=ruleJvmTypeReference
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiSearchPanelRule());
+					}
+					set(
+						$current,
+						"jvmType",
+						lv_jvmType_11_0,
+						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_12=';'
+			{
+				newLeafNode(otherlv_12, grammarAccess.getUiSearchPanelAccess().getSemicolonKeyword_7());
+			}
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiSearchPanelAccess().getContentsUiSearchFieldParserRuleCall_8_0());
+				}
+				lv_contents_13_0=ruleUiSearchField
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiSearchPanelRule());
+					}
+					add(
+						$current,
+						"contents",
+						lv_contents_13_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiSearchField");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiSearchPanelAccess().getBindingsUiBindingParserRuleCall_9_0());
+				}
+				lv_bindings_14_0=ruleUiBinding
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiSearchPanelRule());
+					}
+					add(
+						$current,
+						"bindings",
+						lv_bindings_14_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiSearchPanelAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_10_0());
+				}
+				lv_processorAssignments_15_0=ruleUiVisibilityProcessorAssignment
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiSearchPanelRule());
+					}
+					add(
+						$current,
+						"processorAssignments",
+						lv_processorAssignments_15_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		otherlv_16='}'
+		{
+			newLeafNode(otherlv_16, grammarAccess.getUiSearchPanelAccess().getRightCurlyBracketKeyword_11());
+		}
 	)
-)
-	{ 
-	  getUnorderedGroupHelper().leave(grammarAccess.getUiSearchPanelAccess().getUnorderedGroup_2_1());
-	}
-
-)	otherlv_7=')' 
-    {
-    	newLeafNode(otherlv_7, grammarAccess.getUiSearchPanelAccess().getRightParenthesisKeyword_2_2());
-    }
-)?(
-(
-		lv_name_8_0=RULE_ID
-		{
-			newLeafNode(lv_name_8_0, grammarAccess.getUiSearchPanelAccess().getNameIDTerminalRuleCall_3_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiSearchPanelRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"name",
-        		lv_name_8_0, 
-        		"ID");
-	    }
-
-)
-)?	otherlv_9='{' 
-    {
-    	newLeafNode(otherlv_9, grammarAccess.getUiSearchPanelAccess().getLeftCurlyBracketKeyword_4());
-    }
-	otherlv_10='type' 
-    {
-    	newLeafNode(otherlv_10, grammarAccess.getUiSearchPanelAccess().getTypeKeyword_5());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiSearchPanelAccess().getJvmTypeJvmTypeReferenceParserRuleCall_6_0()); 
-	    }
-		lv_jvmType_11_0=ruleJvmTypeReference		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiSearchPanelRule());
-	        }
-       		set(
-       			$current, 
-       			"jvmType",
-        		lv_jvmType_11_0, 
-        		"JvmTypeReference");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_12=';' 
-    {
-    	newLeafNode(otherlv_12, grammarAccess.getUiSearchPanelAccess().getSemicolonKeyword_7());
-    }
-)?(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiSearchPanelAccess().getContentsUiSearchFieldParserRuleCall_8_0()); 
-	    }
-		lv_contents_13_0=ruleUiSearchField		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiSearchPanelRule());
-	        }
-       		add(
-       			$current, 
-       			"contents",
-        		lv_contents_13_0, 
-        		"UiSearchField");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiSearchPanelAccess().getBindingsUiBindingParserRuleCall_9_0()); 
-	    }
-		lv_bindings_14_0=ruleUiBinding		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiSearchPanelRule());
-	        }
-       		add(
-       			$current, 
-       			"bindings",
-        		lv_bindings_14_0, 
-        		"UiBinding");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiSearchPanelAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_10_0()); 
-	    }
-		lv_processorAssignments_15_0=ruleUiVisibilityProcessorAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiSearchPanelRule());
-	        }
-       		add(
-       			$current, 
-       			"processorAssignments",
-        		lv_processorAssignments_15_0, 
-        		"UiVisibilityProcessorAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_16='}' 
-    {
-    	newLeafNode(otherlv_16, grammarAccess.getUiSearchPanelAccess().getRightCurlyBracketKeyword_11());
-    }
-)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiMobileSearchPanel
-entryRuleUiMobileSearchPanel returns [EObject current=null] 
-	:
+entryRuleUiMobileSearchPanel returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiMobileSearchPanelRule()); }
-	 iv_ruleUiMobileSearchPanel=ruleUiMobileSearchPanel 
-	 { $current=$iv_ruleUiMobileSearchPanel.current; } 
-	 EOF 
-;
+	iv_ruleUiMobileSearchPanel=ruleUiMobileSearchPanel
+	{ $current=$iv_ruleUiMobileSearchPanel.current; }
+	EOF;
 
 // Rule UiMobileSearchPanel
-ruleUiMobileSearchPanel returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUiMobileSearchPanelAccess().getUiMobileSearchPanelAction_0(),
-            $current);
-    }
-)	otherlv_1='mobileSearchPanel' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiMobileSearchPanelAccess().getMobileSearchPanelKeyword_1());
-    }
-(	otherlv_2='(' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getUiMobileSearchPanelAccess().getLeftParenthesisKeyword_2_0());
-    }
-(
-
-(
-	{ 
-	  getUnorderedGroupHelper().enter(grammarAccess.getUiMobileSearchPanelAccess().getUnorderedGroup_2_1());
-	}
+ruleUiMobileSearchPanel returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
 	(
 		(
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileSearchPanelAccess().getUnorderedGroup_2_1(), 0)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiMobileSearchPanelAccess().getUnorderedGroup_2_1(), 0);
-	 				}
-					({true}?=>(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileSearchPanelAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0()); 
-	    }
-		lv_i18nInfo_4_0=ruleUiI18nInfo		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileSearchPanelRule());
-	        }
-       		set(
-       			$current, 
-       			"i18nInfo",
-        		lv_i18nInfo_4_0, 
-        		"UiI18nInfo");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileSearchPanelAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileSearchPanelAccess().getUnorderedGroup_2_1(), 1)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiMobileSearchPanelAccess().getUnorderedGroup_2_1(), 1);
-	 				}
-					({true}?=>(	otherlv_5='styles' 
-    {
-    	newLeafNode(otherlv_5, grammarAccess.getUiMobileSearchPanelAccess().getStylesKeyword_2_1_1_0());
-    }
-(
-(
-		lv_styles_6_0=RULE_STRING
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiMobileSearchPanelAccess().getUiMobileSearchPanelAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='mobileSearchPanel'
 		{
-			newLeafNode(lv_styles_6_0, grammarAccess.getUiMobileSearchPanelAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0()); 
+			newLeafNode(otherlv_1, grammarAccess.getUiMobileSearchPanelAccess().getMobileSearchPanelKeyword_1());
 		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiMobileSearchPanelRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"styles",
-        		lv_styles_6_0, 
-        		"STRING");
-	    }
-
-)
-)))
+		(
+			otherlv_2='('
+			{
+				newLeafNode(otherlv_2, grammarAccess.getUiMobileSearchPanelAccess().getLeftParenthesisKeyword_2_0());
+			}
+			(
+				(
 					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileSearchPanelAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  
-
-		)*	
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiMobileSearchPanelAccess().getUnorderedGroup_2_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileSearchPanelAccess().getUnorderedGroup_2_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiMobileSearchPanelAccess().getUnorderedGroup_2_1(), 0);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getUiMobileSearchPanelAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+										}
+										lv_i18nInfo_4_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiMobileSearchPanelRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_4_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileSearchPanelAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileSearchPanelAccess().getUnorderedGroup_2_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiMobileSearchPanelAccess().getUnorderedGroup_2_1(), 1);
+						}
+									({true}?=>(otherlv_5='styles'
+									{
+										newLeafNode(otherlv_5, grammarAccess.getUiMobileSearchPanelAccess().getStylesKeyword_2_1_1_0());
+									}
+									(
+										(
+											lv_styles_6_0=RULE_STRING
+											{
+												newLeafNode(lv_styles_6_0, grammarAccess.getUiMobileSearchPanelAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiMobileSearchPanelRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"styles",
+													lv_styles_6_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileSearchPanelAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)
+						)*
+					)
+				)
+					{ 
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiMobileSearchPanelAccess().getUnorderedGroup_2_1());
+					}
+			)
+			otherlv_7=')'
+			{
+				newLeafNode(otherlv_7, grammarAccess.getUiMobileSearchPanelAccess().getRightParenthesisKeyword_2_2());
+			}
+		)?
+		(
+			(
+				lv_name_8_0=RULE_ID
+				{
+					newLeafNode(lv_name_8_0, grammarAccess.getUiMobileSearchPanelAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiMobileSearchPanelRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_8_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		otherlv_9='{'
+		{
+			newLeafNode(otherlv_9, grammarAccess.getUiMobileSearchPanelAccess().getLeftCurlyBracketKeyword_4());
+		}
+		otherlv_10='type'
+		{
+			newLeafNode(otherlv_10, grammarAccess.getUiMobileSearchPanelAccess().getTypeKeyword_5());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiMobileSearchPanelAccess().getJvmTypeJvmTypeReferenceParserRuleCall_6_0());
+				}
+				lv_jvmType_11_0=ruleJvmTypeReference
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiMobileSearchPanelRule());
+					}
+					set(
+						$current,
+						"jvmType",
+						lv_jvmType_11_0,
+						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_12=';'
+			{
+				newLeafNode(otherlv_12, grammarAccess.getUiMobileSearchPanelAccess().getSemicolonKeyword_7());
+			}
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiMobileSearchPanelAccess().getContentsUiSearchFieldParserRuleCall_8_0());
+				}
+				lv_contents_13_0=ruleUiSearchField
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiMobileSearchPanelRule());
+					}
+					add(
+						$current,
+						"contents",
+						lv_contents_13_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiSearchField");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiMobileSearchPanelAccess().getBindingsUiBindingParserRuleCall_9_0());
+				}
+				lv_bindings_14_0=ruleUiBinding
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiMobileSearchPanelRule());
+					}
+					add(
+						$current,
+						"bindings",
+						lv_bindings_14_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiMobileSearchPanelAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_10_0());
+				}
+				lv_processorAssignments_15_0=ruleUiVisibilityProcessorAssignment
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiMobileSearchPanelRule());
+					}
+					add(
+						$current,
+						"processorAssignments",
+						lv_processorAssignments_15_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		otherlv_16='}'
+		{
+			newLeafNode(otherlv_16, grammarAccess.getUiMobileSearchPanelAccess().getRightCurlyBracketKeyword_11());
+		}
 	)
-)
-	{ 
-	  getUnorderedGroupHelper().leave(grammarAccess.getUiMobileSearchPanelAccess().getUnorderedGroup_2_1());
-	}
-
-)	otherlv_7=')' 
-    {
-    	newLeafNode(otherlv_7, grammarAccess.getUiMobileSearchPanelAccess().getRightParenthesisKeyword_2_2());
-    }
-)?(
-(
-		lv_name_8_0=RULE_ID
-		{
-			newLeafNode(lv_name_8_0, grammarAccess.getUiMobileSearchPanelAccess().getNameIDTerminalRuleCall_3_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiMobileSearchPanelRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"name",
-        		lv_name_8_0, 
-        		"ID");
-	    }
-
-)
-)?	otherlv_9='{' 
-    {
-    	newLeafNode(otherlv_9, grammarAccess.getUiMobileSearchPanelAccess().getLeftCurlyBracketKeyword_4());
-    }
-	otherlv_10='type' 
-    {
-    	newLeafNode(otherlv_10, grammarAccess.getUiMobileSearchPanelAccess().getTypeKeyword_5());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileSearchPanelAccess().getJvmTypeJvmTypeReferenceParserRuleCall_6_0()); 
-	    }
-		lv_jvmType_11_0=ruleJvmTypeReference		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileSearchPanelRule());
-	        }
-       		set(
-       			$current, 
-       			"jvmType",
-        		lv_jvmType_11_0, 
-        		"JvmTypeReference");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_12=';' 
-    {
-    	newLeafNode(otherlv_12, grammarAccess.getUiMobileSearchPanelAccess().getSemicolonKeyword_7());
-    }
-)?(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileSearchPanelAccess().getContentsUiSearchFieldParserRuleCall_8_0()); 
-	    }
-		lv_contents_13_0=ruleUiSearchField		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileSearchPanelRule());
-	        }
-       		add(
-       			$current, 
-       			"contents",
-        		lv_contents_13_0, 
-        		"UiSearchField");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileSearchPanelAccess().getBindingsUiBindingParserRuleCall_9_0()); 
-	    }
-		lv_bindings_14_0=ruleUiBinding		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileSearchPanelRule());
-	        }
-       		add(
-       			$current, 
-       			"bindings",
-        		lv_bindings_14_0, 
-        		"UiBinding");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileSearchPanelAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_10_0()); 
-	    }
-		lv_processorAssignments_15_0=ruleUiVisibilityProcessorAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileSearchPanelRule());
-	        }
-       		add(
-       			$current, 
-       			"processorAssignments",
-        		lv_processorAssignments_15_0, 
-        		"UiVisibilityProcessorAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_16='}' 
-    {
-    	newLeafNode(otherlv_16, grammarAccess.getUiMobileSearchPanelAccess().getRightCurlyBracketKeyword_11());
-    }
-)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiMobileTabSheet
-entryRuleUiMobileTabSheet returns [EObject current=null] 
-	:
+entryRuleUiMobileTabSheet returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiMobileTabSheetRule()); }
-	 iv_ruleUiMobileTabSheet=ruleUiMobileTabSheet 
-	 { $current=$iv_ruleUiMobileTabSheet.current; } 
-	 EOF 
-;
+	iv_ruleUiMobileTabSheet=ruleUiMobileTabSheet
+	{ $current=$iv_ruleUiMobileTabSheet.current; }
+	EOF;
 
 // Rule UiMobileTabSheet
-ruleUiMobileTabSheet returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUiMobileTabSheetAccess().getUiMobileTabSheetAction_0(),
-            $current);
-    }
-)	otherlv_1='mobileTab' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiMobileTabSheetAccess().getMobileTabKeyword_1());
-    }
-(	otherlv_2='(' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getUiMobileTabSheetAccess().getLeftParenthesisKeyword_2_0());
-    }
-(
-
-(
-	{ 
-	  getUnorderedGroupHelper().enter(grammarAccess.getUiMobileTabSheetAccess().getUnorderedGroup_2_1());
-	}
+ruleUiMobileTabSheet returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
 	(
 		(
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileTabSheetAccess().getUnorderedGroup_2_1(), 0)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiMobileTabSheetAccess().getUnorderedGroup_2_1(), 0);
-	 				}
-					({true}?=>(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileTabSheetAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0()); 
-	    }
-		lv_i18nInfo_4_0=ruleUiI18nInfo		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileTabSheetRule());
-	        }
-       		set(
-       			$current, 
-       			"i18nInfo",
-        		lv_i18nInfo_4_0, 
-        		"UiI18nInfo");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileTabSheetAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileTabSheetAccess().getUnorderedGroup_2_1(), 1)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiMobileTabSheetAccess().getUnorderedGroup_2_1(), 1);
-	 				}
-					({true}?=>(	otherlv_5='styles' 
-    {
-    	newLeafNode(otherlv_5, grammarAccess.getUiMobileTabSheetAccess().getStylesKeyword_2_1_1_0());
-    }
-(
-(
-		lv_styles_6_0=RULE_STRING
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiMobileTabSheetAccess().getUiMobileTabSheetAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='mobileTab'
 		{
-			newLeafNode(lv_styles_6_0, grammarAccess.getUiMobileTabSheetAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0()); 
+			newLeafNode(otherlv_1, grammarAccess.getUiMobileTabSheetAccess().getMobileTabKeyword_1());
 		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiMobileTabSheetRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"styles",
-        		lv_styles_6_0, 
-        		"STRING");
-	    }
-
-)
-)))
+		(
+			otherlv_2='('
+			{
+				newLeafNode(otherlv_2, grammarAccess.getUiMobileTabSheetAccess().getLeftParenthesisKeyword_2_0());
+			}
+			(
+				(
 					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileTabSheetAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  
-
-		)*	
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiMobileTabSheetAccess().getUnorderedGroup_2_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileTabSheetAccess().getUnorderedGroup_2_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiMobileTabSheetAccess().getUnorderedGroup_2_1(), 0);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getUiMobileTabSheetAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+										}
+										lv_i18nInfo_4_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiMobileTabSheetRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_4_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileTabSheetAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileTabSheetAccess().getUnorderedGroup_2_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiMobileTabSheetAccess().getUnorderedGroup_2_1(), 1);
+						}
+									({true}?=>(otherlv_5='styles'
+									{
+										newLeafNode(otherlv_5, grammarAccess.getUiMobileTabSheetAccess().getStylesKeyword_2_1_1_0());
+									}
+									(
+										(
+											lv_styles_6_0=RULE_STRING
+											{
+												newLeafNode(lv_styles_6_0, grammarAccess.getUiMobileTabSheetAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiMobileTabSheetRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"styles",
+													lv_styles_6_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileTabSheetAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)
+						)*
+					)
+				)
+					{ 
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiMobileTabSheetAccess().getUnorderedGroup_2_1());
+					}
+			)
+			otherlv_7=')'
+			{
+				newLeafNode(otherlv_7, grammarAccess.getUiMobileTabSheetAccess().getRightParenthesisKeyword_2_2());
+			}
+		)?
+		(
+			(
+				lv_name_8_0=RULE_ID
+				{
+					newLeafNode(lv_name_8_0, grammarAccess.getUiMobileTabSheetAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiMobileTabSheetRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_8_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		otherlv_9='{'
+		{
+			newLeafNode(otherlv_9, grammarAccess.getUiMobileTabSheetAccess().getLeftCurlyBracketKeyword_4());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiMobileTabSheetAccess().getTabsUiMobileTabAssignmentParserRuleCall_5_0());
+				}
+				lv_tabs_10_0=ruleUiMobileTabAssignment
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiMobileTabSheetRule());
+					}
+					add(
+						$current,
+						"tabs",
+						lv_tabs_10_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileTabAssignment");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiMobileTabSheetAccess().getBindingsUiBindingParserRuleCall_6_0());
+				}
+				lv_bindings_11_0=ruleUiBinding
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiMobileTabSheetRule());
+					}
+					add(
+						$current,
+						"bindings",
+						lv_bindings_11_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiMobileTabSheetAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0());
+				}
+				lv_processorAssignments_12_0=ruleUiVisibilityProcessorAssignment
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiMobileTabSheetRule());
+					}
+					add(
+						$current,
+						"processorAssignments",
+						lv_processorAssignments_12_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		otherlv_13='}'
+		{
+			newLeafNode(otherlv_13, grammarAccess.getUiMobileTabSheetAccess().getRightCurlyBracketKeyword_8());
+		}
 	)
-)
-	{ 
-	  getUnorderedGroupHelper().leave(grammarAccess.getUiMobileTabSheetAccess().getUnorderedGroup_2_1());
-	}
-
-)	otherlv_7=')' 
-    {
-    	newLeafNode(otherlv_7, grammarAccess.getUiMobileTabSheetAccess().getRightParenthesisKeyword_2_2());
-    }
-)?(
-(
-		lv_name_8_0=RULE_ID
-		{
-			newLeafNode(lv_name_8_0, grammarAccess.getUiMobileTabSheetAccess().getNameIDTerminalRuleCall_3_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiMobileTabSheetRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"name",
-        		lv_name_8_0, 
-        		"ID");
-	    }
-
-)
-)?	otherlv_9='{' 
-    {
-    	newLeafNode(otherlv_9, grammarAccess.getUiMobileTabSheetAccess().getLeftCurlyBracketKeyword_4());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileTabSheetAccess().getTabsUiMobileTabAssignmentParserRuleCall_5_0()); 
-	    }
-		lv_tabs_10_0=ruleUiMobileTabAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileTabSheetRule());
-	        }
-       		add(
-       			$current, 
-       			"tabs",
-        		lv_tabs_10_0, 
-        		"UiMobileTabAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileTabSheetAccess().getBindingsUiBindingParserRuleCall_6_0()); 
-	    }
-		lv_bindings_11_0=ruleUiBinding		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileTabSheetRule());
-	        }
-       		add(
-       			$current, 
-       			"bindings",
-        		lv_bindings_11_0, 
-        		"UiBinding");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileTabSheetAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0()); 
-	    }
-		lv_processorAssignments_12_0=ruleUiVisibilityProcessorAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileTabSheetRule());
-	        }
-       		add(
-       			$current, 
-       			"processorAssignments",
-        		lv_processorAssignments_12_0, 
-        		"UiVisibilityProcessorAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_13='}' 
-    {
-    	newLeafNode(otherlv_13, grammarAccess.getUiMobileTabSheetAccess().getRightCurlyBracketKeyword_8());
-    }
-)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiMobileTabAssignment
-entryRuleUiMobileTabAssignment returns [EObject current=null] 
-	:
+entryRuleUiMobileTabAssignment returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiMobileTabAssignmentRule()); }
-	 iv_ruleUiMobileTabAssignment=ruleUiMobileTabAssignment 
-	 { $current=$iv_ruleUiMobileTabAssignment.current; } 
-	 EOF 
-;
+	iv_ruleUiMobileTabAssignment=ruleUiMobileTabAssignment
+	{ $current=$iv_ruleUiMobileTabAssignment.current; }
+	EOF;
 
 // Rule UiMobileTabAssignment
-ruleUiMobileTabAssignment returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='tab' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getUiMobileTabAssignmentAccess().getTabKeyword_0());
-    }
-(
-(
-		lv_name_1_0=RULE_ID
+ruleUiMobileTabAssignment returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='tab'
 		{
-			newLeafNode(lv_name_1_0, grammarAccess.getUiMobileTabAssignmentAccess().getNameIDTerminalRuleCall_1_0()); 
+			newLeafNode(otherlv_0, grammarAccess.getUiMobileTabAssignmentAccess().getTabKeyword_0());
 		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiMobileTabAssignmentRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"name",
-        		lv_name_1_0, 
-        		"ID");
-	    }
-
-)
-)?(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileTabAssignmentAccess().getElementUiMobileEmbeddableParserRuleCall_2_0()); 
-	    }
-		lv_element_2_0=ruleUiMobileEmbeddable		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileTabAssignmentRule());
-	        }
-       		set(
-       			$current, 
-       			"element",
-        		lv_element_2_0, 
-        		"UiMobileEmbeddable");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
+		(
+			(
+				lv_name_1_0=RULE_ID
+				{
+					newLeafNode(lv_name_1_0, grammarAccess.getUiMobileTabAssignmentAccess().getNameIDTerminalRuleCall_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiMobileTabAssignmentRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_1_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiMobileTabAssignmentAccess().getElementUiMobileEmbeddableParserRuleCall_2_0());
+				}
+				lv_element_2_0=ruleUiMobileEmbeddable
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiMobileTabAssignmentRule());
+					}
+					set(
+						$current,
+						"element",
+						lv_element_2_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileEmbeddable");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiTabSheet
-entryRuleUiTabSheet returns [EObject current=null] 
-	:
+entryRuleUiTabSheet returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiTabSheetRule()); }
-	 iv_ruleUiTabSheet=ruleUiTabSheet 
-	 { $current=$iv_ruleUiTabSheet.current; } 
-	 EOF 
-;
+	iv_ruleUiTabSheet=ruleUiTabSheet
+	{ $current=$iv_ruleUiTabSheet.current; }
+	EOF;
 
 // Rule UiTabSheet
-ruleUiTabSheet returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUiTabSheetAccess().getUiTabSheetAction_0(),
-            $current);
-    }
-)	otherlv_1='tabsheet' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiTabSheetAccess().getTabsheetKeyword_1());
-    }
-(	otherlv_2='(' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getUiTabSheetAccess().getLeftParenthesisKeyword_2_0());
-    }
-(
-
-(
-	{ 
-	  getUnorderedGroupHelper().enter(grammarAccess.getUiTabSheetAccess().getUnorderedGroup_2_1());
-	}
+ruleUiTabSheet returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
 	(
 		(
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTabSheetAccess().getUnorderedGroup_2_1(), 0)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiTabSheetAccess().getUnorderedGroup_2_1(), 0);
-	 				}
-					({true}?=>(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiTabSheetAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0()); 
-	    }
-		lv_i18nInfo_4_0=ruleUiI18nInfo		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiTabSheetRule());
-	        }
-       		set(
-       			$current, 
-       			"i18nInfo",
-        		lv_i18nInfo_4_0, 
-        		"UiI18nInfo");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTabSheetAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTabSheetAccess().getUnorderedGroup_2_1(), 1)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiTabSheetAccess().getUnorderedGroup_2_1(), 1);
-	 				}
-					({true}?=>(	otherlv_5='styles' 
-    {
-    	newLeafNode(otherlv_5, grammarAccess.getUiTabSheetAccess().getStylesKeyword_2_1_1_0());
-    }
-(
-(
-		lv_styles_6_0=RULE_STRING
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiTabSheetAccess().getUiTabSheetAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='tabsheet'
 		{
-			newLeafNode(lv_styles_6_0, grammarAccess.getUiTabSheetAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0()); 
+			newLeafNode(otherlv_1, grammarAccess.getUiTabSheetAccess().getTabsheetKeyword_1());
 		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiTabSheetRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"styles",
-        		lv_styles_6_0, 
-        		"STRING");
-	    }
-
-)
-)))
+		(
+			otherlv_2='('
+			{
+				newLeafNode(otherlv_2, grammarAccess.getUiTabSheetAccess().getLeftParenthesisKeyword_2_0());
+			}
+			(
+				(
 					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTabSheetAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  
-
-		)*	
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiTabSheetAccess().getUnorderedGroup_2_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTabSheetAccess().getUnorderedGroup_2_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiTabSheetAccess().getUnorderedGroup_2_1(), 0);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getUiTabSheetAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+										}
+										lv_i18nInfo_4_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiTabSheetRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_4_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTabSheetAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTabSheetAccess().getUnorderedGroup_2_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiTabSheetAccess().getUnorderedGroup_2_1(), 1);
+						}
+									({true}?=>(otherlv_5='styles'
+									{
+										newLeafNode(otherlv_5, grammarAccess.getUiTabSheetAccess().getStylesKeyword_2_1_1_0());
+									}
+									(
+										(
+											lv_styles_6_0=RULE_STRING
+											{
+												newLeafNode(lv_styles_6_0, grammarAccess.getUiTabSheetAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiTabSheetRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"styles",
+													lv_styles_6_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTabSheetAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)
+						)*
+					)
+				)
+					{ 
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiTabSheetAccess().getUnorderedGroup_2_1());
+					}
+			)
+			otherlv_7=')'
+			{
+				newLeafNode(otherlv_7, grammarAccess.getUiTabSheetAccess().getRightParenthesisKeyword_2_2());
+			}
+		)?
+		(
+			(
+				lv_name_8_0=RULE_ID
+				{
+					newLeafNode(lv_name_8_0, grammarAccess.getUiTabSheetAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiTabSheetRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_8_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		otherlv_9='{'
+		{
+			newLeafNode(otherlv_9, grammarAccess.getUiTabSheetAccess().getLeftCurlyBracketKeyword_4());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiTabSheetAccess().getTabsUiTabAssignmentParserRuleCall_5_0());
+				}
+				lv_tabs_10_0=ruleUiTabAssignment
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiTabSheetRule());
+					}
+					add(
+						$current,
+						"tabs",
+						lv_tabs_10_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiTabAssignment");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiTabSheetAccess().getBindingsUiBindingParserRuleCall_6_0());
+				}
+				lv_bindings_11_0=ruleUiBinding
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiTabSheetRule());
+					}
+					add(
+						$current,
+						"bindings",
+						lv_bindings_11_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiTabSheetAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0());
+				}
+				lv_processorAssignments_12_0=ruleUiVisibilityProcessorAssignment
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiTabSheetRule());
+					}
+					add(
+						$current,
+						"processorAssignments",
+						lv_processorAssignments_12_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		otherlv_13='}'
+		{
+			newLeafNode(otherlv_13, grammarAccess.getUiTabSheetAccess().getRightCurlyBracketKeyword_8());
+		}
 	)
-)
-	{ 
-	  getUnorderedGroupHelper().leave(grammarAccess.getUiTabSheetAccess().getUnorderedGroup_2_1());
-	}
-
-)	otherlv_7=')' 
-    {
-    	newLeafNode(otherlv_7, grammarAccess.getUiTabSheetAccess().getRightParenthesisKeyword_2_2());
-    }
-)?(
-(
-		lv_name_8_0=RULE_ID
-		{
-			newLeafNode(lv_name_8_0, grammarAccess.getUiTabSheetAccess().getNameIDTerminalRuleCall_3_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiTabSheetRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"name",
-        		lv_name_8_0, 
-        		"ID");
-	    }
-
-)
-)?	otherlv_9='{' 
-    {
-    	newLeafNode(otherlv_9, grammarAccess.getUiTabSheetAccess().getLeftCurlyBracketKeyword_4());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiTabSheetAccess().getTabsUiTabAssignmentParserRuleCall_5_0()); 
-	    }
-		lv_tabs_10_0=ruleUiTabAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiTabSheetRule());
-	        }
-       		add(
-       			$current, 
-       			"tabs",
-        		lv_tabs_10_0, 
-        		"UiTabAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiTabSheetAccess().getBindingsUiBindingParserRuleCall_6_0()); 
-	    }
-		lv_bindings_11_0=ruleUiBinding		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiTabSheetRule());
-	        }
-       		add(
-       			$current, 
-       			"bindings",
-        		lv_bindings_11_0, 
-        		"UiBinding");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiTabSheetAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0()); 
-	    }
-		lv_processorAssignments_12_0=ruleUiVisibilityProcessorAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiTabSheetRule());
-	        }
-       		add(
-       			$current, 
-       			"processorAssignments",
-        		lv_processorAssignments_12_0, 
-        		"UiVisibilityProcessorAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_13='}' 
-    {
-    	newLeafNode(otherlv_13, grammarAccess.getUiTabSheetAccess().getRightCurlyBracketKeyword_8());
-    }
-)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiTabAssignment
-entryRuleUiTabAssignment returns [EObject current=null] 
-	:
+entryRuleUiTabAssignment returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiTabAssignmentRule()); }
-	 iv_ruleUiTabAssignment=ruleUiTabAssignment 
-	 { $current=$iv_ruleUiTabAssignment.current; } 
-	 EOF 
-;
+	iv_ruleUiTabAssignment=ruleUiTabAssignment
+	{ $current=$iv_ruleUiTabAssignment.current; }
+	EOF;
 
 // Rule UiTabAssignment
-ruleUiTabAssignment returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='tab' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getUiTabAssignmentAccess().getTabKeyword_0());
-    }
-(
-(
-		lv_name_1_0=RULE_ID
+ruleUiTabAssignment returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='tab'
 		{
-			newLeafNode(lv_name_1_0, grammarAccess.getUiTabAssignmentAccess().getNameIDTerminalRuleCall_1_0()); 
+			newLeafNode(otherlv_0, grammarAccess.getUiTabAssignmentAccess().getTabKeyword_0());
 		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiTabAssignmentRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"name",
-        		lv_name_1_0, 
-        		"ID");
-	    }
-
-)
-)?(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiTabAssignmentAccess().getElementUiEmbeddableParserRuleCall_2_0()); 
-	    }
-		lv_element_2_0=ruleUiEmbeddable		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiTabAssignmentRule());
-	        }
-       		set(
-       			$current, 
-       			"element",
-        		lv_element_2_0, 
-        		"UiEmbeddable");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
+		(
+			(
+				lv_name_1_0=RULE_ID
+				{
+					newLeafNode(lv_name_1_0, grammarAccess.getUiTabAssignmentAccess().getNameIDTerminalRuleCall_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiTabAssignmentRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_1_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiTabAssignmentAccess().getElementUiEmbeddableParserRuleCall_2_0());
+				}
+				lv_element_2_0=ruleUiEmbeddable
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiTabAssignmentRule());
+					}
+					set(
+						$current,
+						"element",
+						lv_element_2_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiEmbeddable");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiSplitpanel
-entryRuleUiSplitpanel returns [EObject current=null] 
-	:
+entryRuleUiSplitpanel returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiSplitpanelRule()); }
-	 iv_ruleUiSplitpanel=ruleUiSplitpanel 
-	 { $current=$iv_ruleUiSplitpanel.current; } 
-	 EOF 
-;
+	iv_ruleUiSplitpanel=ruleUiSplitpanel
+	{ $current=$iv_ruleUiSplitpanel.current; }
+	EOF;
 
 // Rule UiSplitpanel
-ruleUiSplitpanel returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='splitter' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getUiSplitpanelAccess().getSplitterKeyword_0());
-    }
-(
-
-(
-	{ 
-	  getUnorderedGroupHelper().enter(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_1());
-	}
+ruleUiSplitpanel returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
 	(
+		otherlv_0='splitter'
+		{
+			newLeafNode(otherlv_0, grammarAccess.getUiSplitpanelAccess().getSplitterKeyword_0());
+		}
 		(
-
-			( 
+			(
+				{ 
+				  getUnorderedGroupHelper().enter(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_1());
+				}
+				(
+					(
+			(
 				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_1(), 0)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_1(), 0);
+					}
+								({true}?=>(otherlv_2='('
+								{
+									newLeafNode(otherlv_2, grammarAccess.getUiSplitpanelAccess().getLeftParenthesisKeyword_1_0_0());
+								}
+								(
+									(
+										{
+											newCompositeNode(grammarAccess.getUiSplitpanelAccess().getI18nInfoUiI18nInfoParserRuleCall_1_0_1_0());
+										}
+										lv_i18nInfo_3_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiSplitpanelRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_3_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+								)?
+								))
 					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_1(), 0);
-	 				}
-					({true}?=>(	otherlv_2='(' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getUiSplitpanelAccess().getLeftParenthesisKeyword_1_0_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiSplitpanelAccess().getI18nInfoUiI18nInfoParserRuleCall_1_0_1_0()); 
-	    }
-		lv_i18nInfo_3_0=ruleUiI18nInfo		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiSplitpanelRule());
-	        }
-       		set(
-       			$current, 
-       			"i18nInfo",
-        		lv_i18nInfo_3_0, 
-        		"UiI18nInfo");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)?))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_1());
-	 				}
- 				)
-			)  |
-
-			( 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_1());
+					}
+				)
+			)|
+			(
 				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_1(), 1)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_1(), 1);
+					}
+								({true}?=>((
+									otherlv_4='styles'
+									{
+										newLeafNode(otherlv_4, grammarAccess.getUiSplitpanelAccess().getStylesKeyword_1_1_0_0());
+									}
+									(
+										(
+											lv_styles_5_0=RULE_STRING
+											{
+												newLeafNode(lv_styles_5_0, grammarAccess.getUiSplitpanelAccess().getStylesSTRINGTerminalRuleCall_1_1_0_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiSplitpanelRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"styles",
+													lv_styles_5_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+								)?
+								otherlv_6=')'
+								{
+									newLeafNode(otherlv_6, grammarAccess.getUiSplitpanelAccess().getRightParenthesisKeyword_1_1_1());
+								}
+								))
 					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_1(), 1);
-	 				}
-					({true}?=>((	otherlv_4='styles' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getUiSplitpanelAccess().getStylesKeyword_1_1_0_0());
-    }
-(
-(
-		lv_styles_5_0=RULE_STRING
-		{
-			newLeafNode(lv_styles_5_0, grammarAccess.getUiSplitpanelAccess().getStylesSTRINGTerminalRuleCall_1_1_0_1_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiSplitpanelRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"styles",
-        		lv_styles_5_0, 
-        		"STRING");
-	    }
-
-)
-))?	otherlv_6=')' 
-    {
-    	newLeafNode(otherlv_6, grammarAccess.getUiSplitpanelAccess().getRightParenthesisKeyword_1_1_1());
-    }
-))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_1());
-	 				}
- 				)
-			)  
-
-		)+
-	  	{getUnorderedGroupHelper().canLeave(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_1())}?	
-	)
-)
-	{ 
-	  getUnorderedGroupHelper().leave(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_1());
-	}
-
-)?(
-(
-		lv_name_7_0=RULE_ID
-		{
-			newLeafNode(lv_name_7_0, grammarAccess.getUiSplitpanelAccess().getNameIDTerminalRuleCall_2_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiSplitpanelRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"name",
-        		lv_name_7_0, 
-        		"ID");
-	    }
-
-)
-)	otherlv_8='{' 
-    {
-    	newLeafNode(otherlv_8, grammarAccess.getUiSplitpanelAccess().getLeftCurlyBracketKeyword_3());
-    }
-(
-
-(
-	{ 
-	  getUnorderedGroupHelper().enter(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4());
-	}
-	(
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_1());
+					}
+				)
+			)
+					)+
+					{getUnorderedGroupHelper().canLeave(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_1())}?
+				)
+			)
+				{ 
+				  getUnorderedGroupHelper().leave(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_1());
+				}
+		)?
 		(
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4(), 0)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4(), 0);
-	 				}
-					({true}?=>(	otherlv_10='first' 
-    {
-    	newLeafNode(otherlv_10, grammarAccess.getUiSplitpanelAccess().getFirstKeyword_4_0_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiSplitpanelAccess().getFirstContentUiSplitpanelAssigmentParserRuleCall_4_0_1_0()); 
-	    }
-		lv_firstContent_11_0=ruleUiSplitpanelAssigment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiSplitpanelRule());
-	        }
-       		set(
-       			$current, 
-       			"firstContent",
-        		lv_firstContent_11_0, 
-        		"UiSplitpanelAssigment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4(), 1)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4(), 1);
-	 				}
-					({true}?=>(	otherlv_12='second' 
-    {
-    	newLeafNode(otherlv_12, grammarAccess.getUiSplitpanelAccess().getSecondKeyword_4_1_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiSplitpanelAccess().getSecondContentUiSplitpanelAssigmentParserRuleCall_4_1_1_0()); 
-	    }
-		lv_secondContent_13_0=ruleUiSplitpanelAssigment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiSplitpanelRule());
-	        }
-       		set(
-       			$current, 
-       			"secondContent",
-        		lv_secondContent_13_0, 
-        		"UiSplitpanelAssigment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4(), 2)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4(), 2);
-	 				}
-					({true}?=>(	otherlv_14='splitPos' 
-    {
-    	newLeafNode(otherlv_14, grammarAccess.getUiSplitpanelAccess().getSplitPosKeyword_4_2_0());
-    }
-(
-(
-		lv_splitPosition_15_0=RULE_INT
+			(
+				lv_name_7_0=RULE_ID
+				{
+					newLeafNode(lv_name_7_0, grammarAccess.getUiSplitpanelAccess().getNameIDTerminalRuleCall_2_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiSplitpanelRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_7_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)
+		otherlv_8='{'
 		{
-			newLeafNode(lv_splitPosition_15_0, grammarAccess.getUiSplitpanelAccess().getSplitPositionINTTerminalRuleCall_4_2_1_0()); 
+			newLeafNode(otherlv_8, grammarAccess.getUiSplitpanelAccess().getLeftCurlyBracketKeyword_3());
 		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiSplitpanelRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"splitPosition",
-        		lv_splitPosition_15_0, 
-        		"INT");
-	    }
-
-)
-)))
+		(
+			(
+				{ 
+				  getUnorderedGroupHelper().enter(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4());
+				}
+				(
+					(
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4(), 0)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4(), 0);
+					}
+								({true}?=>(otherlv_10='first'
+								{
+									newLeafNode(otherlv_10, grammarAccess.getUiSplitpanelAccess().getFirstKeyword_4_0_0());
+								}
+								(
+									(
+										{
+											newCompositeNode(grammarAccess.getUiSplitpanelAccess().getFirstContentUiSplitpanelAssigmentParserRuleCall_4_0_1_0());
+										}
+										lv_firstContent_11_0=ruleUiSplitpanelAssigment
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiSplitpanelRule());
+											}
+											set(
+												$current,
+												"firstContent",
+												lv_firstContent_11_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiSplitpanelAssigment");
+											afterParserOrEnumRuleCall();
+										}
+									)
+								)
+								))
 					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4());
-	 				}
- 				)
-			)  |
-
-			( 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4());
+					}
+				)
+			)|
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4(), 1)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4(), 1);
+					}
+								({true}?=>(otherlv_12='second'
+								{
+									newLeafNode(otherlv_12, grammarAccess.getUiSplitpanelAccess().getSecondKeyword_4_1_0());
+								}
+								(
+									(
+										{
+											newCompositeNode(grammarAccess.getUiSplitpanelAccess().getSecondContentUiSplitpanelAssigmentParserRuleCall_4_1_1_0());
+										}
+										lv_secondContent_13_0=ruleUiSplitpanelAssigment
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiSplitpanelRule());
+											}
+											set(
+												$current,
+												"secondContent",
+												lv_secondContent_13_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiSplitpanelAssigment");
+											afterParserOrEnumRuleCall();
+										}
+									)
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4());
+					}
+				)
+			)|
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4(), 2)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4(), 2);
+					}
+								({true}?=>(otherlv_14='splitPos'
+								{
+									newLeafNode(otherlv_14, grammarAccess.getUiSplitpanelAccess().getSplitPosKeyword_4_2_0());
+								}
+								(
+									(
+										lv_splitPosition_15_0=RULE_INT
+										{
+											newLeafNode(lv_splitPosition_15_0, grammarAccess.getUiSplitpanelAccess().getSplitPositionINTTerminalRuleCall_4_2_1_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiSplitpanelRule());
+											}
+											setWithLastConsumed(
+												$current,
+												"splitPosition",
+												lv_splitPosition_15_0,
+												"org.eclipse.xtext.xbase.Xbase.INT");
+										}
+									)
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4());
+					}
+				)
+			)|
+			(
 				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4(), 3)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4(), 3);
+					}
+								({true}?=>((
+									lv_readonly_16_0='readonly'
+									{
+										newLeafNode(lv_readonly_16_0, grammarAccess.getUiSplitpanelAccess().getReadonlyReadonlyKeyword_4_3_0());
+									}
+									{
+										if ($current==null) {
+											$current = createModelElement(grammarAccess.getUiSplitpanelRule());
+										}
+										setWithLastConsumed($current, "readonly", true, "readonly");
+									}
+								)
+								))
 					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4(), 3);
-	 				}
-					({true}?=>(
-(
-		lv_readonly_16_0=	'readonly' 
-    {
-        newLeafNode(lv_readonly_16_0, grammarAccess.getUiSplitpanelAccess().getReadonlyReadonlyKeyword_4_3_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiSplitpanelRule());
-	        }
-       		setWithLastConsumed($current, "readonly", true, "readonly");
-	    }
-
-)
-))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4());
-	 				}
- 				)
-			)  
-
-		)+
-	  	{getUnorderedGroupHelper().canLeave(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4())}?	
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4());
+					}
+				)
+			)
+					)+
+					{getUnorderedGroupHelper().canLeave(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4())}?
+				)
+			)
+				{ 
+				  getUnorderedGroupHelper().leave(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4());
+				}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiSplitpanelAccess().getBindingsUiBindingParserRuleCall_5_0());
+				}
+				lv_bindings_17_0=ruleUiBinding
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiSplitpanelRule());
+					}
+					add(
+						$current,
+						"bindings",
+						lv_bindings_17_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiSplitpanelAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_6_0());
+				}
+				lv_processorAssignments_18_0=ruleUiVisibilityProcessorAssignment
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiSplitpanelRule());
+					}
+					add(
+						$current,
+						"processorAssignments",
+						lv_processorAssignments_18_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		otherlv_19='}'
+		{
+			newLeafNode(otherlv_19, grammarAccess.getUiSplitpanelAccess().getRightCurlyBracketKeyword_7());
+		}
 	)
-)
-	{ 
-	  getUnorderedGroupHelper().leave(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4());
-	}
-
-)(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiSplitpanelAccess().getBindingsUiBindingParserRuleCall_5_0()); 
-	    }
-		lv_bindings_17_0=ruleUiBinding		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiSplitpanelRule());
-	        }
-       		add(
-       			$current, 
-       			"bindings",
-        		lv_bindings_17_0, 
-        		"UiBinding");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiSplitpanelAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_6_0()); 
-	    }
-		lv_processorAssignments_18_0=ruleUiVisibilityProcessorAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiSplitpanelRule());
-	        }
-       		add(
-       			$current, 
-       			"processorAssignments",
-        		lv_processorAssignments_18_0, 
-        		"UiVisibilityProcessorAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_19='}' 
-    {
-    	newLeafNode(otherlv_19, grammarAccess.getUiSplitpanelAccess().getRightCurlyBracketKeyword_7());
-    }
-)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiSplitpanelAssigment
-entryRuleUiSplitpanelAssigment returns [EObject current=null] 
-	:
+entryRuleUiSplitpanelAssigment returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiSplitpanelAssigmentRule()); }
-	 iv_ruleUiSplitpanelAssigment=ruleUiSplitpanelAssigment 
-	 { $current=$iv_ruleUiSplitpanelAssigment.current; } 
-	 EOF 
-;
+	iv_ruleUiSplitpanelAssigment=ruleUiSplitpanelAssigment
+	{ $current=$iv_ruleUiSplitpanelAssigment.current; }
+	EOF;
 
 // Rule UiSplitpanelAssigment
-ruleUiSplitpanelAssigment returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiSplitpanelAssigmentAccess().getElementUiEmbeddableParserRuleCall_0()); 
-	    }
-		lv_element_0_0=ruleUiEmbeddable		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiSplitpanelAssigmentRule());
-	        }
-       		set(
-       			$current, 
-       			"element",
-        		lv_element_0_0, 
-        		"UiEmbeddable");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
+ruleUiSplitpanelAssigment returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				newCompositeNode(grammarAccess.getUiSplitpanelAssigmentAccess().getElementUiEmbeddableParserRuleCall_0());
+			}
+			lv_element_0_0=ruleUiEmbeddable
+			{
+				if ($current==null) {
+					$current = createModelElementForParent(grammarAccess.getUiSplitpanelAssigmentRule());
+				}
+				set(
+					$current,
+					"element",
+					lv_element_0_0,
+					"org.eclipse.osbp.ecview.dsl.UIGrammar.UiEmbeddable");
+				afterParserOrEnumRuleCall();
+			}
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiPanel
-entryRuleUiPanel returns [EObject current=null] 
-	:
+entryRuleUiPanel returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiPanelRule()); }
-	 iv_ruleUiPanel=ruleUiPanel 
-	 { $current=$iv_ruleUiPanel.current; } 
-	 EOF 
-;
+	iv_ruleUiPanel=ruleUiPanel
+	{ $current=$iv_ruleUiPanel.current; }
+	EOF;
 
 // Rule UiPanel
-ruleUiPanel returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='panel' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getUiPanelAccess().getPanelKeyword_0());
-    }
-(	otherlv_1='(' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiPanelAccess().getLeftParenthesisKeyword_1_0());
-    }
-(
-
-(
-	{ 
-	  getUnorderedGroupHelper().enter(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1());
-	}
+ruleUiPanel returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
 	(
+		otherlv_0='panel'
+		{
+			newLeafNode(otherlv_0, grammarAccess.getUiPanelAccess().getPanelKeyword_0());
+		}
 		(
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1(), 0)}?=>(
+			otherlv_1='('
+			{
+				newLeafNode(otherlv_1, grammarAccess.getUiPanelAccess().getLeftParenthesisKeyword_1_0());
+			}
+			(
+				(
 					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1(), 0);
-	 				}
-					({true}?=>(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiPanelAccess().getI18nInfoUiI18nInfoParserRuleCall_1_1_0_0()); 
-	    }
-		lv_i18nInfo_3_0=ruleUiI18nInfo		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiPanelRule());
-	        }
-       		set(
-       			$current, 
-       			"i18nInfo",
-        		lv_i18nInfo_3_0, 
-        		"UiI18nInfo");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1(), 0);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getUiPanelAccess().getI18nInfoUiI18nInfoParserRuleCall_1_1_0_0());
+										}
+										lv_i18nInfo_3_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiPanelRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_3_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1(), 1);
+						}
+									({true}?=>((
+										lv_readonly_4_0='readonly'
+										{
+											newLeafNode(lv_readonly_4_0, grammarAccess.getUiPanelAccess().getReadonlyReadonlyKeyword_1_1_1_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiPanelRule());
+											}
+											setWithLastConsumed($current, "readonly", true, "readonly");
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1(), 2)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1(), 2);
+						}
+									({true}?=>(otherlv_5='styles'
+									{
+										newLeafNode(otherlv_5, grammarAccess.getUiPanelAccess().getStylesKeyword_1_1_2_0());
+									}
+									(
+										(
+											lv_styles_6_0=RULE_STRING
+											{
+												newLeafNode(lv_styles_6_0, grammarAccess.getUiPanelAccess().getStylesSTRINGTerminalRuleCall_1_1_2_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiPanelRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"styles",
+													lv_styles_6_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1());
+						}
+					)
+				)
+						)*
+					)
+				)
 					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1(), 1)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1(), 1);
-	 				}
-					({true}?=>(
-(
-		lv_readonly_4_0=	'readonly' 
-    {
-        newLeafNode(lv_readonly_4_0, grammarAccess.getUiPanelAccess().getReadonlyReadonlyKeyword_1_1_1_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiPanelRule());
-	        }
-       		setWithLastConsumed($current, "readonly", true, "readonly");
-	    }
-
-)
-))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1(), 2)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1(), 2);
-	 				}
-					({true}?=>(	otherlv_5='styles' 
-    {
-    	newLeafNode(otherlv_5, grammarAccess.getUiPanelAccess().getStylesKeyword_1_1_2_0());
-    }
-(
-(
-		lv_styles_6_0=RULE_STRING
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1());
+					}
+			)
+			otherlv_7=')'
+			{
+				newLeafNode(otherlv_7, grammarAccess.getUiPanelAccess().getRightParenthesisKeyword_1_2());
+			}
+		)?
+		(
+			(
+				lv_name_8_0=RULE_ID
+				{
+					newLeafNode(lv_name_8_0, grammarAccess.getUiPanelAccess().getNameIDTerminalRuleCall_2_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiPanelRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_8_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)
+		otherlv_9='{'
 		{
-			newLeafNode(lv_styles_6_0, grammarAccess.getUiPanelAccess().getStylesSTRINGTerminalRuleCall_1_1_2_1_0()); 
+			newLeafNode(otherlv_9, grammarAccess.getUiPanelAccess().getLeftCurlyBracketKeyword_3());
 		}
+		otherlv_10='content'
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiPanelRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"styles",
-        		lv_styles_6_0, 
-        		"STRING");
-	    }
-
-)
-)))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1());
-	 				}
- 				)
-			)  
-
-		)*	
+			newLeafNode(otherlv_10, grammarAccess.getUiPanelAccess().getContentKeyword_4());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiPanelAccess().getContentUiEmbeddableParserRuleCall_5_0());
+				}
+				lv_content_11_0=ruleUiEmbeddable
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiPanelRule());
+					}
+					set(
+						$current,
+						"content",
+						lv_content_11_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiEmbeddable");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiPanelAccess().getBindingsUiBindingParserRuleCall_6_0());
+				}
+				lv_bindings_12_0=ruleUiBinding
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiPanelRule());
+					}
+					add(
+						$current,
+						"bindings",
+						lv_bindings_12_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiPanelAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0());
+				}
+				lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiPanelRule());
+					}
+					add(
+						$current,
+						"processorAssignments",
+						lv_processorAssignments_13_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		otherlv_14='}'
+		{
+			newLeafNode(otherlv_14, grammarAccess.getUiPanelAccess().getRightCurlyBracketKeyword_8());
+		}
 	)
-)
-	{ 
-	  getUnorderedGroupHelper().leave(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1());
-	}
-
-)	otherlv_7=')' 
-    {
-    	newLeafNode(otherlv_7, grammarAccess.getUiPanelAccess().getRightParenthesisKeyword_1_2());
-    }
-)?(
-(
-		lv_name_8_0=RULE_ID
-		{
-			newLeafNode(lv_name_8_0, grammarAccess.getUiPanelAccess().getNameIDTerminalRuleCall_2_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiPanelRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"name",
-        		lv_name_8_0, 
-        		"ID");
-	    }
-
-)
-)	otherlv_9='{' 
-    {
-    	newLeafNode(otherlv_9, grammarAccess.getUiPanelAccess().getLeftCurlyBracketKeyword_3());
-    }
-	otherlv_10='content' 
-    {
-    	newLeafNode(otherlv_10, grammarAccess.getUiPanelAccess().getContentKeyword_4());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiPanelAccess().getContentUiEmbeddableParserRuleCall_5_0()); 
-	    }
-		lv_content_11_0=ruleUiEmbeddable		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiPanelRule());
-	        }
-       		set(
-       			$current, 
-       			"content",
-        		lv_content_11_0, 
-        		"UiEmbeddable");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiPanelAccess().getBindingsUiBindingParserRuleCall_6_0()); 
-	    }
-		lv_bindings_12_0=ruleUiBinding		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiPanelRule());
-	        }
-       		add(
-       			$current, 
-       			"bindings",
-        		lv_bindings_12_0, 
-        		"UiBinding");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiPanelAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0()); 
-	    }
-		lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiPanelRule());
-	        }
-       		add(
-       			$current, 
-       			"processorAssignments",
-        		lv_processorAssignments_13_0, 
-        		"UiVisibilityProcessorAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_14='}' 
-    {
-    	newLeafNode(otherlv_14, grammarAccess.getUiPanelAccess().getRightCurlyBracketKeyword_8());
-    }
-)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiDialog
-entryRuleUiDialog returns [EObject current=null] 
-	:
+entryRuleUiDialog returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiDialogRule()); }
-	 iv_ruleUiDialog=ruleUiDialog 
-	 { $current=$iv_ruleUiDialog.current; } 
-	 EOF 
-;
+	iv_ruleUiDialog=ruleUiDialog
+	{ $current=$iv_ruleUiDialog.current; }
+	EOF;
 
 // Rule UiDialog
-ruleUiDialog returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUiDialogAccess().getUiDialogAction_0(),
-            $current);
-    }
-)	otherlv_1='dialog' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiDialogAccess().getDialogKeyword_1());
-    }
-(	otherlv_2='(' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getUiDialogAccess().getLeftParenthesisKeyword_2_0());
-    }
-(
-
-(
-	{ 
-	  getUnorderedGroupHelper().enter(grammarAccess.getUiDialogAccess().getUnorderedGroup_2_1());
-	}
+ruleUiDialog returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
 	(
 		(
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiDialogAccess().getUnorderedGroup_2_1(), 0)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiDialogAccess().getUnorderedGroup_2_1(), 0);
-	 				}
-					({true}?=>(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiDialogAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0()); 
-	    }
-		lv_i18nInfo_4_0=ruleUiI18nInfo		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiDialogRule());
-	        }
-       		set(
-       			$current, 
-       			"i18nInfo",
-        		lv_i18nInfo_4_0, 
-        		"UiI18nInfo");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDialogAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiDialogAccess().getUnorderedGroup_2_1(), 1)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiDialogAccess().getUnorderedGroup_2_1(), 1);
-	 				}
-					({true}?=>(	otherlv_5='styles' 
-    {
-    	newLeafNode(otherlv_5, grammarAccess.getUiDialogAccess().getStylesKeyword_2_1_1_0());
-    }
-(
-(
-		lv_styles_6_0=RULE_STRING
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiDialogAccess().getUiDialogAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='dialog'
 		{
-			newLeafNode(lv_styles_6_0, grammarAccess.getUiDialogAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0()); 
+			newLeafNode(otherlv_1, grammarAccess.getUiDialogAccess().getDialogKeyword_1());
 		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiDialogRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"styles",
-        		lv_styles_6_0, 
-        		"STRING");
-	    }
-
-)
-)))
+		(
+			otherlv_2='('
+			{
+				newLeafNode(otherlv_2, grammarAccess.getUiDialogAccess().getLeftParenthesisKeyword_2_0());
+			}
+			(
+				(
 					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDialogAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  
-
-		)*	
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiDialogAccess().getUnorderedGroup_2_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiDialogAccess().getUnorderedGroup_2_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiDialogAccess().getUnorderedGroup_2_1(), 0);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getUiDialogAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+										}
+										lv_i18nInfo_4_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiDialogRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_4_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDialogAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiDialogAccess().getUnorderedGroup_2_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiDialogAccess().getUnorderedGroup_2_1(), 1);
+						}
+									({true}?=>(otherlv_5='styles'
+									{
+										newLeafNode(otherlv_5, grammarAccess.getUiDialogAccess().getStylesKeyword_2_1_1_0());
+									}
+									(
+										(
+											lv_styles_6_0=RULE_STRING
+											{
+												newLeafNode(lv_styles_6_0, grammarAccess.getUiDialogAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiDialogRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"styles",
+													lv_styles_6_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDialogAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)
+						)*
+					)
+				)
+					{ 
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiDialogAccess().getUnorderedGroup_2_1());
+					}
+			)
+			otherlv_7=')'
+			{
+				newLeafNode(otherlv_7, grammarAccess.getUiDialogAccess().getRightParenthesisKeyword_2_2());
+			}
+		)?
+		(
+			(
+				lv_name_8_0=RULE_ID
+				{
+					newLeafNode(lv_name_8_0, grammarAccess.getUiDialogAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiDialogRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_8_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		otherlv_9='{'
+		{
+			newLeafNode(otherlv_9, grammarAccess.getUiDialogAccess().getLeftCurlyBracketKeyword_4());
+		}
+		(
+			otherlv_10='type'
+			{
+				newLeafNode(otherlv_10, grammarAccess.getUiDialogAccess().getTypeKeyword_5_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiDialogAccess().getJvmTypeJvmTypeReferenceParserRuleCall_5_1_0());
+					}
+					lv_jvmType_11_0=ruleJvmTypeReference
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiDialogRule());
+						}
+						set(
+							$current,
+							"jvmType",
+							lv_jvmType_11_0,
+							"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				otherlv_12=';'
+				{
+					newLeafNode(otherlv_12, grammarAccess.getUiDialogAccess().getSemicolonKeyword_5_2());
+				}
+			)?
+		)?
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiDialogAccess().getContentUiDialogAssignmentParserRuleCall_6_0_0());
+					}
+					lv_content_13_0=ruleUiDialogAssignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiDialogRule());
+						}
+						set(
+							$current,
+							"content",
+							lv_content_13_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiDialogAssignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				otherlv_14=';'
+				{
+					newLeafNode(otherlv_14, grammarAccess.getUiDialogAccess().getSemicolonKeyword_6_1());
+				}
+			)?
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiDialogAccess().getBindingsUiBindingParserRuleCall_7_0());
+				}
+				lv_bindings_15_0=ruleUiBinding
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiDialogRule());
+					}
+					add(
+						$current,
+						"bindings",
+						lv_bindings_15_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiDialogAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_8_0());
+				}
+				lv_processorAssignments_16_0=ruleUiVisibilityProcessorAssignment
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiDialogRule());
+					}
+					add(
+						$current,
+						"processorAssignments",
+						lv_processorAssignments_16_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		otherlv_17='}'
+		{
+			newLeafNode(otherlv_17, grammarAccess.getUiDialogAccess().getRightCurlyBracketKeyword_9());
+		}
 	)
-)
-	{ 
-	  getUnorderedGroupHelper().leave(grammarAccess.getUiDialogAccess().getUnorderedGroup_2_1());
-	}
-
-)	otherlv_7=')' 
-    {
-    	newLeafNode(otherlv_7, grammarAccess.getUiDialogAccess().getRightParenthesisKeyword_2_2());
-    }
-)?(
-(
-		lv_name_8_0=RULE_ID
-		{
-			newLeafNode(lv_name_8_0, grammarAccess.getUiDialogAccess().getNameIDTerminalRuleCall_3_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiDialogRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"name",
-        		lv_name_8_0, 
-        		"ID");
-	    }
-
-)
-)?	otherlv_9='{' 
-    {
-    	newLeafNode(otherlv_9, grammarAccess.getUiDialogAccess().getLeftCurlyBracketKeyword_4());
-    }
-(	otherlv_10='type' 
-    {
-    	newLeafNode(otherlv_10, grammarAccess.getUiDialogAccess().getTypeKeyword_5_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiDialogAccess().getJvmTypeJvmTypeReferenceParserRuleCall_5_1_0()); 
-	    }
-		lv_jvmType_11_0=ruleJvmTypeReference		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiDialogRule());
-	        }
-       		set(
-       			$current, 
-       			"jvmType",
-        		lv_jvmType_11_0, 
-        		"JvmTypeReference");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_12=';' 
-    {
-    	newLeafNode(otherlv_12, grammarAccess.getUiDialogAccess().getSemicolonKeyword_5_2());
-    }
-)?)?((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiDialogAccess().getContentUiDialogAssignmentParserRuleCall_6_0_0()); 
-	    }
-		lv_content_13_0=ruleUiDialogAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiDialogRule());
-	        }
-       		set(
-       			$current, 
-       			"content",
-        		lv_content_13_0, 
-        		"UiDialogAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_14=';' 
-    {
-    	newLeafNode(otherlv_14, grammarAccess.getUiDialogAccess().getSemicolonKeyword_6_1());
-    }
-)?)?(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiDialogAccess().getBindingsUiBindingParserRuleCall_7_0()); 
-	    }
-		lv_bindings_15_0=ruleUiBinding		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiDialogRule());
-	        }
-       		add(
-       			$current, 
-       			"bindings",
-        		lv_bindings_15_0, 
-        		"UiBinding");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiDialogAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_8_0()); 
-	    }
-		lv_processorAssignments_16_0=ruleUiVisibilityProcessorAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiDialogRule());
-	        }
-       		add(
-       			$current, 
-       			"processorAssignments",
-        		lv_processorAssignments_16_0, 
-        		"UiVisibilityProcessorAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_17='}' 
-    {
-    	newLeafNode(otherlv_17, grammarAccess.getUiDialogAccess().getRightCurlyBracketKeyword_9());
-    }
-)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiDialogAssignment
-entryRuleUiDialogAssignment returns [EObject current=null] 
-	:
+entryRuleUiDialogAssignment returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiDialogAssignmentRule()); }
-	 iv_ruleUiDialogAssignment=ruleUiDialogAssignment 
-	 { $current=$iv_ruleUiDialogAssignment.current; } 
-	 EOF 
-;
+	iv_ruleUiDialogAssignment=ruleUiDialogAssignment
+	{ $current=$iv_ruleUiDialogAssignment.current; }
+	EOF;
 
 // Rule UiDialogAssignment
-ruleUiDialogAssignment returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiDialogAssignmentAccess().getElementUiEmbeddableParserRuleCall_0()); 
-	    }
-		lv_element_0_0=ruleUiEmbeddable		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiDialogAssignmentRule());
-	        }
-       		set(
-       			$current, 
-       			"element",
-        		lv_element_0_0, 
-        		"UiEmbeddable");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
+ruleUiDialogAssignment returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				newCompositeNode(grammarAccess.getUiDialogAssignmentAccess().getElementUiEmbeddableParserRuleCall_0());
+			}
+			lv_element_0_0=ruleUiEmbeddable
+			{
+				if ($current==null) {
+					$current = createModelElementForParent(grammarAccess.getUiDialogAssignmentRule());
+				}
+				set(
+					$current,
+					"element",
+					lv_element_0_0,
+					"org.eclipse.osbp.ecview.dsl.UIGrammar.UiEmbeddable");
+				afterParserOrEnumRuleCall();
+			}
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiSearchDialog
-entryRuleUiSearchDialog returns [EObject current=null] 
-	:
+entryRuleUiSearchDialog returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiSearchDialogRule()); }
-	 iv_ruleUiSearchDialog=ruleUiSearchDialog 
-	 { $current=$iv_ruleUiSearchDialog.current; } 
-	 EOF 
-;
+	iv_ruleUiSearchDialog=ruleUiSearchDialog
+	{ $current=$iv_ruleUiSearchDialog.current; }
+	EOF;
 
 // Rule UiSearchDialog
-ruleUiSearchDialog returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUiSearchDialogAccess().getUiSearchDialogAction_0(),
-            $current);
-    }
-)	otherlv_1='searchdialog' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiSearchDialogAccess().getSearchdialogKeyword_1());
-    }
-(	otherlv_2='(' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getUiSearchDialogAccess().getLeftParenthesisKeyword_2_0());
-    }
-(
-
-(
-	{ 
-	  getUnorderedGroupHelper().enter(grammarAccess.getUiSearchDialogAccess().getUnorderedGroup_2_1());
-	}
+ruleUiSearchDialog returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
 	(
 		(
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSearchDialogAccess().getUnorderedGroup_2_1(), 0)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiSearchDialogAccess().getUnorderedGroup_2_1(), 0);
-	 				}
-					({true}?=>(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiSearchDialogAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0()); 
-	    }
-		lv_i18nInfo_4_0=ruleUiI18nInfo		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiSearchDialogRule());
-	        }
-       		set(
-       			$current, 
-       			"i18nInfo",
-        		lv_i18nInfo_4_0, 
-        		"UiI18nInfo");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSearchDialogAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSearchDialogAccess().getUnorderedGroup_2_1(), 1)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiSearchDialogAccess().getUnorderedGroup_2_1(), 1);
-	 				}
-					({true}?=>(	otherlv_5='styles' 
-    {
-    	newLeafNode(otherlv_5, grammarAccess.getUiSearchDialogAccess().getStylesKeyword_2_1_1_0());
-    }
-(
-(
-		lv_styles_6_0=RULE_STRING
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiSearchDialogAccess().getUiSearchDialogAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='searchdialog'
 		{
-			newLeafNode(lv_styles_6_0, grammarAccess.getUiSearchDialogAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0()); 
+			newLeafNode(otherlv_1, grammarAccess.getUiSearchDialogAccess().getSearchdialogKeyword_1());
 		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiSearchDialogRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"styles",
-        		lv_styles_6_0, 
-        		"STRING");
-	    }
-
-)
-)))
+		(
+			otherlv_2='('
+			{
+				newLeafNode(otherlv_2, grammarAccess.getUiSearchDialogAccess().getLeftParenthesisKeyword_2_0());
+			}
+			(
+				(
 					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSearchDialogAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  
-
-		)*	
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiSearchDialogAccess().getUnorderedGroup_2_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSearchDialogAccess().getUnorderedGroup_2_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiSearchDialogAccess().getUnorderedGroup_2_1(), 0);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getUiSearchDialogAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+										}
+										lv_i18nInfo_4_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiSearchDialogRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_4_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSearchDialogAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSearchDialogAccess().getUnorderedGroup_2_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiSearchDialogAccess().getUnorderedGroup_2_1(), 1);
+						}
+									({true}?=>(otherlv_5='styles'
+									{
+										newLeafNode(otherlv_5, grammarAccess.getUiSearchDialogAccess().getStylesKeyword_2_1_1_0());
+									}
+									(
+										(
+											lv_styles_6_0=RULE_STRING
+											{
+												newLeafNode(lv_styles_6_0, grammarAccess.getUiSearchDialogAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiSearchDialogRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"styles",
+													lv_styles_6_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSearchDialogAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)
+						)*
+					)
+				)
+					{ 
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiSearchDialogAccess().getUnorderedGroup_2_1());
+					}
+			)
+			otherlv_7=')'
+			{
+				newLeafNode(otherlv_7, grammarAccess.getUiSearchDialogAccess().getRightParenthesisKeyword_2_2());
+			}
+		)?
+		(
+			(
+				lv_name_8_0=RULE_ID
+				{
+					newLeafNode(lv_name_8_0, grammarAccess.getUiSearchDialogAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiSearchDialogRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_8_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		otherlv_9='{'
+		{
+			newLeafNode(otherlv_9, grammarAccess.getUiSearchDialogAccess().getLeftCurlyBracketKeyword_4());
+		}
+		(
+			otherlv_10='type'
+			{
+				newLeafNode(otherlv_10, grammarAccess.getUiSearchDialogAccess().getTypeKeyword_5_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiSearchDialogAccess().getJvmTypeJvmTypeReferenceParserRuleCall_5_1_0());
+					}
+					lv_jvmType_11_0=ruleJvmTypeReference
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiSearchDialogRule());
+						}
+						set(
+							$current,
+							"jvmType",
+							lv_jvmType_11_0,
+							"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)?
+		(
+			otherlv_12='search'
+			{
+				newLeafNode(otherlv_12, grammarAccess.getUiSearchDialogAccess().getSearchKeyword_6_0());
+			}
+			otherlv_13='{'
+			{
+				newLeafNode(otherlv_13, grammarAccess.getUiSearchDialogAccess().getLeftCurlyBracketKeyword_6_1());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiSearchDialogAccess().getSearchFieldsUiDialogSearchFieldAssignmentParserRuleCall_6_2_0());
+					}
+					lv_searchFields_14_0=ruleUiDialogSearchFieldAssignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiSearchDialogRule());
+						}
+						add(
+							$current,
+							"searchFields",
+							lv_searchFields_14_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiDialogSearchFieldAssignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)*
+			otherlv_15='}'
+			{
+				newLeafNode(otherlv_15, grammarAccess.getUiSearchDialogAccess().getRightCurlyBracketKeyword_6_3());
+			}
+		)?
+		(
+			otherlv_16='content'
+			{
+				newLeafNode(otherlv_16, grammarAccess.getUiSearchDialogAccess().getContentKeyword_7_0());
+			}
+			otherlv_17='{'
+			{
+				newLeafNode(otherlv_17, grammarAccess.getUiSearchDialogAccess().getLeftCurlyBracketKeyword_7_1());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiSearchDialogAccess().getContentUiDialogAssignmentParserRuleCall_7_2_0());
+					}
+					lv_content_18_0=ruleUiDialogAssignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiSearchDialogRule());
+						}
+						set(
+							$current,
+							"content",
+							lv_content_18_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiDialogAssignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			otherlv_19='}'
+			{
+				newLeafNode(otherlv_19, grammarAccess.getUiSearchDialogAccess().getRightCurlyBracketKeyword_7_3());
+			}
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiSearchDialogAccess().getBindingsUiBindingParserRuleCall_8_0());
+				}
+				lv_bindings_20_0=ruleUiBinding
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiSearchDialogRule());
+					}
+					add(
+						$current,
+						"bindings",
+						lv_bindings_20_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiSearchDialogAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_9_0());
+				}
+				lv_processorAssignments_21_0=ruleUiVisibilityProcessorAssignment
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiSearchDialogRule());
+					}
+					add(
+						$current,
+						"processorAssignments",
+						lv_processorAssignments_21_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		otherlv_22='}'
+		{
+			newLeafNode(otherlv_22, grammarAccess.getUiSearchDialogAccess().getRightCurlyBracketKeyword_10());
+		}
 	)
-)
-	{ 
-	  getUnorderedGroupHelper().leave(grammarAccess.getUiSearchDialogAccess().getUnorderedGroup_2_1());
-	}
-
-)	otherlv_7=')' 
-    {
-    	newLeafNode(otherlv_7, grammarAccess.getUiSearchDialogAccess().getRightParenthesisKeyword_2_2());
-    }
-)?(
-(
-		lv_name_8_0=RULE_ID
-		{
-			newLeafNode(lv_name_8_0, grammarAccess.getUiSearchDialogAccess().getNameIDTerminalRuleCall_3_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiSearchDialogRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"name",
-        		lv_name_8_0, 
-        		"ID");
-	    }
-
-)
-)?	otherlv_9='{' 
-    {
-    	newLeafNode(otherlv_9, grammarAccess.getUiSearchDialogAccess().getLeftCurlyBracketKeyword_4());
-    }
-(	otherlv_10='type' 
-    {
-    	newLeafNode(otherlv_10, grammarAccess.getUiSearchDialogAccess().getTypeKeyword_5_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiSearchDialogAccess().getJvmTypeJvmTypeReferenceParserRuleCall_5_1_0()); 
-	    }
-		lv_jvmType_11_0=ruleJvmTypeReference		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiSearchDialogRule());
-	        }
-       		set(
-       			$current, 
-       			"jvmType",
-        		lv_jvmType_11_0, 
-        		"JvmTypeReference");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))?(	otherlv_12='search' 
-    {
-    	newLeafNode(otherlv_12, grammarAccess.getUiSearchDialogAccess().getSearchKeyword_6_0());
-    }
-	otherlv_13='{' 
-    {
-    	newLeafNode(otherlv_13, grammarAccess.getUiSearchDialogAccess().getLeftCurlyBracketKeyword_6_1());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiSearchDialogAccess().getSearchFieldsUiDialogSearchFieldAssignmentParserRuleCall_6_2_0()); 
-	    }
-		lv_searchFields_14_0=ruleUiDialogSearchFieldAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiSearchDialogRule());
-	        }
-       		add(
-       			$current, 
-       			"searchFields",
-        		lv_searchFields_14_0, 
-        		"UiDialogSearchFieldAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_15='}' 
-    {
-    	newLeafNode(otherlv_15, grammarAccess.getUiSearchDialogAccess().getRightCurlyBracketKeyword_6_3());
-    }
-)?(	otherlv_16='content' 
-    {
-    	newLeafNode(otherlv_16, grammarAccess.getUiSearchDialogAccess().getContentKeyword_7_0());
-    }
-	otherlv_17='{' 
-    {
-    	newLeafNode(otherlv_17, grammarAccess.getUiSearchDialogAccess().getLeftCurlyBracketKeyword_7_1());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiSearchDialogAccess().getContentUiDialogAssignmentParserRuleCall_7_2_0()); 
-	    }
-		lv_content_18_0=ruleUiDialogAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiSearchDialogRule());
-	        }
-       		set(
-       			$current, 
-       			"content",
-        		lv_content_18_0, 
-        		"UiDialogAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_19='}' 
-    {
-    	newLeafNode(otherlv_19, grammarAccess.getUiSearchDialogAccess().getRightCurlyBracketKeyword_7_3());
-    }
-)?(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiSearchDialogAccess().getBindingsUiBindingParserRuleCall_8_0()); 
-	    }
-		lv_bindings_20_0=ruleUiBinding		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiSearchDialogRule());
-	        }
-       		add(
-       			$current, 
-       			"bindings",
-        		lv_bindings_20_0, 
-        		"UiBinding");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiSearchDialogAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_9_0()); 
-	    }
-		lv_processorAssignments_21_0=ruleUiVisibilityProcessorAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiSearchDialogRule());
-	        }
-       		add(
-       			$current, 
-       			"processorAssignments",
-        		lv_processorAssignments_21_0, 
-        		"UiVisibilityProcessorAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_22='}' 
-    {
-    	newLeafNode(otherlv_22, grammarAccess.getUiSearchDialogAccess().getRightCurlyBracketKeyword_10());
-    }
-)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiDialogSearchFieldAssignment
-entryRuleUiDialogSearchFieldAssignment returns [EObject current=null] 
-	:
+entryRuleUiDialogSearchFieldAssignment returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiDialogSearchFieldAssignmentRule()); }
-	 iv_ruleUiDialogSearchFieldAssignment=ruleUiDialogSearchFieldAssignment 
-	 { $current=$iv_ruleUiDialogSearchFieldAssignment.current; } 
-	 EOF 
-;
+	iv_ruleUiDialogSearchFieldAssignment=ruleUiDialogSearchFieldAssignment
+	{ $current=$iv_ruleUiDialogSearchFieldAssignment.current; }
+	EOF;
 
 // Rule UiDialogSearchFieldAssignment
-ruleUiDialogSearchFieldAssignment returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiDialogSearchFieldAssignmentAccess().getElementUiSearchFieldParserRuleCall_0()); 
-	    }
-		lv_element_0_0=ruleUiSearchField		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiDialogSearchFieldAssignmentRule());
-	        }
-       		set(
-       			$current, 
-       			"element",
-        		lv_element_0_0, 
-        		"UiSearchField");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
+ruleUiDialogSearchFieldAssignment returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				newCompositeNode(grammarAccess.getUiDialogSearchFieldAssignmentAccess().getElementUiSearchFieldParserRuleCall_0());
+			}
+			lv_element_0_0=ruleUiSearchField
+			{
+				if ($current==null) {
+					$current = createModelElementForParent(grammarAccess.getUiDialogSearchFieldAssignmentRule());
+				}
+				set(
+					$current,
+					"element",
+					lv_element_0_0,
+					"org.eclipse.osbp.ecview.dsl.UIGrammar.UiSearchField");
+				afterParserOrEnumRuleCall();
+			}
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiMobileNavigationPage
-entryRuleUiMobileNavigationPage returns [EObject current=null] 
-	:
+entryRuleUiMobileNavigationPage returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiMobileNavigationPageRule()); }
-	 iv_ruleUiMobileNavigationPage=ruleUiMobileNavigationPage 
-	 { $current=$iv_ruleUiMobileNavigationPage.current; } 
-	 EOF 
-;
+	iv_ruleUiMobileNavigationPage=ruleUiMobileNavigationPage
+	{ $current=$iv_ruleUiMobileNavigationPage.current; }
+	EOF;
 
 // Rule UiMobileNavigationPage
-ruleUiMobileNavigationPage returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUiMobileNavigationPageAccess().getUiMobileNavigationPageAction_0(),
-            $current);
-    }
-)	otherlv_1='navPage' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiMobileNavigationPageAccess().getNavPageKeyword_1());
-    }
-(	otherlv_2='(' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getUiMobileNavigationPageAccess().getLeftParenthesisKeyword_2_0());
-    }
-(
-
-(
-	{ 
-	  getUnorderedGroupHelper().enter(grammarAccess.getUiMobileNavigationPageAccess().getUnorderedGroup_2_1());
-	}
+ruleUiMobileNavigationPage returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
 	(
 		(
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileNavigationPageAccess().getUnorderedGroup_2_1(), 0)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiMobileNavigationPageAccess().getUnorderedGroup_2_1(), 0);
-	 				}
-					({true}?=>(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileNavigationPageAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0()); 
-	    }
-		lv_i18nInfo_4_0=ruleUiI18nInfo		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileNavigationPageRule());
-	        }
-       		set(
-       			$current, 
-       			"i18nInfo",
-        		lv_i18nInfo_4_0, 
-        		"UiI18nInfo");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileNavigationPageAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileNavigationPageAccess().getUnorderedGroup_2_1(), 1)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiMobileNavigationPageAccess().getUnorderedGroup_2_1(), 1);
-	 				}
-					({true}?=>(	otherlv_5='styles' 
-    {
-    	newLeafNode(otherlv_5, grammarAccess.getUiMobileNavigationPageAccess().getStylesKeyword_2_1_1_0());
-    }
-(
-(
-		lv_styles_6_0=RULE_STRING
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiMobileNavigationPageAccess().getUiMobileNavigationPageAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='navPage'
 		{
-			newLeafNode(lv_styles_6_0, grammarAccess.getUiMobileNavigationPageAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0()); 
+			newLeafNode(otherlv_1, grammarAccess.getUiMobileNavigationPageAccess().getNavPageKeyword_1());
 		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiMobileNavigationPageRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"styles",
-        		lv_styles_6_0, 
-        		"STRING");
-	    }
-
-)
-)))
+		(
+			otherlv_2='('
+			{
+				newLeafNode(otherlv_2, grammarAccess.getUiMobileNavigationPageAccess().getLeftParenthesisKeyword_2_0());
+			}
+			(
+				(
 					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileNavigationPageAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  
-
-		)*	
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiMobileNavigationPageAccess().getUnorderedGroup_2_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileNavigationPageAccess().getUnorderedGroup_2_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiMobileNavigationPageAccess().getUnorderedGroup_2_1(), 0);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getUiMobileNavigationPageAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+										}
+										lv_i18nInfo_4_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiMobileNavigationPageRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_4_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileNavigationPageAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileNavigationPageAccess().getUnorderedGroup_2_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiMobileNavigationPageAccess().getUnorderedGroup_2_1(), 1);
+						}
+									({true}?=>(otherlv_5='styles'
+									{
+										newLeafNode(otherlv_5, grammarAccess.getUiMobileNavigationPageAccess().getStylesKeyword_2_1_1_0());
+									}
+									(
+										(
+											lv_styles_6_0=RULE_STRING
+											{
+												newLeafNode(lv_styles_6_0, grammarAccess.getUiMobileNavigationPageAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiMobileNavigationPageRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"styles",
+													lv_styles_6_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileNavigationPageAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)
+						)*
+					)
+				)
+					{ 
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiMobileNavigationPageAccess().getUnorderedGroup_2_1());
+					}
+			)
+			otherlv_7=')'
+			{
+				newLeafNode(otherlv_7, grammarAccess.getUiMobileNavigationPageAccess().getRightParenthesisKeyword_2_2());
+			}
+		)?
+		(
+			(
+				lv_name_8_0=RULE_ID
+				{
+					newLeafNode(lv_name_8_0, grammarAccess.getUiMobileNavigationPageAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiMobileNavigationPageRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_8_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		otherlv_9='{'
+		{
+			newLeafNode(otherlv_9, grammarAccess.getUiMobileNavigationPageAccess().getLeftCurlyBracketKeyword_4());
+		}
+		(
+			otherlv_10='type'
+			{
+				newLeafNode(otherlv_10, grammarAccess.getUiMobileNavigationPageAccess().getTypeKeyword_5_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiMobileNavigationPageAccess().getJvmTypeJvmTypeReferenceParserRuleCall_5_1_0());
+					}
+					lv_jvmType_11_0=ruleJvmTypeReference
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiMobileNavigationPageRule());
+						}
+						set(
+							$current,
+							"jvmType",
+							lv_jvmType_11_0,
+							"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				otherlv_12=';'
+				{
+					newLeafNode(otherlv_12, grammarAccess.getUiMobileNavigationPageAccess().getSemicolonKeyword_5_2());
+				}
+			)?
+		)?
+		(
+			otherlv_13='navbarActions'
+			{
+				newLeafNode(otherlv_13, grammarAccess.getUiMobileNavigationPageAccess().getNavbarActionsKeyword_6_0());
+			}
+			otherlv_14='{'
+			{
+				newLeafNode(otherlv_14, grammarAccess.getUiMobileNavigationPageAccess().getLeftCurlyBracketKeyword_6_1());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiMobileNavigationPageAccess().getBarActionsUiMobileNavBarActionParserRuleCall_6_2_0());
+					}
+					lv_barActions_15_0=ruleUiMobileNavBarAction
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiMobileNavigationPageRule());
+						}
+						add(
+							$current,
+							"barActions",
+							lv_barActions_15_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileNavBarAction");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)*
+			otherlv_16='}'
+			{
+				newLeafNode(otherlv_16, grammarAccess.getUiMobileNavigationPageAccess().getRightCurlyBracketKeyword_6_3());
+			}
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiMobileNavigationPageAccess().getContentsUiMobileNavigationPageAssignmentParserRuleCall_7_0());
+				}
+				lv_contents_17_0=ruleUiMobileNavigationPageAssignment
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiMobileNavigationPageRule());
+					}
+					add(
+						$current,
+						"contents",
+						lv_contents_17_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileNavigationPageAssignment");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiMobileNavigationPageAccess().getBindingsUiBindingParserRuleCall_8_0());
+				}
+				lv_bindings_18_0=ruleUiBinding
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiMobileNavigationPageRule());
+					}
+					add(
+						$current,
+						"bindings",
+						lv_bindings_18_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiMobileNavigationPageAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_9_0());
+				}
+				lv_processorAssignments_19_0=ruleUiVisibilityProcessorAssignment
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiMobileNavigationPageRule());
+					}
+					add(
+						$current,
+						"processorAssignments",
+						lv_processorAssignments_19_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		otherlv_20='}'
+		{
+			newLeafNode(otherlv_20, grammarAccess.getUiMobileNavigationPageAccess().getRightCurlyBracketKeyword_10());
+		}
 	)
-)
-	{ 
-	  getUnorderedGroupHelper().leave(grammarAccess.getUiMobileNavigationPageAccess().getUnorderedGroup_2_1());
-	}
-
-)	otherlv_7=')' 
-    {
-    	newLeafNode(otherlv_7, grammarAccess.getUiMobileNavigationPageAccess().getRightParenthesisKeyword_2_2());
-    }
-)?(
-(
-		lv_name_8_0=RULE_ID
-		{
-			newLeafNode(lv_name_8_0, grammarAccess.getUiMobileNavigationPageAccess().getNameIDTerminalRuleCall_3_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiMobileNavigationPageRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"name",
-        		lv_name_8_0, 
-        		"ID");
-	    }
-
-)
-)?	otherlv_9='{' 
-    {
-    	newLeafNode(otherlv_9, grammarAccess.getUiMobileNavigationPageAccess().getLeftCurlyBracketKeyword_4());
-    }
-(	otherlv_10='type' 
-    {
-    	newLeafNode(otherlv_10, grammarAccess.getUiMobileNavigationPageAccess().getTypeKeyword_5_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileNavigationPageAccess().getJvmTypeJvmTypeReferenceParserRuleCall_5_1_0()); 
-	    }
-		lv_jvmType_11_0=ruleJvmTypeReference		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileNavigationPageRule());
-	        }
-       		set(
-       			$current, 
-       			"jvmType",
-        		lv_jvmType_11_0, 
-        		"JvmTypeReference");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_12=';' 
-    {
-    	newLeafNode(otherlv_12, grammarAccess.getUiMobileNavigationPageAccess().getSemicolonKeyword_5_2());
-    }
-)?)?(	otherlv_13='navbarActions' 
-    {
-    	newLeafNode(otherlv_13, grammarAccess.getUiMobileNavigationPageAccess().getNavbarActionsKeyword_6_0());
-    }
-	otherlv_14='{' 
-    {
-    	newLeafNode(otherlv_14, grammarAccess.getUiMobileNavigationPageAccess().getLeftCurlyBracketKeyword_6_1());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileNavigationPageAccess().getBarActionsUiMobileNavBarActionParserRuleCall_6_2_0()); 
-	    }
-		lv_barActions_15_0=ruleUiMobileNavBarAction		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileNavigationPageRule());
-	        }
-       		add(
-       			$current, 
-       			"barActions",
-        		lv_barActions_15_0, 
-        		"UiMobileNavBarAction");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_16='}' 
-    {
-    	newLeafNode(otherlv_16, grammarAccess.getUiMobileNavigationPageAccess().getRightCurlyBracketKeyword_6_3());
-    }
-)?(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileNavigationPageAccess().getContentsUiMobileNavigationPageAssignmentParserRuleCall_7_0()); 
-	    }
-		lv_contents_17_0=ruleUiMobileNavigationPageAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileNavigationPageRule());
-	        }
-       		add(
-       			$current, 
-       			"contents",
-        		lv_contents_17_0, 
-        		"UiMobileNavigationPageAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileNavigationPageAccess().getBindingsUiBindingParserRuleCall_8_0()); 
-	    }
-		lv_bindings_18_0=ruleUiBinding		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileNavigationPageRule());
-	        }
-       		add(
-       			$current, 
-       			"bindings",
-        		lv_bindings_18_0, 
-        		"UiBinding");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileNavigationPageAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_9_0()); 
-	    }
-		lv_processorAssignments_19_0=ruleUiVisibilityProcessorAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileNavigationPageRule());
-	        }
-       		add(
-       			$current, 
-       			"processorAssignments",
-        		lv_processorAssignments_19_0, 
-        		"UiVisibilityProcessorAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_20='}' 
-    {
-    	newLeafNode(otherlv_20, grammarAccess.getUiMobileNavigationPageAccess().getRightCurlyBracketKeyword_10());
-    }
-)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiMobileNavigationPageAssignment
-entryRuleUiMobileNavigationPageAssignment returns [EObject current=null] 
-	:
+entryRuleUiMobileNavigationPageAssignment returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiMobileNavigationPageAssignmentRule()); }
-	 iv_ruleUiMobileNavigationPageAssignment=ruleUiMobileNavigationPageAssignment 
-	 { $current=$iv_ruleUiMobileNavigationPageAssignment.current; } 
-	 EOF 
-;
+	iv_ruleUiMobileNavigationPageAssignment=ruleUiMobileNavigationPageAssignment
+	{ $current=$iv_ruleUiMobileNavigationPageAssignment.current; }
+	EOF;
 
 // Rule UiMobileNavigationPageAssignment
-ruleUiMobileNavigationPageAssignment returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileNavigationPageAssignmentAccess().getElementUiMobileEmbeddableParserRuleCall_0_0()); 
-	    }
-		lv_element_0_0=ruleUiMobileEmbeddable		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileNavigationPageAssignmentRule());
-	        }
-       		set(
-       			$current, 
-       			"element",
-        		lv_element_0_0, 
-        		"UiMobileEmbeddable");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_1='align' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiMobileNavigationPageAssignmentAccess().getAlignKeyword_1_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMobileNavigationPageAssignmentAccess().getAlignmentUiAlignmentEnumRuleCall_1_1_0()); 
-	    }
-		lv_alignment_2_0=ruleUiAlignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMobileNavigationPageAssignmentRule());
-	        }
-       		set(
-       			$current, 
-       			"alignment",
-        		lv_alignment_2_0, 
-        		"UiAlignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))?)
+ruleUiMobileNavigationPageAssignment returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiMobileNavigationPageAssignmentAccess().getElementUiMobileEmbeddableParserRuleCall_0_0());
+				}
+				lv_element_0_0=ruleUiMobileEmbeddable
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiMobileNavigationPageAssignmentRule());
+					}
+					set(
+						$current,
+						"element",
+						lv_element_0_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileEmbeddable");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_1='align'
+			{
+				newLeafNode(otherlv_1, grammarAccess.getUiMobileNavigationPageAssignmentAccess().getAlignKeyword_1_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiMobileNavigationPageAssignmentAccess().getAlignmentUiAlignmentEnumRuleCall_1_1_0());
+					}
+					lv_alignment_2_0=ruleUiAlignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiMobileNavigationPageAssignmentRule());
+						}
+						set(
+							$current,
+							"alignment",
+							lv_alignment_2_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiAlignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)?
+	)
 ;
 
-
-
-
-
-
-
 // Entry rule entryRuleUiTextField
-entryRuleUiTextField returns [EObject current=null] 
-	:
+entryRuleUiTextField returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiTextFieldRule()); }
-	 iv_ruleUiTextField=ruleUiTextField 
-	 { $current=$iv_ruleUiTextField.current; } 
-	 EOF 
-;
+	iv_ruleUiTextField=ruleUiTextField
+	{ $current=$iv_ruleUiTextField.current; }
+	EOF;
 
 // Rule UiTextField
-ruleUiTextField returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUiTextFieldAccess().getUiTextFieldAction_0(),
-            $current);
-    }
-)	otherlv_1='textfield' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiTextFieldAccess().getTextfieldKeyword_1());
-    }
-(	otherlv_2='(' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getUiTextFieldAccess().getLeftParenthesisKeyword_2_0());
-    }
-(
-
-(
-	{ 
-	  getUnorderedGroupHelper().enter(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1());
-	}
+ruleUiTextField returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
 	(
 		(
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 0)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 0);
-	 				}
-					({true}?=>(	otherlv_4='maxLength=' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getUiTextFieldAccess().getMaxLengthKeyword_2_1_0_0());
-    }
-(
-(
-		lv_maxLength_5_0=RULE_INT
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiTextFieldAccess().getUiTextFieldAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='textfield'
 		{
-			newLeafNode(lv_maxLength_5_0, grammarAccess.getUiTextFieldAccess().getMaxLengthINTTerminalRuleCall_2_1_0_1_0()); 
+			newLeafNode(otherlv_1, grammarAccess.getUiTextFieldAccess().getTextfieldKeyword_1());
 		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiTextFieldRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"maxLength",
-        		lv_maxLength_5_0, 
-        		"INT");
-	    }
-
-)
-)))
+		(
+			otherlv_2='('
+			{
+				newLeafNode(otherlv_2, grammarAccess.getUiTextFieldAccess().getLeftParenthesisKeyword_2_0());
+			}
+			(
+				(
 					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 1)}?=>(
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 0);
+						}
+									({true}?=>(otherlv_4='maxLength='
+									{
+										newLeafNode(otherlv_4, grammarAccess.getUiTextFieldAccess().getMaxLengthKeyword_2_1_0_0());
+									}
+									(
+										(
+											lv_maxLength_5_0=RULE_INT
+											{
+												newLeafNode(lv_maxLength_5_0, grammarAccess.getUiTextFieldAccess().getMaxLengthINTTerminalRuleCall_2_1_0_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiTextFieldRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"maxLength",
+													lv_maxLength_5_0,
+													"org.eclipse.xtext.xbase.Xbase.INT");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 1);
+						}
+									({true}?=>(otherlv_6='minLength='
+									{
+										newLeafNode(otherlv_6, grammarAccess.getUiTextFieldAccess().getMinLengthKeyword_2_1_1_0());
+									}
+									(
+										(
+											lv_minLength_7_0=RULE_INT
+											{
+												newLeafNode(lv_minLength_7_0, grammarAccess.getUiTextFieldAccess().getMinLengthINTTerminalRuleCall_2_1_1_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiTextFieldRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"minLength",
+													lv_minLength_7_0,
+													"org.eclipse.xtext.xbase.Xbase.INT");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 2)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 2);
+						}
+									({true}?=>(otherlv_8='regex='
+									{
+										newLeafNode(otherlv_8, grammarAccess.getUiTextFieldAccess().getRegexKeyword_2_1_2_0());
+									}
+									(
+										(
+											lv_regex_9_0=RULE_STRING
+											{
+												newLeafNode(lv_regex_9_0, grammarAccess.getUiTextFieldAccess().getRegexSTRINGTerminalRuleCall_2_1_2_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiTextFieldRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"regex",
+													lv_regex_9_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 3)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 3);
+						}
+									({true}?=>(otherlv_10='styles'
+									{
+										newLeafNode(otherlv_10, grammarAccess.getUiTextFieldAccess().getStylesKeyword_2_1_3_0());
+									}
+									(
+										(
+											lv_styles_11_0=RULE_STRING
+											{
+												newLeafNode(lv_styles_11_0, grammarAccess.getUiTextFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_3_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiTextFieldRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"styles",
+													lv_styles_11_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 4)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 4);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getUiTextFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_4_0());
+										}
+										lv_i18nInfo_12_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiTextFieldRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_12_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 5)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 5);
+						}
+									({true}?=>((
+										lv_readonly_13_0='readonly'
+										{
+											newLeafNode(lv_readonly_13_0, grammarAccess.getUiTextFieldAccess().getReadonlyReadonlyKeyword_2_1_5_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiTextFieldRule());
+											}
+											setWithLastConsumed($current, "readonly", true, "readonly");
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)
+						)*
+					)
+				)
 					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 1);
-	 				}
-					({true}?=>(	otherlv_6='minLength=' 
-    {
-    	newLeafNode(otherlv_6, grammarAccess.getUiTextFieldAccess().getMinLengthKeyword_2_1_1_0());
-    }
-(
-(
-		lv_minLength_7_0=RULE_INT
-		{
-			newLeafNode(lv_minLength_7_0, grammarAccess.getUiTextFieldAccess().getMinLengthINTTerminalRuleCall_2_1_1_1_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiTextFieldRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"minLength",
-        		lv_minLength_7_0, 
-        		"INT");
-	    }
-
-)
-)))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 2)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 2);
-	 				}
-					({true}?=>(	otherlv_8='regex=' 
-    {
-    	newLeafNode(otherlv_8, grammarAccess.getUiTextFieldAccess().getRegexKeyword_2_1_2_0());
-    }
-(
-(
-		lv_regex_9_0=RULE_STRING
-		{
-			newLeafNode(lv_regex_9_0, grammarAccess.getUiTextFieldAccess().getRegexSTRINGTerminalRuleCall_2_1_2_1_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiTextFieldRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"regex",
-        		lv_regex_9_0, 
-        		"STRING");
-	    }
-
-)
-)))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 3)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 3);
-	 				}
-					({true}?=>(	otherlv_10='styles' 
-    {
-    	newLeafNode(otherlv_10, grammarAccess.getUiTextFieldAccess().getStylesKeyword_2_1_3_0());
-    }
-(
-(
-		lv_styles_11_0=RULE_STRING
-		{
-			newLeafNode(lv_styles_11_0, grammarAccess.getUiTextFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_3_1_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiTextFieldRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"styles",
-        		lv_styles_11_0, 
-        		"STRING");
-	    }
-
-)
-)))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 4)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 4);
-	 				}
-					({true}?=>(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiTextFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_4_0()); 
-	    }
-		lv_i18nInfo_12_0=ruleUiI18nInfo		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiTextFieldRule());
-	        }
-       		set(
-       			$current, 
-       			"i18nInfo",
-        		lv_i18nInfo_12_0, 
-        		"UiI18nInfo");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 5)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 5);
-	 				}
-					({true}?=>(
-(
-		lv_readonly_13_0=	'readonly' 
-    {
-        newLeafNode(lv_readonly_13_0, grammarAccess.getUiTextFieldAccess().getReadonlyReadonlyKeyword_2_1_5_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiTextFieldRule());
-	        }
-       		setWithLastConsumed($current, "readonly", true, "readonly");
-	    }
-
-)
-))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  
-
-		)*	
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1());
+					}
+			)
+			otherlv_14=')'
+			{
+				newLeafNode(otherlv_14, grammarAccess.getUiTextFieldAccess().getRightParenthesisKeyword_2_2());
+			}
+		)?
+		(
+			(
+				lv_name_15_0=RULE_ID
+				{
+					newLeafNode(lv_name_15_0, grammarAccess.getUiTextFieldAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiTextFieldRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_15_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		(
+			otherlv_16='{'
+			{
+				newLeafNode(otherlv_16, grammarAccess.getUiTextFieldAccess().getLeftCurlyBracketKeyword_4_0());
+			}
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiTextFieldAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
+						}
+						lv_validators_17_0=ruleUiValidator
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiTextFieldRule());
+							}
+							add(
+								$current,
+								"validators",
+								lv_validators_17_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiTextFieldAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
+						}
+						lv_bindings_18_0=ruleUiBinding
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiTextFieldRule());
+							}
+							add(
+								$current,
+								"bindings",
+								lv_bindings_18_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiTextFieldAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
+					}
+					lv_processorAssignments_19_0=ruleUiVisibilityProcessorAssignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiTextFieldRule());
+						}
+						add(
+							$current,
+							"processorAssignments",
+							lv_processorAssignments_19_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)*
+			otherlv_20='}'
+			{
+				newLeafNode(otherlv_20, grammarAccess.getUiTextFieldAccess().getRightCurlyBracketKeyword_4_3());
+			}
+		)?
 	)
-)
-	{ 
-	  getUnorderedGroupHelper().leave(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1());
-	}
-
-)	otherlv_14=')' 
-    {
-    	newLeafNode(otherlv_14, grammarAccess.getUiTextFieldAccess().getRightParenthesisKeyword_2_2());
-    }
-)?(
-(
-		lv_name_15_0=RULE_ID
-		{
-			newLeafNode(lv_name_15_0, grammarAccess.getUiTextFieldAccess().getNameIDTerminalRuleCall_3_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiTextFieldRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"name",
-        		lv_name_15_0, 
-        		"ID");
-	    }
-
-)
-)?(	otherlv_16='{' 
-    {
-    	newLeafNode(otherlv_16, grammarAccess.getUiTextFieldAccess().getLeftCurlyBracketKeyword_4_0());
-    }
-((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiTextFieldAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0()); 
-	    }
-		lv_validators_17_0=ruleUiValidator		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiTextFieldRule());
-	        }
-       		add(
-       			$current, 
-       			"validators",
-        		lv_validators_17_0, 
-        		"UiValidator");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
-    |(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiTextFieldAccess().getBindingsUiBindingParserRuleCall_4_1_1_0()); 
-	    }
-		lv_bindings_18_0=ruleUiBinding		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiTextFieldRule());
-	        }
-       		add(
-       			$current, 
-       			"bindings",
-        		lv_bindings_18_0, 
-        		"UiBinding");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiTextFieldAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0()); 
-	    }
-		lv_processorAssignments_19_0=ruleUiVisibilityProcessorAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiTextFieldRule());
-	        }
-       		add(
-       			$current, 
-       			"processorAssignments",
-        		lv_processorAssignments_19_0, 
-        		"UiVisibilityProcessorAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_20='}' 
-    {
-    	newLeafNode(otherlv_20, grammarAccess.getUiTextFieldAccess().getRightCurlyBracketKeyword_4_3());
-    }
-)?)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiPasswordField
-entryRuleUiPasswordField returns [EObject current=null] 
-	:
+entryRuleUiPasswordField returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiPasswordFieldRule()); }
-	 iv_ruleUiPasswordField=ruleUiPasswordField 
-	 { $current=$iv_ruleUiPasswordField.current; } 
-	 EOF 
-;
+	iv_ruleUiPasswordField=ruleUiPasswordField
+	{ $current=$iv_ruleUiPasswordField.current; }
+	EOF;
 
 // Rule UiPasswordField
-ruleUiPasswordField returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUiPasswordFieldAccess().getUiPasswordFieldAction_0(),
-            $current);
-    }
-)	otherlv_1='passwordField' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiPasswordFieldAccess().getPasswordFieldKeyword_1());
-    }
-(	otherlv_2='(' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getUiPasswordFieldAccess().getLeftParenthesisKeyword_2_0());
-    }
-(
-
-(
-	{ 
-	  getUnorderedGroupHelper().enter(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1());
-	}
+ruleUiPasswordField returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
 	(
 		(
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1(), 0)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1(), 0);
-	 				}
-					({true}?=>(	otherlv_4='styles' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getUiPasswordFieldAccess().getStylesKeyword_2_1_0_0());
-    }
-(
-(
-		lv_styles_5_0=RULE_STRING
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiPasswordFieldAccess().getUiPasswordFieldAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='passwordField'
 		{
-			newLeafNode(lv_styles_5_0, grammarAccess.getUiPasswordFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_0_1_0()); 
+			newLeafNode(otherlv_1, grammarAccess.getUiPasswordFieldAccess().getPasswordFieldKeyword_1());
 		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiPasswordFieldRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"styles",
-        		lv_styles_5_0, 
-        		"STRING");
-	    }
-
-)
-)))
+		(
+			otherlv_2='('
+			{
+				newLeafNode(otherlv_2, grammarAccess.getUiPasswordFieldAccess().getLeftParenthesisKeyword_2_0());
+			}
+			(
+				(
 					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1(), 1)}?=>(
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1(), 0);
+						}
+									({true}?=>(otherlv_4='styles'
+									{
+										newLeafNode(otherlv_4, grammarAccess.getUiPasswordFieldAccess().getStylesKeyword_2_1_0_0());
+									}
+									(
+										(
+											lv_styles_5_0=RULE_STRING
+											{
+												newLeafNode(lv_styles_5_0, grammarAccess.getUiPasswordFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_0_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiPasswordFieldRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"styles",
+													lv_styles_5_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1(), 1);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getUiPasswordFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_1_0());
+										}
+										lv_i18nInfo_6_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiPasswordFieldRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_6_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1(), 2)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1(), 2);
+						}
+									({true}?=>((
+										lv_readonly_7_0='readonly'
+										{
+											newLeafNode(lv_readonly_7_0, grammarAccess.getUiPasswordFieldAccess().getReadonlyReadonlyKeyword_2_1_2_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiPasswordFieldRule());
+											}
+											setWithLastConsumed($current, "readonly", true, "readonly");
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)
+						)*
+					)
+				)
 					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1(), 1);
-	 				}
-					({true}?=>(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiPasswordFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_1_0()); 
-	    }
-		lv_i18nInfo_6_0=ruleUiI18nInfo		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiPasswordFieldRule());
-	        }
-       		set(
-       			$current, 
-       			"i18nInfo",
-        		lv_i18nInfo_6_0, 
-        		"UiI18nInfo");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1(), 2)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1(), 2);
-	 				}
-					({true}?=>(
-(
-		lv_readonly_7_0=	'readonly' 
-    {
-        newLeafNode(lv_readonly_7_0, grammarAccess.getUiPasswordFieldAccess().getReadonlyReadonlyKeyword_2_1_2_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiPasswordFieldRule());
-	        }
-       		setWithLastConsumed($current, "readonly", true, "readonly");
-	    }
-
-)
-))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  
-
-		)*	
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1());
+					}
+			)
+			otherlv_8=')'
+			{
+				newLeafNode(otherlv_8, grammarAccess.getUiPasswordFieldAccess().getRightParenthesisKeyword_2_2());
+			}
+		)?
+		(
+			(
+				lv_name_9_0=RULE_ID
+				{
+					newLeafNode(lv_name_9_0, grammarAccess.getUiPasswordFieldAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiPasswordFieldRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_9_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		(
+			otherlv_10='{'
+			{
+				newLeafNode(otherlv_10, grammarAccess.getUiPasswordFieldAccess().getLeftCurlyBracketKeyword_4_0());
+			}
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiPasswordFieldAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
+						}
+						lv_validators_11_0=ruleUiValidator
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiPasswordFieldRule());
+							}
+							add(
+								$current,
+								"validators",
+								lv_validators_11_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiPasswordFieldAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
+						}
+						lv_bindings_12_0=ruleUiBinding
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiPasswordFieldRule());
+							}
+							add(
+								$current,
+								"bindings",
+								lv_bindings_12_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiPasswordFieldAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
+					}
+					lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiPasswordFieldRule());
+						}
+						add(
+							$current,
+							"processorAssignments",
+							lv_processorAssignments_13_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)*
+			otherlv_14='}'
+			{
+				newLeafNode(otherlv_14, grammarAccess.getUiPasswordFieldAccess().getRightCurlyBracketKeyword_4_3());
+			}
+		)?
 	)
-)
-	{ 
-	  getUnorderedGroupHelper().leave(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1());
-	}
-
-)	otherlv_8=')' 
-    {
-    	newLeafNode(otherlv_8, grammarAccess.getUiPasswordFieldAccess().getRightParenthesisKeyword_2_2());
-    }
-)?(
-(
-		lv_name_9_0=RULE_ID
-		{
-			newLeafNode(lv_name_9_0, grammarAccess.getUiPasswordFieldAccess().getNameIDTerminalRuleCall_3_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiPasswordFieldRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"name",
-        		lv_name_9_0, 
-        		"ID");
-	    }
-
-)
-)?(	otherlv_10='{' 
-    {
-    	newLeafNode(otherlv_10, grammarAccess.getUiPasswordFieldAccess().getLeftCurlyBracketKeyword_4_0());
-    }
-((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiPasswordFieldAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0()); 
-	    }
-		lv_validators_11_0=ruleUiValidator		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiPasswordFieldRule());
-	        }
-       		add(
-       			$current, 
-       			"validators",
-        		lv_validators_11_0, 
-        		"UiValidator");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
-    |(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiPasswordFieldAccess().getBindingsUiBindingParserRuleCall_4_1_1_0()); 
-	    }
-		lv_bindings_12_0=ruleUiBinding		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiPasswordFieldRule());
-	        }
-       		add(
-       			$current, 
-       			"bindings",
-        		lv_bindings_12_0, 
-        		"UiBinding");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiPasswordFieldAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0()); 
-	    }
-		lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiPasswordFieldRule());
-	        }
-       		add(
-       			$current, 
-       			"processorAssignments",
-        		lv_processorAssignments_13_0, 
-        		"UiVisibilityProcessorAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_14='}' 
-    {
-    	newLeafNode(otherlv_14, grammarAccess.getUiPasswordFieldAccess().getRightCurlyBracketKeyword_4_3());
-    }
-)?)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiMaskedTextField
-entryRuleUiMaskedTextField returns [EObject current=null] 
-	:
+entryRuleUiMaskedTextField returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiMaskedTextFieldRule()); }
-	 iv_ruleUiMaskedTextField=ruleUiMaskedTextField 
-	 { $current=$iv_ruleUiMaskedTextField.current; } 
-	 EOF 
-;
+	iv_ruleUiMaskedTextField=ruleUiMaskedTextField
+	{ $current=$iv_ruleUiMaskedTextField.current; }
+	EOF;
 
 // Rule UiMaskedTextField
-ruleUiMaskedTextField returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUiMaskedTextFieldAccess().getUiMaskedTextFieldAction_0(),
-            $current);
-    }
-)	otherlv_1='maskedText' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiMaskedTextFieldAccess().getMaskedTextKeyword_1());
-    }
-(	otherlv_2='(' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getUiMaskedTextFieldAccess().getLeftParenthesisKeyword_2_0());
-    }
-(
-
-(
-	{ 
-	  getUnorderedGroupHelper().enter(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1());
-	}
+ruleUiMaskedTextField returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
 	(
 		(
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), 0)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), 0);
-	 				}
-					({true}?=>(	otherlv_4='styles' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getUiMaskedTextFieldAccess().getStylesKeyword_2_1_0_0());
-    }
-(
-(
-		lv_styles_5_0=RULE_STRING
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiMaskedTextFieldAccess().getUiMaskedTextFieldAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='maskedText'
 		{
-			newLeafNode(lv_styles_5_0, grammarAccess.getUiMaskedTextFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_0_1_0()); 
+			newLeafNode(otherlv_1, grammarAccess.getUiMaskedTextFieldAccess().getMaskedTextKeyword_1());
 		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiMaskedTextFieldRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"styles",
-        		lv_styles_5_0, 
-        		"STRING");
-	    }
-
-)
-)))
+		(
+			otherlv_2='('
+			{
+				newLeafNode(otherlv_2, grammarAccess.getUiMaskedTextFieldAccess().getLeftParenthesisKeyword_2_0());
+			}
+			(
+				(
 					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), 1)}?=>(
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), 0);
+						}
+									({true}?=>(otherlv_4='styles'
+									{
+										newLeafNode(otherlv_4, grammarAccess.getUiMaskedTextFieldAccess().getStylesKeyword_2_1_0_0());
+									}
+									(
+										(
+											lv_styles_5_0=RULE_STRING
+											{
+												newLeafNode(lv_styles_5_0, grammarAccess.getUiMaskedTextFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_0_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiMaskedTextFieldRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"styles",
+													lv_styles_5_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), 1);
+						}
+									({true}?=>(otherlv_6='mask='
+									{
+										newLeafNode(otherlv_6, grammarAccess.getUiMaskedTextFieldAccess().getMaskKeyword_2_1_1_0());
+									}
+									(
+										(
+											lv_mask_7_0=RULE_STRING
+											{
+												newLeafNode(lv_mask_7_0, grammarAccess.getUiMaskedTextFieldAccess().getMaskSTRINGTerminalRuleCall_2_1_1_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiMaskedTextFieldRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"mask",
+													lv_mask_7_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), 2)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), 2);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getUiMaskedTextFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_2_0());
+										}
+										lv_i18nInfo_8_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiMaskedTextFieldRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_8_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), 3)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), 3);
+						}
+									({true}?=>((
+										lv_readonly_9_0='readonly'
+										{
+											newLeafNode(lv_readonly_9_0, grammarAccess.getUiMaskedTextFieldAccess().getReadonlyReadonlyKeyword_2_1_3_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiMaskedTextFieldRule());
+											}
+											setWithLastConsumed($current, "readonly", true, "readonly");
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)
+						)*
+					)
+				)
 					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), 1);
-	 				}
-					({true}?=>(	otherlv_6='mask=' 
-    {
-    	newLeafNode(otherlv_6, grammarAccess.getUiMaskedTextFieldAccess().getMaskKeyword_2_1_1_0());
-    }
-(
-(
-		lv_mask_7_0=RULE_STRING
-		{
-			newLeafNode(lv_mask_7_0, grammarAccess.getUiMaskedTextFieldAccess().getMaskSTRINGTerminalRuleCall_2_1_1_1_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiMaskedTextFieldRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"mask",
-        		lv_mask_7_0, 
-        		"STRING");
-	    }
-
-)
-)))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), 2)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), 2);
-	 				}
-					({true}?=>(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMaskedTextFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_2_0()); 
-	    }
-		lv_i18nInfo_8_0=ruleUiI18nInfo		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMaskedTextFieldRule());
-	        }
-       		set(
-       			$current, 
-       			"i18nInfo",
-        		lv_i18nInfo_8_0, 
-        		"UiI18nInfo");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), 3)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), 3);
-	 				}
-					({true}?=>(
-(
-		lv_readonly_9_0=	'readonly' 
-    {
-        newLeafNode(lv_readonly_9_0, grammarAccess.getUiMaskedTextFieldAccess().getReadonlyReadonlyKeyword_2_1_3_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiMaskedTextFieldRule());
-	        }
-       		setWithLastConsumed($current, "readonly", true, "readonly");
-	    }
-
-)
-))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  
-
-		)*	
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1());
+					}
+			)
+			otherlv_10=')'
+			{
+				newLeafNode(otherlv_10, grammarAccess.getUiMaskedTextFieldAccess().getRightParenthesisKeyword_2_2());
+			}
+		)?
+		(
+			(
+				lv_name_11_0=RULE_ID
+				{
+					newLeafNode(lv_name_11_0, grammarAccess.getUiMaskedTextFieldAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiMaskedTextFieldRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_11_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		(
+			otherlv_12='{'
+			{
+				newLeafNode(otherlv_12, grammarAccess.getUiMaskedTextFieldAccess().getLeftCurlyBracketKeyword_4_0());
+			}
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiMaskedTextFieldAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
+						}
+						lv_validators_13_0=ruleUiValidator
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiMaskedTextFieldRule());
+							}
+							add(
+								$current,
+								"validators",
+								lv_validators_13_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiMaskedTextFieldAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
+						}
+						lv_bindings_14_0=ruleUiBinding
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiMaskedTextFieldRule());
+							}
+							add(
+								$current,
+								"bindings",
+								lv_bindings_14_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiMaskedTextFieldAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
+					}
+					lv_processorAssignments_15_0=ruleUiVisibilityProcessorAssignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiMaskedTextFieldRule());
+						}
+						add(
+							$current,
+							"processorAssignments",
+							lv_processorAssignments_15_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)*
+			otherlv_16='}'
+			{
+				newLeafNode(otherlv_16, grammarAccess.getUiMaskedTextFieldAccess().getRightCurlyBracketKeyword_4_3());
+			}
+		)?
 	)
-)
-	{ 
-	  getUnorderedGroupHelper().leave(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1());
-	}
-
-)	otherlv_10=')' 
-    {
-    	newLeafNode(otherlv_10, grammarAccess.getUiMaskedTextFieldAccess().getRightParenthesisKeyword_2_2());
-    }
-)?(
-(
-		lv_name_11_0=RULE_ID
-		{
-			newLeafNode(lv_name_11_0, grammarAccess.getUiMaskedTextFieldAccess().getNameIDTerminalRuleCall_3_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiMaskedTextFieldRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"name",
-        		lv_name_11_0, 
-        		"ID");
-	    }
-
-)
-)?(	otherlv_12='{' 
-    {
-    	newLeafNode(otherlv_12, grammarAccess.getUiMaskedTextFieldAccess().getLeftCurlyBracketKeyword_4_0());
-    }
-((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMaskedTextFieldAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0()); 
-	    }
-		lv_validators_13_0=ruleUiValidator		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMaskedTextFieldRule());
-	        }
-       		add(
-       			$current, 
-       			"validators",
-        		lv_validators_13_0, 
-        		"UiValidator");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
-    |(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMaskedTextFieldAccess().getBindingsUiBindingParserRuleCall_4_1_1_0()); 
-	    }
-		lv_bindings_14_0=ruleUiBinding		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMaskedTextFieldRule());
-	        }
-       		add(
-       			$current, 
-       			"bindings",
-        		lv_bindings_14_0, 
-        		"UiBinding");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMaskedTextFieldAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0()); 
-	    }
-		lv_processorAssignments_15_0=ruleUiVisibilityProcessorAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMaskedTextFieldRule());
-	        }
-       		add(
-       			$current, 
-       			"processorAssignments",
-        		lv_processorAssignments_15_0, 
-        		"UiVisibilityProcessorAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_16='}' 
-    {
-    	newLeafNode(otherlv_16, grammarAccess.getUiMaskedTextFieldAccess().getRightCurlyBracketKeyword_4_3());
-    }
-)?)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiMaskedNumericField
-entryRuleUiMaskedNumericField returns [EObject current=null] 
-	:
+entryRuleUiMaskedNumericField returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiMaskedNumericFieldRule()); }
-	 iv_ruleUiMaskedNumericField=ruleUiMaskedNumericField 
-	 { $current=$iv_ruleUiMaskedNumericField.current; } 
-	 EOF 
-;
+	iv_ruleUiMaskedNumericField=ruleUiMaskedNumericField
+	{ $current=$iv_ruleUiMaskedNumericField.current; }
+	EOF;
 
 // Rule UiMaskedNumericField
-ruleUiMaskedNumericField returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUiMaskedNumericFieldAccess().getUiMaskedNumericFieldAction_0(),
-            $current);
-    }
-)	otherlv_1='maskedNumeric' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiMaskedNumericFieldAccess().getMaskedNumericKeyword_1());
-    }
-(	otherlv_2='(' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getUiMaskedNumericFieldAccess().getLeftParenthesisKeyword_2_0());
-    }
-(
-
-(
-	{ 
-	  getUnorderedGroupHelper().enter(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1());
-	}
+ruleUiMaskedNumericField returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
 	(
 		(
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1(), 0)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1(), 0);
-	 				}
-					({true}?=>(	otherlv_4='styles' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getUiMaskedNumericFieldAccess().getStylesKeyword_2_1_0_0());
-    }
-(
-(
-		lv_styles_5_0=RULE_STRING
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiMaskedNumericFieldAccess().getUiMaskedNumericFieldAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='maskedNumeric'
 		{
-			newLeafNode(lv_styles_5_0, grammarAccess.getUiMaskedNumericFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_0_1_0()); 
+			newLeafNode(otherlv_1, grammarAccess.getUiMaskedNumericFieldAccess().getMaskedNumericKeyword_1());
 		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiMaskedNumericFieldRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"styles",
-        		lv_styles_5_0, 
-        		"STRING");
-	    }
-
-)
-)))
+		(
+			otherlv_2='('
+			{
+				newLeafNode(otherlv_2, grammarAccess.getUiMaskedNumericFieldAccess().getLeftParenthesisKeyword_2_0());
+			}
+			(
+				(
 					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1(), 1)}?=>(
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1(), 0);
+						}
+									({true}?=>(otherlv_4='styles'
+									{
+										newLeafNode(otherlv_4, grammarAccess.getUiMaskedNumericFieldAccess().getStylesKeyword_2_1_0_0());
+									}
+									(
+										(
+											lv_styles_5_0=RULE_STRING
+											{
+												newLeafNode(lv_styles_5_0, grammarAccess.getUiMaskedNumericFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_0_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiMaskedNumericFieldRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"styles",
+													lv_styles_5_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1(), 1);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getUiMaskedNumericFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_1_0());
+										}
+										lv_i18nInfo_6_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiMaskedNumericFieldRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_6_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1(), 2)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1(), 2);
+						}
+									({true}?=>((
+										lv_readonly_7_0='readonly'
+										{
+											newLeafNode(lv_readonly_7_0, grammarAccess.getUiMaskedNumericFieldAccess().getReadonlyReadonlyKeyword_2_1_2_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiMaskedNumericFieldRule());
+											}
+											setWithLastConsumed($current, "readonly", true, "readonly");
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)
+						)*
+					)
+				)
 					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1(), 1);
-	 				}
-					({true}?=>(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMaskedNumericFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_1_0()); 
-	    }
-		lv_i18nInfo_6_0=ruleUiI18nInfo		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMaskedNumericFieldRule());
-	        }
-       		set(
-       			$current, 
-       			"i18nInfo",
-        		lv_i18nInfo_6_0, 
-        		"UiI18nInfo");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1(), 2)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1(), 2);
-	 				}
-					({true}?=>(
-(
-		lv_readonly_7_0=	'readonly' 
-    {
-        newLeafNode(lv_readonly_7_0, grammarAccess.getUiMaskedNumericFieldAccess().getReadonlyReadonlyKeyword_2_1_2_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiMaskedNumericFieldRule());
-	        }
-       		setWithLastConsumed($current, "readonly", true, "readonly");
-	    }
-
-)
-))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  
-
-		)*	
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1());
+					}
+			)
+			otherlv_8=')'
+			{
+				newLeafNode(otherlv_8, grammarAccess.getUiMaskedNumericFieldAccess().getRightParenthesisKeyword_2_2());
+			}
+		)?
+		(
+			(
+				lv_name_9_0=RULE_ID
+				{
+					newLeafNode(lv_name_9_0, grammarAccess.getUiMaskedNumericFieldAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiMaskedNumericFieldRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_9_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		(
+			otherlv_10='{'
+			{
+				newLeafNode(otherlv_10, grammarAccess.getUiMaskedNumericFieldAccess().getLeftCurlyBracketKeyword_4_0());
+			}
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiMaskedNumericFieldAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
+						}
+						lv_validators_11_0=ruleUiValidator
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiMaskedNumericFieldRule());
+							}
+							add(
+								$current,
+								"validators",
+								lv_validators_11_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiMaskedNumericFieldAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
+						}
+						lv_bindings_12_0=ruleUiBinding
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiMaskedNumericFieldRule());
+							}
+							add(
+								$current,
+								"bindings",
+								lv_bindings_12_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiMaskedNumericFieldAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
+					}
+					lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiMaskedNumericFieldRule());
+						}
+						add(
+							$current,
+							"processorAssignments",
+							lv_processorAssignments_13_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)*
+			otherlv_14='}'
+			{
+				newLeafNode(otherlv_14, grammarAccess.getUiMaskedNumericFieldAccess().getRightCurlyBracketKeyword_4_3());
+			}
+		)?
 	)
-)
-	{ 
-	  getUnorderedGroupHelper().leave(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1());
-	}
-
-)	otherlv_8=')' 
-    {
-    	newLeafNode(otherlv_8, grammarAccess.getUiMaskedNumericFieldAccess().getRightParenthesisKeyword_2_2());
-    }
-)?(
-(
-		lv_name_9_0=RULE_ID
-		{
-			newLeafNode(lv_name_9_0, grammarAccess.getUiMaskedNumericFieldAccess().getNameIDTerminalRuleCall_3_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiMaskedNumericFieldRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"name",
-        		lv_name_9_0, 
-        		"ID");
-	    }
-
-)
-)?(	otherlv_10='{' 
-    {
-    	newLeafNode(otherlv_10, grammarAccess.getUiMaskedNumericFieldAccess().getLeftCurlyBracketKeyword_4_0());
-    }
-((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMaskedNumericFieldAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0()); 
-	    }
-		lv_validators_11_0=ruleUiValidator		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMaskedNumericFieldRule());
-	        }
-       		add(
-       			$current, 
-       			"validators",
-        		lv_validators_11_0, 
-        		"UiValidator");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
-    |(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMaskedNumericFieldAccess().getBindingsUiBindingParserRuleCall_4_1_1_0()); 
-	    }
-		lv_bindings_12_0=ruleUiBinding		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMaskedNumericFieldRule());
-	        }
-       		add(
-       			$current, 
-       			"bindings",
-        		lv_bindings_12_0, 
-        		"UiBinding");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMaskedNumericFieldAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0()); 
-	    }
-		lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMaskedNumericFieldRule());
-	        }
-       		add(
-       			$current, 
-       			"processorAssignments",
-        		lv_processorAssignments_13_0, 
-        		"UiVisibilityProcessorAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_14='}' 
-    {
-    	newLeafNode(otherlv_14, grammarAccess.getUiMaskedNumericFieldAccess().getRightCurlyBracketKeyword_4_3());
-    }
-)?)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiMaskedDecimalField
-entryRuleUiMaskedDecimalField returns [EObject current=null] 
-	:
+entryRuleUiMaskedDecimalField returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiMaskedDecimalFieldRule()); }
-	 iv_ruleUiMaskedDecimalField=ruleUiMaskedDecimalField 
-	 { $current=$iv_ruleUiMaskedDecimalField.current; } 
-	 EOF 
-;
+	iv_ruleUiMaskedDecimalField=ruleUiMaskedDecimalField
+	{ $current=$iv_ruleUiMaskedDecimalField.current; }
+	EOF;
 
 // Rule UiMaskedDecimalField
-ruleUiMaskedDecimalField returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUiMaskedDecimalFieldAccess().getUiMaskedDecimalFieldAction_0(),
-            $current);
-    }
-)	otherlv_1='maskedDecimal' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiMaskedDecimalFieldAccess().getMaskedDecimalKeyword_1());
-    }
-(	otherlv_2='(' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getUiMaskedDecimalFieldAccess().getLeftParenthesisKeyword_2_0());
-    }
-(
-
-(
-	{ 
-	  getUnorderedGroupHelper().enter(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1());
-	}
+ruleUiMaskedDecimalField returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
 	(
 		(
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), 0)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), 0);
-	 				}
-					({true}?=>(	otherlv_4='styles' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getUiMaskedDecimalFieldAccess().getStylesKeyword_2_1_0_0());
-    }
-(
-(
-		lv_styles_5_0=RULE_STRING
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiMaskedDecimalFieldAccess().getUiMaskedDecimalFieldAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='maskedDecimal'
 		{
-			newLeafNode(lv_styles_5_0, grammarAccess.getUiMaskedDecimalFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_0_1_0()); 
+			newLeafNode(otherlv_1, grammarAccess.getUiMaskedDecimalFieldAccess().getMaskedDecimalKeyword_1());
 		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiMaskedDecimalFieldRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"styles",
-        		lv_styles_5_0, 
-        		"STRING");
-	    }
-
-)
-)))
+		(
+			otherlv_2='('
+			{
+				newLeafNode(otherlv_2, grammarAccess.getUiMaskedDecimalFieldAccess().getLeftParenthesisKeyword_2_0());
+			}
+			(
+				(
 					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), 1)}?=>(
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), 0);
+						}
+									({true}?=>(otherlv_4='styles'
+									{
+										newLeafNode(otherlv_4, grammarAccess.getUiMaskedDecimalFieldAccess().getStylesKeyword_2_1_0_0());
+									}
+									(
+										(
+											lv_styles_5_0=RULE_STRING
+											{
+												newLeafNode(lv_styles_5_0, grammarAccess.getUiMaskedDecimalFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_0_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiMaskedDecimalFieldRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"styles",
+													lv_styles_5_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), 1);
+						}
+									({true}?=>(otherlv_6='mask='
+									{
+										newLeafNode(otherlv_6, grammarAccess.getUiMaskedDecimalFieldAccess().getMaskKeyword_2_1_1_0());
+									}
+									(
+										(
+											lv_mask_7_0=RULE_STRING
+											{
+												newLeafNode(lv_mask_7_0, grammarAccess.getUiMaskedDecimalFieldAccess().getMaskSTRINGTerminalRuleCall_2_1_1_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiMaskedDecimalFieldRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"mask",
+													lv_mask_7_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), 2)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), 2);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getUiMaskedDecimalFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_2_0());
+										}
+										lv_i18nInfo_8_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiMaskedDecimalFieldRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_8_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), 3)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), 3);
+						}
+									({true}?=>((
+										lv_readonly_9_0='readonly'
+										{
+											newLeafNode(lv_readonly_9_0, grammarAccess.getUiMaskedDecimalFieldAccess().getReadonlyReadonlyKeyword_2_1_3_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiMaskedDecimalFieldRule());
+											}
+											setWithLastConsumed($current, "readonly", true, "readonly");
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)
+						)*
+					)
+				)
 					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), 1);
-	 				}
-					({true}?=>(	otherlv_6='mask=' 
-    {
-    	newLeafNode(otherlv_6, grammarAccess.getUiMaskedDecimalFieldAccess().getMaskKeyword_2_1_1_0());
-    }
-(
-(
-		lv_mask_7_0=RULE_STRING
-		{
-			newLeafNode(lv_mask_7_0, grammarAccess.getUiMaskedDecimalFieldAccess().getMaskSTRINGTerminalRuleCall_2_1_1_1_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiMaskedDecimalFieldRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"mask",
-        		lv_mask_7_0, 
-        		"STRING");
-	    }
-
-)
-)))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), 2)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), 2);
-	 				}
-					({true}?=>(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMaskedDecimalFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_2_0()); 
-	    }
-		lv_i18nInfo_8_0=ruleUiI18nInfo		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMaskedDecimalFieldRule());
-	        }
-       		set(
-       			$current, 
-       			"i18nInfo",
-        		lv_i18nInfo_8_0, 
-        		"UiI18nInfo");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), 3)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), 3);
-	 				}
-					({true}?=>(
-(
-		lv_readonly_9_0=	'readonly' 
-    {
-        newLeafNode(lv_readonly_9_0, grammarAccess.getUiMaskedDecimalFieldAccess().getReadonlyReadonlyKeyword_2_1_3_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiMaskedDecimalFieldRule());
-	        }
-       		setWithLastConsumed($current, "readonly", true, "readonly");
-	    }
-
-)
-))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  
-
-		)*	
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1());
+					}
+			)
+			otherlv_10=')'
+			{
+				newLeafNode(otherlv_10, grammarAccess.getUiMaskedDecimalFieldAccess().getRightParenthesisKeyword_2_2());
+			}
+		)?
+		(
+			(
+				lv_name_11_0=RULE_ID
+				{
+					newLeafNode(lv_name_11_0, grammarAccess.getUiMaskedDecimalFieldAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiMaskedDecimalFieldRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_11_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		(
+			otherlv_12='{'
+			{
+				newLeafNode(otherlv_12, grammarAccess.getUiMaskedDecimalFieldAccess().getLeftCurlyBracketKeyword_4_0());
+			}
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiMaskedDecimalFieldAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
+						}
+						lv_validators_13_0=ruleUiValidator
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiMaskedDecimalFieldRule());
+							}
+							add(
+								$current,
+								"validators",
+								lv_validators_13_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiMaskedDecimalFieldAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
+						}
+						lv_bindings_14_0=ruleUiBinding
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiMaskedDecimalFieldRule());
+							}
+							add(
+								$current,
+								"bindings",
+								lv_bindings_14_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiMaskedDecimalFieldAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
+					}
+					lv_processorAssignments_15_0=ruleUiVisibilityProcessorAssignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiMaskedDecimalFieldRule());
+						}
+						add(
+							$current,
+							"processorAssignments",
+							lv_processorAssignments_15_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)*
+			otherlv_16='}'
+			{
+				newLeafNode(otherlv_16, grammarAccess.getUiMaskedDecimalFieldAccess().getRightCurlyBracketKeyword_4_3());
+			}
+		)?
 	)
-)
-	{ 
-	  getUnorderedGroupHelper().leave(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1());
-	}
-
-)	otherlv_10=')' 
-    {
-    	newLeafNode(otherlv_10, grammarAccess.getUiMaskedDecimalFieldAccess().getRightParenthesisKeyword_2_2());
-    }
-)?(
-(
-		lv_name_11_0=RULE_ID
-		{
-			newLeafNode(lv_name_11_0, grammarAccess.getUiMaskedDecimalFieldAccess().getNameIDTerminalRuleCall_3_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiMaskedDecimalFieldRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"name",
-        		lv_name_11_0, 
-        		"ID");
-	    }
-
-)
-)?(	otherlv_12='{' 
-    {
-    	newLeafNode(otherlv_12, grammarAccess.getUiMaskedDecimalFieldAccess().getLeftCurlyBracketKeyword_4_0());
-    }
-((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMaskedDecimalFieldAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0()); 
-	    }
-		lv_validators_13_0=ruleUiValidator		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMaskedDecimalFieldRule());
-	        }
-       		add(
-       			$current, 
-       			"validators",
-        		lv_validators_13_0, 
-        		"UiValidator");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
-    |(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMaskedDecimalFieldAccess().getBindingsUiBindingParserRuleCall_4_1_1_0()); 
-	    }
-		lv_bindings_14_0=ruleUiBinding		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMaskedDecimalFieldRule());
-	        }
-       		add(
-       			$current, 
-       			"bindings",
-        		lv_bindings_14_0, 
-        		"UiBinding");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiMaskedDecimalFieldAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0()); 
-	    }
-		lv_processorAssignments_15_0=ruleUiVisibilityProcessorAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiMaskedDecimalFieldRule());
-	        }
-       		add(
-       			$current, 
-       			"processorAssignments",
-        		lv_processorAssignments_15_0, 
-        		"UiVisibilityProcessorAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_16='}' 
-    {
-    	newLeafNode(otherlv_16, grammarAccess.getUiMaskedDecimalFieldAccess().getRightCurlyBracketKeyword_4_3());
-    }
-)?)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiPrefixedMaskedTextField
-entryRuleUiPrefixedMaskedTextField returns [EObject current=null] 
-	:
+entryRuleUiPrefixedMaskedTextField returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiPrefixedMaskedTextFieldRule()); }
-	 iv_ruleUiPrefixedMaskedTextField=ruleUiPrefixedMaskedTextField 
-	 { $current=$iv_ruleUiPrefixedMaskedTextField.current; } 
-	 EOF 
-;
+	iv_ruleUiPrefixedMaskedTextField=ruleUiPrefixedMaskedTextField
+	{ $current=$iv_ruleUiPrefixedMaskedTextField.current; }
+	EOF;
 
 // Rule UiPrefixedMaskedTextField
-ruleUiPrefixedMaskedTextField returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUiPrefixedMaskedTextFieldAction_0(),
-            $current);
-    }
-)	otherlv_1='maskedTextWithPrefix' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getMaskedTextWithPrefixKeyword_1());
-    }
-(	otherlv_2='(' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getLeftParenthesisKeyword_2_0());
-    }
-(
-
-(
-	{ 
-	  getUnorderedGroupHelper().enter(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1());
-	}
+ruleUiPrefixedMaskedTextField returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
 	(
 		(
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 0)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 0);
-	 				}
-					({true}?=>(	otherlv_4='styles' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getStylesKeyword_2_1_0_0());
-    }
-(
-(
-		lv_styles_5_0=RULE_STRING
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUiPrefixedMaskedTextFieldAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='maskedTextWithPrefix'
 		{
-			newLeafNode(lv_styles_5_0, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_0_1_0()); 
+			newLeafNode(otherlv_1, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getMaskedTextWithPrefixKeyword_1());
 		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiPrefixedMaskedTextFieldRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"styles",
-        		lv_styles_5_0, 
-        		"STRING");
-	    }
-
-)
-)))
+		(
+			otherlv_2='('
+			{
+				newLeafNode(otherlv_2, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getLeftParenthesisKeyword_2_0());
+			}
+			(
+				(
 					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 1)}?=>(
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 0);
+						}
+									({true}?=>(otherlv_4='styles'
+									{
+										newLeafNode(otherlv_4, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getStylesKeyword_2_1_0_0());
+									}
+									(
+										(
+											lv_styles_5_0=RULE_STRING
+											{
+												newLeafNode(lv_styles_5_0, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_0_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiPrefixedMaskedTextFieldRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"styles",
+													lv_styles_5_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 1);
+						}
+									({true}?=>(otherlv_6='mask='
+									{
+										newLeafNode(otherlv_6, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getMaskKeyword_2_1_1_0());
+									}
+									(
+										(
+											lv_mask_7_0=RULE_STRING
+											{
+												newLeafNode(lv_mask_7_0, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getMaskSTRINGTerminalRuleCall_2_1_1_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiPrefixedMaskedTextFieldRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"mask",
+													lv_mask_7_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 2)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 2);
+						}
+									({true}?=>(otherlv_8='prefixes='
+									{
+										newLeafNode(otherlv_8, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getPrefixesKeyword_2_1_2_0());
+									}
+									otherlv_9='('
+									{
+										newLeafNode(otherlv_9, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getLeftParenthesisKeyword_2_1_2_1());
+									}
+									(
+										(
+											{
+												newCompositeNode(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getPrefixMasksUiPrefixToMaskMapEntryParserRuleCall_2_1_2_2_0());
+											}
+											lv_prefixMasks_10_0=ruleUiPrefixToMaskMapEntry
+											{
+												if ($current==null) {
+													$current = createModelElementForParent(grammarAccess.getUiPrefixedMaskedTextFieldRule());
+												}
+												add(
+													$current,
+													"prefixMasks",
+													lv_prefixMasks_10_0,
+													"org.eclipse.osbp.ecview.dsl.UIGrammar.UiPrefixToMaskMapEntry");
+												afterParserOrEnumRuleCall();
+											}
+										)
+									)
+									(
+										otherlv_11=','
+										{
+											newLeafNode(otherlv_11, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getCommaKeyword_2_1_2_3_0());
+										}
+										(
+											(
+												{
+													newCompositeNode(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getPrefixMasksUiPrefixToMaskMapEntryParserRuleCall_2_1_2_3_1_0());
+												}
+												lv_prefixMasks_12_0=ruleUiPrefixToMaskMapEntry
+												{
+													if ($current==null) {
+														$current = createModelElementForParent(grammarAccess.getUiPrefixedMaskedTextFieldRule());
+													}
+													add(
+														$current,
+														"prefixMasks",
+														lv_prefixMasks_12_0,
+														"org.eclipse.osbp.ecview.dsl.UIGrammar.UiPrefixToMaskMapEntry");
+													afterParserOrEnumRuleCall();
+												}
+											)
+										)
+									)*
+									otherlv_13=')'
+									{
+										newLeafNode(otherlv_13, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getRightParenthesisKeyword_2_1_2_4());
+									}
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 3)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 3);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_3_0());
+										}
+										lv_i18nInfo_14_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiPrefixedMaskedTextFieldRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_14_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 4)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 4);
+						}
+									({true}?=>((
+										lv_readonly_15_0='readonly'
+										{
+											newLeafNode(lv_readonly_15_0, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getReadonlyReadonlyKeyword_2_1_4_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiPrefixedMaskedTextFieldRule());
+											}
+											setWithLastConsumed($current, "readonly", true, "readonly");
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)
+						)*
+					)
+				)
 					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 1);
-	 				}
-					({true}?=>(	otherlv_6='mask=' 
-    {
-    	newLeafNode(otherlv_6, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getMaskKeyword_2_1_1_0());
-    }
-(
-(
-		lv_mask_7_0=RULE_STRING
-		{
-			newLeafNode(lv_mask_7_0, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getMaskSTRINGTerminalRuleCall_2_1_1_1_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiPrefixedMaskedTextFieldRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"mask",
-        		lv_mask_7_0, 
-        		"STRING");
-	    }
-
-)
-)))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 2)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 2);
-	 				}
-					({true}?=>(	otherlv_8='prefixes=' 
-    {
-    	newLeafNode(otherlv_8, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getPrefixesKeyword_2_1_2_0());
-    }
-	otherlv_9='(' 
-    {
-    	newLeafNode(otherlv_9, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getLeftParenthesisKeyword_2_1_2_1());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getPrefixMasksUiPrefixToMaskMapEntryParserRuleCall_2_1_2_2_0()); 
-	    }
-		lv_prefixMasks_10_0=ruleUiPrefixToMaskMapEntry		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiPrefixedMaskedTextFieldRule());
-	        }
-       		add(
-       			$current, 
-       			"prefixMasks",
-        		lv_prefixMasks_10_0, 
-        		"UiPrefixToMaskMapEntry");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_11=',' 
-    {
-    	newLeafNode(otherlv_11, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getCommaKeyword_2_1_2_3_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getPrefixMasksUiPrefixToMaskMapEntryParserRuleCall_2_1_2_3_1_0()); 
-	    }
-		lv_prefixMasks_12_0=ruleUiPrefixToMaskMapEntry		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiPrefixedMaskedTextFieldRule());
-	        }
-       		add(
-       			$current, 
-       			"prefixMasks",
-        		lv_prefixMasks_12_0, 
-        		"UiPrefixToMaskMapEntry");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))*	otherlv_13=')' 
-    {
-    	newLeafNode(otherlv_13, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getRightParenthesisKeyword_2_1_2_4());
-    }
-))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 3)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 3);
-	 				}
-					({true}?=>(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_3_0()); 
-	    }
-		lv_i18nInfo_14_0=ruleUiI18nInfo		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiPrefixedMaskedTextFieldRule());
-	        }
-       		set(
-       			$current, 
-       			"i18nInfo",
-        		lv_i18nInfo_14_0, 
-        		"UiI18nInfo");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 4)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 4);
-	 				}
-					({true}?=>(
-(
-		lv_readonly_15_0=	'readonly' 
-    {
-        newLeafNode(lv_readonly_15_0, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getReadonlyReadonlyKeyword_2_1_4_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiPrefixedMaskedTextFieldRule());
-	        }
-       		setWithLastConsumed($current, "readonly", true, "readonly");
-	    }
-
-)
-))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  
-
-		)*	
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1());
+					}
+			)
+			otherlv_16=')'
+			{
+				newLeafNode(otherlv_16, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getRightParenthesisKeyword_2_2());
+			}
+		)?
+		(
+			(
+				lv_name_17_0=RULE_ID
+				{
+					newLeafNode(lv_name_17_0, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiPrefixedMaskedTextFieldRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_17_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		(
+			otherlv_18='{'
+			{
+				newLeafNode(otherlv_18, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getLeftCurlyBracketKeyword_4_0());
+			}
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
+						}
+						lv_validators_19_0=ruleUiValidator
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiPrefixedMaskedTextFieldRule());
+							}
+							add(
+								$current,
+								"validators",
+								lv_validators_19_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
+						}
+						lv_bindings_20_0=ruleUiBinding
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiPrefixedMaskedTextFieldRule());
+							}
+							add(
+								$current,
+								"bindings",
+								lv_bindings_20_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
+					}
+					lv_processorAssignments_21_0=ruleUiVisibilityProcessorAssignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiPrefixedMaskedTextFieldRule());
+						}
+						add(
+							$current,
+							"processorAssignments",
+							lv_processorAssignments_21_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)*
+			otherlv_22='}'
+			{
+				newLeafNode(otherlv_22, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getRightCurlyBracketKeyword_4_3());
+			}
+		)?
 	)
-)
-	{ 
-	  getUnorderedGroupHelper().leave(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1());
-	}
-
-)	otherlv_16=')' 
-    {
-    	newLeafNode(otherlv_16, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getRightParenthesisKeyword_2_2());
-    }
-)?(
-(
-		lv_name_17_0=RULE_ID
-		{
-			newLeafNode(lv_name_17_0, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getNameIDTerminalRuleCall_3_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiPrefixedMaskedTextFieldRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"name",
-        		lv_name_17_0, 
-        		"ID");
-	    }
-
-)
-)?(	otherlv_18='{' 
-    {
-    	newLeafNode(otherlv_18, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getLeftCurlyBracketKeyword_4_0());
-    }
-((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0()); 
-	    }
-		lv_validators_19_0=ruleUiValidator		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiPrefixedMaskedTextFieldRule());
-	        }
-       		add(
-       			$current, 
-       			"validators",
-        		lv_validators_19_0, 
-        		"UiValidator");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
-    |(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getBindingsUiBindingParserRuleCall_4_1_1_0()); 
-	    }
-		lv_bindings_20_0=ruleUiBinding		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiPrefixedMaskedTextFieldRule());
-	        }
-       		add(
-       			$current, 
-       			"bindings",
-        		lv_bindings_20_0, 
-        		"UiBinding");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0()); 
-	    }
-		lv_processorAssignments_21_0=ruleUiVisibilityProcessorAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiPrefixedMaskedTextFieldRule());
-	        }
-       		add(
-       			$current, 
-       			"processorAssignments",
-        		lv_processorAssignments_21_0, 
-        		"UiVisibilityProcessorAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_22='}' 
-    {
-    	newLeafNode(otherlv_22, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getRightCurlyBracketKeyword_4_3());
-    }
-)?)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiPrefixToMaskMapEntry
-entryRuleUiPrefixToMaskMapEntry returns [EObject current=null] 
-	:
+entryRuleUiPrefixToMaskMapEntry returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiPrefixToMaskMapEntryRule()); }
-	 iv_ruleUiPrefixToMaskMapEntry=ruleUiPrefixToMaskMapEntry 
-	 { $current=$iv_ruleUiPrefixToMaskMapEntry.current; } 
-	 EOF 
-;
+	iv_ruleUiPrefixToMaskMapEntry=ruleUiPrefixToMaskMapEntry
+	{ $current=$iv_ruleUiPrefixToMaskMapEntry.current; }
+	EOF;
 
 // Rule UiPrefixToMaskMapEntry
-ruleUiPrefixToMaskMapEntry returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUiPrefixToMaskMapEntryAccess().getUiPrefixToMaskMapEntryAction_0(),
-            $current);
-    }
-)	otherlv_1='prefix' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiPrefixToMaskMapEntryAccess().getPrefixKeyword_1());
-    }
-(
-(
-		lv_key_2_0=RULE_STRING
+ruleUiPrefixToMaskMapEntry returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiPrefixToMaskMapEntryAccess().getUiPrefixToMaskMapEntryAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='prefix'
 		{
-			newLeafNode(lv_key_2_0, grammarAccess.getUiPrefixToMaskMapEntryAccess().getKeySTRINGTerminalRuleCall_2_0()); 
+			newLeafNode(otherlv_1, grammarAccess.getUiPrefixToMaskMapEntryAccess().getPrefixKeyword_1());
 		}
+		(
+			(
+				lv_key_2_0=RULE_STRING
+				{
+					newLeafNode(lv_key_2_0, grammarAccess.getUiPrefixToMaskMapEntryAccess().getKeySTRINGTerminalRuleCall_2_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiPrefixToMaskMapEntryRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"key",
+						lv_key_2_0,
+						"org.eclipse.xtext.xbase.Xtype.STRING");
+				}
+			)
+		)
+		otherlv_3='mask'
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiPrefixToMaskMapEntryRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"key",
-        		lv_key_2_0, 
-        		"STRING");
-	    }
-
-)
-)	otherlv_3='mask' 
-    {
-    	newLeafNode(otherlv_3, grammarAccess.getUiPrefixToMaskMapEntryAccess().getMaskKeyword_3());
-    }
-(
-(
-		lv_value_4_0=RULE_STRING
-		{
-			newLeafNode(lv_value_4_0, grammarAccess.getUiPrefixToMaskMapEntryAccess().getValueSTRINGTerminalRuleCall_4_0()); 
+			newLeafNode(otherlv_3, grammarAccess.getUiPrefixToMaskMapEntryAccess().getMaskKeyword_3());
 		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiPrefixToMaskMapEntryRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"value",
-        		lv_value_4_0, 
-        		"STRING");
-	    }
-
-)
-))
+		(
+			(
+				lv_value_4_0=RULE_STRING
+				{
+					newLeafNode(lv_value_4_0, grammarAccess.getUiPrefixToMaskMapEntryAccess().getValueSTRINGTerminalRuleCall_4_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiPrefixToMaskMapEntryRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"value",
+						lv_value_4_0,
+						"org.eclipse.xtext.xbase.Xtype.STRING");
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiRichTextArea
-entryRuleUiRichTextArea returns [EObject current=null] 
-	:
+entryRuleUiRichTextArea returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiRichTextAreaRule()); }
-	 iv_ruleUiRichTextArea=ruleUiRichTextArea 
-	 { $current=$iv_ruleUiRichTextArea.current; } 
-	 EOF 
-;
+	iv_ruleUiRichTextArea=ruleUiRichTextArea
+	{ $current=$iv_ruleUiRichTextArea.current; }
+	EOF;
 
 // Rule UiRichTextArea
-ruleUiRichTextArea returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUiRichTextAreaAccess().getUiRichTextAreaAction_0(),
-            $current);
-    }
-)	otherlv_1='richtextArea' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiRichTextAreaAccess().getRichtextAreaKeyword_1());
-    }
-(	otherlv_2='(' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getUiRichTextAreaAccess().getLeftParenthesisKeyword_2_0());
-    }
-(
-
-(
-	{ 
-	  getUnorderedGroupHelper().enter(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1());
-	}
+ruleUiRichTextArea returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
 	(
 		(
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), 0)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), 0);
-	 				}
-					({true}?=>(	otherlv_4='styles' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getUiRichTextAreaAccess().getStylesKeyword_2_1_0_0());
-    }
-(
-(
-		lv_styles_5_0=RULE_STRING
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiRichTextAreaAccess().getUiRichTextAreaAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='richtextArea'
 		{
-			newLeafNode(lv_styles_5_0, grammarAccess.getUiRichTextAreaAccess().getStylesSTRINGTerminalRuleCall_2_1_0_1_0()); 
+			newLeafNode(otherlv_1, grammarAccess.getUiRichTextAreaAccess().getRichtextAreaKeyword_1());
 		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiRichTextAreaRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"styles",
-        		lv_styles_5_0, 
-        		"STRING");
-	    }
-
-)
-)))
+		(
+			otherlv_2='('
+			{
+				newLeafNode(otherlv_2, grammarAccess.getUiRichTextAreaAccess().getLeftParenthesisKeyword_2_0());
+			}
+			(
+				(
 					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), 1)}?=>(
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), 0);
+						}
+									({true}?=>(otherlv_4='styles'
+									{
+										newLeafNode(otherlv_4, grammarAccess.getUiRichTextAreaAccess().getStylesKeyword_2_1_0_0());
+									}
+									(
+										(
+											lv_styles_5_0=RULE_STRING
+											{
+												newLeafNode(lv_styles_5_0, grammarAccess.getUiRichTextAreaAccess().getStylesSTRINGTerminalRuleCall_2_1_0_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiRichTextAreaRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"styles",
+													lv_styles_5_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), 1);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getUiRichTextAreaAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_1_0());
+										}
+										lv_i18nInfo_6_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiRichTextAreaRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_6_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), 2)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), 2);
+						}
+									({true}?=>((
+										lv_asBlob_7_0='asBlob'
+										{
+											newLeafNode(lv_asBlob_7_0, grammarAccess.getUiRichTextAreaAccess().getAsBlobAsBlobKeyword_2_1_2_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiRichTextAreaRule());
+											}
+											setWithLastConsumed($current, "asBlob", true, "asBlob");
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), 3)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), 3);
+						}
+									({true}?=>((
+										lv_readonly_8_0='readonly'
+										{
+											newLeafNode(lv_readonly_8_0, grammarAccess.getUiRichTextAreaAccess().getReadonlyReadonlyKeyword_2_1_3_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiRichTextAreaRule());
+											}
+											setWithLastConsumed($current, "readonly", true, "readonly");
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)
+						)*
+					)
+				)
 					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), 1);
-	 				}
-					({true}?=>(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiRichTextAreaAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_1_0()); 
-	    }
-		lv_i18nInfo_6_0=ruleUiI18nInfo		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiRichTextAreaRule());
-	        }
-       		set(
-       			$current, 
-       			"i18nInfo",
-        		lv_i18nInfo_6_0, 
-        		"UiI18nInfo");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), 2)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), 2);
-	 				}
-					({true}?=>(
-(
-		lv_asBlob_7_0=	'asBlob' 
-    {
-        newLeafNode(lv_asBlob_7_0, grammarAccess.getUiRichTextAreaAccess().getAsBlobAsBlobKeyword_2_1_2_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiRichTextAreaRule());
-	        }
-       		setWithLastConsumed($current, "asBlob", true, "asBlob");
-	    }
-
-)
-))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), 3)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), 3);
-	 				}
-					({true}?=>(
-(
-		lv_readonly_8_0=	'readonly' 
-    {
-        newLeafNode(lv_readonly_8_0, grammarAccess.getUiRichTextAreaAccess().getReadonlyReadonlyKeyword_2_1_3_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiRichTextAreaRule());
-	        }
-       		setWithLastConsumed($current, "readonly", true, "readonly");
-	    }
-
-)
-))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  
-
-		)*	
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1());
+					}
+			)
+			otherlv_9=')'
+			{
+				newLeafNode(otherlv_9, grammarAccess.getUiRichTextAreaAccess().getRightParenthesisKeyword_2_2());
+			}
+		)?
+		(
+			(
+				lv_name_10_0=RULE_ID
+				{
+					newLeafNode(lv_name_10_0, grammarAccess.getUiRichTextAreaAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiRichTextAreaRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_10_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		(
+			otherlv_11='{'
+			{
+				newLeafNode(otherlv_11, grammarAccess.getUiRichTextAreaAccess().getLeftCurlyBracketKeyword_4_0());
+			}
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiRichTextAreaAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
+						}
+						lv_validators_12_0=ruleUiValidator
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiRichTextAreaRule());
+							}
+							add(
+								$current,
+								"validators",
+								lv_validators_12_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiRichTextAreaAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
+						}
+						lv_bindings_13_0=ruleUiBinding
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiRichTextAreaRule());
+							}
+							add(
+								$current,
+								"bindings",
+								lv_bindings_13_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiRichTextAreaAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
+					}
+					lv_processorAssignments_14_0=ruleUiVisibilityProcessorAssignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiRichTextAreaRule());
+						}
+						add(
+							$current,
+							"processorAssignments",
+							lv_processorAssignments_14_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)*
+			otherlv_15='}'
+			{
+				newLeafNode(otherlv_15, grammarAccess.getUiRichTextAreaAccess().getRightCurlyBracketKeyword_4_3());
+			}
+		)?
 	)
-)
-	{ 
-	  getUnorderedGroupHelper().leave(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1());
-	}
-
-)	otherlv_9=')' 
-    {
-    	newLeafNode(otherlv_9, grammarAccess.getUiRichTextAreaAccess().getRightParenthesisKeyword_2_2());
-    }
-)?(
-(
-		lv_name_10_0=RULE_ID
-		{
-			newLeafNode(lv_name_10_0, grammarAccess.getUiRichTextAreaAccess().getNameIDTerminalRuleCall_3_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiRichTextAreaRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"name",
-        		lv_name_10_0, 
-        		"ID");
-	    }
-
-)
-)?(	otherlv_11='{' 
-    {
-    	newLeafNode(otherlv_11, grammarAccess.getUiRichTextAreaAccess().getLeftCurlyBracketKeyword_4_0());
-    }
-((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiRichTextAreaAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0()); 
-	    }
-		lv_validators_12_0=ruleUiValidator		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiRichTextAreaRule());
-	        }
-       		add(
-       			$current, 
-       			"validators",
-        		lv_validators_12_0, 
-        		"UiValidator");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
-    |(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiRichTextAreaAccess().getBindingsUiBindingParserRuleCall_4_1_1_0()); 
-	    }
-		lv_bindings_13_0=ruleUiBinding		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiRichTextAreaRule());
-	        }
-       		add(
-       			$current, 
-       			"bindings",
-        		lv_bindings_13_0, 
-        		"UiBinding");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiRichTextAreaAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0()); 
-	    }
-		lv_processorAssignments_14_0=ruleUiVisibilityProcessorAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiRichTextAreaRule());
-	        }
-       		add(
-       			$current, 
-       			"processorAssignments",
-        		lv_processorAssignments_14_0, 
-        		"UiVisibilityProcessorAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_15='}' 
-    {
-    	newLeafNode(otherlv_15, grammarAccess.getUiRichTextAreaAccess().getRightCurlyBracketKeyword_4_3());
-    }
-)?)
 ;
 
-
-
-
-
 // Entry rule entryRuleUiSuggestTextField
-entryRuleUiSuggestTextField returns [EObject current=null] 
-	:
+entryRuleUiSuggestTextField returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUiSuggestTextFieldRule()); }
-	 iv_ruleUiSuggestTextField=ruleUiSuggestTextField 
-	 { $current=$iv_ruleUiSuggestTextField.current; } 
-	 EOF 
-;
+	iv_ruleUiSuggestTextField=ruleUiSuggestTextField
+	{ $current=$iv_ruleUiSuggestTextField.current; }
+	EOF;
 
 // Rule UiSuggestTextField
-ruleUiSuggestTextField returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUiSuggestTextFieldAccess().getUiSuggestTextFieldAction_0(),
-            $current);
-    }
-)	otherlv_1='suggestText' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUiSuggestTextFieldAccess().getSuggestTextKeyword_1());
-    }
-(	otherlv_2='(' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getUiSuggestTextFieldAccess().getLeftParenthesisKeyword_2_0());
-    }
-(
-
-(
-	{ 
-	  getUnorderedGroupHelper().enter(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_2_1());
-	}
+ruleUiSuggestTextField returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
 	(
 		(
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_2_1(), 0)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_2_1(), 0);
-	 				}
-					({true}?=>(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiSuggestTextFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0()); 
-	    }
-		lv_i18nInfo_4_0=ruleUiI18nInfo		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiSuggestTextFieldRule());
-	        }
-       		set(
-       			$current, 
-       			"i18nInfo",
-        		lv_i18nInfo_4_0, 
-        		"UiI18nInfo");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_2_1(), 1)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_2_1(), 1);
-	 				}
-					({true}?=>(	otherlv_5='styles' 
-    {
-    	newLeafNode(otherlv_5, grammarAccess.getUiSuggestTextFieldAccess().getStylesKeyword_2_1_1_0());
-    }
-(
-(
-		lv_styles_6_0=RULE_STRING
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiSuggestTextFieldAccess().getUiSuggestTextFieldAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='suggestText'
 		{
-			newLeafNode(lv_styles_6_0, grammarAccess.getUiSuggestTextFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0()); 
+			newLeafNode(otherlv_1, grammarAccess.getUiSuggestTextFieldAccess().getSuggestTextKeyword_1());
 		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiSuggestTextFieldRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"styles",
-        		lv_styles_6_0, 
-        		"STRING");
-	    }
-
-)
-)))
+		(
+			otherlv_2='('
+			{
+				newLeafNode(otherlv_2, grammarAccess.getUiSuggestTextFieldAccess().getLeftParenthesisKeyword_2_0());
+			}
+			(
+				(
 					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_2_1());
-	 				}
- 				)
-			)  
-
-		)*	
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_2_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_2_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_2_1(), 0);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getUiSuggestTextFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+										}
+										lv_i18nInfo_4_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiSuggestTextFieldRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_4_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_2_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_2_1(), 1);
+						}
+									({true}?=>(otherlv_5='styles'
+									{
+										newLeafNode(otherlv_5, grammarAccess.getUiSuggestTextFieldAccess().getStylesKeyword_2_1_1_0());
+									}
+									(
+										(
+											lv_styles_6_0=RULE_STRING
+											{
+												newLeafNode(lv_styles_6_0, grammarAccess.getUiSuggestTextFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiSuggestTextFieldRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"styles",
+													lv_styles_6_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)
+						)*
+					)
+				)
+					{ 
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_2_1());
+					}
+			)
+			otherlv_7=')'
+			{
+				newLeafNode(otherlv_7, grammarAccess.getUiSuggestTextFieldAccess().getRightParenthesisKeyword_2_2());
+			}
+		)?
+		(
+			(
+				lv_name_8_0=RULE_ID
+				{
+					newLeafNode(lv_name_8_0, grammarAccess.getUiSuggestTextFieldAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiSuggestTextFieldRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_8_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		(
+			otherlv_9='{'
+			{
+				newLeafNode(otherlv_9, grammarAccess.getUiSuggestTextFieldAccess().getLeftCurlyBracketKeyword_4_0());
+			}
+			(
+				(
+					{ 
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 0);
+						}
+									({true}?=>(otherlv_11='type'
+									{
+										newLeafNode(otherlv_11, grammarAccess.getUiSuggestTextFieldAccess().getTypeKeyword_4_1_0_0());
+									}
+									(
+										(
+											{
+												newCompositeNode(grammarAccess.getUiSuggestTextFieldAccess().getJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0());
+											}
+											lv_jvmType_12_0=ruleJvmTypeReference
+											{
+												if ($current==null) {
+													$current = createModelElementForParent(grammarAccess.getUiSuggestTextFieldRule());
+												}
+												set(
+													$current,
+													"jvmType",
+													lv_jvmType_12_0,
+													"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+												afterParserOrEnumRuleCall();
+											}
+										)
+									)
+									(
+										otherlv_13=';'
+										{
+											newLeafNode(otherlv_13, grammarAccess.getUiSuggestTextFieldAccess().getSemicolonKeyword_4_1_0_2());
+										}
+									)?
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 1);
+						}
+									({true}?=>(otherlv_14='captionField'
+									{
+										newLeafNode(otherlv_14, grammarAccess.getUiSuggestTextFieldAccess().getCaptionFieldKeyword_4_1_1_0());
+									}
+									(
+										(
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiSuggestTextFieldRule());
+												}
+											}
+											otherlv_15=RULE_ID
+											{
+												newLeafNode(otherlv_15, grammarAccess.getUiSuggestTextFieldAccess().getItemCaptionPropertyJvmOperationCrossReference_4_1_1_1_0());
+											}
+										)
+									)
+									(
+										otherlv_16=';'
+										{
+											newLeafNode(otherlv_16, grammarAccess.getUiSuggestTextFieldAccess().getSemicolonKeyword_4_1_1_2());
+										}
+									)?
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 2)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 2);
+						}
+									({true}?=>(otherlv_17='filterField'
+									{
+										newLeafNode(otherlv_17, grammarAccess.getUiSuggestTextFieldAccess().getFilterFieldKeyword_4_1_2_0());
+									}
+									(
+										(
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiSuggestTextFieldRule());
+												}
+											}
+											otherlv_18=RULE_ID
+											{
+												newLeafNode(otherlv_18, grammarAccess.getUiSuggestTextFieldAccess().getItemFilterPropertyJvmOperationCrossReference_4_1_2_1_0());
+											}
+										)
+									)
+									(
+										otherlv_19=';'
+										{
+											newLeafNode(otherlv_19, grammarAccess.getUiSuggestTextFieldAccess().getSemicolonKeyword_4_1_2_2());
+										}
+									)?
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 3)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 3);
+						}
+									({true}?=>(otherlv_20='uuidField'
+									{
+										newLeafNode(otherlv_20, grammarAccess.getUiSuggestTextFieldAccess().getUuidFieldKeyword_4_1_3_0());
+									}
+									(
+										(
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiSuggestTextFieldRule());
+												}
+											}
+											otherlv_21=RULE_ID
+											{
+												newLeafNode(otherlv_21, grammarAccess.getUiSuggestTextFieldAccess().getItemUUIDPropertyJvmOperationCrossReference_4_1_3_1_0());
+											}
+										)
+									)
+									(
+										otherlv_22=';'
+										{
+											newLeafNode(otherlv_22, grammarAccess.getUiSuggestTextFieldAccess().getSemicolonKeyword_4_1_3_2());
+										}
+									)?
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 4)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 4);
+						}
+									({true}?=>((
+										lv_autoHidePopup_23_0='autoHidePopup'
+										{
+											newLeafNode(lv_autoHidePopup_23_0, grammarAccess.getUiSuggestTextFieldAccess().getAutoHidePopupAutoHidePopupKeyword_4_1_4_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiSuggestTextFieldRule());
+											}
+											setWithLastConsumed($current, "autoHidePopup", true, "autoHidePopup");
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 5)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 5);
+						}
+									({true}?=>((
+										lv_readonly_24_0='readonly'
+										{
+											newLeafNode(lv_readonly_24_0, grammarAccess.getUiSuggestTextFieldAccess().getReadonlyReadonlyKeyword_4_1_5_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiSuggestTextFieldRule());
+											}
+											setWithLastConsumed($current, "readonly", true, "readonly");
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)
+						)*
+					)
+				)
+					{ 
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1());
+					}
+			)
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiSuggestTextFieldAccess().getValidatorsUiValidatorParserRuleCall_4_2_0_0());
+						}
+						lv_validators_25_0=ruleUiValidator
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiSuggestTextFieldRule());
+							}
+							add(
+								$current,
+								"validators",
+								lv_validators_25_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiSuggestTextFieldAccess().getBindingsUiBindingParserRuleCall_4_2_1_0());
+						}
+						lv_bindings_26_0=ruleUiBinding
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiSuggestTextFieldRule());
+							}
+							add(
+								$current,
+								"bindings",
+								lv_bindings_26_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiSuggestTextFieldAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0());
+					}
+					lv_processorAssignments_27_0=ruleUiVisibilityProcessorAssignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiSuggestTextFieldRule());
+						}
+						add(
+							$current,
+							"processorAssignments",
+							lv_processorAssignments_27_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)*
+			otherlv_28='}'
+			{
+				newLeafNode(otherlv_28, grammarAccess.getUiSuggestTextFieldAccess().getRightCurlyBracketKeyword_4_4());
+			}
+		)?
 	)
-)
-	{ 
-	  getUnorderedGroupHelper().leave(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_2_1());
-	}
+;
 
-)	otherlv_7=')' 
-    {
-    	newLeafNode(otherlv_7, grammarAccess.getUiSuggestTextFieldAccess().getRightParenthesisKeyword_2_2());
-    }
-)?(
-(
-		lv_name_8_0=RULE_ID
-		{
-			newLeafNode(lv_name_8_0, grammarAccess.getUiSuggestTextFieldAccess().getNameIDTerminalRuleCall_3_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiSuggestTextFieldRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"name",
-        		lv_name_8_0, 
-        		"ID");
-	    }
+// Entry rule entryRuleUiBeanReferenceField
+entryRuleUiBeanReferenceField returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiBeanReferenceFieldRule()); }
+	iv_ruleUiBeanReferenceField=ruleUiBeanReferenceField
+	{ $current=$iv_ruleUiBeanReferenceField.current; }
+	EOF;
 
-)
-)?(	otherlv_9='{' 
-    {
-    	newLeafNode(otherlv_9, grammarAccess.getUiSuggestTextFieldAccess().getLeftCurlyBracketKeyword_4_0());
-    }
-(
-
-(
-	{ 
-	  getUnorderedGroupHelper().enter(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1());
-	}
+// Rule UiBeanReferenceField
+ruleUiBeanReferenceField returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
 	(
 		(
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 0)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 0);
-	 				}
-					({true}?=>(	otherlv_11='type' 
-    {
-    	newLeafNode(otherlv_11, grammarAccess.getUiSuggestTextFieldAccess().getTypeKeyword_4_1_0_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUiSuggestTextFieldAccess().getJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0()); 
-	    }
-		lv_jvmType_12_0=ruleJvmTypeReference		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUiSuggestTextFieldRule());
-	        }
-       		set(
-       			$current, 
-       			"jvmType",
-        		lv_jvmType_12_0, 
-        		"JvmTypeReference");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_13=';' 
-    {
-    	newLeafNode(otherlv_13, grammarAccess.getUiSuggestTextFieldAccess().getSemicolonKeyword_4_1_0_2());
-    }
-)?))
-					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 1)}?=>(
-					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 1);
-	 				}
-					({true}?=>(	otherlv_14='captionField' 
-    {
-    	newLeafNode(otherlv_14, grammarAccess.getUiSuggestTextFieldAccess().getCaptionFieldKeyword_4_1_1_0());
-    }
-(
-(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiBeanReferenceFieldAccess().getUiBeanReferenceFieldAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='referenceField'
 		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiSuggestTextFieldRule());
-	        }
-        }
-	otherlv_15=RULE_ID
-	{
-		newLeafNode(otherlv_15, grammarAccess.getUiSuggestTextFieldAccess().getItemCaptionPropertyJvmOperationCrossReference_4_1_1_1_0()); 
-	}
-
-)
-)(	otherlv_16=';' 
-    {
-    	newLeafNode(otherlv_16, grammarAccess.getUiSuggestTextFieldAccess().getSemicolonKeyword_4_1_1_2());
-    }
-)?))
+			newLeafNode(otherlv_1, grammarAccess.getUiBeanReferenceFieldAccess().getReferenceFieldKeyword_1());
+		}
+		(
+			otherlv_2='('
+			{
+				newLeafNode(otherlv_2, grammarAccess.getUiBeanReferenceFieldAccess().getLeftParenthesisKeyword_2_0());
+			}
+			(
+				(
 					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 2)}?=>(
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_2_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_2_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_2_1(), 0);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getUiBeanReferenceFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+										}
+										lv_i18nInfo_4_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiBeanReferenceFieldRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_4_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_2_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_2_1(), 1);
+						}
+									({true}?=>(otherlv_5='styles'
+									{
+										newLeafNode(otherlv_5, grammarAccess.getUiBeanReferenceFieldAccess().getStylesKeyword_2_1_1_0());
+									}
+									(
+										(
+											lv_styles_6_0=RULE_STRING
+											{
+												newLeafNode(lv_styles_6_0, grammarAccess.getUiBeanReferenceFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiBeanReferenceFieldRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"styles",
+													lv_styles_6_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)
+						)*
+					)
+				)
 					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 2);
-	 				}
-					({true}?=>(	otherlv_17='filterField' 
-    {
-    	newLeafNode(otherlv_17, grammarAccess.getUiSuggestTextFieldAccess().getFilterFieldKeyword_4_1_2_0());
-    }
-(
-(
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_2_1());
+					}
+			)
+			otherlv_7=')'
+			{
+				newLeafNode(otherlv_7, grammarAccess.getUiBeanReferenceFieldAccess().getRightParenthesisKeyword_2_2());
+			}
+		)?
+		(
+			(
+				lv_name_8_0=RULE_ID
+				{
+					newLeafNode(lv_name_8_0, grammarAccess.getUiBeanReferenceFieldAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiBeanReferenceFieldRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_8_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		(
+			otherlv_9='{'
+			{
+				newLeafNode(otherlv_9, grammarAccess.getUiBeanReferenceFieldAccess().getLeftCurlyBracketKeyword_4_0());
+			}
+			(
+				(
+					{ 
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 0);
+						}
+									({true}?=>(otherlv_11='type'
+									{
+										newLeafNode(otherlv_11, grammarAccess.getUiBeanReferenceFieldAccess().getTypeKeyword_4_1_0_0());
+									}
+									(
+										(
+											{
+												newCompositeNode(grammarAccess.getUiBeanReferenceFieldAccess().getJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0());
+											}
+											lv_jvmType_12_0=ruleJvmTypeReference
+											{
+												if ($current==null) {
+													$current = createModelElementForParent(grammarAccess.getUiBeanReferenceFieldRule());
+												}
+												set(
+													$current,
+													"jvmType",
+													lv_jvmType_12_0,
+													"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+												afterParserOrEnumRuleCall();
+											}
+										)
+									)
+									(
+										otherlv_13=';'
+										{
+											newLeafNode(otherlv_13, grammarAccess.getUiBeanReferenceFieldAccess().getSemicolonKeyword_4_1_0_2());
+										}
+									)?
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 1);
+						}
+									({true}?=>(otherlv_14='refSource'
+									{
+										newLeafNode(otherlv_14, grammarAccess.getUiBeanReferenceFieldAccess().getRefSourceKeyword_4_1_1_0());
+									}
+									(
+										(
+											{
+												newCompositeNode(grammarAccess.getUiBeanReferenceFieldAccess().getReferenceSourceJvmTypeJvmTypeReferenceParserRuleCall_4_1_1_1_0());
+											}
+											lv_referenceSourceJvmType_15_0=ruleJvmTypeReference
+											{
+												if ($current==null) {
+													$current = createModelElementForParent(grammarAccess.getUiBeanReferenceFieldRule());
+												}
+												set(
+													$current,
+													"referenceSourceJvmType",
+													lv_referenceSourceJvmType_15_0,
+													"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+												afterParserOrEnumRuleCall();
+											}
+										)
+									)
+									otherlv_16=':'
+									{
+										newLeafNode(otherlv_16, grammarAccess.getUiBeanReferenceFieldAccess().getColonKeyword_4_1_1_2());
+									}
+									(
+										(
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiBeanReferenceFieldRule());
+												}
+											}
+											otherlv_17=RULE_ID
+											{
+												newLeafNode(otherlv_17, grammarAccess.getUiBeanReferenceFieldAccess().getReferenceSourceFieldJvmFieldCrossReference_4_1_1_3_0());
+											}
+										)
+									)
+									(
+										otherlv_18=';'
+										{
+											newLeafNode(otherlv_18, grammarAccess.getUiBeanReferenceFieldAccess().getSemicolonKeyword_4_1_1_4());
+										}
+									)?
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 2)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 2);
+						}
+									({true}?=>(otherlv_19='captionField'
+									{
+										newLeafNode(otherlv_19, grammarAccess.getUiBeanReferenceFieldAccess().getCaptionFieldKeyword_4_1_2_0());
+									}
+									(
+										(
+											{
+												newCompositeNode(grammarAccess.getUiBeanReferenceFieldAccess().getCaptionPropertyUiNestedPropertyParserRuleCall_4_1_2_1_0());
+											}
+											lv_captionProperty_20_0=ruleUiNestedProperty
+											{
+												if ($current==null) {
+													$current = createModelElementForParent(grammarAccess.getUiBeanReferenceFieldRule());
+												}
+												set(
+													$current,
+													"captionProperty",
+													lv_captionProperty_20_0,
+													"org.eclipse.osbp.ecview.dsl.UIGrammar.UiNestedProperty");
+												afterParserOrEnumRuleCall();
+											}
+										)
+									)
+									(
+										otherlv_21=';'
+										{
+											newLeafNode(otherlv_21, grammarAccess.getUiBeanReferenceFieldAccess().getSemicolonKeyword_4_1_2_2());
+										}
+									)?
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 3)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 3);
+						}
+									({true}?=>(otherlv_22='descriptionField'
+									{
+										newLeafNode(otherlv_22, grammarAccess.getUiBeanReferenceFieldAccess().getDescriptionFieldKeyword_4_1_3_0());
+									}
+									(
+										(
+											{
+												newCompositeNode(grammarAccess.getUiBeanReferenceFieldAccess().getDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_3_1_0());
+											}
+											lv_descriptionProperty_23_0=ruleUiNestedProperty
+											{
+												if ($current==null) {
+													$current = createModelElementForParent(grammarAccess.getUiBeanReferenceFieldRule());
+												}
+												set(
+													$current,
+													"descriptionProperty",
+													lv_descriptionProperty_23_0,
+													"org.eclipse.osbp.ecview.dsl.UIGrammar.UiNestedProperty");
+												afterParserOrEnumRuleCall();
+											}
+										)
+									)
+									(
+										otherlv_24=';'
+										{
+											newLeafNode(otherlv_24, grammarAccess.getUiBeanReferenceFieldAccess().getSemicolonKeyword_4_1_3_2());
+										}
+									)?
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 4)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 4);
+						}
+									({true}?=>(otherlv_25='imageField'
+									{
+										newLeafNode(otherlv_25, grammarAccess.getUiBeanReferenceFieldAccess().getImageFieldKeyword_4_1_4_0());
+									}
+									(
+										(
+											{
+												newCompositeNode(grammarAccess.getUiBeanReferenceFieldAccess().getImagePropertyUiNestedPropertyParserRuleCall_4_1_4_1_0());
+											}
+											lv_imageProperty_26_0=ruleUiNestedProperty
+											{
+												if ($current==null) {
+													$current = createModelElementForParent(grammarAccess.getUiBeanReferenceFieldRule());
+												}
+												set(
+													$current,
+													"imageProperty",
+													lv_imageProperty_26_0,
+													"org.eclipse.osbp.ecview.dsl.UIGrammar.UiNestedProperty");
+												afterParserOrEnumRuleCall();
+											}
+										)
+									)
+									(
+										otherlv_27=';'
+										{
+											newLeafNode(otherlv_27, grammarAccess.getUiBeanReferenceFieldAccess().getSemicolonKeyword_4_1_4_2());
+										}
+									)?
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 5)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 5);
+						}
+									({true}?=>(otherlv_28='inMemoryService'
+									{
+										newLeafNode(otherlv_28, grammarAccess.getUiBeanReferenceFieldAccess().getInMemoryServiceKeyword_4_1_5_0());
+									}
+									(
+										(
+											{
+												newCompositeNode(grammarAccess.getUiBeanReferenceFieldAccess().getInMemoryBeanProviderJvmTypeReferenceParserRuleCall_4_1_5_1_0());
+											}
+											lv_inMemoryBeanProvider_29_0=ruleJvmTypeReference
+											{
+												if ($current==null) {
+													$current = createModelElementForParent(grammarAccess.getUiBeanReferenceFieldRule());
+												}
+												set(
+													$current,
+													"inMemoryBeanProvider",
+													lv_inMemoryBeanProvider_29_0,
+													"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+												afterParserOrEnumRuleCall();
+											}
+										)
+									)
+									(
+										otherlv_30=';'
+										{
+											newLeafNode(otherlv_30, grammarAccess.getUiBeanReferenceFieldAccess().getSemicolonKeyword_4_1_5_2());
+										}
+									)?
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)
+						)*
+					)
+				)
+					{ 
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1());
+					}
+			)
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiBeanReferenceFieldAccess().getValidatorsUiValidatorParserRuleCall_4_2_0_0());
+						}
+						lv_validators_31_0=ruleUiValidator
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiBeanReferenceFieldRule());
+							}
+							add(
+								$current,
+								"validators",
+								lv_validators_31_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiBeanReferenceFieldAccess().getBindingsUiBindingParserRuleCall_4_2_1_0());
+						}
+						lv_bindings_32_0=ruleUiBinding
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiBeanReferenceFieldRule());
+							}
+							add(
+								$current,
+								"bindings",
+								lv_bindings_32_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiBeanReferenceFieldAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0());
+					}
+					lv_processorAssignments_33_0=ruleUiVisibilityProcessorAssignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiBeanReferenceFieldRule());
+						}
+						add(
+							$current,
+							"processorAssignments",
+							lv_processorAssignments_33_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)*
+			otherlv_34='}'
+			{
+				newLeafNode(otherlv_34, grammarAccess.getUiBeanReferenceFieldAccess().getRightCurlyBracketKeyword_4_4());
+			}
+		)?
+	)
+;
+
+// Entry rule entryRuleUiSearchField
+entryRuleUiSearchField returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiSearchFieldRule()); }
+	iv_ruleUiSearchField=ruleUiSearchField
+	{ $current=$iv_ruleUiSearchField.current; }
+	EOF;
+
+// Rule UiSearchField
+ruleUiSearchField returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiSearchFieldAccess().getUiSearchFieldAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='searchfield'
 		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiSuggestTextFieldRule());
-	        }
-        }
-	otherlv_18=RULE_ID
-	{
-		newLeafNode(otherlv_18, grammarAccess.getUiSuggestTextFieldAccess().getItemFilterPropertyJvmOperationCrossReference_4_1_2_1_0()); 
-	}
-
-)
-)(	otherlv_19=';' 
-    {
-    	newLeafNode(otherlv_19, grammarAccess.getUiSuggestTextFieldAccess().getSemicolonKeyword_4_1_2_2());
-    }
-)?))
+			newLeafNode(otherlv_1, grammarAccess.getUiSearchFieldAccess().getSearchfieldKeyword_1());
+		}
+		(
+			otherlv_2='('
+			{
+				newLeafNode(otherlv_2, grammarAccess.getUiSearchFieldAccess().getLeftParenthesisKeyword_2_0());
+			}
+			(
+				(
 					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 3)}?=>(
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiSearchFieldAccess().getUnorderedGroup_2_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSearchFieldAccess().getUnorderedGroup_2_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiSearchFieldAccess().getUnorderedGroup_2_1(), 0);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getUiSearchFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+										}
+										lv_i18nInfo_4_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiSearchFieldRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_4_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSearchFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSearchFieldAccess().getUnorderedGroup_2_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiSearchFieldAccess().getUnorderedGroup_2_1(), 1);
+						}
+									({true}?=>(otherlv_5='styles'
+									{
+										newLeafNode(otherlv_5, grammarAccess.getUiSearchFieldAccess().getStylesKeyword_2_1_1_0());
+									}
+									(
+										(
+											lv_styles_6_0=RULE_STRING
+											{
+												newLeafNode(lv_styles_6_0, grammarAccess.getUiSearchFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiSearchFieldRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"styles",
+													lv_styles_6_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSearchFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)
+						)*
+					)
+				)
 					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 3);
-	 				}
-					({true}?=>(	otherlv_20='uuidField' 
-    {
-    	newLeafNode(otherlv_20, grammarAccess.getUiSuggestTextFieldAccess().getUuidFieldKeyword_4_1_3_0());
-    }
-(
-(
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiSearchFieldAccess().getUnorderedGroup_2_1());
+					}
+			)
+			otherlv_7=')'
+			{
+				newLeafNode(otherlv_7, grammarAccess.getUiSearchFieldAccess().getRightParenthesisKeyword_2_2());
+			}
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiSearchFieldAccess().getPropertyUiNestedPropertyParserRuleCall_3_0());
+				}
+				lv_property_8_0=ruleUiNestedProperty
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiSearchFieldRule());
+					}
+					set(
+						$current,
+						"property",
+						lv_property_8_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiNestedProperty");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleUiTextArea
+entryRuleUiTextArea returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiTextAreaRule()); }
+	iv_ruleUiTextArea=ruleUiTextArea
+	{ $current=$iv_ruleUiTextArea.current; }
+	EOF;
+
+// Rule UiTextArea
+ruleUiTextArea returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiTextAreaAccess().getUiTextAreaAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='textarea'
 		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiSuggestTextFieldRule());
-	        }
-        }
-	otherlv_21=RULE_ID
+			newLeafNode(otherlv_1, grammarAccess.getUiTextAreaAccess().getTextareaKeyword_1());
+		}
+		(
+			otherlv_2='('
+			{
+				newLeafNode(otherlv_2, grammarAccess.getUiTextAreaAccess().getLeftParenthesisKeyword_2_0());
+			}
+			(
+				(
+					{ 
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiTextAreaAccess().getUnorderedGroup_2_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextAreaAccess().getUnorderedGroup_2_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiTextAreaAccess().getUnorderedGroup_2_1(), 0);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getUiTextAreaAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+										}
+										lv_i18nInfo_4_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiTextAreaRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_4_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTextAreaAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextAreaAccess().getUnorderedGroup_2_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiTextAreaAccess().getUnorderedGroup_2_1(), 1);
+						}
+									({true}?=>((
+										lv_readonly_5_0='readonly'
+										{
+											newLeafNode(lv_readonly_5_0, grammarAccess.getUiTextAreaAccess().getReadonlyReadonlyKeyword_2_1_1_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiTextAreaRule());
+											}
+											setWithLastConsumed($current, "readonly", true, "readonly");
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTextAreaAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextAreaAccess().getUnorderedGroup_2_1(), 2)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiTextAreaAccess().getUnorderedGroup_2_1(), 2);
+						}
+									({true}?=>(otherlv_6='styles'
+									{
+										newLeafNode(otherlv_6, grammarAccess.getUiTextAreaAccess().getStylesKeyword_2_1_2_0());
+									}
+									(
+										(
+											lv_styles_7_0=RULE_STRING
+											{
+												newLeafNode(lv_styles_7_0, grammarAccess.getUiTextAreaAccess().getStylesSTRINGTerminalRuleCall_2_1_2_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiTextAreaRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"styles",
+													lv_styles_7_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTextAreaAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)
+						)*
+					)
+				)
+					{ 
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiTextAreaAccess().getUnorderedGroup_2_1());
+					}
+			)
+			otherlv_8=')'
+			{
+				newLeafNode(otherlv_8, grammarAccess.getUiTextAreaAccess().getRightParenthesisKeyword_2_2());
+			}
+		)?
+		(
+			(
+				lv_name_9_0=RULE_ID
+				{
+					newLeafNode(lv_name_9_0, grammarAccess.getUiTextAreaAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiTextAreaRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_9_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		(
+			otherlv_10='{'
+			{
+				newLeafNode(otherlv_10, grammarAccess.getUiTextAreaAccess().getLeftCurlyBracketKeyword_4_0());
+			}
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiTextAreaAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
+						}
+						lv_validators_11_0=ruleUiValidator
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiTextAreaRule());
+							}
+							add(
+								$current,
+								"validators",
+								lv_validators_11_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiTextAreaAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
+						}
+						lv_bindings_12_0=ruleUiBinding
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiTextAreaRule());
+							}
+							add(
+								$current,
+								"bindings",
+								lv_bindings_12_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiTextAreaAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
+					}
+					lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiTextAreaRule());
+						}
+						add(
+							$current,
+							"processorAssignments",
+							lv_processorAssignments_13_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)*
+			otherlv_14='}'
+			{
+				newLeafNode(otherlv_14, grammarAccess.getUiTextAreaAccess().getRightCurlyBracketKeyword_4_3());
+			}
+		)?
+	)
+;
+
+// Entry rule entryRuleUiDateField
+entryRuleUiDateField returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiDateFieldRule()); }
+	iv_ruleUiDateField=ruleUiDateField
+	{ $current=$iv_ruleUiDateField.current; }
+	EOF;
+
+// Rule UiDateField
+ruleUiDateField returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiDateFieldAccess().getUiDateFieldAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='datefield'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getUiDateFieldAccess().getDatefieldKeyword_1());
+		}
+		(
+			otherlv_2='('
+			{
+				newLeafNode(otherlv_2, grammarAccess.getUiDateFieldAccess().getLeftParenthesisKeyword_2_0());
+			}
+			(
+				(
+					{ 
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), 0);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getUiDateFieldAccess().getDateFormatUiDateFormatEnumRuleCall_2_1_0_0());
+										}
+										lv_dateFormat_4_0=ruleUiDateFormat
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiDateFieldRule());
+											}
+											set(
+												$current,
+												"dateFormat",
+												lv_dateFormat_4_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiDateFormat");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), 1);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getUiDateFieldAccess().getResolutionUiDateTimeResolutionEnumRuleCall_2_1_1_0());
+										}
+										lv_resolution_5_0=ruleUiDateTimeResolution
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiDateFieldRule());
+											}
+											set(
+												$current,
+												"resolution",
+												lv_resolution_5_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiDateTimeResolution");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), 2)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), 2);
+						}
+									({true}?=>(otherlv_6='styles'
+									{
+										newLeafNode(otherlv_6, grammarAccess.getUiDateFieldAccess().getStylesKeyword_2_1_2_0());
+									}
+									(
+										(
+											lv_styles_7_0=RULE_STRING
+											{
+												newLeafNode(lv_styles_7_0, grammarAccess.getUiDateFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_2_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiDateFieldRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"styles",
+													lv_styles_7_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), 3)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), 3);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getUiDateFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_3_0());
+										}
+										lv_i18nInfo_8_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiDateFieldRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_8_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), 4)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), 4);
+						}
+									({true}?=>((
+										lv_readonly_9_0='readonly'
+										{
+											newLeafNode(lv_readonly_9_0, grammarAccess.getUiDateFieldAccess().getReadonlyReadonlyKeyword_2_1_4_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiDateFieldRule());
+											}
+											setWithLastConsumed($current, "readonly", true, "readonly");
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)
+						)*
+					)
+				)
+					{ 
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1());
+					}
+			)
+			otherlv_10=')'
+			{
+				newLeafNode(otherlv_10, grammarAccess.getUiDateFieldAccess().getRightParenthesisKeyword_2_2());
+			}
+		)?
+		(
+			(
+				lv_name_11_0=RULE_ID
+				{
+					newLeafNode(lv_name_11_0, grammarAccess.getUiDateFieldAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiDateFieldRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_11_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		(
+			otherlv_12='{'
+			{
+				newLeafNode(otherlv_12, grammarAccess.getUiDateFieldAccess().getLeftCurlyBracketKeyword_4_0());
+			}
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiDateFieldAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
+						}
+						lv_validators_13_0=ruleUiValidator
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiDateFieldRule());
+							}
+							add(
+								$current,
+								"validators",
+								lv_validators_13_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiDateFieldAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
+						}
+						lv_bindings_14_0=ruleUiBinding
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiDateFieldRule());
+							}
+							add(
+								$current,
+								"bindings",
+								lv_bindings_14_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiDateFieldAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
+					}
+					lv_processorAssignments_15_0=ruleUiVisibilityProcessorAssignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiDateFieldRule());
+						}
+						add(
+							$current,
+							"processorAssignments",
+							lv_processorAssignments_15_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)*
+			otherlv_16='}'
+			{
+				newLeafNode(otherlv_16, grammarAccess.getUiDateFieldAccess().getRightCurlyBracketKeyword_4_3());
+			}
+		)?
+	)
+;
+
+// Entry rule entryRuleUiBrowser
+entryRuleUiBrowser returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiBrowserRule()); }
+	iv_ruleUiBrowser=ruleUiBrowser
+	{ $current=$iv_ruleUiBrowser.current; }
+	EOF;
+
+// Rule UiBrowser
+ruleUiBrowser returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiBrowserAccess().getUiBrowserAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='browser'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getUiBrowserAccess().getBrowserKeyword_1());
+		}
+		(
+			otherlv_2='('
+			{
+				newLeafNode(otherlv_2, grammarAccess.getUiBrowserAccess().getLeftParenthesisKeyword_2_0());
+			}
+			(
+				(
+					{ 
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiBrowserAccess().getUnorderedGroup_2_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiBrowserAccess().getUnorderedGroup_2_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiBrowserAccess().getUnorderedGroup_2_1(), 0);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getUiBrowserAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+										}
+										lv_i18nInfo_4_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiBrowserRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_4_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiBrowserAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiBrowserAccess().getUnorderedGroup_2_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiBrowserAccess().getUnorderedGroup_2_1(), 1);
+						}
+									({true}?=>((
+										lv_readonly_5_0='readonly'
+										{
+											newLeafNode(lv_readonly_5_0, grammarAccess.getUiBrowserAccess().getReadonlyReadonlyKeyword_2_1_1_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiBrowserRule());
+											}
+											setWithLastConsumed($current, "readonly", true, "readonly");
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiBrowserAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiBrowserAccess().getUnorderedGroup_2_1(), 2)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiBrowserAccess().getUnorderedGroup_2_1(), 2);
+						}
+									({true}?=>(otherlv_6='styles'
+									{
+										newLeafNode(otherlv_6, grammarAccess.getUiBrowserAccess().getStylesKeyword_2_1_2_0());
+									}
+									(
+										(
+											lv_styles_7_0=RULE_STRING
+											{
+												newLeafNode(lv_styles_7_0, grammarAccess.getUiBrowserAccess().getStylesSTRINGTerminalRuleCall_2_1_2_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiBrowserRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"styles",
+													lv_styles_7_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiBrowserAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)
+						)*
+					)
+				)
+					{ 
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiBrowserAccess().getUnorderedGroup_2_1());
+					}
+			)
+			otherlv_8=')'
+			{
+				newLeafNode(otherlv_8, grammarAccess.getUiBrowserAccess().getRightParenthesisKeyword_2_2());
+			}
+		)?
+		(
+			(
+				lv_name_9_0=RULE_ID
+				{
+					newLeafNode(lv_name_9_0, grammarAccess.getUiBrowserAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiBrowserRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_9_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		(
+			otherlv_10='{'
+			{
+				newLeafNode(otherlv_10, grammarAccess.getUiBrowserAccess().getLeftCurlyBracketKeyword_4_0());
+			}
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiBrowserAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
+						}
+						lv_validators_11_0=ruleUiValidator
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiBrowserRule());
+							}
+							add(
+								$current,
+								"validators",
+								lv_validators_11_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiBrowserAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
+						}
+						lv_bindings_12_0=ruleUiBinding
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiBrowserRule());
+							}
+							add(
+								$current,
+								"bindings",
+								lv_bindings_12_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiBrowserAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
+					}
+					lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiBrowserRule());
+						}
+						add(
+							$current,
+							"processorAssignments",
+							lv_processorAssignments_13_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)*
+			otherlv_14='}'
+			{
+				newLeafNode(otherlv_14, grammarAccess.getUiBrowserAccess().getRightCurlyBracketKeyword_4_3());
+			}
+		)?
+	)
+;
+
+// Entry rule entryRuleUiProgressBar
+entryRuleUiProgressBar returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiProgressBarRule()); }
+	iv_ruleUiProgressBar=ruleUiProgressBar
+	{ $current=$iv_ruleUiProgressBar.current; }
+	EOF;
+
+// Rule UiProgressBar
+ruleUiProgressBar returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiProgressBarAccess().getUiProgressBarAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='progressbar'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getUiProgressBarAccess().getProgressbarKeyword_1());
+		}
+		(
+			otherlv_2='('
+			{
+				newLeafNode(otherlv_2, grammarAccess.getUiProgressBarAccess().getLeftParenthesisKeyword_2_0());
+			}
+			(
+				(
+					{ 
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiProgressBarAccess().getUnorderedGroup_2_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiProgressBarAccess().getUnorderedGroup_2_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiProgressBarAccess().getUnorderedGroup_2_1(), 0);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getUiProgressBarAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+										}
+										lv_i18nInfo_4_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiProgressBarRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_4_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiProgressBarAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiProgressBarAccess().getUnorderedGroup_2_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiProgressBarAccess().getUnorderedGroup_2_1(), 1);
+						}
+									({true}?=>(otherlv_5='styles'
+									{
+										newLeafNode(otherlv_5, grammarAccess.getUiProgressBarAccess().getStylesKeyword_2_1_1_0());
+									}
+									(
+										(
+											lv_styles_6_0=RULE_STRING
+											{
+												newLeafNode(lv_styles_6_0, grammarAccess.getUiProgressBarAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiProgressBarRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"styles",
+													lv_styles_6_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiProgressBarAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)
+						)*
+					)
+				)
+					{ 
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiProgressBarAccess().getUnorderedGroup_2_1());
+					}
+			)
+			otherlv_7=')'
+			{
+				newLeafNode(otherlv_7, grammarAccess.getUiProgressBarAccess().getRightParenthesisKeyword_2_2());
+			}
+		)?
+		(
+			(
+				lv_name_8_0=RULE_ID
+				{
+					newLeafNode(lv_name_8_0, grammarAccess.getUiProgressBarAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiProgressBarRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_8_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		(
+			otherlv_9='{'
+			{
+				newLeafNode(otherlv_9, grammarAccess.getUiProgressBarAccess().getLeftCurlyBracketKeyword_4_0());
+			}
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiProgressBarAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
+						}
+						lv_validators_10_0=ruleUiValidator
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiProgressBarRule());
+							}
+							add(
+								$current,
+								"validators",
+								lv_validators_10_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiProgressBarAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
+						}
+						lv_bindings_11_0=ruleUiBinding
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiProgressBarRule());
+							}
+							add(
+								$current,
+								"bindings",
+								lv_bindings_11_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiProgressBarAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
+					}
+					lv_processorAssignments_12_0=ruleUiVisibilityProcessorAssignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiProgressBarRule());
+						}
+						add(
+							$current,
+							"processorAssignments",
+							lv_processorAssignments_12_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)*
+			otherlv_13='}'
+			{
+				newLeafNode(otherlv_13, grammarAccess.getUiProgressBarAccess().getRightCurlyBracketKeyword_4_3());
+			}
+		)?
+	)
+;
+
+// Entry rule entryRuleUiImage
+entryRuleUiImage returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiImageRule()); }
+	iv_ruleUiImage=ruleUiImage
+	{ $current=$iv_ruleUiImage.current; }
+	EOF;
+
+// Rule UiImage
+ruleUiImage returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiImageAccess().getUiImageAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='image'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getUiImageAccess().getImageKeyword_1());
+		}
+		(
+			otherlv_2='('
+			{
+				newLeafNode(otherlv_2, grammarAccess.getUiImageAccess().getLeftParenthesisKeyword_2_0());
+			}
+			(
+				(
+					{ 
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiImageAccess().getUnorderedGroup_2_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiImageAccess().getUnorderedGroup_2_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiImageAccess().getUnorderedGroup_2_1(), 0);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getUiImageAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+										}
+										lv_i18nInfo_4_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiImageRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_4_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiImageAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiImageAccess().getUnorderedGroup_2_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiImageAccess().getUnorderedGroup_2_1(), 1);
+						}
+									({true}?=>(otherlv_5='styles'
+									{
+										newLeafNode(otherlv_5, grammarAccess.getUiImageAccess().getStylesKeyword_2_1_1_0());
+									}
+									(
+										(
+											lv_styles_6_0=RULE_STRING
+											{
+												newLeafNode(lv_styles_6_0, grammarAccess.getUiImageAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiImageRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"styles",
+													lv_styles_6_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiImageAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)
+						)*
+					)
+				)
+					{ 
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiImageAccess().getUnorderedGroup_2_1());
+					}
+			)
+			otherlv_7=')'
+			{
+				newLeafNode(otherlv_7, grammarAccess.getUiImageAccess().getRightParenthesisKeyword_2_2());
+			}
+		)?
+		(
+			(
+				lv_name_8_0=RULE_ID
+				{
+					newLeafNode(lv_name_8_0, grammarAccess.getUiImageAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiImageRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_8_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		(
+			otherlv_9='{'
+			{
+				newLeafNode(otherlv_9, grammarAccess.getUiImageAccess().getLeftCurlyBracketKeyword_4_0());
+			}
+			(
+				otherlv_10='iconPath'
+				{
+					newLeafNode(otherlv_10, grammarAccess.getUiImageAccess().getIconPathKeyword_4_1_0());
+				}
+				(
+					(
+						lv_value_11_0=RULE_STRING
+						{
+							newLeafNode(lv_value_11_0, grammarAccess.getUiImageAccess().getValueSTRINGTerminalRuleCall_4_1_1_0());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getUiImageRule());
+							}
+							setWithLastConsumed(
+								$current,
+								"value",
+								lv_value_11_0,
+								"org.eclipse.xtext.xbase.Xtype.STRING");
+						}
+					)
+				)
+				(
+					otherlv_12=';'
+					{
+						newLeafNode(otherlv_12, grammarAccess.getUiImageAccess().getSemicolonKeyword_4_1_2());
+					}
+				)?
+			)?
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiImageAccess().getBindingsUiBindingParserRuleCall_4_2_0());
+					}
+					lv_bindings_13_0=ruleUiBinding
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiImageRule());
+						}
+						add(
+							$current,
+							"bindings",
+							lv_bindings_13_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)*
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiImageAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0());
+					}
+					lv_processorAssignments_14_0=ruleUiVisibilityProcessorAssignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiImageRule());
+						}
+						add(
+							$current,
+							"processorAssignments",
+							lv_processorAssignments_14_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)*
+			otherlv_15='}'
+			{
+				newLeafNode(otherlv_15, grammarAccess.getUiImageAccess().getRightCurlyBracketKeyword_4_4());
+			}
+		)?
+	)
+;
+
+// Entry rule entryRuleUiTable
+entryRuleUiTable returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiTableRule()); }
+	iv_ruleUiTable=ruleUiTable
+	{ $current=$iv_ruleUiTable.current; }
+	EOF;
+
+// Rule UiTable
+ruleUiTable returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiTableAccess().getUiTableAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='table'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getUiTableAccess().getTableKeyword_1());
+		}
+		(
+			otherlv_2='('
+			{
+				newLeafNode(otherlv_2, grammarAccess.getUiTableAccess().getLeftParenthesisKeyword_2_0());
+			}
+			(
+				(
+					{ 
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiTableAccess().getUnorderedGroup_2_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTableAccess().getUnorderedGroup_2_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiTableAccess().getUnorderedGroup_2_1(), 0);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getUiTableAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+										}
+										lv_i18nInfo_4_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiTableRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_4_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTableAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTableAccess().getUnorderedGroup_2_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiTableAccess().getUnorderedGroup_2_1(), 1);
+						}
+									({true}?=>(otherlv_5='styles'
+									{
+										newLeafNode(otherlv_5, grammarAccess.getUiTableAccess().getStylesKeyword_2_1_1_0());
+									}
+									(
+										(
+											lv_styles_6_0=RULE_STRING
+											{
+												newLeafNode(lv_styles_6_0, grammarAccess.getUiTableAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiTableRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"styles",
+													lv_styles_6_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTableAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)
+						)*
+					)
+				)
+					{ 
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiTableAccess().getUnorderedGroup_2_1());
+					}
+			)
+			otherlv_7=')'
+			{
+				newLeafNode(otherlv_7, grammarAccess.getUiTableAccess().getRightParenthesisKeyword_2_2());
+			}
+		)?
+		(
+			(
+				lv_name_8_0=RULE_ID
+				{
+					newLeafNode(lv_name_8_0, grammarAccess.getUiTableAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiTableRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_8_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		(
+			otherlv_9='{'
+			{
+				newLeafNode(otherlv_9, grammarAccess.getUiTableAccess().getLeftCurlyBracketKeyword_4_0());
+			}
+			(
+				(
+					{ 
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 0);
+						}
+									({true}?=>(otherlv_11='type'
+									{
+										newLeafNode(otherlv_11, grammarAccess.getUiTableAccess().getTypeKeyword_4_1_0_0());
+									}
+									(
+										(
+											{
+												newCompositeNode(grammarAccess.getUiTableAccess().getJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0());
+											}
+											lv_jvmType_12_0=ruleJvmTypeReference
+											{
+												if ($current==null) {
+													$current = createModelElementForParent(grammarAccess.getUiTableRule());
+												}
+												set(
+													$current,
+													"jvmType",
+													lv_jvmType_12_0,
+													"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+												afterParserOrEnumRuleCall();
+											}
+										)
+									)
+									(
+										otherlv_13=';'
+										{
+											newLeafNode(otherlv_13, grammarAccess.getUiTableAccess().getSemicolonKeyword_4_1_0_2());
+										}
+									)?
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 1);
+						}
+									({true}?=>(otherlv_14='selectionType'
+									{
+										newLeafNode(otherlv_14, grammarAccess.getUiTableAccess().getSelectionTypeKeyword_4_1_1_0());
+									}
+									(
+										(
+											{
+												newCompositeNode(grammarAccess.getUiTableAccess().getSelectionTypeUiSelectionTypeEnumRuleCall_4_1_1_1_0());
+											}
+											lv_selectionType_15_0=ruleUiSelectionType
+											{
+												if ($current==null) {
+													$current = createModelElementForParent(grammarAccess.getUiTableRule());
+												}
+												set(
+													$current,
+													"selectionType",
+													lv_selectionType_15_0,
+													"org.eclipse.osbp.ecview.dsl.UIGrammar.UiSelectionType");
+												afterParserOrEnumRuleCall();
+											}
+										)
+									)
+									(
+										otherlv_16=';'
+										{
+											newLeafNode(otherlv_16, grammarAccess.getUiTableAccess().getSemicolonKeyword_4_1_1_2());
+										}
+									)?
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 2)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 2);
+						}
+									({true}?=>(otherlv_17='imageField'
+									{
+										newLeafNode(otherlv_17, grammarAccess.getUiTableAccess().getImageFieldKeyword_4_1_2_0());
+									}
+									(
+										(
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiTableRule());
+												}
+											}
+											otherlv_18=RULE_ID
+											{
+												newLeafNode(otherlv_18, grammarAccess.getUiTableAccess().getItemImagePropertyJvmOperationCrossReference_4_1_2_1_0());
+											}
+										)
+									)
+									(
+										otherlv_19=';'
+										{
+											newLeafNode(otherlv_19, grammarAccess.getUiTableAccess().getSemicolonKeyword_4_1_2_2());
+										}
+									)?
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 3)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 3);
+						}
+									({true}?=>((
+										(
+											lv_consumeBeanService_20_0='useBeanService'
+											{
+												newLeafNode(lv_consumeBeanService_20_0, grammarAccess.getUiTableAccess().getConsumeBeanServiceUseBeanServiceKeyword_4_1_3_0_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiTableRule());
+												}
+												setWithLastConsumed($current, "consumeBeanService", true, "useBeanService");
+											}
+										)
+									)
+									(
+										otherlv_21=';'
+										{
+											newLeafNode(otherlv_21, grammarAccess.getUiTableAccess().getSemicolonKeyword_4_1_3_1());
+										}
+									)?
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 4)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 4);
+						}
+									({true}?=>((
+										(
+											lv_scrollToBottom_22_0='scrollToBottom'
+											{
+												newLeafNode(lv_scrollToBottom_22_0, grammarAccess.getUiTableAccess().getScrollToBottomScrollToBottomKeyword_4_1_4_0_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiTableRule());
+												}
+												setWithLastConsumed($current, "scrollToBottom", true, "scrollToBottom");
+											}
+										)
+									)
+									(
+										otherlv_23=';'
+										{
+											newLeafNode(otherlv_23, grammarAccess.getUiTableAccess().getSemicolonKeyword_4_1_4_1());
+										}
+									)?
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 5)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 5);
+						}
+									({true}?=>((
+										lv_readonly_24_0='readonly'
+										{
+											newLeafNode(lv_readonly_24_0, grammarAccess.getUiTableAccess().getReadonlyReadonlyKeyword_4_1_5_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiTableRule());
+											}
+											setWithLastConsumed($current, "readonly", true, "readonly");
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)
+						)*
+					)
+				)
+					{ 
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1());
+					}
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiTableAccess().getColumnAssignmentUiColumnsAssignmentParserRuleCall_4_2_0());
+					}
+					lv_columnAssignment_25_0=ruleUiColumnsAssignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiTableRule());
+						}
+						set(
+							$current,
+							"columnAssignment",
+							lv_columnAssignment_25_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiColumnsAssignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)?
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiTableAccess().getSortOrderAssignmentUiSortOrderAssignmentParserRuleCall_4_3_0());
+					}
+					lv_sortOrderAssignment_26_0=ruleUiSortOrderAssignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiTableRule());
+						}
+						set(
+							$current,
+							"sortOrderAssignment",
+							lv_sortOrderAssignment_26_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiSortOrderAssignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)?
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiTableAccess().getValidatorsUiValidatorParserRuleCall_4_4_0_0());
+						}
+						lv_validators_27_0=ruleUiValidator
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiTableRule());
+							}
+							add(
+								$current,
+								"validators",
+								lv_validators_27_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiTableAccess().getBindingsUiBindingParserRuleCall_4_4_1_0());
+						}
+						lv_bindings_28_0=ruleUiBinding
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiTableRule());
+							}
+							add(
+								$current,
+								"bindings",
+								lv_bindings_28_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiTableAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_5_0());
+					}
+					lv_processorAssignments_29_0=ruleUiVisibilityProcessorAssignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiTableRule());
+						}
+						add(
+							$current,
+							"processorAssignments",
+							lv_processorAssignments_29_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)*
+			otherlv_30='}'
+			{
+				newLeafNode(otherlv_30, grammarAccess.getUiTableAccess().getRightCurlyBracketKeyword_4_6());
+			}
+		)?
+	)
+;
+
+// Entry rule entryRuleUiComboBox
+entryRuleUiComboBox returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiComboBoxRule()); }
+	iv_ruleUiComboBox=ruleUiComboBox
+	{ $current=$iv_ruleUiComboBox.current; }
+	EOF;
+
+// Rule UiComboBox
+ruleUiComboBox returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiComboBoxAccess().getUiComboBoxAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='combo'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getUiComboBoxAccess().getComboKeyword_1());
+		}
+		(
+			otherlv_2='('
+			{
+				newLeafNode(otherlv_2, grammarAccess.getUiComboBoxAccess().getLeftParenthesisKeyword_2_0());
+			}
+			(
+				(
+					{ 
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_2_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_2_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_2_1(), 0);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getUiComboBoxAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+										}
+										lv_i18nInfo_4_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiComboBoxRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_4_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_2_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_2_1(), 1);
+						}
+									({true}?=>(otherlv_5='styles'
+									{
+										newLeafNode(otherlv_5, grammarAccess.getUiComboBoxAccess().getStylesKeyword_2_1_1_0());
+									}
+									(
+										(
+											lv_styles_6_0=RULE_STRING
+											{
+												newLeafNode(lv_styles_6_0, grammarAccess.getUiComboBoxAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiComboBoxRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"styles",
+													lv_styles_6_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)
+						)*
+					)
+				)
+					{ 
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_2_1());
+					}
+			)
+			otherlv_7=')'
+			{
+				newLeafNode(otherlv_7, grammarAccess.getUiComboBoxAccess().getRightParenthesisKeyword_2_2());
+			}
+		)?
+		(
+			(
+				lv_name_8_0=RULE_ID
+				{
+					newLeafNode(lv_name_8_0, grammarAccess.getUiComboBoxAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiComboBoxRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_8_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		(
+			otherlv_9='{'
+			{
+				newLeafNode(otherlv_9, grammarAccess.getUiComboBoxAccess().getLeftCurlyBracketKeyword_4_0());
+			}
+			(
+				(
+					{ 
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 0);
+						}
+									({true}?=>(otherlv_11='type'
+									{
+										newLeafNode(otherlv_11, grammarAccess.getUiComboBoxAccess().getTypeKeyword_4_1_0_0());
+									}
+									(
+										(
+											{
+												newCompositeNode(grammarAccess.getUiComboBoxAccess().getJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0());
+											}
+											lv_jvmType_12_0=ruleJvmTypeReference
+											{
+												if ($current==null) {
+													$current = createModelElementForParent(grammarAccess.getUiComboBoxRule());
+												}
+												set(
+													$current,
+													"jvmType",
+													lv_jvmType_12_0,
+													"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+												afterParserOrEnumRuleCall();
+											}
+										)
+									)
+									(
+										otherlv_13=';'
+										{
+											newLeafNode(otherlv_13, grammarAccess.getUiComboBoxAccess().getSemicolonKeyword_4_1_0_2());
+										}
+									)?
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 1);
+						}
+									({true}?=>(otherlv_14='captionField'
+									{
+										newLeafNode(otherlv_14, grammarAccess.getUiComboBoxAccess().getCaptionFieldKeyword_4_1_1_0());
+									}
+									(
+										(
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiComboBoxRule());
+												}
+											}
+											otherlv_15=RULE_ID
+											{
+												newLeafNode(otherlv_15, grammarAccess.getUiComboBoxAccess().getItemCaptionPropertyJvmOperationCrossReference_4_1_1_1_0());
+											}
+										)
+									)
+									(
+										otherlv_16=';'
+										{
+											newLeafNode(otherlv_16, grammarAccess.getUiComboBoxAccess().getSemicolonKeyword_4_1_1_2());
+										}
+									)?
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 2)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 2);
+						}
+									({true}?=>(otherlv_17='descriptionField'
+									{
+										newLeafNode(otherlv_17, grammarAccess.getUiComboBoxAccess().getDescriptionFieldKeyword_4_1_2_0());
+									}
+									(
+										(
+											{
+												newCompositeNode(grammarAccess.getUiComboBoxAccess().getDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_2_1_0());
+											}
+											lv_descriptionProperty_18_0=ruleUiNestedProperty
+											{
+												if ($current==null) {
+													$current = createModelElementForParent(grammarAccess.getUiComboBoxRule());
+												}
+												set(
+													$current,
+													"descriptionProperty",
+													lv_descriptionProperty_18_0,
+													"org.eclipse.osbp.ecview.dsl.UIGrammar.UiNestedProperty");
+												afterParserOrEnumRuleCall();
+											}
+										)
+									)
+									(
+										otherlv_19=';'
+										{
+											newLeafNode(otherlv_19, grammarAccess.getUiComboBoxAccess().getSemicolonKeyword_4_1_2_2());
+										}
+									)?
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 3)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 3);
+						}
+									({true}?=>(otherlv_20='imageField'
+									{
+										newLeafNode(otherlv_20, grammarAccess.getUiComboBoxAccess().getImageFieldKeyword_4_1_3_0());
+									}
+									(
+										(
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiComboBoxRule());
+												}
+											}
+											otherlv_21=RULE_ID
+											{
+												newLeafNode(otherlv_21, grammarAccess.getUiComboBoxAccess().getItemImagePropertyJvmOperationCrossReference_4_1_3_1_0());
+											}
+										)
+									)
+									(
+										otherlv_22=';'
+										{
+											newLeafNode(otherlv_22, grammarAccess.getUiComboBoxAccess().getSemicolonKeyword_4_1_3_2());
+										}
+									)?
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 4)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 4);
+						}
+									({true}?=>((
+										(
+											lv_consumeBeanService_23_0='useBeanService'
+											{
+												newLeafNode(lv_consumeBeanService_23_0, grammarAccess.getUiComboBoxAccess().getConsumeBeanServiceUseBeanServiceKeyword_4_1_4_0_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiComboBoxRule());
+												}
+												setWithLastConsumed($current, "consumeBeanService", true, "useBeanService");
+											}
+										)
+									)
+									(
+										otherlv_24=';'
+										{
+											newLeafNode(otherlv_24, grammarAccess.getUiComboBoxAccess().getSemicolonKeyword_4_1_4_1());
+										}
+									)?
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 5)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 5);
+						}
+									({true}?=>((
+										lv_readonly_25_0='readonly'
+										{
+											newLeafNode(lv_readonly_25_0, grammarAccess.getUiComboBoxAccess().getReadonlyReadonlyKeyword_4_1_5_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiComboBoxRule());
+											}
+											setWithLastConsumed($current, "readonly", true, "readonly");
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)
+						)*
+					)
+				)
+					{ 
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1());
+					}
+			)
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiComboBoxAccess().getValidatorsUiValidatorParserRuleCall_4_2_0_0());
+						}
+						lv_validators_26_0=ruleUiValidator
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiComboBoxRule());
+							}
+							add(
+								$current,
+								"validators",
+								lv_validators_26_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiComboBoxAccess().getBindingsUiBindingParserRuleCall_4_2_1_0());
+						}
+						lv_bindings_27_0=ruleUiBinding
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiComboBoxRule());
+							}
+							add(
+								$current,
+								"bindings",
+								lv_bindings_27_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiComboBoxAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0());
+					}
+					lv_processorAssignments_28_0=ruleUiVisibilityProcessorAssignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiComboBoxRule());
+						}
+						add(
+							$current,
+							"processorAssignments",
+							lv_processorAssignments_28_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)*
+			otherlv_29='}'
+			{
+				newLeafNode(otherlv_29, grammarAccess.getUiComboBoxAccess().getRightCurlyBracketKeyword_4_4());
+			}
+		)?
+	)
+;
+
+// Entry rule entryRuleUiButton
+entryRuleUiButton returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiButtonRule()); }
+	iv_ruleUiButton=ruleUiButton
+	{ $current=$iv_ruleUiButton.current; }
+	EOF;
+
+// Rule UiButton
+ruleUiButton returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiButtonAccess().getUiButtonAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='button'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getUiButtonAccess().getButtonKeyword_1());
+		}
+		(
+			otherlv_2='('
+			{
+				newLeafNode(otherlv_2, grammarAccess.getUiButtonAccess().getLeftParenthesisKeyword_2_0());
+			}
+			(
+				(
+					{ 
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiButtonAccess().getUnorderedGroup_2_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiButtonAccess().getUnorderedGroup_2_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiButtonAccess().getUnorderedGroup_2_1(), 0);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getUiButtonAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+										}
+										lv_i18nInfo_4_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiButtonRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_4_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiButtonAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiButtonAccess().getUnorderedGroup_2_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiButtonAccess().getUnorderedGroup_2_1(), 1);
+						}
+									({true}?=>((
+										lv_readonly_5_0='readonly'
+										{
+											newLeafNode(lv_readonly_5_0, grammarAccess.getUiButtonAccess().getReadonlyReadonlyKeyword_2_1_1_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiButtonRule());
+											}
+											setWithLastConsumed($current, "readonly", true, "readonly");
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiButtonAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiButtonAccess().getUnorderedGroup_2_1(), 2)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiButtonAccess().getUnorderedGroup_2_1(), 2);
+						}
+									({true}?=>(otherlv_6='styles'
+									{
+										newLeafNode(otherlv_6, grammarAccess.getUiButtonAccess().getStylesKeyword_2_1_2_0());
+									}
+									(
+										(
+											lv_styles_7_0=RULE_STRING
+											{
+												newLeafNode(lv_styles_7_0, grammarAccess.getUiButtonAccess().getStylesSTRINGTerminalRuleCall_2_1_2_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiButtonRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"styles",
+													lv_styles_7_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiButtonAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)
+						)*
+					)
+				)
+					{ 
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiButtonAccess().getUnorderedGroup_2_1());
+					}
+			)
+			otherlv_8=')'
+			{
+				newLeafNode(otherlv_8, grammarAccess.getUiButtonAccess().getRightParenthesisKeyword_2_2());
+			}
+		)?
+		(
+			(
+				lv_name_9_0=RULE_ID
+				{
+					newLeafNode(lv_name_9_0, grammarAccess.getUiButtonAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiButtonRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_9_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+	)
+;
+
+// Entry rule entryRuleUiMobileNavigationButton
+entryRuleUiMobileNavigationButton returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiMobileNavigationButtonRule()); }
+	iv_ruleUiMobileNavigationButton=ruleUiMobileNavigationButton
+	{ $current=$iv_ruleUiMobileNavigationButton.current; }
+	EOF;
+
+// Rule UiMobileNavigationButton
+ruleUiMobileNavigationButton returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiMobileNavigationButtonAccess().getUiMobileNavigationButtonAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='navButton'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getUiMobileNavigationButtonAccess().getNavButtonKeyword_1());
+		}
+		(
+			otherlv_2='('
+			{
+				newLeafNode(otherlv_2, grammarAccess.getUiMobileNavigationButtonAccess().getLeftParenthesisKeyword_2_0());
+			}
+			(
+				(
+					{ 
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiMobileNavigationButtonAccess().getUnorderedGroup_2_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileNavigationButtonAccess().getUnorderedGroup_2_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiMobileNavigationButtonAccess().getUnorderedGroup_2_1(), 0);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getUiMobileNavigationButtonAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+										}
+										lv_i18nInfo_4_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiMobileNavigationButtonRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_4_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileNavigationButtonAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileNavigationButtonAccess().getUnorderedGroup_2_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiMobileNavigationButtonAccess().getUnorderedGroup_2_1(), 1);
+						}
+									({true}?=>((
+										lv_readonly_5_0='readonly'
+										{
+											newLeafNode(lv_readonly_5_0, grammarAccess.getUiMobileNavigationButtonAccess().getReadonlyReadonlyKeyword_2_1_1_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiMobileNavigationButtonRule());
+											}
+											setWithLastConsumed($current, "readonly", true, "readonly");
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileNavigationButtonAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileNavigationButtonAccess().getUnorderedGroup_2_1(), 2)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiMobileNavigationButtonAccess().getUnorderedGroup_2_1(), 2);
+						}
+									({true}?=>(otherlv_6='styles'
+									{
+										newLeafNode(otherlv_6, grammarAccess.getUiMobileNavigationButtonAccess().getStylesKeyword_2_1_2_0());
+									}
+									(
+										(
+											lv_styles_7_0=RULE_STRING
+											{
+												newLeafNode(lv_styles_7_0, grammarAccess.getUiMobileNavigationButtonAccess().getStylesSTRINGTerminalRuleCall_2_1_2_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiMobileNavigationButtonRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"styles",
+													lv_styles_7_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileNavigationButtonAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)
+						)*
+					)
+				)
+					{ 
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiMobileNavigationButtonAccess().getUnorderedGroup_2_1());
+					}
+			)
+			otherlv_8=')'
+			{
+				newLeafNode(otherlv_8, grammarAccess.getUiMobileNavigationButtonAccess().getRightParenthesisKeyword_2_2());
+			}
+		)?
+		(
+			(
+				lv_name_9_0=RULE_ID
+				{
+					newLeafNode(lv_name_9_0, grammarAccess.getUiMobileNavigationButtonAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiMobileNavigationButtonRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_9_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiMobileNavigationButtonAccess().getTargetPageUiMobileNavigationPageParserRuleCall_4_0_0());
+					}
+					lv_targetPage_10_0=ruleUiMobileNavigationPage
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiMobileNavigationButtonRule());
+						}
+						set(
+							$current,
+							"targetPage",
+							lv_targetPage_10_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileNavigationPage");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			    |
+			(
+				otherlv_11='alias'
+				{
+					newLeafNode(otherlv_11, grammarAccess.getUiMobileNavigationButtonAccess().getAliasKeyword_4_1_0());
+				}
+				(
+					(
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getUiMobileNavigationButtonRule());
+							}
+						}
+						otherlv_12=RULE_ID
+						{
+							newLeafNode(otherlv_12, grammarAccess.getUiMobileNavigationButtonAccess().getTargetPageAliasUiMobileNavigationPageCrossReference_4_1_1_0());
+						}
+					)
+				)
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleUiMobileSwitch
+entryRuleUiMobileSwitch returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiMobileSwitchRule()); }
+	iv_ruleUiMobileSwitch=ruleUiMobileSwitch
+	{ $current=$iv_ruleUiMobileSwitch.current; }
+	EOF;
+
+// Rule UiMobileSwitch
+ruleUiMobileSwitch returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiMobileSwitchAccess().getUiSwitchAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='switchIt'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getUiMobileSwitchAccess().getSwitchItKeyword_1());
+		}
+		(
+			otherlv_2='('
+			{
+				newLeafNode(otherlv_2, grammarAccess.getUiMobileSwitchAccess().getLeftParenthesisKeyword_2_0());
+			}
+			(
+				(
+					{ 
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiMobileSwitchAccess().getUnorderedGroup_2_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileSwitchAccess().getUnorderedGroup_2_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiMobileSwitchAccess().getUnorderedGroup_2_1(), 0);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getUiMobileSwitchAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+										}
+										lv_i18nInfo_4_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiMobileSwitchRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_4_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileSwitchAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileSwitchAccess().getUnorderedGroup_2_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiMobileSwitchAccess().getUnorderedGroup_2_1(), 1);
+						}
+									({true}?=>((
+										lv_readonly_5_0='readonly'
+										{
+											newLeafNode(lv_readonly_5_0, grammarAccess.getUiMobileSwitchAccess().getReadonlyReadonlyKeyword_2_1_1_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiMobileSwitchRule());
+											}
+											setWithLastConsumed($current, "readonly", true, "readonly");
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileSwitchAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileSwitchAccess().getUnorderedGroup_2_1(), 2)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiMobileSwitchAccess().getUnorderedGroup_2_1(), 2);
+						}
+									({true}?=>(otherlv_6='styles'
+									{
+										newLeafNode(otherlv_6, grammarAccess.getUiMobileSwitchAccess().getStylesKeyword_2_1_2_0());
+									}
+									(
+										(
+											lv_styles_7_0=RULE_STRING
+											{
+												newLeafNode(lv_styles_7_0, grammarAccess.getUiMobileSwitchAccess().getStylesSTRINGTerminalRuleCall_2_1_2_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiMobileSwitchRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"styles",
+													lv_styles_7_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileSwitchAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)
+						)*
+					)
+				)
+					{ 
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiMobileSwitchAccess().getUnorderedGroup_2_1());
+					}
+			)
+			otherlv_8=')'
+			{
+				newLeafNode(otherlv_8, grammarAccess.getUiMobileSwitchAccess().getRightParenthesisKeyword_2_2());
+			}
+		)?
+		(
+			(
+				lv_name_9_0=RULE_ID
+				{
+					newLeafNode(lv_name_9_0, grammarAccess.getUiMobileSwitchAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiMobileSwitchRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_9_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		(
+			otherlv_10='{'
+			{
+				newLeafNode(otherlv_10, grammarAccess.getUiMobileSwitchAccess().getLeftCurlyBracketKeyword_4_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiMobileSwitchAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_1_0());
+					}
+					lv_processorAssignments_11_0=ruleUiVisibilityProcessorAssignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiMobileSwitchRule());
+						}
+						add(
+							$current,
+							"processorAssignments",
+							lv_processorAssignments_11_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)*
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiMobileSwitchAccess().getValidatorsUiValidatorParserRuleCall_4_2_0_0());
+						}
+						lv_validators_12_0=ruleUiValidator
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiMobileSwitchRule());
+							}
+							add(
+								$current,
+								"validators",
+								lv_validators_12_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiMobileSwitchAccess().getBindingsUiBindingParserRuleCall_4_2_1_0());
+						}
+						lv_bindings_13_0=ruleUiBinding
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiMobileSwitchRule());
+							}
+							add(
+								$current,
+								"bindings",
+								lv_bindings_13_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+			otherlv_14='}'
+			{
+				newLeafNode(otherlv_14, grammarAccess.getUiMobileSwitchAccess().getRightCurlyBracketKeyword_4_3());
+			}
+		)?
+	)
+;
+
+// Entry rule entryRuleUiLabel
+entryRuleUiLabel returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiLabelRule()); }
+	iv_ruleUiLabel=ruleUiLabel
+	{ $current=$iv_ruleUiLabel.current; }
+	EOF;
+
+// Rule UiLabel
+ruleUiLabel returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiLabelAccess().getUiLabelAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='label'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getUiLabelAccess().getLabelKeyword_1());
+		}
+		(
+			otherlv_2='('
+			{
+				newLeafNode(otherlv_2, grammarAccess.getUiLabelAccess().getLeftParenthesisKeyword_2_0());
+			}
+			(
+				(
+					{ 
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiLabelAccess().getUnorderedGroup_2_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiLabelAccess().getUnorderedGroup_2_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiLabelAccess().getUnorderedGroup_2_1(), 0);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getUiLabelAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+										}
+										lv_i18nInfo_4_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiLabelRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_4_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiLabelAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiLabelAccess().getUnorderedGroup_2_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiLabelAccess().getUnorderedGroup_2_1(), 1);
+						}
+									({true}?=>(otherlv_5='styles'
+									{
+										newLeafNode(otherlv_5, grammarAccess.getUiLabelAccess().getStylesKeyword_2_1_1_0());
+									}
+									(
+										(
+											lv_styles_6_0=RULE_STRING
+											{
+												newLeafNode(lv_styles_6_0, grammarAccess.getUiLabelAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiLabelRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"styles",
+													lv_styles_6_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiLabelAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)
+						)*
+					)
+				)
+					{ 
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiLabelAccess().getUnorderedGroup_2_1());
+					}
+			)
+			otherlv_7=')'
+			{
+				newLeafNode(otherlv_7, grammarAccess.getUiLabelAccess().getRightParenthesisKeyword_2_2());
+			}
+		)?
+		(
+			(
+				lv_name_8_0=RULE_ID
+				{
+					newLeafNode(lv_name_8_0, grammarAccess.getUiLabelAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiLabelRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_8_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		(
+			otherlv_9='{'
+			{
+				newLeafNode(otherlv_9, grammarAccess.getUiLabelAccess().getLeftCurlyBracketKeyword_4_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiLabelAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_1_0());
+					}
+					lv_processorAssignments_10_0=ruleUiVisibilityProcessorAssignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiLabelRule());
+						}
+						add(
+							$current,
+							"processorAssignments",
+							lv_processorAssignments_10_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)*
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiLabelAccess().getBindingsUiBindingParserRuleCall_4_2_0());
+					}
+					lv_bindings_11_0=ruleUiBinding
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiLabelRule());
+						}
+						add(
+							$current,
+							"bindings",
+							lv_bindings_11_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)*
+			otherlv_12='}'
+			{
+				newLeafNode(otherlv_12, grammarAccess.getUiLabelAccess().getRightCurlyBracketKeyword_4_3());
+			}
+		)?
+	)
+;
+
+// Entry rule entryRuleUiDecimalField
+entryRuleUiDecimalField returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiDecimalFieldRule()); }
+	iv_ruleUiDecimalField=ruleUiDecimalField
+	{ $current=$iv_ruleUiDecimalField.current; }
+	EOF;
+
+// Rule UiDecimalField
+ruleUiDecimalField returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiDecimalFieldAccess().getUiDecimalFieldAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='decimalField'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getUiDecimalFieldAccess().getDecimalFieldKeyword_1());
+		}
+		(
+			otherlv_2='('
+			{
+				newLeafNode(otherlv_2, grammarAccess.getUiDecimalFieldAccess().getLeftParenthesisKeyword_2_0());
+			}
+			(
+				(
+					{ 
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 0);
+						}
+									({true}?=>((
+										lv_noGrouping_4_0='noGrouping'
+										{
+											newLeafNode(lv_noGrouping_4_0, grammarAccess.getUiDecimalFieldAccess().getNoGroupingNoGroupingKeyword_2_1_0_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiDecimalFieldRule());
+											}
+											setWithLastConsumed($current, "noGrouping", true, "noGrouping");
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 1);
+						}
+									({true}?=>((
+										lv_noMarkNegative_5_0='noMarkNegative'
+										{
+											newLeafNode(lv_noMarkNegative_5_0, grammarAccess.getUiDecimalFieldAccess().getNoMarkNegativeNoMarkNegativeKeyword_2_1_1_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiDecimalFieldRule());
+											}
+											setWithLastConsumed($current, "noMarkNegative", true, "noMarkNegative");
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 2)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 2);
+						}
+									({true}?=>(otherlv_6='styles'
+									{
+										newLeafNode(otherlv_6, grammarAccess.getUiDecimalFieldAccess().getStylesKeyword_2_1_2_0());
+									}
+									(
+										(
+											lv_styles_7_0=RULE_STRING
+											{
+												newLeafNode(lv_styles_7_0, grammarAccess.getUiDecimalFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_2_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiDecimalFieldRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"styles",
+													lv_styles_7_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 3)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 3);
+						}
+									({true}?=>(otherlv_8='precision='
+									{
+										newLeafNode(otherlv_8, grammarAccess.getUiDecimalFieldAccess().getPrecisionKeyword_2_1_3_0());
+									}
+									(
+										(
+											lv_precision_9_0=RULE_INT
+											{
+												newLeafNode(lv_precision_9_0, grammarAccess.getUiDecimalFieldAccess().getPrecisionINTTerminalRuleCall_2_1_3_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiDecimalFieldRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"precision",
+													lv_precision_9_0,
+													"org.eclipse.xtext.xbase.Xbase.INT");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 4)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 4);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getUiDecimalFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_4_0());
+										}
+										lv_i18nInfo_10_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiDecimalFieldRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_10_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 5)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 5);
+						}
+									({true}?=>((
+										lv_readonly_11_0='readonly'
+										{
+											newLeafNode(lv_readonly_11_0, grammarAccess.getUiDecimalFieldAccess().getReadonlyReadonlyKeyword_2_1_5_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiDecimalFieldRule());
+											}
+											setWithLastConsumed($current, "readonly", true, "readonly");
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)
+						)*
+					)
+				)
+					{ 
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1());
+					}
+			)
+			otherlv_12=')'
+			{
+				newLeafNode(otherlv_12, grammarAccess.getUiDecimalFieldAccess().getRightParenthesisKeyword_2_2());
+			}
+		)?
+		(
+			(
+				lv_name_13_0=RULE_ID
+				{
+					newLeafNode(lv_name_13_0, grammarAccess.getUiDecimalFieldAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiDecimalFieldRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_13_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		(
+			otherlv_14='{'
+			{
+				newLeafNode(otherlv_14, grammarAccess.getUiDecimalFieldAccess().getLeftCurlyBracketKeyword_4_0());
+			}
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiDecimalFieldAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
+						}
+						lv_validators_15_0=ruleUiValidator
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiDecimalFieldRule());
+							}
+							add(
+								$current,
+								"validators",
+								lv_validators_15_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiDecimalFieldAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
+						}
+						lv_bindings_16_0=ruleUiBinding
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiDecimalFieldRule());
+							}
+							add(
+								$current,
+								"bindings",
+								lv_bindings_16_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiDecimalFieldAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
+					}
+					lv_processorAssignments_17_0=ruleUiVisibilityProcessorAssignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiDecimalFieldRule());
+						}
+						add(
+							$current,
+							"processorAssignments",
+							lv_processorAssignments_17_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)*
+			otherlv_18='}'
+			{
+				newLeafNode(otherlv_18, grammarAccess.getUiDecimalFieldAccess().getRightCurlyBracketKeyword_4_3());
+			}
+		)?
+	)
+;
+
+// Entry rule entryRuleUiOptionsGroup
+entryRuleUiOptionsGroup returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiOptionsGroupRule()); }
+	iv_ruleUiOptionsGroup=ruleUiOptionsGroup
+	{ $current=$iv_ruleUiOptionsGroup.current; }
+	EOF;
+
+// Rule UiOptionsGroup
+ruleUiOptionsGroup returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiOptionsGroupAccess().getUiOptionsGroupAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='optionsgroup'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getUiOptionsGroupAccess().getOptionsgroupKeyword_1());
+		}
+		(
+			otherlv_2='('
+			{
+				newLeafNode(otherlv_2, grammarAccess.getUiOptionsGroupAccess().getLeftParenthesisKeyword_2_0());
+			}
+			(
+				(
+					{ 
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_2_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_2_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_2_1(), 0);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getUiOptionsGroupAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+										}
+										lv_i18nInfo_4_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiOptionsGroupRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_4_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_2_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_2_1(), 1);
+						}
+									({true}?=>(otherlv_5='styles'
+									{
+										newLeafNode(otherlv_5, grammarAccess.getUiOptionsGroupAccess().getStylesKeyword_2_1_1_0());
+									}
+									(
+										(
+											lv_styles_6_0=RULE_STRING
+											{
+												newLeafNode(lv_styles_6_0, grammarAccess.getUiOptionsGroupAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiOptionsGroupRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"styles",
+													lv_styles_6_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)
+						)*
+					)
+				)
+					{ 
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_2_1());
+					}
+			)
+			otherlv_7=')'
+			{
+				newLeafNode(otherlv_7, grammarAccess.getUiOptionsGroupAccess().getRightParenthesisKeyword_2_2());
+			}
+		)?
+		(
+			(
+				lv_name_8_0=RULE_ID
+				{
+					newLeafNode(lv_name_8_0, grammarAccess.getUiOptionsGroupAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiOptionsGroupRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_8_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		(
+			otherlv_9='{'
+			{
+				newLeafNode(otherlv_9, grammarAccess.getUiOptionsGroupAccess().getLeftCurlyBracketKeyword_4_0());
+			}
+			(
+				(
+					{ 
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 0);
+						}
+									({true}?=>(otherlv_11='type'
+									{
+										newLeafNode(otherlv_11, grammarAccess.getUiOptionsGroupAccess().getTypeKeyword_4_1_0_0());
+									}
+									(
+										(
+											{
+												newCompositeNode(grammarAccess.getUiOptionsGroupAccess().getJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0());
+											}
+											lv_jvmType_12_0=ruleJvmTypeReference
+											{
+												if ($current==null) {
+													$current = createModelElementForParent(grammarAccess.getUiOptionsGroupRule());
+												}
+												set(
+													$current,
+													"jvmType",
+													lv_jvmType_12_0,
+													"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+												afterParserOrEnumRuleCall();
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 1);
+						}
+									({true}?=>(otherlv_13='selectionType'
+									{
+										newLeafNode(otherlv_13, grammarAccess.getUiOptionsGroupAccess().getSelectionTypeKeyword_4_1_1_0());
+									}
+									(
+										(
+											{
+												newCompositeNode(grammarAccess.getUiOptionsGroupAccess().getSelectionTypeUiSelectionTypeEnumRuleCall_4_1_1_1_0());
+											}
+											lv_selectionType_14_0=ruleUiSelectionType
+											{
+												if ($current==null) {
+													$current = createModelElementForParent(grammarAccess.getUiOptionsGroupRule());
+												}
+												set(
+													$current,
+													"selectionType",
+													lv_selectionType_14_0,
+													"org.eclipse.osbp.ecview.dsl.UIGrammar.UiSelectionType");
+												afterParserOrEnumRuleCall();
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 2)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 2);
+						}
+									({true}?=>(otherlv_15='captionField'
+									{
+										newLeafNode(otherlv_15, grammarAccess.getUiOptionsGroupAccess().getCaptionFieldKeyword_4_1_2_0());
+									}
+									(
+										(
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiOptionsGroupRule());
+												}
+											}
+											otherlv_16=RULE_ID
+											{
+												newLeafNode(otherlv_16, grammarAccess.getUiOptionsGroupAccess().getItemCaptionPropertyJvmOperationCrossReference_4_1_2_1_0());
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 3)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 3);
+						}
+									({true}?=>(otherlv_17='descriptionField'
+									{
+										newLeafNode(otherlv_17, grammarAccess.getUiOptionsGroupAccess().getDescriptionFieldKeyword_4_1_3_0());
+									}
+									(
+										(
+											{
+												newCompositeNode(grammarAccess.getUiOptionsGroupAccess().getDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_3_1_0());
+											}
+											lv_descriptionProperty_18_0=ruleUiNestedProperty
+											{
+												if ($current==null) {
+													$current = createModelElementForParent(grammarAccess.getUiOptionsGroupRule());
+												}
+												set(
+													$current,
+													"descriptionProperty",
+													lv_descriptionProperty_18_0,
+													"org.eclipse.osbp.ecview.dsl.UIGrammar.UiNestedProperty");
+												afterParserOrEnumRuleCall();
+											}
+										)
+									)
+									(
+										otherlv_19=';'
+										{
+											newLeafNode(otherlv_19, grammarAccess.getUiOptionsGroupAccess().getSemicolonKeyword_4_1_3_2());
+										}
+									)?
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 4)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 4);
+						}
+									({true}?=>(otherlv_20='imageField'
+									{
+										newLeafNode(otherlv_20, grammarAccess.getUiOptionsGroupAccess().getImageFieldKeyword_4_1_4_0());
+									}
+									(
+										(
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiOptionsGroupRule());
+												}
+											}
+											otherlv_21=RULE_ID
+											{
+												newLeafNode(otherlv_21, grammarAccess.getUiOptionsGroupAccess().getItemImagePropertyJvmOperationCrossReference_4_1_4_1_0());
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 5)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 5);
+						}
+									({true}?=>((
+										(
+											lv_consumeBeanService_22_0='useBeanService'
+											{
+												newLeafNode(lv_consumeBeanService_22_0, grammarAccess.getUiOptionsGroupAccess().getConsumeBeanServiceUseBeanServiceKeyword_4_1_5_0_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiOptionsGroupRule());
+												}
+												setWithLastConsumed($current, "consumeBeanService", true, "useBeanService");
+											}
+										)
+									)
+									(
+										otherlv_23=';'
+										{
+											newLeafNode(otherlv_23, grammarAccess.getUiOptionsGroupAccess().getSemicolonKeyword_4_1_5_1());
+										}
+									)?
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 6)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 6);
+						}
+									({true}?=>((
+										lv_readonly_24_0='readonly'
+										{
+											newLeafNode(lv_readonly_24_0, grammarAccess.getUiOptionsGroupAccess().getReadonlyReadonlyKeyword_4_1_6_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiOptionsGroupRule());
+											}
+											setWithLastConsumed($current, "readonly", true, "readonly");
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)
+						)*
+					)
+				)
+					{ 
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1());
+					}
+			)
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiOptionsGroupAccess().getValidatorsUiValidatorParserRuleCall_4_2_0_0());
+						}
+						lv_validators_25_0=ruleUiValidator
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiOptionsGroupRule());
+							}
+							add(
+								$current,
+								"validators",
+								lv_validators_25_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiOptionsGroupAccess().getBindingsUiBindingParserRuleCall_4_2_1_0());
+						}
+						lv_bindings_26_0=ruleUiBinding
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiOptionsGroupRule());
+							}
+							add(
+								$current,
+								"bindings",
+								lv_bindings_26_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiOptionsGroupAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0());
+					}
+					lv_processorAssignments_27_0=ruleUiVisibilityProcessorAssignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiOptionsGroupRule());
+						}
+						add(
+							$current,
+							"processorAssignments",
+							lv_processorAssignments_27_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)*
+			otherlv_28='}'
+			{
+				newLeafNode(otherlv_28, grammarAccess.getUiOptionsGroupAccess().getRightCurlyBracketKeyword_4_4());
+			}
+		)?
+	)
+;
+
+// Entry rule entryRuleUiList
+entryRuleUiList returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiListRule()); }
+	iv_ruleUiList=ruleUiList
+	{ $current=$iv_ruleUiList.current; }
+	EOF;
+
+// Rule UiList
+ruleUiList returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiListAccess().getUiListAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='listSelect'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getUiListAccess().getListSelectKeyword_1());
+		}
+		(
+			otherlv_2='('
+			{
+				newLeafNode(otherlv_2, grammarAccess.getUiListAccess().getLeftParenthesisKeyword_2_0());
+			}
+			(
+				(
+					{ 
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiListAccess().getUnorderedGroup_2_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_2_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiListAccess().getUnorderedGroup_2_1(), 0);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getUiListAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+										}
+										lv_i18nInfo_4_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiListRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_4_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiListAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_2_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiListAccess().getUnorderedGroup_2_1(), 1);
+						}
+									({true}?=>(otherlv_5='styles'
+									{
+										newLeafNode(otherlv_5, grammarAccess.getUiListAccess().getStylesKeyword_2_1_1_0());
+									}
+									(
+										(
+											lv_styles_6_0=RULE_STRING
+											{
+												newLeafNode(lv_styles_6_0, grammarAccess.getUiListAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiListRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"styles",
+													lv_styles_6_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiListAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)
+						)*
+					)
+				)
+					{ 
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiListAccess().getUnorderedGroup_2_1());
+					}
+			)
+			otherlv_7=')'
+			{
+				newLeafNode(otherlv_7, grammarAccess.getUiListAccess().getRightParenthesisKeyword_2_2());
+			}
+		)?
+		(
+			(
+				lv_name_8_0=RULE_ID
+				{
+					newLeafNode(lv_name_8_0, grammarAccess.getUiListAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiListRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_8_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		(
+			otherlv_9='{'
+			{
+				newLeafNode(otherlv_9, grammarAccess.getUiListAccess().getLeftCurlyBracketKeyword_4_0());
+			}
+			(
+				(
+					{ 
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiListAccess().getUnorderedGroup_4_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 0);
+						}
+									({true}?=>(otherlv_11='type'
+									{
+										newLeafNode(otherlv_11, grammarAccess.getUiListAccess().getTypeKeyword_4_1_0_0());
+									}
+									(
+										(
+											{
+												newCompositeNode(grammarAccess.getUiListAccess().getJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0());
+											}
+											lv_jvmType_12_0=ruleJvmTypeReference
+											{
+												if ($current==null) {
+													$current = createModelElementForParent(grammarAccess.getUiListRule());
+												}
+												set(
+													$current,
+													"jvmType",
+													lv_jvmType_12_0,
+													"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+												afterParserOrEnumRuleCall();
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiListAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 1);
+						}
+									({true}?=>(otherlv_13='selectionType'
+									{
+										newLeafNode(otherlv_13, grammarAccess.getUiListAccess().getSelectionTypeKeyword_4_1_1_0());
+									}
+									(
+										(
+											{
+												newCompositeNode(grammarAccess.getUiListAccess().getSelectionTypeUiSelectionTypeEnumRuleCall_4_1_1_1_0());
+											}
+											lv_selectionType_14_0=ruleUiSelectionType
+											{
+												if ($current==null) {
+													$current = createModelElementForParent(grammarAccess.getUiListRule());
+												}
+												set(
+													$current,
+													"selectionType",
+													lv_selectionType_14_0,
+													"org.eclipse.osbp.ecview.dsl.UIGrammar.UiSelectionType");
+												afterParserOrEnumRuleCall();
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiListAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 2)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 2);
+						}
+									({true}?=>(otherlv_15='captionField'
+									{
+										newLeafNode(otherlv_15, grammarAccess.getUiListAccess().getCaptionFieldKeyword_4_1_2_0());
+									}
+									(
+										(
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiListRule());
+												}
+											}
+											otherlv_16=RULE_ID
+											{
+												newLeafNode(otherlv_16, grammarAccess.getUiListAccess().getItemCaptionPropertyJvmOperationCrossReference_4_1_2_1_0());
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiListAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 3)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 3);
+						}
+									({true}?=>(otherlv_17='descriptionField'
+									{
+										newLeafNode(otherlv_17, grammarAccess.getUiListAccess().getDescriptionFieldKeyword_4_1_3_0());
+									}
+									(
+										(
+											{
+												newCompositeNode(grammarAccess.getUiListAccess().getDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_3_1_0());
+											}
+											lv_descriptionProperty_18_0=ruleUiNestedProperty
+											{
+												if ($current==null) {
+													$current = createModelElementForParent(grammarAccess.getUiListRule());
+												}
+												set(
+													$current,
+													"descriptionProperty",
+													lv_descriptionProperty_18_0,
+													"org.eclipse.osbp.ecview.dsl.UIGrammar.UiNestedProperty");
+												afterParserOrEnumRuleCall();
+											}
+										)
+									)
+									(
+										otherlv_19=';'
+										{
+											newLeafNode(otherlv_19, grammarAccess.getUiListAccess().getSemicolonKeyword_4_1_3_2());
+										}
+									)?
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiListAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 4)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 4);
+						}
+									({true}?=>(otherlv_20='imageField'
+									{
+										newLeafNode(otherlv_20, grammarAccess.getUiListAccess().getImageFieldKeyword_4_1_4_0());
+									}
+									(
+										(
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiListRule());
+												}
+											}
+											otherlv_21=RULE_ID
+											{
+												newLeafNode(otherlv_21, grammarAccess.getUiListAccess().getItemImagePropertyJvmOperationCrossReference_4_1_4_1_0());
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiListAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 5)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 5);
+						}
+									({true}?=>((
+										(
+											lv_consumeBeanService_22_0='useBeanService'
+											{
+												newLeafNode(lv_consumeBeanService_22_0, grammarAccess.getUiListAccess().getConsumeBeanServiceUseBeanServiceKeyword_4_1_5_0_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiListRule());
+												}
+												setWithLastConsumed($current, "consumeBeanService", true, "useBeanService");
+											}
+										)
+									)
+									(
+										otherlv_23=';'
+										{
+											newLeafNode(otherlv_23, grammarAccess.getUiListAccess().getSemicolonKeyword_4_1_5_1());
+										}
+									)?
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiListAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 6)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 6);
+						}
+									({true}?=>((
+										lv_readonly_24_0='readonly'
+										{
+											newLeafNode(lv_readonly_24_0, grammarAccess.getUiListAccess().getReadonlyReadonlyKeyword_4_1_6_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiListRule());
+											}
+											setWithLastConsumed($current, "readonly", true, "readonly");
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiListAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)
+						)*
+					)
+				)
+					{ 
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiListAccess().getUnorderedGroup_4_1());
+					}
+			)
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiListAccess().getValidatorsUiValidatorParserRuleCall_4_2_0_0());
+						}
+						lv_validators_25_0=ruleUiValidator
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiListRule());
+							}
+							add(
+								$current,
+								"validators",
+								lv_validators_25_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiListAccess().getBindingsUiBindingParserRuleCall_4_2_1_0());
+						}
+						lv_bindings_26_0=ruleUiBinding
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiListRule());
+							}
+							add(
+								$current,
+								"bindings",
+								lv_bindings_26_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiListAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0());
+					}
+					lv_processorAssignments_27_0=ruleUiVisibilityProcessorAssignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiListRule());
+						}
+						add(
+							$current,
+							"processorAssignments",
+							lv_processorAssignments_27_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)*
+			otherlv_28='}'
+			{
+				newLeafNode(otherlv_28, grammarAccess.getUiListAccess().getRightCurlyBracketKeyword_4_4());
+			}
+		)?
+	)
+;
+
+// Entry rule entryRuleUiColumnsAssignment
+entryRuleUiColumnsAssignment returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiColumnsAssignmentRule()); }
+	iv_ruleUiColumnsAssignment=ruleUiColumnsAssignment
+	{ $current=$iv_ruleUiColumnsAssignment.current; }
+	EOF;
+
+// Rule UiColumnsAssignment
+ruleUiColumnsAssignment returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiColumnsAssignmentAccess().getUiColumnsAssignmentAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='columns'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getUiColumnsAssignmentAccess().getColumnsKeyword_1());
+		}
+		otherlv_2='{'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getUiColumnsAssignmentAccess().getLeftCurlyBracketKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiColumnsAssignmentAccess().getColumnsUiColumnParserRuleCall_3_0());
+				}
+				lv_columns_3_0=ruleUiColumn
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiColumnsAssignmentRule());
+					}
+					add(
+						$current,
+						"columns",
+						lv_columns_3_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiColumn");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		otherlv_4='}'
+		{
+			newLeafNode(otherlv_4, grammarAccess.getUiColumnsAssignmentAccess().getRightCurlyBracketKeyword_4());
+		}
+	)
+;
+
+// Entry rule entryRuleUiSortOrderAssignment
+entryRuleUiSortOrderAssignment returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiSortOrderAssignmentRule()); }
+	iv_ruleUiSortOrderAssignment=ruleUiSortOrderAssignment
+	{ $current=$iv_ruleUiSortOrderAssignment.current; }
+	EOF;
+
+// Rule UiSortOrderAssignment
+ruleUiSortOrderAssignment returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiSortOrderAssignmentAccess().getUiSortOrderAssignmentAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='sort'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getUiSortOrderAssignmentAccess().getSortKeyword_1());
+		}
+		otherlv_2='{'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getUiSortOrderAssignmentAccess().getLeftCurlyBracketKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiSortOrderAssignmentAccess().getColumnsUiSortOrderParserRuleCall_3_0());
+				}
+				lv_columns_3_0=ruleUiSortOrder
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiSortOrderAssignmentRule());
+					}
+					add(
+						$current,
+						"columns",
+						lv_columns_3_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiSortOrder");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		otherlv_4='}'
+		{
+			newLeafNode(otherlv_4, grammarAccess.getUiSortOrderAssignmentAccess().getRightCurlyBracketKeyword_4());
+		}
+	)
+;
+
+// Entry rule entryRuleUiSortOrder
+entryRuleUiSortOrder returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiSortOrderRule()); }
+	iv_ruleUiSortOrder=ruleUiSortOrder
+	{ $current=$iv_ruleUiSortOrder.current; }
+	EOF;
+
+// Rule UiSortOrder
+ruleUiSortOrder returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='column'
+		{
+			newLeafNode(otherlv_0, grammarAccess.getUiSortOrderAccess().getColumnKeyword_0());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiSortOrderAccess().getPropertyUiNestedPropertyParserRuleCall_1_0());
+				}
+				lv_property_1_0=ruleUiNestedProperty
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiSortOrderRule());
+					}
+					set(
+						$current,
+						"property",
+						lv_property_1_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiNestedProperty");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_2='desc'
+			{
+				newLeafNode(otherlv_2, grammarAccess.getUiSortOrderAccess().getDescKeyword_2_0());
+			}
+			    |
+			(
+				(
+					lv_asc_3_0='asc'
+					{
+						newLeafNode(lv_asc_3_0, grammarAccess.getUiSortOrderAccess().getAscAscKeyword_2_1_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getUiSortOrderRule());
+						}
+						setWithLastConsumed($current, "asc", true, "asc");
+					}
+				)
+			)
+		)?
+		(
+			otherlv_4=';'
+			{
+				newLeafNode(otherlv_4, grammarAccess.getUiSortOrderAccess().getSemicolonKeyword_3());
+			}
+		)?
+	)
+;
+
+// Entry rule entryRuleUiColumn
+entryRuleUiColumn returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiColumnRule()); }
+	iv_ruleUiColumn=ruleUiColumn
+	{ $current=$iv_ruleUiColumn.current; }
+	EOF;
+
+// Rule UiColumn
+ruleUiColumn returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiColumnAccess().getUiColumnAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='column'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getUiColumnAccess().getColumnKeyword_1());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiColumnAccess().getPropertyUiNestedPropertyParserRuleCall_2_0());
+				}
+				lv_property_2_0=ruleUiNestedProperty
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiColumnRule());
+					}
+					set(
+						$current,
+						"property",
+						lv_property_2_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiNestedProperty");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_3='icon'
+			{
+				newLeafNode(otherlv_3, grammarAccess.getUiColumnAccess().getIconKeyword_3_0());
+			}
+			(
+				(
+					lv_iconName_4_0=RULE_STRING
+					{
+						newLeafNode(lv_iconName_4_0, grammarAccess.getUiColumnAccess().getIconNameSTRINGTerminalRuleCall_3_1_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getUiColumnRule());
+						}
+						setWithLastConsumed(
+							$current,
+							"iconName",
+							lv_iconName_4_0,
+							"org.eclipse.xtext.xbase.Xtype.STRING");
+					}
+				)
+			)
+		)?
+		(
+			otherlv_5=';'
+			{
+				newLeafNode(otherlv_5, grammarAccess.getUiColumnAccess().getSemicolonKeyword_4());
+			}
+		)?
+	)
+;
+
+// Entry rule entryRuleUiEmbeddable
+entryRuleUiEmbeddable returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiEmbeddableRule()); }
+	iv_ruleUiEmbeddable=ruleUiEmbeddable
+	{ $current=$iv_ruleUiEmbeddable.current; }
+	EOF;
+
+// Rule UiEmbeddable
+ruleUiEmbeddable returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getUiEmbeddableAccess().getUiLayoutParserRuleCall_0());
+		}
+		this_UiLayout_0=ruleUiLayout
+		{
+			$current = $this_UiLayout_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiEmbeddableAccess().getUiFieldParserRuleCall_1());
+		}
+		this_UiField_1=ruleUiField
+		{
+			$current = $this_UiField_1.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiEmbeddableAccess().getUiActionParserRuleCall_2());
+		}
+		this_UiAction_2=ruleUiAction
+		{
+			$current = $this_UiAction_2.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiEmbeddableAccess().getUiTabSheetParserRuleCall_3());
+		}
+		this_UiTabSheet_3=ruleUiTabSheet
+		{
+			$current = $this_UiTabSheet_3.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleUiMobileEmbeddable
+entryRuleUiMobileEmbeddable returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiMobileEmbeddableRule()); }
+	iv_ruleUiMobileEmbeddable=ruleUiMobileEmbeddable
+	{ $current=$iv_ruleUiMobileEmbeddable.current; }
+	EOF;
+
+// Rule UiMobileEmbeddable
+ruleUiMobileEmbeddable returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getUiMobileEmbeddableAccess().getUiMobileLayoutParserRuleCall_0());
+		}
+		this_UiMobileLayout_0=ruleUiMobileLayout
+		{
+			$current = $this_UiMobileLayout_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiMobileEmbeddableAccess().getUiMobileFieldParserRuleCall_1());
+		}
+		this_UiMobileField_1=ruleUiMobileField
+		{
+			$current = $this_UiMobileField_1.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiMobileEmbeddableAccess().getUiMobileTabSheetParserRuleCall_2());
+		}
+		this_UiMobileTabSheet_2=ruleUiMobileTabSheet
+		{
+			$current = $this_UiMobileTabSheet_2.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiMobileEmbeddableAccess().getUiMobileActionParserRuleCall_3());
+		}
+		this_UiMobileAction_3=ruleUiMobileAction
+		{
+			$current = $this_UiMobileAction_3.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleUiMobileLayout
+entryRuleUiMobileLayout returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiMobileLayoutRule()); }
+	iv_ruleUiMobileLayout=ruleUiMobileLayout
+	{ $current=$iv_ruleUiMobileLayout.current; }
+	EOF;
+
+// Rule UiMobileLayout
+ruleUiMobileLayout returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getUiMobileLayoutAccess().getUiMobileHorizontalButtonGroupParserRuleCall_0());
+		}
+		this_UiMobileHorizontalButtonGroup_0=ruleUiMobileHorizontalButtonGroup
+		{
+			$current = $this_UiMobileHorizontalButtonGroup_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiMobileLayoutAccess().getUiMobileVerticalComponentGroupParserRuleCall_1());
+		}
+		this_UiMobileVerticalComponentGroup_1=ruleUiMobileVerticalComponentGroup
+		{
+			$current = $this_UiMobileVerticalComponentGroup_1.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiMobileLayoutAccess().getUiMobileNavigationPageParserRuleCall_2());
+		}
+		this_UiMobileNavigationPage_2=ruleUiMobileNavigationPage
+		{
+			$current = $this_UiMobileNavigationPage_2.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiMobileLayoutAccess().getUiMobileHorizontalLayoutParserRuleCall_3());
+		}
+		this_UiMobileHorizontalLayout_3=ruleUiMobileHorizontalLayout
+		{
+			$current = $this_UiMobileHorizontalLayout_3.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiMobileLayoutAccess().getUiMobileVerticalLayoutParserRuleCall_4());
+		}
+		this_UiMobileVerticalLayout_4=ruleUiMobileVerticalLayout
+		{
+			$current = $this_UiMobileVerticalLayout_4.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiMobileLayoutAccess().getUiMobileSearchPanelParserRuleCall_5());
+		}
+		this_UiMobileSearchPanel_5=ruleUiMobileSearchPanel
+		{
+			$current = $this_UiMobileSearchPanel_5.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiMobileLayoutAccess().getUiMobileNavigationRootParserRuleCall_6());
+		}
+		this_UiMobileNavigationRoot_6=ruleUiMobileNavigationRoot
+		{
+			$current = $this_UiMobileNavigationRoot_6.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleUiMobileField
+entryRuleUiMobileField returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiMobileFieldRule()); }
+	iv_ruleUiMobileField=ruleUiMobileField
+	{ $current=$iv_ruleUiMobileField.current; }
+	EOF;
+
+// Rule UiMobileField
+ruleUiMobileField returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiMobileSwitchParserRuleCall_0());
+		}
+		this_UiMobileSwitch_0=ruleUiMobileSwitch
+		{
+			$current = $this_UiMobileSwitch_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiTextFieldParserRuleCall_1());
+		}
+		this_UiTextField_1=ruleUiTextField
+		{
+			$current = $this_UiTextField_1.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiMaskedTextFieldParserRuleCall_2());
+		}
+		this_UiMaskedTextField_2=ruleUiMaskedTextField
+		{
+			$current = $this_UiMaskedTextField_2.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiMaskedNumericFieldParserRuleCall_3());
+		}
+		this_UiMaskedNumericField_3=ruleUiMaskedNumericField
+		{
+			$current = $this_UiMaskedNumericField_3.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiMaskedDecimalFieldParserRuleCall_4());
+		}
+		this_UiMaskedDecimalField_4=ruleUiMaskedDecimalField
+		{
+			$current = $this_UiMaskedDecimalField_4.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiPrefixedMaskedTextFieldParserRuleCall_5());
+		}
+		this_UiPrefixedMaskedTextField_5=ruleUiPrefixedMaskedTextField
+		{
+			$current = $this_UiPrefixedMaskedTextField_5.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiRichTextAreaParserRuleCall_6());
+		}
+		this_UiRichTextArea_6=ruleUiRichTextArea
+		{
+			$current = $this_UiRichTextArea_6.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiPasswordFieldParserRuleCall_7());
+		}
+		this_UiPasswordField_7=ruleUiPasswordField
+		{
+			$current = $this_UiPasswordField_7.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiSuggestTextFieldParserRuleCall_8());
+		}
+		this_UiSuggestTextField_8=ruleUiSuggestTextField
+		{
+			$current = $this_UiSuggestTextField_8.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiNumericFieldParserRuleCall_9());
+		}
+		this_UiNumericField_9=ruleUiNumericField
+		{
+			$current = $this_UiNumericField_9.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiTableParserRuleCall_10());
+		}
+		this_UiTable_10=ruleUiTable
+		{
+			$current = $this_UiTable_10.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiComboBoxParserRuleCall_11());
+		}
+		this_UiComboBox_11=ruleUiComboBox
+		{
+			$current = $this_UiComboBox_11.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiImageParserRuleCall_12());
+		}
+		this_UiImage_12=ruleUiImage
+		{
+			$current = $this_UiImage_12.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiSearchFieldParserRuleCall_13());
+		}
+		this_UiSearchField_13=ruleUiSearchField
+		{
+			$current = $this_UiSearchField_13.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiLabelParserRuleCall_14());
+		}
+		this_UiLabel_14=ruleUiLabel
+		{
+			$current = $this_UiLabel_14.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiDecimalFieldParserRuleCall_15());
+		}
+		this_UiDecimalField_15=ruleUiDecimalField
+		{
+			$current = $this_UiDecimalField_15.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiTextAreaParserRuleCall_16());
+		}
+		this_UiTextArea_16=ruleUiTextArea
+		{
+			$current = $this_UiTextArea_16.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiDateFieldParserRuleCall_17());
+		}
+		this_UiDateField_17=ruleUiDateField
+		{
+			$current = $this_UiDateField_17.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiBrowserParserRuleCall_18());
+		}
+		this_UiBrowser_18=ruleUiBrowser
+		{
+			$current = $this_UiBrowser_18.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiProgressBarParserRuleCall_19());
+		}
+		this_UiProgressBar_19=ruleUiProgressBar
+		{
+			$current = $this_UiProgressBar_19.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiOptionsGroupParserRuleCall_20());
+		}
+		this_UiOptionsGroup_20=ruleUiOptionsGroup
+		{
+			$current = $this_UiOptionsGroup_20.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleUiLayout
+entryRuleUiLayout returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiLayoutRule()); }
+	iv_ruleUiLayout=ruleUiLayout
+	{ $current=$iv_ruleUiLayout.current; }
+	EOF;
+
+// Rule UiLayout
+ruleUiLayout returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getUiLayoutAccess().getUiGridLayoutParserRuleCall_0());
+		}
+		this_UiGridLayout_0=ruleUiGridLayout
+		{
+			$current = $this_UiGridLayout_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiLayoutAccess().getUiFormLayoutParserRuleCall_1());
+		}
+		this_UiFormLayout_1=ruleUiFormLayout
+		{
+			$current = $this_UiFormLayout_1.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiLayoutAccess().getUiHorizontalLayoutParserRuleCall_2());
+		}
+		this_UiHorizontalLayout_2=ruleUiHorizontalLayout
+		{
+			$current = $this_UiHorizontalLayout_2.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiLayoutAccess().getUiVerticalLayoutParserRuleCall_3());
+		}
+		this_UiVerticalLayout_3=ruleUiVerticalLayout
+		{
+			$current = $this_UiVerticalLayout_3.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiLayoutAccess().getUiSplitpanelParserRuleCall_4());
+		}
+		this_UiSplitpanel_4=ruleUiSplitpanel
+		{
+			$current = $this_UiSplitpanel_4.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiLayoutAccess().getUiPanelParserRuleCall_5());
+		}
+		this_UiPanel_5=ruleUiPanel
+		{
+			$current = $this_UiPanel_5.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiLayoutAccess().getUiSearchPanelParserRuleCall_6());
+		}
+		this_UiSearchPanel_6=ruleUiSearchPanel
+		{
+			$current = $this_UiSearchPanel_6.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleUiField
+entryRuleUiField returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiFieldRule()); }
+	iv_ruleUiField=ruleUiField
+	{ $current=$iv_ruleUiField.current; }
+	EOF;
+
+// Rule UiField
+ruleUiField returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getUiFieldAccess().getUiTextFieldParserRuleCall_0());
+		}
+		this_UiTextField_0=ruleUiTextField
+		{
+			$current = $this_UiTextField_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiFieldAccess().getUiMaskedTextFieldParserRuleCall_1());
+		}
+		this_UiMaskedTextField_1=ruleUiMaskedTextField
+		{
+			$current = $this_UiMaskedTextField_1.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiFieldAccess().getUiMaskedNumericFieldParserRuleCall_2());
+		}
+		this_UiMaskedNumericField_2=ruleUiMaskedNumericField
+		{
+			$current = $this_UiMaskedNumericField_2.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiFieldAccess().getUiMaskedDecimalFieldParserRuleCall_3());
+		}
+		this_UiMaskedDecimalField_3=ruleUiMaskedDecimalField
+		{
+			$current = $this_UiMaskedDecimalField_3.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiFieldAccess().getUiPrefixedMaskedTextFieldParserRuleCall_4());
+		}
+		this_UiPrefixedMaskedTextField_4=ruleUiPrefixedMaskedTextField
+		{
+			$current = $this_UiPrefixedMaskedTextField_4.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiFieldAccess().getUiRichTextAreaParserRuleCall_5());
+		}
+		this_UiRichTextArea_5=ruleUiRichTextArea
+		{
+			$current = $this_UiRichTextArea_5.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiFieldAccess().getUiPasswordFieldParserRuleCall_6());
+		}
+		this_UiPasswordField_6=ruleUiPasswordField
+		{
+			$current = $this_UiPasswordField_6.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiFieldAccess().getUiSuggestTextFieldParserRuleCall_7());
+		}
+		this_UiSuggestTextField_7=ruleUiSuggestTextField
+		{
+			$current = $this_UiSuggestTextField_7.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiFieldAccess().getUiListParserRuleCall_8());
+		}
+		this_UiList_8=ruleUiList
+		{
+			$current = $this_UiList_8.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiFieldAccess().getUiNumericFieldParserRuleCall_9());
+		}
+		this_UiNumericField_9=ruleUiNumericField
+		{
+			$current = $this_UiNumericField_9.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiFieldAccess().getUiCheckBoxParserRuleCall_10());
+		}
+		this_UiCheckBox_10=ruleUiCheckBox
+		{
+			$current = $this_UiCheckBox_10.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiFieldAccess().getUiTableParserRuleCall_11());
+		}
+		this_UiTable_11=ruleUiTable
+		{
+			$current = $this_UiTable_11.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiFieldAccess().getUiComboBoxParserRuleCall_12());
+		}
+		this_UiComboBox_12=ruleUiComboBox
+		{
+			$current = $this_UiComboBox_12.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiFieldAccess().getUiImageParserRuleCall_13());
+		}
+		this_UiImage_13=ruleUiImage
+		{
+			$current = $this_UiImage_13.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiFieldAccess().getUiSearchFieldParserRuleCall_14());
+		}
+		this_UiSearchField_14=ruleUiSearchField
+		{
+			$current = $this_UiSearchField_14.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiFieldAccess().getUiLabelParserRuleCall_15());
+		}
+		this_UiLabel_15=ruleUiLabel
+		{
+			$current = $this_UiLabel_15.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiFieldAccess().getUiDecimalFieldParserRuleCall_16());
+		}
+		this_UiDecimalField_16=ruleUiDecimalField
+		{
+			$current = $this_UiDecimalField_16.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiFieldAccess().getUiTextAreaParserRuleCall_17());
+		}
+		this_UiTextArea_17=ruleUiTextArea
+		{
+			$current = $this_UiTextArea_17.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiFieldAccess().getUiDateFieldParserRuleCall_18());
+		}
+		this_UiDateField_18=ruleUiDateField
+		{
+			$current = $this_UiDateField_18.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiFieldAccess().getUiBrowserParserRuleCall_19());
+		}
+		this_UiBrowser_19=ruleUiBrowser
+		{
+			$current = $this_UiBrowser_19.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiFieldAccess().getUiProgressBarParserRuleCall_20());
+		}
+		this_UiProgressBar_20=ruleUiProgressBar
+		{
+			$current = $this_UiProgressBar_20.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiFieldAccess().getUiOptionsGroupParserRuleCall_21());
+		}
+		this_UiOptionsGroup_21=ruleUiOptionsGroup
+		{
+			$current = $this_UiOptionsGroup_21.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiFieldAccess().getUiBeanReferenceFieldParserRuleCall_22());
+		}
+		this_UiBeanReferenceField_22=ruleUiBeanReferenceField
+		{
+			$current = $this_UiBeanReferenceField_22.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleUiAction
+entryRuleUiAction returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiActionRule()); }
+	iv_ruleUiAction=ruleUiAction
+	{ $current=$iv_ruleUiAction.current; }
+	EOF;
+
+// Rule UiAction
+ruleUiAction returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
 	{
-		newLeafNode(otherlv_21, grammarAccess.getUiSuggestTextFieldAccess().getItemUUIDPropertyJvmOperationCrossReference_4_1_3_1_0()); 
+		newCompositeNode(grammarAccess.getUiActionAccess().getUiButtonParserRuleCall());
 	}
+	this_UiButton_0=ruleUiButton
+	{
+		$current = $this_UiButton_0.current;
+		afterParserOrEnumRuleCall();
+	}
+;
 
-)
-)(	otherlv_22=';' 
-    {
-    	newLeafNode(otherlv_22, grammarAccess.getUiSuggestTextFieldAccess().getSemicolonKeyword_4_1_3_2());
-    }
-)?))
+// Entry rule entryRuleUiMobileAction
+entryRuleUiMobileAction returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiMobileActionRule()); }
+	iv_ruleUiMobileAction=ruleUiMobileAction
+	{ $current=$iv_ruleUiMobileAction.current; }
+	EOF;
+
+// Rule UiMobileAction
+ruleUiMobileAction returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getUiMobileActionAccess().getUiMobileNavigationButtonParserRuleCall_0());
+		}
+		this_UiMobileNavigationButton_0=ruleUiMobileNavigationButton
+		{
+			$current = $this_UiMobileNavigationButton_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiMobileActionAccess().getUiButtonParserRuleCall_1());
+		}
+		this_UiButton_1=ruleUiButton
+		{
+			$current = $this_UiButton_1.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleUiNumericField
+entryRuleUiNumericField returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiNumericFieldRule()); }
+	iv_ruleUiNumericField=ruleUiNumericField
+	{ $current=$iv_ruleUiNumericField.current; }
+	EOF;
+
+// Rule UiNumericField
+ruleUiNumericField returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiNumericFieldAccess().getUiNumericFieldAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='numericField'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getUiNumericFieldAccess().getNumericFieldKeyword_1());
+		}
+		(
+			otherlv_2='('
+			{
+				newLeafNode(otherlv_2, grammarAccess.getUiNumericFieldAccess().getLeftParenthesisKeyword_2_0());
+			}
+			(
+				(
 					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 4)}?=>(
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), 0);
+						}
+									({true}?=>((
+										lv_noGrouping_4_0='noGrouping'
+										{
+											newLeafNode(lv_noGrouping_4_0, grammarAccess.getUiNumericFieldAccess().getNoGroupingNoGroupingKeyword_2_1_0_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiNumericFieldRule());
+											}
+											setWithLastConsumed($current, "noGrouping", true, "noGrouping");
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), 1);
+						}
+									({true}?=>(otherlv_5='styles'
+									{
+										newLeafNode(otherlv_5, grammarAccess.getUiNumericFieldAccess().getStylesKeyword_2_1_1_0());
+									}
+									(
+										(
+											lv_styles_6_0=RULE_STRING
+											{
+												newLeafNode(lv_styles_6_0, grammarAccess.getUiNumericFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiNumericFieldRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"styles",
+													lv_styles_6_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), 2)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), 2);
+						}
+									({true}?=>((
+										lv_noMarkNegative_7_0='noMarkNegative'
+										{
+											newLeafNode(lv_noMarkNegative_7_0, grammarAccess.getUiNumericFieldAccess().getNoMarkNegativeNoMarkNegativeKeyword_2_1_2_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiNumericFieldRule());
+											}
+											setWithLastConsumed($current, "noMarkNegative", true, "noMarkNegative");
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), 3)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), 3);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getUiNumericFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_3_0());
+										}
+										lv_i18nInfo_8_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiNumericFieldRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_8_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), 4)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), 4);
+						}
+									({true}?=>((
+										lv_readonly_9_0='readonly'
+										{
+											newLeafNode(lv_readonly_9_0, grammarAccess.getUiNumericFieldAccess().getReadonlyReadonlyKeyword_2_1_4_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiNumericFieldRule());
+											}
+											setWithLastConsumed($current, "readonly", true, "readonly");
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)
+						)*
+					)
+				)
 					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 4);
-	 				}
-					({true}?=>(
-(
-		lv_autoHidePopup_23_0=	'autoHidePopup' 
-    {
-        newLeafNode(lv_autoHidePopup_23_0, grammarAccess.getUiSuggestTextFieldAccess().getAutoHidePopupAutoHidePopupKeyword_4_1_4_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiSuggestTextFieldRule());
-	        }
-       		setWithLastConsumed($current, "autoHidePopup", true, "autoHidePopup");
-	    }
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1());
+					}
+			)
+			otherlv_10=')'
+			{
+				newLeafNode(otherlv_10, grammarAccess.getUiNumericFieldAccess().getRightParenthesisKeyword_2_2());
+			}
+		)?
+		(
+			(
+				lv_name_11_0=RULE_ID
+				{
+					newLeafNode(lv_name_11_0, grammarAccess.getUiNumericFieldAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiNumericFieldRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_11_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		(
+			otherlv_12='{'
+			{
+				newLeafNode(otherlv_12, grammarAccess.getUiNumericFieldAccess().getLeftCurlyBracketKeyword_4_0());
+			}
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiNumericFieldAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
+						}
+						lv_validators_13_0=ruleUiValidator
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiNumericFieldRule());
+							}
+							add(
+								$current,
+								"validators",
+								lv_validators_13_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiNumericFieldAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
+						}
+						lv_bindings_14_0=ruleUiBinding
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiNumericFieldRule());
+							}
+							add(
+								$current,
+								"bindings",
+								lv_bindings_14_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiNumericFieldAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
+					}
+					lv_processorAssignments_15_0=ruleUiVisibilityProcessorAssignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiNumericFieldRule());
+						}
+						add(
+							$current,
+							"processorAssignments",
+							lv_processorAssignments_15_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)*
+			otherlv_16='}'
+			{
+				newLeafNode(otherlv_16, grammarAccess.getUiNumericFieldAccess().getRightCurlyBracketKeyword_4_3());
+			}
+		)?
+	)
+;
 
-)
-))
+// Entry rule entryRuleUiCheckBox
+entryRuleUiCheckBox returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiCheckBoxRule()); }
+	iv_ruleUiCheckBox=ruleUiCheckBox
+	{ $current=$iv_ruleUiCheckBox.current; }
+	EOF;
+
+// Rule UiCheckBox
+ruleUiCheckBox returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiCheckBoxAccess().getUiCheckBoxAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='checkbox'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getUiCheckBoxAccess().getCheckboxKeyword_1());
+		}
+		(
+			otherlv_2='('
+			{
+				newLeafNode(otherlv_2, grammarAccess.getUiCheckBoxAccess().getLeftParenthesisKeyword_2_0());
+			}
+			(
+				(
 					{ 
-	 				  getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1());
-	 				}
- 				)
-			)  |
-
-			( 
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 5)}?=>(
+					  getUnorderedGroupHelper().enter(grammarAccess.getUiCheckBoxAccess().getUnorderedGroup_2_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiCheckBoxAccess().getUnorderedGroup_2_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiCheckBoxAccess().getUnorderedGroup_2_1(), 0);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getUiCheckBoxAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+										}
+										lv_i18nInfo_4_0=ruleUiI18nInfo
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getUiCheckBoxRule());
+											}
+											set(
+												$current,
+												"i18nInfo",
+												lv_i18nInfo_4_0,
+												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiCheckBoxAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiCheckBoxAccess().getUnorderedGroup_2_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiCheckBoxAccess().getUnorderedGroup_2_1(), 1);
+						}
+									({true}?=>((
+										lv_readonly_5_0='readonly'
+										{
+											newLeafNode(lv_readonly_5_0, grammarAccess.getUiCheckBoxAccess().getReadonlyReadonlyKeyword_2_1_1_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getUiCheckBoxRule());
+											}
+											setWithLastConsumed($current, "readonly", true, "readonly");
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiCheckBoxAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiCheckBoxAccess().getUnorderedGroup_2_1(), 2)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getUiCheckBoxAccess().getUnorderedGroup_2_1(), 2);
+						}
+									({true}?=>(otherlv_6='styles'
+									{
+										newLeafNode(otherlv_6, grammarAccess.getUiCheckBoxAccess().getStylesKeyword_2_1_2_0());
+									}
+									(
+										(
+											lv_styles_7_0=RULE_STRING
+											{
+												newLeafNode(lv_styles_7_0, grammarAccess.getUiCheckBoxAccess().getStylesSTRINGTerminalRuleCall_2_1_2_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getUiCheckBoxRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"styles",
+													lv_styles_7_0,
+													"org.eclipse.xtext.xbase.Xtype.STRING");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiCheckBoxAccess().getUnorderedGroup_2_1());
+						}
+					)
+				)
+						)*
+					)
+				)
 					{ 
-	 				  getUnorderedGroupHelper().select(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 5);
-	 				}
-					({true}?=>(
-(
-		lv_readonly_24_0=	'readonly' 
-    {
-        newLeafNode(lv_readonly_24_0, grammarAccess.getUiSuggestTextFieldAccess().getReadonlyReadonlyKeyword_4_1_5_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUiSuggestTextFieldRule());
-	        }
-       		setWithLastConsumed($current, "readonly", true, "readonly");
-	    }
+					  getUnorderedGroupHelper().leave(grammarAccess.getUiCheckBoxAccess().getUnorderedGroup_2_1());
+					}
+			)
+			otherlv_8=')'
+			{
+				newLeafNode(otherlv_8, grammarAccess.getUiCheckBoxAccess().getRightParenthesisKeyword_2_2());
+			}
+		)?
+		(
+			(
+				lv_name_9_0=RULE_ID
+				{
+					newLeafNode(lv_name_9_0, grammarAccess.getUiCheckBoxAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiCheckBoxRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_9_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		(
+			otherlv_10='{'
+			{
+				newLeafNode(otherlv_10, grammarAccess.getUiCheckBoxAccess().getLeftCurlyBracketKeyword_4_0());
+			}
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiCheckBoxAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
+						}
+						lv_validators_11_0=ruleUiValidator
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiCheckBoxRule());
+							}
+							add(
+								$current,
+								"validators",
+								lv_validators_11_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getUiCheckBoxAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
+						}
+						lv_bindings_12_0=ruleUiBinding
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getUiCheckBoxRule());
+							}
+							add(
+								$current,
+								"bindings",
+								lv_bindings_12_0,
+								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiCheckBoxAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
+					}
+					lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiCheckBoxRule());
+						}
+						add(
+							$current,
+							"processorAssignments",
+							lv_processorAssignments_13_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)*
+			otherlv_14='}'
+			{
+				newLeafNode(otherlv_14, grammarAccess.getUiCheckBoxAccess().getRightCurlyBracketKeyword_4_3());
+			}
+		)?
+	)
+;
 
+// Entry rule entryRuleUiValidator
+entryRuleUiValidator returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiValidatorRule()); }
+	iv_ruleUiValidator=ruleUiValidator
+	{ $current=$iv_ruleUiValidator.current; }
+	EOF;
+
+// Rule UiValidator
+ruleUiValidator returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getUiValidatorAccess().getUiMaxLengthValidatorParserRuleCall_0());
+		}
+		this_UiMaxLengthValidator_0=ruleUiMaxLengthValidator
+		{
+			$current = $this_UiMaxLengthValidator_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiValidatorAccess().getUiMinLengthValidatorParserRuleCall_1());
+		}
+		this_UiMinLengthValidator_1=ruleUiMinLengthValidator
+		{
+			$current = $this_UiMinLengthValidator_1.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiValidatorAccess().getUiRegexpValidatorParserRuleCall_2());
+		}
+		this_UiRegexpValidator_2=ruleUiRegexpValidator
+		{
+			$current = $this_UiRegexpValidator_2.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiValidatorAccess().getUiXbaseValidatorParserRuleCall_3());
+		}
+		this_UiXbaseValidator_3=ruleUiXbaseValidator
+		{
+			$current = $this_UiXbaseValidator_3.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getUiValidatorAccess().getUiBeanValidationValidatorParserRuleCall_4());
+		}
+		this_UiBeanValidationValidator_4=ruleUiBeanValidationValidator
+		{
+			$current = $this_UiBeanValidationValidator_4.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleUiMaxLengthValidator
+entryRuleUiMaxLengthValidator returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiMaxLengthValidatorRule()); }
+	iv_ruleUiMaxLengthValidator=ruleUiMaxLengthValidator
+	{ $current=$iv_ruleUiMaxLengthValidator.current; }
+	EOF;
+
+// Rule UiMaxLengthValidator
+ruleUiMaxLengthValidator returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiMaxLengthValidatorAccess().getUiMaxLengthValidatorAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='MaxLengthValidator'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getUiMaxLengthValidatorAccess().getMaxLengthValidatorKeyword_1());
+		}
+		(
+			(
+				lv_name_2_0=RULE_ID
+				{
+					newLeafNode(lv_name_2_0, grammarAccess.getUiMaxLengthValidatorAccess().getNameIDTerminalRuleCall_2_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiMaxLengthValidatorRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_2_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		otherlv_3='('
+		{
+			newLeafNode(otherlv_3, grammarAccess.getUiMaxLengthValidatorAccess().getLeftParenthesisKeyword_3());
+		}
+		(
+			(
+				lv_maxLength_4_0=RULE_INT
+				{
+					newLeafNode(lv_maxLength_4_0, grammarAccess.getUiMaxLengthValidatorAccess().getMaxLengthINTTerminalRuleCall_4_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiMaxLengthValidatorRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"maxLength",
+						lv_maxLength_4_0,
+						"org.eclipse.xtext.xbase.Xbase.INT");
+				}
+			)
+		)
+		otherlv_5=')'
+		{
+			newLeafNode(otherlv_5, grammarAccess.getUiMaxLengthValidatorAccess().getRightParenthesisKeyword_5());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiMaxLengthValidatorAccess().getErrorCodeUiErrorCodeParserRuleCall_6_0());
+				}
+				lv_errorCode_6_0=ruleUiErrorCode
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiMaxLengthValidatorRule());
+					}
+					set(
+						$current,
+						"errorCode",
+						lv_errorCode_6_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiErrorCode");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+	)
+;
+
+// Entry rule entryRuleUiMinLengthValidator
+entryRuleUiMinLengthValidator returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiMinLengthValidatorRule()); }
+	iv_ruleUiMinLengthValidator=ruleUiMinLengthValidator
+	{ $current=$iv_ruleUiMinLengthValidator.current; }
+	EOF;
+
+// Rule UiMinLengthValidator
+ruleUiMinLengthValidator returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiMinLengthValidatorAccess().getUiMinLengthValidatorAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='MinLengthValidator'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getUiMinLengthValidatorAccess().getMinLengthValidatorKeyword_1());
+		}
+		(
+			(
+				lv_name_2_0=RULE_ID
+				{
+					newLeafNode(lv_name_2_0, grammarAccess.getUiMinLengthValidatorAccess().getNameIDTerminalRuleCall_2_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiMinLengthValidatorRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_2_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		otherlv_3='('
+		{
+			newLeafNode(otherlv_3, grammarAccess.getUiMinLengthValidatorAccess().getLeftParenthesisKeyword_3());
+		}
+		(
+			(
+				lv_minLength_4_0=RULE_INT
+				{
+					newLeafNode(lv_minLength_4_0, grammarAccess.getUiMinLengthValidatorAccess().getMinLengthINTTerminalRuleCall_4_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiMinLengthValidatorRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"minLength",
+						lv_minLength_4_0,
+						"org.eclipse.xtext.xbase.Xbase.INT");
+				}
+			)
+		)
+		otherlv_5=')'
+		{
+			newLeafNode(otherlv_5, grammarAccess.getUiMinLengthValidatorAccess().getRightParenthesisKeyword_5());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiMinLengthValidatorAccess().getErrorCodeUiErrorCodeParserRuleCall_6_0());
+				}
+				lv_errorCode_6_0=ruleUiErrorCode
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiMinLengthValidatorRule());
+					}
+					set(
+						$current,
+						"errorCode",
+						lv_errorCode_6_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiErrorCode");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+	)
+;
+
+// Entry rule entryRuleUiRegexpValidator
+entryRuleUiRegexpValidator returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiRegexpValidatorRule()); }
+	iv_ruleUiRegexpValidator=ruleUiRegexpValidator
+	{ $current=$iv_ruleUiRegexpValidator.current; }
+	EOF;
+
+// Rule UiRegexpValidator
+ruleUiRegexpValidator returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiRegexpValidatorAccess().getUiRegexpValidatorAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='RegexValidator'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getUiRegexpValidatorAccess().getRegexValidatorKeyword_1());
+		}
+		(
+			(
+				lv_name_2_0=RULE_ID
+				{
+					newLeafNode(lv_name_2_0, grammarAccess.getUiRegexpValidatorAccess().getNameIDTerminalRuleCall_2_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiRegexpValidatorRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_2_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+		otherlv_3='('
+		{
+			newLeafNode(otherlv_3, grammarAccess.getUiRegexpValidatorAccess().getLeftParenthesisKeyword_3());
+		}
+		(
+			(
+				lv_regExpression_4_0=RULE_STRING
+				{
+					newLeafNode(lv_regExpression_4_0, grammarAccess.getUiRegexpValidatorAccess().getRegExpressionSTRINGTerminalRuleCall_4_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiRegexpValidatorRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"regExpression",
+						lv_regExpression_4_0,
+						"org.eclipse.xtext.xbase.Xtype.STRING");
+				}
+			)
+		)
+		otherlv_5=')'
+		{
+			newLeafNode(otherlv_5, grammarAccess.getUiRegexpValidatorAccess().getRightParenthesisKeyword_5());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiRegexpValidatorAccess().getErrorCodeUiErrorCodeParserRuleCall_6_0());
+				}
+				lv_errorCode_6_0=ruleUiErrorCode
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiRegexpValidatorRule());
+					}
+					set(
+						$current,
+						"errorCode",
+						lv_errorCode_6_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiErrorCode");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+	)
+;
+
+// Entry rule entryRuleUiXbaseValidator
+entryRuleUiXbaseValidator returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiXbaseValidatorRule()); }
+	iv_ruleUiXbaseValidator=ruleUiXbaseValidator
+	{ $current=$iv_ruleUiXbaseValidator.current; }
+	EOF;
+
+// Rule UiXbaseValidator
+ruleUiXbaseValidator returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiXbaseValidatorAccess().getUiXbaseValidatorAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='Expression'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getUiXbaseValidatorAccess().getExpressionKeyword_1());
+		}
+		(
+			(
+				lv_name_2_0=RULE_ID
+				{
+					newLeafNode(lv_name_2_0, grammarAccess.getUiXbaseValidatorAccess().getNameIDTerminalRuleCall_2_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiXbaseValidatorRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_2_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)
+		otherlv_3='('
+		{
+			newLeafNode(otherlv_3, grammarAccess.getUiXbaseValidatorAccess().getLeftParenthesisKeyword_3());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiXbaseValidatorAccess().getJvmTypeJvmTypeReferenceParserRuleCall_4_0());
+				}
+				lv_jvmType_4_0=ruleJvmTypeReference
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiXbaseValidatorRule());
+					}
+					set(
+						$current,
+						"jvmType",
+						lv_jvmType_4_0,
+						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_5=')'
+		{
+			newLeafNode(otherlv_5, grammarAccess.getUiXbaseValidatorAccess().getRightParenthesisKeyword_5());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiXbaseValidatorAccess().getErrorCodesUiErrorCodeParserRuleCall_6_0());
+				}
+				lv_errorCodes_6_0=ruleUiErrorCode
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiXbaseValidatorRule());
+					}
+					add(
+						$current,
+						"errorCodes",
+						lv_errorCodes_6_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiErrorCode");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiXbaseValidatorAccess().getExpressionXBlockExpressionParserRuleCall_7_0());
+				}
+				lv_expression_7_0=ruleXBlockExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiXbaseValidatorRule());
+					}
+					set(
+						$current,
+						"expression",
+						lv_expression_7_0,
+						"org.eclipse.xtext.xbase.Xbase.XBlockExpression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+	)
+;
+
+// Entry rule entryRuleUiBeanValidationValidator
+entryRuleUiBeanValidationValidator returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiBeanValidationValidatorRule()); }
+	iv_ruleUiBeanValidationValidator=ruleUiBeanValidationValidator
+	{ $current=$iv_ruleUiBeanValidationValidator.current; }
+	EOF;
+
+// Rule UiBeanValidationValidator
+ruleUiBeanValidationValidator returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiBeanValidationValidatorAccess().getUiBeanValidationValidatorAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='BeanValidationValidator'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getUiBeanValidationValidatorAccess().getBeanValidationValidatorKeyword_1());
+		}
+		(
+			(
+				lv_name_2_0=RULE_ID
+				{
+					newLeafNode(lv_name_2_0, grammarAccess.getUiBeanValidationValidatorAccess().getNameIDTerminalRuleCall_2_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiBeanValidationValidatorRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_2_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)?
+	)
+;
+
+// Entry rule entryRuleUiErrorCode
+entryRuleUiErrorCode returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiErrorCodeRule()); }
+	iv_ruleUiErrorCode=ruleUiErrorCode
+	{ $current=$iv_ruleUiErrorCode.current; }
+	EOF;
+
+// Rule UiErrorCode
+ruleUiErrorCode returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='code'
+		{
+			newLeafNode(otherlv_0, grammarAccess.getUiErrorCodeAccess().getCodeKeyword_0());
+		}
+		(
+			(
+				lv_name_1_0=RULE_ID
+				{
+					newLeafNode(lv_name_1_0, grammarAccess.getUiErrorCodeAccess().getNameIDTerminalRuleCall_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiErrorCodeRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_1_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)
+		(
+			(
+				lv_defaultMessage_2_0=RULE_STRING
+				{
+					newLeafNode(lv_defaultMessage_2_0, grammarAccess.getUiErrorCodeAccess().getDefaultMessageSTRINGTerminalRuleCall_2_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiErrorCodeRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"defaultMessage",
+						lv_defaultMessage_2_0,
+						"org.eclipse.xtext.xbase.Xtype.STRING");
+				}
+			)
+		)?
+	)
+;
+
+// Entry rule entryRuleUiVisibilityProcessor
+entryRuleUiVisibilityProcessor returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiVisibilityProcessorRule()); }
+	iv_ruleUiVisibilityProcessor=ruleUiVisibilityProcessor
+	{ $current=$iv_ruleUiVisibilityProcessor.current; }
+	EOF;
+
+// Rule UiVisibilityProcessor
+ruleUiVisibilityProcessor returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUiVisibilityProcessorAccess().getUiVisibilityProcessorAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='visibility'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getUiVisibilityProcessorAccess().getVisibilityKeyword_1());
+		}
+		(
+			(
+				lv_name_2_0=RULE_ID
+				{
+					newLeafNode(lv_name_2_0, grammarAccess.getUiVisibilityProcessorAccess().getNameIDTerminalRuleCall_2_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiVisibilityProcessorRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_2_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)
+		otherlv_3='{'
+		{
+			newLeafNode(otherlv_3, grammarAccess.getUiVisibilityProcessorAccess().getLeftCurlyBracketKeyword_3());
+		}
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiVisibilityProcessorAccess().getDataUsedUiBindingEndpointAliasParserRuleCall_4_0_0());
+					}
+					lv_dataUsed_4_0=ruleUiBindingEndpointAlias
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiVisibilityProcessorRule());
+						}
+						add(
+							$current,
+							"dataUsed",
+							lv_dataUsed_4_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAlias");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			    |
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiVisibilityProcessorAccess().getChangeTriggersUiChangeTriggerParserRuleCall_4_1_0());
+					}
+					lv_changeTriggers_5_0=ruleUiChangeTrigger
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiVisibilityProcessorRule());
+						}
+						add(
+							$current,
+							"changeTriggers",
+							lv_changeTriggers_5_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiChangeTrigger");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			    |
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUiVisibilityProcessorAccess().getImportedElementsUiTypedBindableRawTypeAliasParserRuleCall_4_2_0());
+					}
+					lv_importedElements_6_0=ruleUiTypedBindableRawTypeAlias
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUiVisibilityProcessorRule());
+						}
+						add(
+							$current,
+							"importedElements",
+							lv_importedElements_6_0,
+							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiTypedBindableRawTypeAlias");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)*
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiVisibilityProcessorAccess().getRuleUiXbaseVisibilityRuleParserRuleCall_5_0());
+				}
+				lv_rule_7_0=ruleUiXbaseVisibilityRule
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiVisibilityProcessorRule());
+					}
+					set(
+						$current,
+						"rule",
+						lv_rule_7_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiXbaseVisibilityRule");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		otherlv_8='}'
+		{
+			newLeafNode(otherlv_8, grammarAccess.getUiVisibilityProcessorAccess().getRightCurlyBracketKeyword_6());
+		}
+	)
+;
+
+// Entry rule entryRuleUiXbaseVisibilityRule
+entryRuleUiXbaseVisibilityRule returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiXbaseVisibilityRuleRule()); }
+	iv_ruleUiXbaseVisibilityRule=ruleUiXbaseVisibilityRule
+	{ $current=$iv_ruleUiXbaseVisibilityRule.current; }
+	EOF;
+
+// Rule UiXbaseVisibilityRule
+ruleUiXbaseVisibilityRule returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				newCompositeNode(grammarAccess.getUiXbaseVisibilityRuleAccess().getExpressionXBlockExpressionParserRuleCall_0());
+			}
+			lv_expression_0_0=ruleXBlockExpression
+			{
+				if ($current==null) {
+					$current = createModelElementForParent(grammarAccess.getUiXbaseVisibilityRuleRule());
+				}
+				set(
+					$current,
+					"expression",
+					lv_expression_0_0,
+					"org.eclipse.xtext.xbase.Xbase.XBlockExpression");
+				afterParserOrEnumRuleCall();
+			}
+		)
+	)
+;
+
+// Entry rule entryRuleUiChangeTrigger
+entryRuleUiChangeTrigger returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUiChangeTriggerRule()); }
+	iv_ruleUiChangeTrigger=ruleUiChangeTrigger
+	{ $current=$iv_ruleUiChangeTrigger.current; }
+	EOF;
+
+// Rule UiChangeTrigger
+ruleUiChangeTrigger returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='fireOn'
+		{
+			newLeafNode(otherlv_0, grammarAccess.getUiChangeTriggerAccess().getFireOnKeyword_0());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUiChangeTriggerAccess().getEndpointUiBindingEndpointAssignmentParserRuleCall_1_0());
+				}
+				lv_endpoint_1_0=ruleUiBindingEndpointAssignment
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUiChangeTriggerRule());
+					}
+					set(
+						$current,
+						"endpoint",
+						lv_endpoint_1_0,
+						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAssignment");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_2='as'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getUiChangeTriggerAccess().getAsKeyword_2());
+		}
+		(
+			(
+				lv_alias_3_0=RULE_ID
+				{
+					newLeafNode(lv_alias_3_0, grammarAccess.getUiChangeTriggerAccess().getAliasIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUiChangeTriggerRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"alias",
+						lv_alias_3_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)
+		(
+			otherlv_4=';'
+			{
+				newLeafNode(otherlv_4, grammarAccess.getUiChangeTriggerAccess().getSemicolonKeyword_4());
+			}
+		)?
+	)
+;
+
+// 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]:
+	{ newCompositeNode(grammarAccess.getXTypeLiteralRule()); }
+	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());
+		}
+		(
+			(
+				{
+					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]:
+	{ newCompositeNode(grammarAccess.getXThrowExpressionRule()); }
+	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,
+						"org.eclipse.xtext.xbase.Xbase.XExpression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleXReturnExpression
+entryRuleXReturnExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXReturnExpressionRule()); }
+	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,
+						"org.eclipse.xtext.xbase.Xbase.XExpression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+	)
+;
+
+// Entry rule entryRuleXTryCatchFinallyExpression
+entryRuleXTryCatchFinallyExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionRule()); }
+	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,
+						"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]:
+	{ newCompositeNode(grammarAccess.getXSynchronizedExpressionRule()); }
+	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,
+						"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();
+				}
+			)
+		)
+	)
+;
+
+// 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 UiDateFormat
+ruleUiDateFormat returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			enumLiteral_0='date'
+			{
+				$current = grammarAccess.getUiDateFormatAccess().getDATEEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_0, grammarAccess.getUiDateFormatAccess().getDATEEnumLiteralDeclaration_0());
+			}
+		)
+		    |
+		(
+			enumLiteral_1='datetime'
+			{
+				$current = grammarAccess.getUiDateFormatAccess().getDATE_TIMEEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_1, grammarAccess.getUiDateFormatAccess().getDATE_TIMEEnumLiteralDeclaration_1());
+			}
+		)
+		    |
+		(
+			enumLiteral_2='time'
+			{
+				$current = grammarAccess.getUiDateFormatAccess().getTIMEEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_2, grammarAccess.getUiDateFormatAccess().getTIMEEnumLiteralDeclaration_2());
+			}
+		)
+	)
+;
+
+// Rule UiDateTimeResolution
+ruleUiDateTimeResolution returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			enumLiteral_0='undefined'
+			{
+				$current = grammarAccess.getUiDateTimeResolutionAccess().getUNDEFINEDEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_0, grammarAccess.getUiDateTimeResolutionAccess().getUNDEFINEDEnumLiteralDeclaration_0());
+			}
+		)
+		    |
+		(
+			enumLiteral_1='second'
+			{
+				$current = grammarAccess.getUiDateTimeResolutionAccess().getSECONDEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_1, grammarAccess.getUiDateTimeResolutionAccess().getSECONDEnumLiteralDeclaration_1());
+			}
+		)
+		    |
+		(
+			enumLiteral_2='minute'
+			{
+				$current = grammarAccess.getUiDateTimeResolutionAccess().getMINUTEEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_2, grammarAccess.getUiDateTimeResolutionAccess().getMINUTEEnumLiteralDeclaration_2());
+			}
+		)
+		    |
+		(
+			enumLiteral_3='hour'
+			{
+				$current = grammarAccess.getUiDateTimeResolutionAccess().getHOUREnumLiteralDeclaration_3().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_3, grammarAccess.getUiDateTimeResolutionAccess().getHOUREnumLiteralDeclaration_3());
+			}
+		)
+		    |
+		(
+			enumLiteral_4='day'
+			{
+				$current = grammarAccess.getUiDateTimeResolutionAccess().getDAYEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_4, grammarAccess.getUiDateTimeResolutionAccess().getDAYEnumLiteralDeclaration_4());
+			}
+		)
+		    |
+		(
+			enumLiteral_5='month'
+			{
+				$current = grammarAccess.getUiDateTimeResolutionAccess().getMONTHEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_5, grammarAccess.getUiDateTimeResolutionAccess().getMONTHEnumLiteralDeclaration_5());
+			}
+		)
+		    |
+		(
+			enumLiteral_6='year'
+			{
+				$current = grammarAccess.getUiDateTimeResolutionAccess().getYEAREnumLiteralDeclaration_6().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_6, grammarAccess.getUiDateTimeResolutionAccess().getYEAREnumLiteralDeclaration_6());
+			}
+		)
+	)
+;
+
+// Rule UiSelectionType
+ruleUiSelectionType returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			enumLiteral_0='single'
+			{
+				$current = grammarAccess.getUiSelectionTypeAccess().getSINGLEEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_0, grammarAccess.getUiSelectionTypeAccess().getSINGLEEnumLiteralDeclaration_0());
+			}
+		)
+		    |
+		(
+			enumLiteral_1='multi'
+			{
+				$current = grammarAccess.getUiSelectionTypeAccess().getMULTIEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_1, grammarAccess.getUiSelectionTypeAccess().getMULTIEnumLiteralDeclaration_1());
+			}
+		)
+		    |
+		(
+			enumLiteral_2='none'
+			{
+				$current = grammarAccess.getUiSelectionTypeAccess().getNONEEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_2, grammarAccess.getUiSelectionTypeAccess().getNONEEnumLiteralDeclaration_2());
+			}
+		)
+	)
+;
+
+// Rule UiAlignment
+ruleUiAlignment returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			enumLiteral_0='undefined'
+			{
+				$current = grammarAccess.getUiAlignmentAccess().getUNDEFINEDEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_0, grammarAccess.getUiAlignmentAccess().getUNDEFINEDEnumLiteralDeclaration_0());
+			}
+		)
+		    |
+		(
+			enumLiteral_1='bottom-center'
+			{
+				$current = grammarAccess.getUiAlignmentAccess().getBOTTOM_CENTEREnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_1, grammarAccess.getUiAlignmentAccess().getBOTTOM_CENTEREnumLiteralDeclaration_1());
+			}
+		)
+		    |
+		(
+			enumLiteral_2='bottom-left'
+			{
+				$current = grammarAccess.getUiAlignmentAccess().getBOTTOM_LEFTEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_2, grammarAccess.getUiAlignmentAccess().getBOTTOM_LEFTEnumLiteralDeclaration_2());
+			}
+		)
+		    |
+		(
+			enumLiteral_3='bottom-right'
+			{
+				$current = grammarAccess.getUiAlignmentAccess().getBOTTOM_RIGHTEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_3, grammarAccess.getUiAlignmentAccess().getBOTTOM_RIGHTEnumLiteralDeclaration_3());
+			}
+		)
+		    |
+		(
+			enumLiteral_4='bottom-fill'
+			{
+				$current = grammarAccess.getUiAlignmentAccess().getBOTTOM_FILLEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_4, grammarAccess.getUiAlignmentAccess().getBOTTOM_FILLEnumLiteralDeclaration_4());
+			}
+		)
+		    |
+		(
+			enumLiteral_5='middle-center'
+			{
+				$current = grammarAccess.getUiAlignmentAccess().getMIDDLE_CENTEREnumLiteralDeclaration_5().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_5, grammarAccess.getUiAlignmentAccess().getMIDDLE_CENTEREnumLiteralDeclaration_5());
+			}
+		)
+		    |
+		(
+			enumLiteral_6='middle-left'
+			{
+				$current = grammarAccess.getUiAlignmentAccess().getMIDDLE_LEFTEnumLiteralDeclaration_6().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_6, grammarAccess.getUiAlignmentAccess().getMIDDLE_LEFTEnumLiteralDeclaration_6());
+			}
+		)
+		    |
+		(
+			enumLiteral_7='middle-right'
+			{
+				$current = grammarAccess.getUiAlignmentAccess().getMIDDLE_RIGHTEnumLiteralDeclaration_7().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_7, grammarAccess.getUiAlignmentAccess().getMIDDLE_RIGHTEnumLiteralDeclaration_7());
+			}
+		)
+		    |
+		(
+			enumLiteral_8='middle-fill'
+			{
+				$current = grammarAccess.getUiAlignmentAccess().getMIDDLE_FILLEnumLiteralDeclaration_8().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_8, grammarAccess.getUiAlignmentAccess().getMIDDLE_FILLEnumLiteralDeclaration_8());
+			}
+		)
+		    |
+		(
+			enumLiteral_9='top-center'
+			{
+				$current = grammarAccess.getUiAlignmentAccess().getTOP_CENTEREnumLiteralDeclaration_9().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_9, grammarAccess.getUiAlignmentAccess().getTOP_CENTEREnumLiteralDeclaration_9());
+			}
+		)
+		    |
+		(
+			enumLiteral_10='top-left'
+			{
+				$current = grammarAccess.getUiAlignmentAccess().getTOP_LEFTEnumLiteralDeclaration_10().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_10, grammarAccess.getUiAlignmentAccess().getTOP_LEFTEnumLiteralDeclaration_10());
+			}
+		)
+		    |
+		(
+			enumLiteral_11='top-right'
+			{
+				$current = grammarAccess.getUiAlignmentAccess().getTOP_RIGHTEnumLiteralDeclaration_11().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_11, grammarAccess.getUiAlignmentAccess().getTOP_RIGHTEnumLiteralDeclaration_11());
+			}
+		)
+		    |
+		(
+			enumLiteral_12='top-fill'
+			{
+				$current = grammarAccess.getUiAlignmentAccess().getTOP_FILLEnumLiteralDeclaration_12().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_12, grammarAccess.getUiAlignmentAccess().getTOP_FILLEnumLiteralDeclaration_12());
+			}
+		)
+		    |
+		(
+			enumLiteral_13='fill-center'
+			{
+				$current = grammarAccess.getUiAlignmentAccess().getFILL_CENTEREnumLiteralDeclaration_13().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_13, grammarAccess.getUiAlignmentAccess().getFILL_CENTEREnumLiteralDeclaration_13());
+			}
+		)
+		    |
+		(
+			enumLiteral_14='fill-left'
+			{
+				$current = grammarAccess.getUiAlignmentAccess().getFILL_LEFTEnumLiteralDeclaration_14().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_14, grammarAccess.getUiAlignmentAccess().getFILL_LEFTEnumLiteralDeclaration_14());
+			}
+		)
+		    |
+		(
+			enumLiteral_15='fill-right'
+			{
+				$current = grammarAccess.getUiAlignmentAccess().getFILL_RIGHTEnumLiteralDeclaration_15().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_15, grammarAccess.getUiAlignmentAccess().getFILL_RIGHTEnumLiteralDeclaration_15());
+			}
+		)
+		    |
+		(
+			enumLiteral_16='fill-fill'
+			{
+				$current = grammarAccess.getUiAlignmentAccess().getFILL_FILLEnumLiteralDeclaration_16().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_16, grammarAccess.getUiAlignmentAccess().getFILL_FILLEnumLiteralDeclaration_16());
+			}
+		)
+	)
+;
+
+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.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.tokens b/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.tokens
index 165476a..a389b2b 100644
--- a/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.tokens
+++ b/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.tokens
@@ -1,227 +1,232 @@
-'!'=177
-'!='=162
-'!=='=164
-'#'=181
-'%'=176
-'%='=157
-'&&'=160
-'&'=208
-'('=46
-')'=48
-'*'=173
-'**'=174
-'*='=155
-'+'=171
-'++'=178
-'+='=19
-','=101
-'-'=172
-'--'=30
-'-='=154
-'->'=166
-'.'=32
-'..'=36
-'..<'=167
-'/'=175
-'/='=156
-':'=25
-'::'=179
-';'=15
-'<'=29
-'<>'=169
-'='=153
-'=='=161
-'==='=163
-'=>'=168
-'>'=31
-'>='=158
-'?'=207
-'?.'=180
-'?:'=170
-'BeanValidationValidator'=149
-'Expression'=148
-'MaxLengthValidator'=145
-'MinLengthValidator'=146
-'RegexValidator'=147
-'['=33
-']'=34
-'addToTable'=40
-'alias'=129
-'align'=54
-'as'=17
-'asBlob'=105
-'asc'=142
-'at'=44
-'autoHidePopup'=110
-'bind'=27
-'bottom-center'=221
-'bottom-fill'=224
-'bottom-left'=222
-'bottom-right'=223
-'browser'=119
-'button'=127
-'captionField'=107
-'case'=187
-'catch'=206
-'category'=51
+'!'=185
+'!='=171
+'!=='=173
+'#'=162
+'%'=184
+'%='=166
+'&&'=169
+'&'=213
+'('=45
+')'=47
+'*'=158
+'**'=182
+'*='=164
+'+'=180
+'++'=186
+'+='=18
+','=102
+'-'=181
+'--'=29
+'-='=163
+'->'=175
+'.'=31
+'..'=35
+'..<'=176
+'/'=183
+'/='=165
+':'=24
+'::'=187
+';'=16
+'<'=28
+'<>'=178
+'='=161
+'=='=170
+'==='=172
+'=>'=177
+'>'=30
+'>='=167
+'?'=212
+'?.'=188
+'?:'=179
+'@'=160
+'BeanValidationValidator'=151
+'Expression'=150
+'MaxLengthValidator'=147
+'MinLengthValidator'=148
+'RegexValidator'=149
+'['=32
+']'=33
+'addToTable'=39
+'alias'=131
+'align'=53
+'as'=15
+'asBlob'=106
+'asc'=144
+'at'=43
+'autoHidePopup'=111
+'bind'=26
+'bottom-center'=226
+'bottom-fill'=229
+'bottom-left'=227
+'bottom-right'=228
+'browser'=120
+'button'=129
+'captionField'=108
+'case'=194
+'catch'=211
+'category'=50
 'checkDirty'=57
-'checkbox'=144
-'code'=150
-'column'=140
-'columns'=138
-'columns='=62
-'combo'=126
-'content'=84
-'dataAlias'=23
-'datasource'=24
-'date'=209
-'datefield'=118
-'datetime'=210
-'day'=215
-'decimalField'=132
-'default'=186
-'desc'=141
-'descriptionField'=113
-'dialog'=85
-'do'=189
-'else'=184
-'eventTopic'=26
-'exposedActions'=53
-'extends'=192
-'extension'=194
+'checkbox'=146
+'code'=152
+'column'=142
+'columns'=140
+'columns='=63
+'combo'=128
+'content'=85
+'dataAlias'=22
+'datasource'=23
+'date'=214
+'datefield'=119
+'datetime'=215
+'day'=220
+'decimalField'=134
+'default'=193
+'desc'=143
+'descriptionField'=114
+'dialog'=86
+'display'=54
+'do'=196
+'else'=191
+'eventTopic'=25
+'exposedActions'=52
+'extends'=199
+'extension'=157
 'externalCommand'=58
-'false'=197
-'fieldValidation'=18
-'fill-center'=233
-'fill-fill'=236
-'fill-left'=234
-'fill-right'=235
-'filterField'=108
-'finally'=204
-'fireOn'=152
-'first'=80
-'for'=43
-'form'=65
-'gridlayout'=61
-'horizontalButtonGroup'=71
-'horizontalLayout'=69
-'hour'=214
+'false'=202
+'fieldValidation'=17
+'fill-center'=238
+'fill-fill'=241
+'fill-left'=239
+'fill-right'=240
+'filterField'=109
+'finally'=209
+'fireOn'=154
+'first'=81
+'for'=42
+'form'=66
+'gridlayout'=62
+'horizontalButtonGroup'=72
+'horizontalLayout'=70
+'hour'=219
 'i18n'=60
 'icon'=55
-'iconPath'=122
+'iconPath'=123
 'id'=56
-'ideview'=49
-'if'=183
-'image'=121
-'imageField'=114
-'import'=14
-'inMemoryService'=115
-'instanceof'=165
-'label'=131
-'list'=28
-'listSelect'=137
-'mask'=103
-'mask='=96
-'maskedDecimal'=98
-'maskedNumeric'=97
-'maskedText'=95
-'maskedTextWithPrefix'=99
-'maxLength='=91
-'middle-center'=225
-'middle-fill'=228
-'middle-left'=226
-'middle-right'=227
-'minLength='=92
-'minute'=213
+'ideview'=48
+'if'=190
+'image'=122
+'imageField'=115
+'import'=155
+'inMemoryService'=116
+'instanceof'=174
+'label'=133
+'list'=27
+'listSelect'=139
+'mask'=104
+'mask='=97
+'maskedDecimal'=99
+'maskedNumeric'=98
+'maskedText'=96
+'maskedTextWithPrefix'=100
+'maxLength='=92
+'middle-center'=230
+'middle-fill'=233
+'middle-left'=231
+'middle-right'=232
+'minLength='=93
+'minute'=218
 'mobile'=59
-'mobileHorizontalLayout'=70
-'mobileSearchPanel'=75
-'mobileTab'=76
-'mobileVerticalLayout'=67
-'month'=216
-'multi'=219
-'navButton'=128
-'navPage'=88
-'navRoot'=68
-'navbarActions'=89
-'navigateTo'=37
-'new'=196
-'newInstance'=42
-'noAutoTrigger'=47
-'noGrouping'=133
-'noMarkNegative'=134
-'none'=220
-'null'=199
-'numericField'=143
-'openDialog'=38
-'optionsgroup'=136
+'mobileHorizontalLayout'=71
+'mobileSearchPanel'=76
+'mobileTab'=77
+'mobileVerticalLayout'=68
+'month'=221
+'multi'=224
+'navButton'=130
+'navPage'=89
+'navRoot'=69
+'navbarActions'=90
+'navigateTo'=36
+'new'=201
+'newInstance'=41
+'noAutoTrigger'=46
+'noCaption'=61
+'noGrouping'=135
+'noMarkNegative'=136
+'none'=225
+'ns'=159
+'null'=204
+'numericField'=145
+'openDialog'=37
+'optionsgroup'=138
 'package'=13
-'panel'=83
-'passwordField'=94
-'precision='=135
-'prefix'=102
-'prefixes='=100
-'progressbar'=120
-'readonly'=64
-'refSource'=112
-'referenceField'=111
-'regex='=93
-'removeFromTable'=41
-'return'=202
-'richtextArea'=104
-'rootType'=52
-'search'=87
-'searchPanel'=73
-'searchWith'=39
-'searchdialog'=86
-'searchfield'=116
-'second'=81
-'selectionType'=124
-'sendEvent'=45
-'sharedStateGroup'=50
-'single'=218
-'sort'=139
-'splitPos'=82
-'splitter'=79
-'static'=193
-'styles'=63
-'suggestText'=106
-'super'=195
-'switch'=185
-'switchIt'=130
-'synchronized'=205
-'tab'=77
-'table'=123
-'tabsheet'=78
-'textarea'=117
-'textfield'=90
-'throw'=201
-'time'=211
-'top-center'=229
-'top-fill'=232
-'top-left'=230
-'top-right'=231
-'true'=198
-'try'=203
-'type'=74
-'typeof'=200
-'ui'=35
-'undefined'=212
-'useBeanService'=125
-'uuidField'=109
-'val'=191
-'validatorAlias'=16
-'var'=190
-'verticalGroup'=72
-'verticalLayout'=66
-'viewset'=20
-'visibility'=151
-'while'=188
-'year'=217
-'{'=21
-'|'=182
-'||'=159
-'}'=22
+'panel'=84
+'passwordField'=95
+'precision='=137
+'prefix'=103
+'prefixes='=101
+'progressbar'=121
+'readonly'=65
+'refSource'=113
+'referenceField'=112
+'regex='=94
+'removeFromTable'=40
+'return'=207
+'richtextArea'=105
+'rootType'=51
+'scrollToBottom'=127
+'search'=88
+'searchPanel'=74
+'searchWith'=38
+'searchdialog'=87
+'searchfield'=117
+'second'=82
+'selectionType'=125
+'sendEvent'=44
+'sharedStateGroup'=49
+'single'=223
+'sort'=141
+'splitPos'=83
+'splitter'=80
+'static'=156
+'styles'=64
+'suggestText'=107
+'super'=200
+'switch'=192
+'switchIt'=132
+'synchronized'=210
+'tab'=78
+'table'=124
+'tabsheet'=79
+'textarea'=118
+'textfield'=91
+'throw'=206
+'time'=216
+'top-center'=234
+'top-fill'=237
+'top-left'=235
+'top-right'=236
+'true'=203
+'try'=208
+'type'=75
+'typeof'=205
+'ui'=34
+'undefined'=217
+'useBeanService'=126
+'uuidField'=110
+'val'=198
+'validatorAlias'=14
+'var'=197
+'verticalGroup'=73
+'verticalLayout'=67
+'viewset'=19
+'visibility'=153
+'while'=195
+'year'=222
+'{'=20
+'|'=189
+'||'=168
+'}'=21
 RULE_ANY_OTHER=12
 RULE_DECIMAL=8
 RULE_HEX=7
@@ -378,7 +383,12 @@
 T__234=234
 T__235=235
 T__236=236
+T__237=237
+T__238=238
+T__239=239
 T__23=23
+T__240=240
+T__241=241
 T__24=24
 T__25=25
 T__26=26
diff --git a/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammarLexer.java b/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammarLexer.java
index 78b7e9a..f3d6869 100644
--- a/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammarLexer.java
+++ b/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammarLexer.java
@@ -157,16 +157,21 @@
     public static final int T__124=124;
     public static final int T__123=123;
     public static final int T__120=120;
+    public static final int T__241=241;
+    public static final int T__240=240;
     public static final int RULE_SL_COMMENT=10;
     public static final int T__119=119;
     public static final int T__118=118;
+    public static final int T__239=239;
     public static final int T__115=115;
     public static final int T__236=236;
     public static final int EOF=-1;
     public static final int T__114=114;
     public static final int T__235=235;
     public static final int T__117=117;
+    public static final int T__238=238;
     public static final int T__116=116;
+    public static final int T__237=237;
     public static final int T__111=111;
     public static final int T__232=232;
     public static final int T__110=110;
@@ -269,15 +274,15 @@
         super(input,state);
 
     }
-    public String getGrammarFileName() { return "../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g"; }
+    public String getGrammarFileName() { return "InternalUIGrammar.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.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:11:7: ( 'package' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:11:9: 'package'
+            // InternalUIGrammar.g:11:7: ( 'package' )
+            // InternalUIGrammar.g:11:9: 'package'
             {
             match("package"); 
 
@@ -297,10 +302,10 @@
         try {
             int _type = T__14;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:12:7: ( 'import' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:12:9: 'import'
+            // InternalUIGrammar.g:12:7: ( 'validatorAlias' )
+            // InternalUIGrammar.g:12:9: 'validatorAlias'
             {
-            match("import"); 
+            match("validatorAlias"); 
 
 
             }
@@ -318,10 +323,11 @@
         try {
             int _type = T__15;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:13:7: ( ';' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:13:9: ';'
+            // InternalUIGrammar.g:13:7: ( 'as' )
+            // InternalUIGrammar.g:13:9: 'as'
             {
-            match(';'); 
+            match("as"); 
+
 
             }
 
@@ -338,11 +344,10 @@
         try {
             int _type = T__16;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:14:7: ( 'validatorAlias' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:14:9: 'validatorAlias'
+            // InternalUIGrammar.g:14:7: ( ';' )
+            // InternalUIGrammar.g:14:9: ';'
             {
-            match("validatorAlias"); 
-
+            match(';'); 
 
             }
 
@@ -359,10 +364,10 @@
         try {
             int _type = T__17;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:15:7: ( 'as' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:15:9: 'as'
+            // InternalUIGrammar.g:15:7: ( 'fieldValidation' )
+            // InternalUIGrammar.g:15:9: 'fieldValidation'
             {
-            match("as"); 
+            match("fieldValidation"); 
 
 
             }
@@ -380,10 +385,10 @@
         try {
             int _type = T__18;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:16:7: ( 'fieldValidation' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:16:9: 'fieldValidation'
+            // InternalUIGrammar.g:16:7: ( '+=' )
+            // InternalUIGrammar.g:16:9: '+='
             {
-            match("fieldValidation"); 
+            match("+="); 
 
 
             }
@@ -401,10 +406,10 @@
         try {
             int _type = T__19;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:17:7: ( '+=' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:17:9: '+='
+            // InternalUIGrammar.g:17:7: ( 'viewset' )
+            // InternalUIGrammar.g:17:9: 'viewset'
             {
-            match("+="); 
+            match("viewset"); 
 
 
             }
@@ -422,11 +427,10 @@
         try {
             int _type = T__20;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:18:7: ( 'viewset' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:18:9: 'viewset'
+            // InternalUIGrammar.g:18:7: ( '{' )
+            // InternalUIGrammar.g:18:9: '{'
             {
-            match("viewset"); 
-
+            match('{'); 
 
             }
 
@@ -443,10 +447,10 @@
         try {
             int _type = T__21;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:19:7: ( '{' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:19:9: '{'
+            // InternalUIGrammar.g:19:7: ( '}' )
+            // InternalUIGrammar.g:19:9: '}'
             {
-            match('{'); 
+            match('}'); 
 
             }
 
@@ -463,10 +467,11 @@
         try {
             int _type = T__22;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:20:7: ( '}' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:20:9: '}'
+            // InternalUIGrammar.g:20:7: ( 'dataAlias' )
+            // InternalUIGrammar.g:20:9: 'dataAlias'
             {
-            match('}'); 
+            match("dataAlias"); 
+
 
             }
 
@@ -483,10 +488,10 @@
         try {
             int _type = T__23;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:21:7: ( 'dataAlias' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:21:9: 'dataAlias'
+            // InternalUIGrammar.g:21:7: ( 'datasource' )
+            // InternalUIGrammar.g:21:9: 'datasource'
             {
-            match("dataAlias"); 
+            match("datasource"); 
 
 
             }
@@ -504,11 +509,10 @@
         try {
             int _type = T__24;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:22:7: ( 'datasource' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:22:9: 'datasource'
+            // InternalUIGrammar.g:22:7: ( ':' )
+            // InternalUIGrammar.g:22:9: ':'
             {
-            match("datasource"); 
-
+            match(':'); 
 
             }
 
@@ -525,10 +529,11 @@
         try {
             int _type = T__25;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23:7: ( ':' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23:9: ':'
+            // InternalUIGrammar.g:23:7: ( 'eventTopic' )
+            // InternalUIGrammar.g:23:9: 'eventTopic'
             {
-            match(':'); 
+            match("eventTopic"); 
+
 
             }
 
@@ -545,10 +550,10 @@
         try {
             int _type = T__26;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:24:7: ( 'eventTopic' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:24:9: 'eventTopic'
+            // InternalUIGrammar.g:24:7: ( 'bind' )
+            // InternalUIGrammar.g:24:9: 'bind'
             {
-            match("eventTopic"); 
+            match("bind"); 
 
 
             }
@@ -566,10 +571,10 @@
         try {
             int _type = T__27;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:25:7: ( 'bind' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:25:9: 'bind'
+            // InternalUIGrammar.g:25:7: ( 'list' )
+            // InternalUIGrammar.g:25:9: 'list'
             {
-            match("bind"); 
+            match("list"); 
 
 
             }
@@ -587,11 +592,10 @@
         try {
             int _type = T__28;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:26:7: ( 'list' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:26:9: 'list'
+            // InternalUIGrammar.g:26:7: ( '<' )
+            // InternalUIGrammar.g:26:9: '<'
             {
-            match("list"); 
-
+            match('<'); 
 
             }
 
@@ -608,10 +612,11 @@
         try {
             int _type = T__29;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:27:7: ( '<' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:27:9: '<'
+            // InternalUIGrammar.g:27:7: ( '--' )
+            // InternalUIGrammar.g:27:9: '--'
             {
-            match('<'); 
+            match("--"); 
+
 
             }
 
@@ -628,11 +633,10 @@
         try {
             int _type = T__30;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:28:7: ( '--' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:28:9: '--'
+            // InternalUIGrammar.g:28:7: ( '>' )
+            // InternalUIGrammar.g:28:9: '>'
             {
-            match("--"); 
-
+            match('>'); 
 
             }
 
@@ -649,10 +653,10 @@
         try {
             int _type = T__31;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:29:7: ( '>' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:29:9: '>'
+            // InternalUIGrammar.g:29:7: ( '.' )
+            // InternalUIGrammar.g:29:9: '.'
             {
-            match('>'); 
+            match('.'); 
 
             }
 
@@ -669,10 +673,10 @@
         try {
             int _type = T__32;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:30:7: ( '.' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:30:9: '.'
+            // InternalUIGrammar.g:30:7: ( '[' )
+            // InternalUIGrammar.g:30:9: '['
             {
-            match('.'); 
+            match('['); 
 
             }
 
@@ -689,10 +693,10 @@
         try {
             int _type = T__33;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:31:7: ( '[' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:31:9: '['
+            // InternalUIGrammar.g:31:7: ( ']' )
+            // InternalUIGrammar.g:31:9: ']'
             {
-            match('['); 
+            match(']'); 
 
             }
 
@@ -709,10 +713,11 @@
         try {
             int _type = T__34;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:32:7: ( ']' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:32:9: ']'
+            // InternalUIGrammar.g:32:7: ( 'ui' )
+            // InternalUIGrammar.g:32:9: 'ui'
             {
-            match(']'); 
+            match("ui"); 
+
 
             }
 
@@ -729,10 +734,10 @@
         try {
             int _type = T__35;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:33:7: ( 'ui' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:33:9: 'ui'
+            // InternalUIGrammar.g:33:7: ( '..' )
+            // InternalUIGrammar.g:33:9: '..'
             {
-            match("ui"); 
+            match(".."); 
 
 
             }
@@ -750,10 +755,10 @@
         try {
             int _type = T__36;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:34:7: ( '..' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:34:9: '..'
+            // InternalUIGrammar.g:34:7: ( 'navigateTo' )
+            // InternalUIGrammar.g:34:9: 'navigateTo'
             {
-            match(".."); 
+            match("navigateTo"); 
 
 
             }
@@ -771,10 +776,10 @@
         try {
             int _type = T__37;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:35:7: ( 'navigateTo' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:35:9: 'navigateTo'
+            // InternalUIGrammar.g:35:7: ( 'openDialog' )
+            // InternalUIGrammar.g:35:9: 'openDialog'
             {
-            match("navigateTo"); 
+            match("openDialog"); 
 
 
             }
@@ -792,10 +797,10 @@
         try {
             int _type = T__38;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:36:7: ( 'openDialog' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:36:9: 'openDialog'
+            // InternalUIGrammar.g:36:7: ( 'searchWith' )
+            // InternalUIGrammar.g:36:9: 'searchWith'
             {
-            match("openDialog"); 
+            match("searchWith"); 
 
 
             }
@@ -813,10 +818,10 @@
         try {
             int _type = T__39;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:37:7: ( 'searchWith' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:37:9: 'searchWith'
+            // InternalUIGrammar.g:37:7: ( 'addToTable' )
+            // InternalUIGrammar.g:37:9: 'addToTable'
             {
-            match("searchWith"); 
+            match("addToTable"); 
 
 
             }
@@ -834,10 +839,10 @@
         try {
             int _type = T__40;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:38:7: ( 'addToTable' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:38:9: 'addToTable'
+            // InternalUIGrammar.g:38:7: ( 'removeFromTable' )
+            // InternalUIGrammar.g:38:9: 'removeFromTable'
             {
-            match("addToTable"); 
+            match("removeFromTable"); 
 
 
             }
@@ -855,10 +860,10 @@
         try {
             int _type = T__41;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:39:7: ( 'removeFromTable' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:39:9: 'removeFromTable'
+            // InternalUIGrammar.g:39:7: ( 'newInstance' )
+            // InternalUIGrammar.g:39:9: 'newInstance'
             {
-            match("removeFromTable"); 
+            match("newInstance"); 
 
 
             }
@@ -876,10 +881,10 @@
         try {
             int _type = T__42;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:40:7: ( 'newInstance' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:40:9: 'newInstance'
+            // InternalUIGrammar.g:40:7: ( 'for' )
+            // InternalUIGrammar.g:40:9: 'for'
             {
-            match("newInstance"); 
+            match("for"); 
 
 
             }
@@ -897,10 +902,10 @@
         try {
             int _type = T__43;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:41:7: ( 'for' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:41:9: 'for'
+            // InternalUIGrammar.g:41:7: ( 'at' )
+            // InternalUIGrammar.g:41:9: 'at'
             {
-            match("for"); 
+            match("at"); 
 
 
             }
@@ -918,10 +923,10 @@
         try {
             int _type = T__44;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:42:7: ( 'at' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:42:9: 'at'
+            // InternalUIGrammar.g:42:7: ( 'sendEvent' )
+            // InternalUIGrammar.g:42:9: 'sendEvent'
             {
-            match("at"); 
+            match("sendEvent"); 
 
 
             }
@@ -939,11 +944,10 @@
         try {
             int _type = T__45;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:43:7: ( 'sendEvent' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:43:9: 'sendEvent'
+            // InternalUIGrammar.g:43:7: ( '(' )
+            // InternalUIGrammar.g:43:9: '('
             {
-            match("sendEvent"); 
-
+            match('('); 
 
             }
 
@@ -960,10 +964,11 @@
         try {
             int _type = T__46;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:44:7: ( '(' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:44:9: '('
+            // InternalUIGrammar.g:44:7: ( 'noAutoTrigger' )
+            // InternalUIGrammar.g:44:9: 'noAutoTrigger'
             {
-            match('('); 
+            match("noAutoTrigger"); 
+
 
             }
 
@@ -980,11 +985,10 @@
         try {
             int _type = T__47;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:45:7: ( 'noAutoTrigger' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:45:9: 'noAutoTrigger'
+            // InternalUIGrammar.g:45:7: ( ')' )
+            // InternalUIGrammar.g:45:9: ')'
             {
-            match("noAutoTrigger"); 
-
+            match(')'); 
 
             }
 
@@ -1001,10 +1005,11 @@
         try {
             int _type = T__48;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:46:7: ( ')' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:46:9: ')'
+            // InternalUIGrammar.g:46:7: ( 'ideview' )
+            // InternalUIGrammar.g:46:9: 'ideview'
             {
-            match(')'); 
+            match("ideview"); 
+
 
             }
 
@@ -1021,10 +1026,10 @@
         try {
             int _type = T__49;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:47:7: ( 'ideview' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:47:9: 'ideview'
+            // InternalUIGrammar.g:47:7: ( 'sharedStateGroup' )
+            // InternalUIGrammar.g:47:9: 'sharedStateGroup'
             {
-            match("ideview"); 
+            match("sharedStateGroup"); 
 
 
             }
@@ -1042,10 +1047,10 @@
         try {
             int _type = T__50;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:48:7: ( 'sharedStateGroup' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:48:9: 'sharedStateGroup'
+            // InternalUIGrammar.g:48:7: ( 'category' )
+            // InternalUIGrammar.g:48:9: 'category'
             {
-            match("sharedStateGroup"); 
+            match("category"); 
 
 
             }
@@ -1063,10 +1068,10 @@
         try {
             int _type = T__51;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:49:7: ( 'category' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:49:9: 'category'
+            // InternalUIGrammar.g:49:7: ( 'rootType' )
+            // InternalUIGrammar.g:49:9: 'rootType'
             {
-            match("category"); 
+            match("rootType"); 
 
 
             }
@@ -1084,10 +1089,10 @@
         try {
             int _type = T__52;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:50:7: ( 'rootType' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:50:9: 'rootType'
+            // InternalUIGrammar.g:50:7: ( 'exposedActions' )
+            // InternalUIGrammar.g:50:9: 'exposedActions'
             {
-            match("rootType"); 
+            match("exposedActions"); 
 
 
             }
@@ -1105,10 +1110,10 @@
         try {
             int _type = T__53;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:51:7: ( 'exposedActions' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:51:9: 'exposedActions'
+            // InternalUIGrammar.g:51:7: ( 'align' )
+            // InternalUIGrammar.g:51:9: 'align'
             {
-            match("exposedActions"); 
+            match("align"); 
 
 
             }
@@ -1126,10 +1131,10 @@
         try {
             int _type = T__54;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:52:7: ( 'align' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:52:9: 'align'
+            // InternalUIGrammar.g:52:7: ( 'display' )
+            // InternalUIGrammar.g:52:9: 'display'
             {
-            match("align"); 
+            match("display"); 
 
 
             }
@@ -1147,8 +1152,8 @@
         try {
             int _type = T__55;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:53:7: ( 'icon' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:53:9: 'icon'
+            // InternalUIGrammar.g:53:7: ( 'icon' )
+            // InternalUIGrammar.g:53:9: 'icon'
             {
             match("icon"); 
 
@@ -1168,8 +1173,8 @@
         try {
             int _type = T__56;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:54:7: ( 'id' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:54:9: 'id'
+            // InternalUIGrammar.g:54:7: ( 'id' )
+            // InternalUIGrammar.g:54:9: 'id'
             {
             match("id"); 
 
@@ -1189,8 +1194,8 @@
         try {
             int _type = T__57;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:55:7: ( 'checkDirty' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:55:9: 'checkDirty'
+            // InternalUIGrammar.g:55:7: ( 'checkDirty' )
+            // InternalUIGrammar.g:55:9: 'checkDirty'
             {
             match("checkDirty"); 
 
@@ -1210,8 +1215,8 @@
         try {
             int _type = T__58;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:56:7: ( 'externalCommand' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:56:9: 'externalCommand'
+            // InternalUIGrammar.g:56:7: ( 'externalCommand' )
+            // InternalUIGrammar.g:56:9: 'externalCommand'
             {
             match("externalCommand"); 
 
@@ -1231,8 +1236,8 @@
         try {
             int _type = T__59;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:57:7: ( 'mobile' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:57:9: 'mobile'
+            // InternalUIGrammar.g:57:7: ( 'mobile' )
+            // InternalUIGrammar.g:57:9: 'mobile'
             {
             match("mobile"); 
 
@@ -1252,8 +1257,8 @@
         try {
             int _type = T__60;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:58:7: ( 'i18n' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:58:9: 'i18n'
+            // InternalUIGrammar.g:58:7: ( 'i18n' )
+            // InternalUIGrammar.g:58:9: 'i18n'
             {
             match("i18n"); 
 
@@ -1273,10 +1278,10 @@
         try {
             int _type = T__61;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:59:7: ( 'gridlayout' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:59:9: 'gridlayout'
+            // InternalUIGrammar.g:59:7: ( 'noCaption' )
+            // InternalUIGrammar.g:59:9: 'noCaption'
             {
-            match("gridlayout"); 
+            match("noCaption"); 
 
 
             }
@@ -1294,10 +1299,10 @@
         try {
             int _type = T__62;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:60:7: ( 'columns=' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:60:9: 'columns='
+            // InternalUIGrammar.g:60:7: ( 'gridlayout' )
+            // InternalUIGrammar.g:60:9: 'gridlayout'
             {
-            match("columns="); 
+            match("gridlayout"); 
 
 
             }
@@ -1315,10 +1320,10 @@
         try {
             int _type = T__63;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:61:7: ( 'styles' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:61:9: 'styles'
+            // InternalUIGrammar.g:61:7: ( 'columns=' )
+            // InternalUIGrammar.g:61:9: 'columns='
             {
-            match("styles"); 
+            match("columns="); 
 
 
             }
@@ -1336,10 +1341,10 @@
         try {
             int _type = T__64;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:62:7: ( 'readonly' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:62:9: 'readonly'
+            // InternalUIGrammar.g:62:7: ( 'styles' )
+            // InternalUIGrammar.g:62:9: 'styles'
             {
-            match("readonly"); 
+            match("styles"); 
 
 
             }
@@ -1357,10 +1362,10 @@
         try {
             int _type = T__65;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:63:7: ( 'form' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:63:9: 'form'
+            // InternalUIGrammar.g:63:7: ( 'readonly' )
+            // InternalUIGrammar.g:63:9: 'readonly'
             {
-            match("form"); 
+            match("readonly"); 
 
 
             }
@@ -1378,10 +1383,10 @@
         try {
             int _type = T__66;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:64:7: ( 'verticalLayout' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:64:9: 'verticalLayout'
+            // InternalUIGrammar.g:64:7: ( 'form' )
+            // InternalUIGrammar.g:64:9: 'form'
             {
-            match("verticalLayout"); 
+            match("form"); 
 
 
             }
@@ -1399,10 +1404,10 @@
         try {
             int _type = T__67;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:65:7: ( 'mobileVerticalLayout' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:65:9: 'mobileVerticalLayout'
+            // InternalUIGrammar.g:65:7: ( 'verticalLayout' )
+            // InternalUIGrammar.g:65:9: 'verticalLayout'
             {
-            match("mobileVerticalLayout"); 
+            match("verticalLayout"); 
 
 
             }
@@ -1420,10 +1425,10 @@
         try {
             int _type = T__68;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:66:7: ( 'navRoot' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:66:9: 'navRoot'
+            // InternalUIGrammar.g:66:7: ( 'mobileVerticalLayout' )
+            // InternalUIGrammar.g:66:9: 'mobileVerticalLayout'
             {
-            match("navRoot"); 
+            match("mobileVerticalLayout"); 
 
 
             }
@@ -1441,10 +1446,10 @@
         try {
             int _type = T__69;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:67:7: ( 'horizontalLayout' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:67:9: 'horizontalLayout'
+            // InternalUIGrammar.g:67:7: ( 'navRoot' )
+            // InternalUIGrammar.g:67:9: 'navRoot'
             {
-            match("horizontalLayout"); 
+            match("navRoot"); 
 
 
             }
@@ -1462,10 +1467,10 @@
         try {
             int _type = T__70;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:68:7: ( 'mobileHorizontalLayout' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:68:9: 'mobileHorizontalLayout'
+            // InternalUIGrammar.g:68:7: ( 'horizontalLayout' )
+            // InternalUIGrammar.g:68:9: 'horizontalLayout'
             {
-            match("mobileHorizontalLayout"); 
+            match("horizontalLayout"); 
 
 
             }
@@ -1483,10 +1488,10 @@
         try {
             int _type = T__71;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:69:7: ( 'horizontalButtonGroup' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:69:9: 'horizontalButtonGroup'
+            // InternalUIGrammar.g:69:7: ( 'mobileHorizontalLayout' )
+            // InternalUIGrammar.g:69:9: 'mobileHorizontalLayout'
             {
-            match("horizontalButtonGroup"); 
+            match("mobileHorizontalLayout"); 
 
 
             }
@@ -1504,10 +1509,10 @@
         try {
             int _type = T__72;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:70:7: ( 'verticalGroup' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:70:9: 'verticalGroup'
+            // InternalUIGrammar.g:70:7: ( 'horizontalButtonGroup' )
+            // InternalUIGrammar.g:70:9: 'horizontalButtonGroup'
             {
-            match("verticalGroup"); 
+            match("horizontalButtonGroup"); 
 
 
             }
@@ -1525,10 +1530,10 @@
         try {
             int _type = T__73;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:71:7: ( 'searchPanel' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:71:9: 'searchPanel'
+            // InternalUIGrammar.g:71:7: ( 'verticalGroup' )
+            // InternalUIGrammar.g:71:9: 'verticalGroup'
             {
-            match("searchPanel"); 
+            match("verticalGroup"); 
 
 
             }
@@ -1546,10 +1551,10 @@
         try {
             int _type = T__74;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:72:7: ( 'type' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:72:9: 'type'
+            // InternalUIGrammar.g:72:7: ( 'searchPanel' )
+            // InternalUIGrammar.g:72:9: 'searchPanel'
             {
-            match("type"); 
+            match("searchPanel"); 
 
 
             }
@@ -1567,10 +1572,10 @@
         try {
             int _type = T__75;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:73:7: ( 'mobileSearchPanel' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:73:9: 'mobileSearchPanel'
+            // InternalUIGrammar.g:73:7: ( 'type' )
+            // InternalUIGrammar.g:73:9: 'type'
             {
-            match("mobileSearchPanel"); 
+            match("type"); 
 
 
             }
@@ -1588,10 +1593,10 @@
         try {
             int _type = T__76;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:74:7: ( 'mobileTab' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:74:9: 'mobileTab'
+            // InternalUIGrammar.g:74:7: ( 'mobileSearchPanel' )
+            // InternalUIGrammar.g:74:9: 'mobileSearchPanel'
             {
-            match("mobileTab"); 
+            match("mobileSearchPanel"); 
 
 
             }
@@ -1609,10 +1614,10 @@
         try {
             int _type = T__77;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:75:7: ( 'tab' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:75:9: 'tab'
+            // InternalUIGrammar.g:75:7: ( 'mobileTab' )
+            // InternalUIGrammar.g:75:9: 'mobileTab'
             {
-            match("tab"); 
+            match("mobileTab"); 
 
 
             }
@@ -1630,10 +1635,10 @@
         try {
             int _type = T__78;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:76:7: ( 'tabsheet' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:76:9: 'tabsheet'
+            // InternalUIGrammar.g:76:7: ( 'tab' )
+            // InternalUIGrammar.g:76:9: 'tab'
             {
-            match("tabsheet"); 
+            match("tab"); 
 
 
             }
@@ -1651,10 +1656,10 @@
         try {
             int _type = T__79;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:77:7: ( 'splitter' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:77:9: 'splitter'
+            // InternalUIGrammar.g:77:7: ( 'tabsheet' )
+            // InternalUIGrammar.g:77:9: 'tabsheet'
             {
-            match("splitter"); 
+            match("tabsheet"); 
 
 
             }
@@ -1672,10 +1677,10 @@
         try {
             int _type = T__80;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:78:7: ( 'first' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:78:9: 'first'
+            // InternalUIGrammar.g:78:7: ( 'splitter' )
+            // InternalUIGrammar.g:78:9: 'splitter'
             {
-            match("first"); 
+            match("splitter"); 
 
 
             }
@@ -1693,10 +1698,10 @@
         try {
             int _type = T__81;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:79:7: ( 'second' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:79:9: 'second'
+            // InternalUIGrammar.g:79:7: ( 'first' )
+            // InternalUIGrammar.g:79:9: 'first'
             {
-            match("second"); 
+            match("first"); 
 
 
             }
@@ -1714,10 +1719,10 @@
         try {
             int _type = T__82;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:80:7: ( 'splitPos' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:80:9: 'splitPos'
+            // InternalUIGrammar.g:80:7: ( 'second' )
+            // InternalUIGrammar.g:80:9: 'second'
             {
-            match("splitPos"); 
+            match("second"); 
 
 
             }
@@ -1735,10 +1740,10 @@
         try {
             int _type = T__83;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:81:7: ( 'panel' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:81:9: 'panel'
+            // InternalUIGrammar.g:81:7: ( 'splitPos' )
+            // InternalUIGrammar.g:81:9: 'splitPos'
             {
-            match("panel"); 
+            match("splitPos"); 
 
 
             }
@@ -1756,10 +1761,10 @@
         try {
             int _type = T__84;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:82:7: ( 'content' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:82:9: 'content'
+            // InternalUIGrammar.g:82:7: ( 'panel' )
+            // InternalUIGrammar.g:82:9: 'panel'
             {
-            match("content"); 
+            match("panel"); 
 
 
             }
@@ -1777,10 +1782,10 @@
         try {
             int _type = T__85;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:83:7: ( 'dialog' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:83:9: 'dialog'
+            // InternalUIGrammar.g:83:7: ( 'content' )
+            // InternalUIGrammar.g:83:9: 'content'
             {
-            match("dialog"); 
+            match("content"); 
 
 
             }
@@ -1798,10 +1803,10 @@
         try {
             int _type = T__86;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:84:7: ( 'searchdialog' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:84:9: 'searchdialog'
+            // InternalUIGrammar.g:84:7: ( 'dialog' )
+            // InternalUIGrammar.g:84:9: 'dialog'
             {
-            match("searchdialog"); 
+            match("dialog"); 
 
 
             }
@@ -1819,10 +1824,10 @@
         try {
             int _type = T__87;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:85:7: ( 'search' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:85:9: 'search'
+            // InternalUIGrammar.g:85:7: ( 'searchdialog' )
+            // InternalUIGrammar.g:85:9: 'searchdialog'
             {
-            match("search"); 
+            match("searchdialog"); 
 
 
             }
@@ -1840,10 +1845,10 @@
         try {
             int _type = T__88;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:86:7: ( 'navPage' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:86:9: 'navPage'
+            // InternalUIGrammar.g:86:7: ( 'search' )
+            // InternalUIGrammar.g:86:9: 'search'
             {
-            match("navPage"); 
+            match("search"); 
 
 
             }
@@ -1861,10 +1866,10 @@
         try {
             int _type = T__89;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:87:7: ( 'navbarActions' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:87:9: 'navbarActions'
+            // InternalUIGrammar.g:87:7: ( 'navPage' )
+            // InternalUIGrammar.g:87:9: 'navPage'
             {
-            match("navbarActions"); 
+            match("navPage"); 
 
 
             }
@@ -1882,10 +1887,10 @@
         try {
             int _type = T__90;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:88:7: ( 'textfield' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:88:9: 'textfield'
+            // InternalUIGrammar.g:88:7: ( 'navbarActions' )
+            // InternalUIGrammar.g:88:9: 'navbarActions'
             {
-            match("textfield"); 
+            match("navbarActions"); 
 
 
             }
@@ -1903,10 +1908,10 @@
         try {
             int _type = T__91;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:89:7: ( 'maxLength=' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:89:9: 'maxLength='
+            // InternalUIGrammar.g:89:7: ( 'textfield' )
+            // InternalUIGrammar.g:89:9: 'textfield'
             {
-            match("maxLength="); 
+            match("textfield"); 
 
 
             }
@@ -1924,10 +1929,10 @@
         try {
             int _type = T__92;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:90:7: ( 'minLength=' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:90:9: 'minLength='
+            // InternalUIGrammar.g:90:7: ( 'maxLength=' )
+            // InternalUIGrammar.g:90:9: 'maxLength='
             {
-            match("minLength="); 
+            match("maxLength="); 
 
 
             }
@@ -1945,10 +1950,10 @@
         try {
             int _type = T__93;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:91:7: ( 'regex=' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:91:9: 'regex='
+            // InternalUIGrammar.g:91:7: ( 'minLength=' )
+            // InternalUIGrammar.g:91:9: 'minLength='
             {
-            match("regex="); 
+            match("minLength="); 
 
 
             }
@@ -1966,10 +1971,10 @@
         try {
             int _type = T__94;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:92:7: ( 'passwordField' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:92:9: 'passwordField'
+            // InternalUIGrammar.g:92:7: ( 'regex=' )
+            // InternalUIGrammar.g:92:9: 'regex='
             {
-            match("passwordField"); 
+            match("regex="); 
 
 
             }
@@ -1987,10 +1992,10 @@
         try {
             int _type = T__95;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:93:7: ( 'maskedText' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:93:9: 'maskedText'
+            // InternalUIGrammar.g:93:7: ( 'passwordField' )
+            // InternalUIGrammar.g:93:9: 'passwordField'
             {
-            match("maskedText"); 
+            match("passwordField"); 
 
 
             }
@@ -2008,10 +2013,10 @@
         try {
             int _type = T__96;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:94:7: ( 'mask=' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:94:9: 'mask='
+            // InternalUIGrammar.g:94:7: ( 'maskedText' )
+            // InternalUIGrammar.g:94:9: 'maskedText'
             {
-            match("mask="); 
+            match("maskedText"); 
 
 
             }
@@ -2029,10 +2034,10 @@
         try {
             int _type = T__97;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:95:7: ( 'maskedNumeric' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:95:9: 'maskedNumeric'
+            // InternalUIGrammar.g:95:7: ( 'mask=' )
+            // InternalUIGrammar.g:95:9: 'mask='
             {
-            match("maskedNumeric"); 
+            match("mask="); 
 
 
             }
@@ -2050,10 +2055,10 @@
         try {
             int _type = T__98;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:96:7: ( 'maskedDecimal' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:96:9: 'maskedDecimal'
+            // InternalUIGrammar.g:96:7: ( 'maskedNumeric' )
+            // InternalUIGrammar.g:96:9: 'maskedNumeric'
             {
-            match("maskedDecimal"); 
+            match("maskedNumeric"); 
 
 
             }
@@ -2071,10 +2076,10 @@
         try {
             int _type = T__99;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:97:7: ( 'maskedTextWithPrefix' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:97:9: 'maskedTextWithPrefix'
+            // InternalUIGrammar.g:97:7: ( 'maskedDecimal' )
+            // InternalUIGrammar.g:97:9: 'maskedDecimal'
             {
-            match("maskedTextWithPrefix"); 
+            match("maskedDecimal"); 
 
 
             }
@@ -2092,10 +2097,10 @@
         try {
             int _type = T__100;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:98:8: ( 'prefixes=' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:98:10: 'prefixes='
+            // InternalUIGrammar.g:98:8: ( 'maskedTextWithPrefix' )
+            // InternalUIGrammar.g:98:10: 'maskedTextWithPrefix'
             {
-            match("prefixes="); 
+            match("maskedTextWithPrefix"); 
 
 
             }
@@ -2113,10 +2118,11 @@
         try {
             int _type = T__101;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:99:8: ( ',' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:99:10: ','
+            // InternalUIGrammar.g:99:8: ( 'prefixes=' )
+            // InternalUIGrammar.g:99:10: 'prefixes='
             {
-            match(','); 
+            match("prefixes="); 
+
 
             }
 
@@ -2133,11 +2139,10 @@
         try {
             int _type = T__102;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:100:8: ( 'prefix' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:100:10: 'prefix'
+            // InternalUIGrammar.g:100:8: ( ',' )
+            // InternalUIGrammar.g:100:10: ','
             {
-            match("prefix"); 
-
+            match(','); 
 
             }
 
@@ -2154,10 +2159,10 @@
         try {
             int _type = T__103;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:101:8: ( 'mask' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:101:10: 'mask'
+            // InternalUIGrammar.g:101:8: ( 'prefix' )
+            // InternalUIGrammar.g:101:10: 'prefix'
             {
-            match("mask"); 
+            match("prefix"); 
 
 
             }
@@ -2175,10 +2180,10 @@
         try {
             int _type = T__104;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:102:8: ( 'richtextArea' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:102:10: 'richtextArea'
+            // InternalUIGrammar.g:102:8: ( 'mask' )
+            // InternalUIGrammar.g:102:10: 'mask'
             {
-            match("richtextArea"); 
+            match("mask"); 
 
 
             }
@@ -2196,10 +2201,10 @@
         try {
             int _type = T__105;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:103:8: ( 'asBlob' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:103:10: 'asBlob'
+            // InternalUIGrammar.g:103:8: ( 'richtextArea' )
+            // InternalUIGrammar.g:103:10: 'richtextArea'
             {
-            match("asBlob"); 
+            match("richtextArea"); 
 
 
             }
@@ -2217,10 +2222,10 @@
         try {
             int _type = T__106;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:104:8: ( 'suggestText' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:104:10: 'suggestText'
+            // InternalUIGrammar.g:104:8: ( 'asBlob' )
+            // InternalUIGrammar.g:104:10: 'asBlob'
             {
-            match("suggestText"); 
+            match("asBlob"); 
 
 
             }
@@ -2238,10 +2243,10 @@
         try {
             int _type = T__107;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:105:8: ( 'captionField' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:105:10: 'captionField'
+            // InternalUIGrammar.g:105:8: ( 'suggestText' )
+            // InternalUIGrammar.g:105:10: 'suggestText'
             {
-            match("captionField"); 
+            match("suggestText"); 
 
 
             }
@@ -2259,10 +2264,10 @@
         try {
             int _type = T__108;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:106:8: ( 'filterField' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:106:10: 'filterField'
+            // InternalUIGrammar.g:106:8: ( 'captionField' )
+            // InternalUIGrammar.g:106:10: 'captionField'
             {
-            match("filterField"); 
+            match("captionField"); 
 
 
             }
@@ -2280,10 +2285,10 @@
         try {
             int _type = T__109;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:107:8: ( 'uuidField' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:107:10: 'uuidField'
+            // InternalUIGrammar.g:107:8: ( 'filterField' )
+            // InternalUIGrammar.g:107:10: 'filterField'
             {
-            match("uuidField"); 
+            match("filterField"); 
 
 
             }
@@ -2301,10 +2306,10 @@
         try {
             int _type = T__110;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:108:8: ( 'autoHidePopup' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:108:10: 'autoHidePopup'
+            // InternalUIGrammar.g:108:8: ( 'uuidField' )
+            // InternalUIGrammar.g:108:10: 'uuidField'
             {
-            match("autoHidePopup"); 
+            match("uuidField"); 
 
 
             }
@@ -2322,10 +2327,10 @@
         try {
             int _type = T__111;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:109:8: ( 'referenceField' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:109:10: 'referenceField'
+            // InternalUIGrammar.g:109:8: ( 'autoHidePopup' )
+            // InternalUIGrammar.g:109:10: 'autoHidePopup'
             {
-            match("referenceField"); 
+            match("autoHidePopup"); 
 
 
             }
@@ -2343,10 +2348,10 @@
         try {
             int _type = T__112;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:110:8: ( 'refSource' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:110:10: 'refSource'
+            // InternalUIGrammar.g:110:8: ( 'referenceField' )
+            // InternalUIGrammar.g:110:10: 'referenceField'
             {
-            match("refSource"); 
+            match("referenceField"); 
 
 
             }
@@ -2364,10 +2369,10 @@
         try {
             int _type = T__113;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:111:8: ( 'descriptionField' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:111:10: 'descriptionField'
+            // InternalUIGrammar.g:111:8: ( 'refSource' )
+            // InternalUIGrammar.g:111:10: 'refSource'
             {
-            match("descriptionField"); 
+            match("refSource"); 
 
 
             }
@@ -2385,10 +2390,10 @@
         try {
             int _type = T__114;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:112:8: ( 'imageField' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:112:10: 'imageField'
+            // InternalUIGrammar.g:112:8: ( 'descriptionField' )
+            // InternalUIGrammar.g:112:10: 'descriptionField'
             {
-            match("imageField"); 
+            match("descriptionField"); 
 
 
             }
@@ -2406,10 +2411,10 @@
         try {
             int _type = T__115;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:113:8: ( 'inMemoryService' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:113:10: 'inMemoryService'
+            // InternalUIGrammar.g:113:8: ( 'imageField' )
+            // InternalUIGrammar.g:113:10: 'imageField'
             {
-            match("inMemoryService"); 
+            match("imageField"); 
 
 
             }
@@ -2427,10 +2432,10 @@
         try {
             int _type = T__116;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:114:8: ( 'searchfield' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:114:10: 'searchfield'
+            // InternalUIGrammar.g:114:8: ( 'inMemoryService' )
+            // InternalUIGrammar.g:114:10: 'inMemoryService'
             {
-            match("searchfield"); 
+            match("inMemoryService"); 
 
 
             }
@@ -2448,10 +2453,10 @@
         try {
             int _type = T__117;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:115:8: ( 'textarea' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:115:10: 'textarea'
+            // InternalUIGrammar.g:115:8: ( 'searchfield' )
+            // InternalUIGrammar.g:115:10: 'searchfield'
             {
-            match("textarea"); 
+            match("searchfield"); 
 
 
             }
@@ -2469,10 +2474,10 @@
         try {
             int _type = T__118;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:116:8: ( 'datefield' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:116:10: 'datefield'
+            // InternalUIGrammar.g:116:8: ( 'textarea' )
+            // InternalUIGrammar.g:116:10: 'textarea'
             {
-            match("datefield"); 
+            match("textarea"); 
 
 
             }
@@ -2490,10 +2495,10 @@
         try {
             int _type = T__119;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:117:8: ( 'browser' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:117:10: 'browser'
+            // InternalUIGrammar.g:117:8: ( 'datefield' )
+            // InternalUIGrammar.g:117:10: 'datefield'
             {
-            match("browser"); 
+            match("datefield"); 
 
 
             }
@@ -2511,10 +2516,10 @@
         try {
             int _type = T__120;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:118:8: ( 'progressbar' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:118:10: 'progressbar'
+            // InternalUIGrammar.g:118:8: ( 'browser' )
+            // InternalUIGrammar.g:118:10: 'browser'
             {
-            match("progressbar"); 
+            match("browser"); 
 
 
             }
@@ -2532,10 +2537,10 @@
         try {
             int _type = T__121;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:119:8: ( 'image' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:119:10: 'image'
+            // InternalUIGrammar.g:119:8: ( 'progressbar' )
+            // InternalUIGrammar.g:119:10: 'progressbar'
             {
-            match("image"); 
+            match("progressbar"); 
 
 
             }
@@ -2553,10 +2558,10 @@
         try {
             int _type = T__122;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:120:8: ( 'iconPath' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:120:10: 'iconPath'
+            // InternalUIGrammar.g:120:8: ( 'image' )
+            // InternalUIGrammar.g:120:10: 'image'
             {
-            match("iconPath"); 
+            match("image"); 
 
 
             }
@@ -2574,10 +2579,10 @@
         try {
             int _type = T__123;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:121:8: ( 'table' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:121:10: 'table'
+            // InternalUIGrammar.g:121:8: ( 'iconPath' )
+            // InternalUIGrammar.g:121:10: 'iconPath'
             {
-            match("table"); 
+            match("iconPath"); 
 
 
             }
@@ -2595,10 +2600,10 @@
         try {
             int _type = T__124;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:122:8: ( 'selectionType' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:122:10: 'selectionType'
+            // InternalUIGrammar.g:122:8: ( 'table' )
+            // InternalUIGrammar.g:122:10: 'table'
             {
-            match("selectionType"); 
+            match("table"); 
 
 
             }
@@ -2616,10 +2621,10 @@
         try {
             int _type = T__125;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:123:8: ( 'useBeanService' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:123:10: 'useBeanService'
+            // InternalUIGrammar.g:123:8: ( 'selectionType' )
+            // InternalUIGrammar.g:123:10: 'selectionType'
             {
-            match("useBeanService"); 
+            match("selectionType"); 
 
 
             }
@@ -2637,10 +2642,10 @@
         try {
             int _type = T__126;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:124:8: ( 'combo' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:124:10: 'combo'
+            // InternalUIGrammar.g:124:8: ( 'useBeanService' )
+            // InternalUIGrammar.g:124:10: 'useBeanService'
             {
-            match("combo"); 
+            match("useBeanService"); 
 
 
             }
@@ -2658,10 +2663,10 @@
         try {
             int _type = T__127;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:125:8: ( 'button' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:125:10: 'button'
+            // InternalUIGrammar.g:125:8: ( 'scrollToBottom' )
+            // InternalUIGrammar.g:125:10: 'scrollToBottom'
             {
-            match("button"); 
+            match("scrollToBottom"); 
 
 
             }
@@ -2679,10 +2684,10 @@
         try {
             int _type = T__128;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:126:8: ( 'navButton' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:126:10: 'navButton'
+            // InternalUIGrammar.g:126:8: ( 'combo' )
+            // InternalUIGrammar.g:126:10: 'combo'
             {
-            match("navButton"); 
+            match("combo"); 
 
 
             }
@@ -2700,10 +2705,10 @@
         try {
             int _type = T__129;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:127:8: ( 'alias' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:127:10: 'alias'
+            // InternalUIGrammar.g:127:8: ( 'button' )
+            // InternalUIGrammar.g:127:10: 'button'
             {
-            match("alias"); 
+            match("button"); 
 
 
             }
@@ -2721,10 +2726,10 @@
         try {
             int _type = T__130;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:128:8: ( 'switchIt' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:128:10: 'switchIt'
+            // InternalUIGrammar.g:128:8: ( 'navButton' )
+            // InternalUIGrammar.g:128:10: 'navButton'
             {
-            match("switchIt"); 
+            match("navButton"); 
 
 
             }
@@ -2742,10 +2747,10 @@
         try {
             int _type = T__131;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:129:8: ( 'label' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:129:10: 'label'
+            // InternalUIGrammar.g:129:8: ( 'alias' )
+            // InternalUIGrammar.g:129:10: 'alias'
             {
-            match("label"); 
+            match("alias"); 
 
 
             }
@@ -2763,10 +2768,10 @@
         try {
             int _type = T__132;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:130:8: ( 'decimalField' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:130:10: 'decimalField'
+            // InternalUIGrammar.g:130:8: ( 'switchIt' )
+            // InternalUIGrammar.g:130:10: 'switchIt'
             {
-            match("decimalField"); 
+            match("switchIt"); 
 
 
             }
@@ -2784,10 +2789,10 @@
         try {
             int _type = T__133;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:131:8: ( 'noGrouping' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:131:10: 'noGrouping'
+            // InternalUIGrammar.g:131:8: ( 'label' )
+            // InternalUIGrammar.g:131:10: 'label'
             {
-            match("noGrouping"); 
+            match("label"); 
 
 
             }
@@ -2805,10 +2810,10 @@
         try {
             int _type = T__134;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:132:8: ( 'noMarkNegative' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:132:10: 'noMarkNegative'
+            // InternalUIGrammar.g:132:8: ( 'decimalField' )
+            // InternalUIGrammar.g:132:10: 'decimalField'
             {
-            match("noMarkNegative"); 
+            match("decimalField"); 
 
 
             }
@@ -2826,10 +2831,10 @@
         try {
             int _type = T__135;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:133:8: ( 'precision=' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:133:10: 'precision='
+            // InternalUIGrammar.g:133:8: ( 'noGrouping' )
+            // InternalUIGrammar.g:133:10: 'noGrouping'
             {
-            match("precision="); 
+            match("noGrouping"); 
 
 
             }
@@ -2847,10 +2852,10 @@
         try {
             int _type = T__136;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:134:8: ( 'optionsgroup' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:134:10: 'optionsgroup'
+            // InternalUIGrammar.g:134:8: ( 'noMarkNegative' )
+            // InternalUIGrammar.g:134:10: 'noMarkNegative'
             {
-            match("optionsgroup"); 
+            match("noMarkNegative"); 
 
 
             }
@@ -2868,10 +2873,10 @@
         try {
             int _type = T__137;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:135:8: ( 'listSelect' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:135:10: 'listSelect'
+            // InternalUIGrammar.g:135:8: ( 'precision=' )
+            // InternalUIGrammar.g:135:10: 'precision='
             {
-            match("listSelect"); 
+            match("precision="); 
 
 
             }
@@ -2889,10 +2894,10 @@
         try {
             int _type = T__138;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:136:8: ( 'columns' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:136:10: 'columns'
+            // InternalUIGrammar.g:136:8: ( 'optionsgroup' )
+            // InternalUIGrammar.g:136:10: 'optionsgroup'
             {
-            match("columns"); 
+            match("optionsgroup"); 
 
 
             }
@@ -2910,10 +2915,10 @@
         try {
             int _type = T__139;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:137:8: ( 'sort' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:137:10: 'sort'
+            // InternalUIGrammar.g:137:8: ( 'listSelect' )
+            // InternalUIGrammar.g:137:10: 'listSelect'
             {
-            match("sort"); 
+            match("listSelect"); 
 
 
             }
@@ -2931,10 +2936,10 @@
         try {
             int _type = T__140;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:138:8: ( 'column' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:138:10: 'column'
+            // InternalUIGrammar.g:138:8: ( 'columns' )
+            // InternalUIGrammar.g:138:10: 'columns'
             {
-            match("column"); 
+            match("columns"); 
 
 
             }
@@ -2952,10 +2957,10 @@
         try {
             int _type = T__141;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:139:8: ( 'desc' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:139:10: 'desc'
+            // InternalUIGrammar.g:139:8: ( 'sort' )
+            // InternalUIGrammar.g:139:10: 'sort'
             {
-            match("desc"); 
+            match("sort"); 
 
 
             }
@@ -2973,10 +2978,10 @@
         try {
             int _type = T__142;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:140:8: ( 'asc' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:140:10: 'asc'
+            // InternalUIGrammar.g:140:8: ( 'column' )
+            // InternalUIGrammar.g:140:10: 'column'
             {
-            match("asc"); 
+            match("column"); 
 
 
             }
@@ -2994,10 +2999,10 @@
         try {
             int _type = T__143;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:141:8: ( 'numericField' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:141:10: 'numericField'
+            // InternalUIGrammar.g:141:8: ( 'desc' )
+            // InternalUIGrammar.g:141:10: 'desc'
             {
-            match("numericField"); 
+            match("desc"); 
 
 
             }
@@ -3015,10 +3020,10 @@
         try {
             int _type = T__144;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:142:8: ( 'checkbox' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:142:10: 'checkbox'
+            // InternalUIGrammar.g:142:8: ( 'asc' )
+            // InternalUIGrammar.g:142:10: 'asc'
             {
-            match("checkbox"); 
+            match("asc"); 
 
 
             }
@@ -3036,10 +3041,10 @@
         try {
             int _type = T__145;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:143:8: ( 'MaxLengthValidator' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:143:10: 'MaxLengthValidator'
+            // InternalUIGrammar.g:143:8: ( 'numericField' )
+            // InternalUIGrammar.g:143:10: 'numericField'
             {
-            match("MaxLengthValidator"); 
+            match("numericField"); 
 
 
             }
@@ -3057,10 +3062,10 @@
         try {
             int _type = T__146;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:144:8: ( 'MinLengthValidator' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:144:10: 'MinLengthValidator'
+            // InternalUIGrammar.g:144:8: ( 'checkbox' )
+            // InternalUIGrammar.g:144:10: 'checkbox'
             {
-            match("MinLengthValidator"); 
+            match("checkbox"); 
 
 
             }
@@ -3078,10 +3083,10 @@
         try {
             int _type = T__147;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:145:8: ( 'RegexValidator' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:145:10: 'RegexValidator'
+            // InternalUIGrammar.g:145:8: ( 'MaxLengthValidator' )
+            // InternalUIGrammar.g:145:10: 'MaxLengthValidator'
             {
-            match("RegexValidator"); 
+            match("MaxLengthValidator"); 
 
 
             }
@@ -3099,10 +3104,10 @@
         try {
             int _type = T__148;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:146:8: ( 'Expression' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:146:10: 'Expression'
+            // InternalUIGrammar.g:146:8: ( 'MinLengthValidator' )
+            // InternalUIGrammar.g:146:10: 'MinLengthValidator'
             {
-            match("Expression"); 
+            match("MinLengthValidator"); 
 
 
             }
@@ -3120,10 +3125,10 @@
         try {
             int _type = T__149;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:147:8: ( 'BeanValidationValidator' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:147:10: 'BeanValidationValidator'
+            // InternalUIGrammar.g:147:8: ( 'RegexValidator' )
+            // InternalUIGrammar.g:147:10: 'RegexValidator'
             {
-            match("BeanValidationValidator"); 
+            match("RegexValidator"); 
 
 
             }
@@ -3141,10 +3146,10 @@
         try {
             int _type = T__150;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:148:8: ( 'code' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:148:10: 'code'
+            // InternalUIGrammar.g:148:8: ( 'Expression' )
+            // InternalUIGrammar.g:148:10: 'Expression'
             {
-            match("code"); 
+            match("Expression"); 
 
 
             }
@@ -3162,10 +3167,10 @@
         try {
             int _type = T__151;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:149:8: ( 'visibility' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:149:10: 'visibility'
+            // InternalUIGrammar.g:149:8: ( 'BeanValidationValidator' )
+            // InternalUIGrammar.g:149:10: 'BeanValidationValidator'
             {
-            match("visibility"); 
+            match("BeanValidationValidator"); 
 
 
             }
@@ -3183,10 +3188,10 @@
         try {
             int _type = T__152;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:150:8: ( 'fireOn' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:150:10: 'fireOn'
+            // InternalUIGrammar.g:150:8: ( 'code' )
+            // InternalUIGrammar.g:150:10: 'code'
             {
-            match("fireOn"); 
+            match("code"); 
 
 
             }
@@ -3204,10 +3209,11 @@
         try {
             int _type = T__153;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:151:8: ( '=' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:151:10: '='
+            // InternalUIGrammar.g:151:8: ( 'visibility' )
+            // InternalUIGrammar.g:151:10: 'visibility'
             {
-            match('='); 
+            match("visibility"); 
+
 
             }
 
@@ -3224,10 +3230,10 @@
         try {
             int _type = T__154;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:152:8: ( '-=' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:152:10: '-='
+            // InternalUIGrammar.g:152:8: ( 'fireOn' )
+            // InternalUIGrammar.g:152:10: 'fireOn'
             {
-            match("-="); 
+            match("fireOn"); 
 
 
             }
@@ -3245,10 +3251,10 @@
         try {
             int _type = T__155;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:153:8: ( '*=' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:153:10: '*='
+            // InternalUIGrammar.g:153:8: ( 'import' )
+            // InternalUIGrammar.g:153:10: 'import'
             {
-            match("*="); 
+            match("import"); 
 
 
             }
@@ -3266,10 +3272,10 @@
         try {
             int _type = T__156;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:154:8: ( '/=' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:154:10: '/='
+            // InternalUIGrammar.g:154:8: ( 'static' )
+            // InternalUIGrammar.g:154:10: 'static'
             {
-            match("/="); 
+            match("static"); 
 
 
             }
@@ -3287,10 +3293,10 @@
         try {
             int _type = T__157;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:155:8: ( '%=' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:155:10: '%='
+            // InternalUIGrammar.g:155:8: ( 'extension' )
+            // InternalUIGrammar.g:155:10: 'extension'
             {
-            match("%="); 
+            match("extension"); 
 
 
             }
@@ -3308,11 +3314,10 @@
         try {
             int _type = T__158;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:156:8: ( '>=' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:156:10: '>='
+            // InternalUIGrammar.g:156:8: ( '*' )
+            // InternalUIGrammar.g:156:10: '*'
             {
-            match(">="); 
-
+            match('*'); 
 
             }
 
@@ -3329,10 +3334,10 @@
         try {
             int _type = T__159;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:157:8: ( '||' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:157:10: '||'
+            // InternalUIGrammar.g:157:8: ( 'ns' )
+            // InternalUIGrammar.g:157:10: 'ns'
             {
-            match("||"); 
+            match("ns"); 
 
 
             }
@@ -3350,11 +3355,10 @@
         try {
             int _type = T__160;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:158:8: ( '&&' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:158:10: '&&'
+            // InternalUIGrammar.g:158:8: ( '@' )
+            // InternalUIGrammar.g:158:10: '@'
             {
-            match("&&"); 
-
+            match('@'); 
 
             }
 
@@ -3371,11 +3375,10 @@
         try {
             int _type = T__161;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:159:8: ( '==' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:159:10: '=='
+            // InternalUIGrammar.g:159:8: ( '=' )
+            // InternalUIGrammar.g:159:10: '='
             {
-            match("=="); 
-
+            match('='); 
 
             }
 
@@ -3392,11 +3395,10 @@
         try {
             int _type = T__162;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:160:8: ( '!=' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:160:10: '!='
+            // InternalUIGrammar.g:160:8: ( '#' )
+            // InternalUIGrammar.g:160:10: '#'
             {
-            match("!="); 
-
+            match('#'); 
 
             }
 
@@ -3413,10 +3415,10 @@
         try {
             int _type = T__163;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:161:8: ( '===' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:161:10: '==='
+            // InternalUIGrammar.g:161:8: ( '-=' )
+            // InternalUIGrammar.g:161:10: '-='
             {
-            match("==="); 
+            match("-="); 
 
 
             }
@@ -3434,10 +3436,10 @@
         try {
             int _type = T__164;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:162:8: ( '!==' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:162:10: '!=='
+            // InternalUIGrammar.g:162:8: ( '*=' )
+            // InternalUIGrammar.g:162:10: '*='
             {
-            match("!=="); 
+            match("*="); 
 
 
             }
@@ -3455,10 +3457,10 @@
         try {
             int _type = T__165;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:163:8: ( 'instanceof' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:163:10: 'instanceof'
+            // InternalUIGrammar.g:163:8: ( '/=' )
+            // InternalUIGrammar.g:163:10: '/='
             {
-            match("instanceof"); 
+            match("/="); 
 
 
             }
@@ -3476,10 +3478,10 @@
         try {
             int _type = T__166;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:164:8: ( '->' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:164:10: '->'
+            // InternalUIGrammar.g:164:8: ( '%=' )
+            // InternalUIGrammar.g:164:10: '%='
             {
-            match("->"); 
+            match("%="); 
 
 
             }
@@ -3497,10 +3499,10 @@
         try {
             int _type = T__167;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:165:8: ( '..<' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:165:10: '..<'
+            // InternalUIGrammar.g:165:8: ( '>=' )
+            // InternalUIGrammar.g:165:10: '>='
             {
-            match("..<"); 
+            match(">="); 
 
 
             }
@@ -3518,10 +3520,10 @@
         try {
             int _type = T__168;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:166:8: ( '=>' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:166:10: '=>'
+            // InternalUIGrammar.g:166:8: ( '||' )
+            // InternalUIGrammar.g:166:10: '||'
             {
-            match("=>"); 
+            match("||"); 
 
 
             }
@@ -3539,10 +3541,10 @@
         try {
             int _type = T__169;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:167:8: ( '<>' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:167:10: '<>'
+            // InternalUIGrammar.g:167:8: ( '&&' )
+            // InternalUIGrammar.g:167:10: '&&'
             {
-            match("<>"); 
+            match("&&"); 
 
 
             }
@@ -3560,10 +3562,10 @@
         try {
             int _type = T__170;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:168:8: ( '?:' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:168:10: '?:'
+            // InternalUIGrammar.g:168:8: ( '==' )
+            // InternalUIGrammar.g:168:10: '=='
             {
-            match("?:"); 
+            match("=="); 
 
 
             }
@@ -3581,10 +3583,11 @@
         try {
             int _type = T__171;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:169:8: ( '+' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:169:10: '+'
+            // InternalUIGrammar.g:169:8: ( '!=' )
+            // InternalUIGrammar.g:169:10: '!='
             {
-            match('+'); 
+            match("!="); 
+
 
             }
 
@@ -3601,10 +3604,11 @@
         try {
             int _type = T__172;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:170:8: ( '-' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:170:10: '-'
+            // InternalUIGrammar.g:170:8: ( '===' )
+            // InternalUIGrammar.g:170:10: '==='
             {
-            match('-'); 
+            match("==="); 
+
 
             }
 
@@ -3621,10 +3625,11 @@
         try {
             int _type = T__173;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:171:8: ( '*' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:171:10: '*'
+            // InternalUIGrammar.g:171:8: ( '!==' )
+            // InternalUIGrammar.g:171:10: '!=='
             {
-            match('*'); 
+            match("!=="); 
+
 
             }
 
@@ -3641,10 +3646,10 @@
         try {
             int _type = T__174;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:172:8: ( '**' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:172:10: '**'
+            // InternalUIGrammar.g:172:8: ( 'instanceof' )
+            // InternalUIGrammar.g:172:10: 'instanceof'
             {
-            match("**"); 
+            match("instanceof"); 
 
 
             }
@@ -3662,10 +3667,11 @@
         try {
             int _type = T__175;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:173:8: ( '/' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:173:10: '/'
+            // InternalUIGrammar.g:173:8: ( '->' )
+            // InternalUIGrammar.g:173:10: '->'
             {
-            match('/'); 
+            match("->"); 
+
 
             }
 
@@ -3682,10 +3688,11 @@
         try {
             int _type = T__176;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:174:8: ( '%' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:174:10: '%'
+            // InternalUIGrammar.g:174:8: ( '..<' )
+            // InternalUIGrammar.g:174:10: '..<'
             {
-            match('%'); 
+            match("..<"); 
+
 
             }
 
@@ -3702,10 +3709,11 @@
         try {
             int _type = T__177;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:175:8: ( '!' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:175:10: '!'
+            // InternalUIGrammar.g:175:8: ( '=>' )
+            // InternalUIGrammar.g:175:10: '=>'
             {
-            match('!'); 
+            match("=>"); 
+
 
             }
 
@@ -3722,10 +3730,10 @@
         try {
             int _type = T__178;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:176:8: ( '++' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:176:10: '++'
+            // InternalUIGrammar.g:176:8: ( '<>' )
+            // InternalUIGrammar.g:176:10: '<>'
             {
-            match("++"); 
+            match("<>"); 
 
 
             }
@@ -3743,10 +3751,10 @@
         try {
             int _type = T__179;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:177:8: ( '::' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:177:10: '::'
+            // InternalUIGrammar.g:177:8: ( '?:' )
+            // InternalUIGrammar.g:177:10: '?:'
             {
-            match("::"); 
+            match("?:"); 
 
 
             }
@@ -3764,11 +3772,10 @@
         try {
             int _type = T__180;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:178:8: ( '?.' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:178:10: '?.'
+            // InternalUIGrammar.g:178:8: ( '+' )
+            // InternalUIGrammar.g:178:10: '+'
             {
-            match("?."); 
-
+            match('+'); 
 
             }
 
@@ -3785,10 +3792,10 @@
         try {
             int _type = T__181;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:179:8: ( '#' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:179:10: '#'
+            // InternalUIGrammar.g:179:8: ( '-' )
+            // InternalUIGrammar.g:179:10: '-'
             {
-            match('#'); 
+            match('-'); 
 
             }
 
@@ -3805,10 +3812,11 @@
         try {
             int _type = T__182;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:180:8: ( '|' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:180:10: '|'
+            // InternalUIGrammar.g:180:8: ( '**' )
+            // InternalUIGrammar.g:180:10: '**'
             {
-            match('|'); 
+            match("**"); 
+
 
             }
 
@@ -3825,11 +3833,10 @@
         try {
             int _type = T__183;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:181:8: ( 'if' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:181:10: 'if'
+            // InternalUIGrammar.g:181:8: ( '/' )
+            // InternalUIGrammar.g:181:10: '/'
             {
-            match("if"); 
-
+            match('/'); 
 
             }
 
@@ -3846,11 +3853,10 @@
         try {
             int _type = T__184;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:182:8: ( 'else' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:182:10: 'else'
+            // InternalUIGrammar.g:182:8: ( '%' )
+            // InternalUIGrammar.g:182:10: '%'
             {
-            match("else"); 
-
+            match('%'); 
 
             }
 
@@ -3867,11 +3873,10 @@
         try {
             int _type = T__185;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:183:8: ( 'switch' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:183:10: 'switch'
+            // InternalUIGrammar.g:183:8: ( '!' )
+            // InternalUIGrammar.g:183:10: '!'
             {
-            match("switch"); 
-
+            match('!'); 
 
             }
 
@@ -3888,10 +3893,10 @@
         try {
             int _type = T__186;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:184:8: ( 'default' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:184:10: 'default'
+            // InternalUIGrammar.g:184:8: ( '++' )
+            // InternalUIGrammar.g:184:10: '++'
             {
-            match("default"); 
+            match("++"); 
 
 
             }
@@ -3909,10 +3914,10 @@
         try {
             int _type = T__187;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:185:8: ( 'case' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:185:10: 'case'
+            // InternalUIGrammar.g:185:8: ( '::' )
+            // InternalUIGrammar.g:185:10: '::'
             {
-            match("case"); 
+            match("::"); 
 
 
             }
@@ -3930,10 +3935,10 @@
         try {
             int _type = T__188;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:186:8: ( 'while' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:186:10: 'while'
+            // InternalUIGrammar.g:186:8: ( '?.' )
+            // InternalUIGrammar.g:186:10: '?.'
             {
-            match("while"); 
+            match("?."); 
 
 
             }
@@ -3951,11 +3956,10 @@
         try {
             int _type = T__189;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:187:8: ( 'do' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:187:10: 'do'
+            // InternalUIGrammar.g:187:8: ( '|' )
+            // InternalUIGrammar.g:187:10: '|'
             {
-            match("do"); 
-
+            match('|'); 
 
             }
 
@@ -3972,10 +3976,10 @@
         try {
             int _type = T__190;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:188:8: ( 'var' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:188:10: 'var'
+            // InternalUIGrammar.g:188:8: ( 'if' )
+            // InternalUIGrammar.g:188:10: 'if'
             {
-            match("var"); 
+            match("if"); 
 
 
             }
@@ -3993,10 +3997,10 @@
         try {
             int _type = T__191;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:189:8: ( 'val' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:189:10: 'val'
+            // InternalUIGrammar.g:189:8: ( 'else' )
+            // InternalUIGrammar.g:189:10: 'else'
             {
-            match("val"); 
+            match("else"); 
 
 
             }
@@ -4014,10 +4018,10 @@
         try {
             int _type = T__192;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:190:8: ( 'extends' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:190:10: 'extends'
+            // InternalUIGrammar.g:190:8: ( 'switch' )
+            // InternalUIGrammar.g:190:10: 'switch'
             {
-            match("extends"); 
+            match("switch"); 
 
 
             }
@@ -4035,10 +4039,10 @@
         try {
             int _type = T__193;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:191:8: ( 'static' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:191:10: 'static'
+            // InternalUIGrammar.g:191:8: ( 'default' )
+            // InternalUIGrammar.g:191:10: 'default'
             {
-            match("static"); 
+            match("default"); 
 
 
             }
@@ -4056,10 +4060,10 @@
         try {
             int _type = T__194;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:192:8: ( 'extension' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:192:10: 'extension'
+            // InternalUIGrammar.g:192:8: ( 'case' )
+            // InternalUIGrammar.g:192:10: 'case'
             {
-            match("extension"); 
+            match("case"); 
 
 
             }
@@ -4077,10 +4081,10 @@
         try {
             int _type = T__195;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:193:8: ( 'super' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:193:10: 'super'
+            // InternalUIGrammar.g:193:8: ( 'while' )
+            // InternalUIGrammar.g:193:10: 'while'
             {
-            match("super"); 
+            match("while"); 
 
 
             }
@@ -4098,10 +4102,10 @@
         try {
             int _type = T__196;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:194:8: ( 'new' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:194:10: 'new'
+            // InternalUIGrammar.g:194:8: ( 'do' )
+            // InternalUIGrammar.g:194:10: 'do'
             {
-            match("new"); 
+            match("do"); 
 
 
             }
@@ -4119,10 +4123,10 @@
         try {
             int _type = T__197;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:195:8: ( 'false' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:195:10: 'false'
+            // InternalUIGrammar.g:195:8: ( 'var' )
+            // InternalUIGrammar.g:195:10: 'var'
             {
-            match("false"); 
+            match("var"); 
 
 
             }
@@ -4140,10 +4144,10 @@
         try {
             int _type = T__198;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:196:8: ( 'true' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:196:10: 'true'
+            // InternalUIGrammar.g:196:8: ( 'val' )
+            // InternalUIGrammar.g:196:10: 'val'
             {
-            match("true"); 
+            match("val"); 
 
 
             }
@@ -4161,10 +4165,10 @@
         try {
             int _type = T__199;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:197:8: ( 'null' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:197:10: 'null'
+            // InternalUIGrammar.g:197:8: ( 'extends' )
+            // InternalUIGrammar.g:197:10: 'extends'
             {
-            match("null"); 
+            match("extends"); 
 
 
             }
@@ -4182,10 +4186,10 @@
         try {
             int _type = T__200;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:198:8: ( 'typeof' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:198:10: 'typeof'
+            // InternalUIGrammar.g:198:8: ( 'super' )
+            // InternalUIGrammar.g:198:10: 'super'
             {
-            match("typeof"); 
+            match("super"); 
 
 
             }
@@ -4203,10 +4207,10 @@
         try {
             int _type = T__201;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:199:8: ( 'throw' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:199:10: 'throw'
+            // InternalUIGrammar.g:199:8: ( 'new' )
+            // InternalUIGrammar.g:199:10: 'new'
             {
-            match("throw"); 
+            match("new"); 
 
 
             }
@@ -4224,10 +4228,10 @@
         try {
             int _type = T__202;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:200:8: ( 'return' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:200:10: 'return'
+            // InternalUIGrammar.g:200:8: ( 'false' )
+            // InternalUIGrammar.g:200:10: 'false'
             {
-            match("return"); 
+            match("false"); 
 
 
             }
@@ -4245,10 +4249,10 @@
         try {
             int _type = T__203;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:201:8: ( 'try' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:201:10: 'try'
+            // InternalUIGrammar.g:201:8: ( 'true' )
+            // InternalUIGrammar.g:201:10: 'true'
             {
-            match("try"); 
+            match("true"); 
 
 
             }
@@ -4266,10 +4270,10 @@
         try {
             int _type = T__204;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:202:8: ( 'finally' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:202:10: 'finally'
+            // InternalUIGrammar.g:202:8: ( 'null' )
+            // InternalUIGrammar.g:202:10: 'null'
             {
-            match("finally"); 
+            match("null"); 
 
 
             }
@@ -4287,10 +4291,10 @@
         try {
             int _type = T__205;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:203:8: ( 'synchronized' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:203:10: 'synchronized'
+            // InternalUIGrammar.g:203:8: ( 'typeof' )
+            // InternalUIGrammar.g:203:10: 'typeof'
             {
-            match("synchronized"); 
+            match("typeof"); 
 
 
             }
@@ -4308,10 +4312,10 @@
         try {
             int _type = T__206;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:204:8: ( 'catch' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:204:10: 'catch'
+            // InternalUIGrammar.g:204:8: ( 'throw' )
+            // InternalUIGrammar.g:204:10: 'throw'
             {
-            match("catch"); 
+            match("throw"); 
 
 
             }
@@ -4329,10 +4333,11 @@
         try {
             int _type = T__207;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:205:8: ( '?' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:205:10: '?'
+            // InternalUIGrammar.g:205:8: ( 'return' )
+            // InternalUIGrammar.g:205:10: 'return'
             {
-            match('?'); 
+            match("return"); 
+
 
             }
 
@@ -4349,10 +4354,11 @@
         try {
             int _type = T__208;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:206:8: ( '&' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:206:10: '&'
+            // InternalUIGrammar.g:206:8: ( 'try' )
+            // InternalUIGrammar.g:206:10: 'try'
             {
-            match('&'); 
+            match("try"); 
+
 
             }
 
@@ -4369,10 +4375,10 @@
         try {
             int _type = T__209;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:207:8: ( 'date' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:207:10: 'date'
+            // InternalUIGrammar.g:207:8: ( 'finally' )
+            // InternalUIGrammar.g:207:10: 'finally'
             {
-            match("date"); 
+            match("finally"); 
 
 
             }
@@ -4390,10 +4396,10 @@
         try {
             int _type = T__210;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:208:8: ( 'datetime' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:208:10: 'datetime'
+            // InternalUIGrammar.g:208:8: ( 'synchronized' )
+            // InternalUIGrammar.g:208:10: 'synchronized'
             {
-            match("datetime"); 
+            match("synchronized"); 
 
 
             }
@@ -4411,10 +4417,10 @@
         try {
             int _type = T__211;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:209:8: ( 'time' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:209:10: 'time'
+            // InternalUIGrammar.g:209:8: ( 'catch' )
+            // InternalUIGrammar.g:209:10: 'catch'
             {
-            match("time"); 
+            match("catch"); 
 
 
             }
@@ -4432,11 +4438,10 @@
         try {
             int _type = T__212;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:210:8: ( 'undefined' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:210:10: 'undefined'
+            // InternalUIGrammar.g:210:8: ( '?' )
+            // InternalUIGrammar.g:210:10: '?'
             {
-            match("undefined"); 
-
+            match('?'); 
 
             }
 
@@ -4453,11 +4458,10 @@
         try {
             int _type = T__213;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:211:8: ( 'minute' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:211:10: 'minute'
+            // InternalUIGrammar.g:211:8: ( '&' )
+            // InternalUIGrammar.g:211:10: '&'
             {
-            match("minute"); 
-
+            match('&'); 
 
             }
 
@@ -4474,10 +4478,10 @@
         try {
             int _type = T__214;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:212:8: ( 'hour' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:212:10: 'hour'
+            // InternalUIGrammar.g:212:8: ( 'date' )
+            // InternalUIGrammar.g:212:10: 'date'
             {
-            match("hour"); 
+            match("date"); 
 
 
             }
@@ -4495,10 +4499,10 @@
         try {
             int _type = T__215;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:213:8: ( 'day' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:213:10: 'day'
+            // InternalUIGrammar.g:213:8: ( 'datetime' )
+            // InternalUIGrammar.g:213:10: 'datetime'
             {
-            match("day"); 
+            match("datetime"); 
 
 
             }
@@ -4516,10 +4520,10 @@
         try {
             int _type = T__216;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:214:8: ( 'month' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:214:10: 'month'
+            // InternalUIGrammar.g:214:8: ( 'time' )
+            // InternalUIGrammar.g:214:10: 'time'
             {
-            match("month"); 
+            match("time"); 
 
 
             }
@@ -4537,10 +4541,10 @@
         try {
             int _type = T__217;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:215:8: ( 'year' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:215:10: 'year'
+            // InternalUIGrammar.g:215:8: ( 'undefined' )
+            // InternalUIGrammar.g:215:10: 'undefined'
             {
-            match("year"); 
+            match("undefined"); 
 
 
             }
@@ -4558,10 +4562,10 @@
         try {
             int _type = T__218;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:216:8: ( 'single' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:216:10: 'single'
+            // InternalUIGrammar.g:216:8: ( 'minute' )
+            // InternalUIGrammar.g:216:10: 'minute'
             {
-            match("single"); 
+            match("minute"); 
 
 
             }
@@ -4579,10 +4583,10 @@
         try {
             int _type = T__219;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:217:8: ( 'multi' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:217:10: 'multi'
+            // InternalUIGrammar.g:217:8: ( 'hour' )
+            // InternalUIGrammar.g:217:10: 'hour'
             {
-            match("multi"); 
+            match("hour"); 
 
 
             }
@@ -4600,10 +4604,10 @@
         try {
             int _type = T__220;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:218:8: ( 'none' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:218:10: 'none'
+            // InternalUIGrammar.g:218:8: ( 'day' )
+            // InternalUIGrammar.g:218:10: 'day'
             {
-            match("none"); 
+            match("day"); 
 
 
             }
@@ -4621,10 +4625,10 @@
         try {
             int _type = T__221;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:219:8: ( 'bottom-center' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:219:10: 'bottom-center'
+            // InternalUIGrammar.g:219:8: ( 'month' )
+            // InternalUIGrammar.g:219:10: 'month'
             {
-            match("bottom-center"); 
+            match("month"); 
 
 
             }
@@ -4642,10 +4646,10 @@
         try {
             int _type = T__222;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:220:8: ( 'bottom-left' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:220:10: 'bottom-left'
+            // InternalUIGrammar.g:220:8: ( 'year' )
+            // InternalUIGrammar.g:220:10: 'year'
             {
-            match("bottom-left"); 
+            match("year"); 
 
 
             }
@@ -4663,10 +4667,10 @@
         try {
             int _type = T__223;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:221:8: ( 'bottom-right' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:221:10: 'bottom-right'
+            // InternalUIGrammar.g:221:8: ( 'single' )
+            // InternalUIGrammar.g:221:10: 'single'
             {
-            match("bottom-right"); 
+            match("single"); 
 
 
             }
@@ -4684,10 +4688,10 @@
         try {
             int _type = T__224;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:222:8: ( 'bottom-fill' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:222:10: 'bottom-fill'
+            // InternalUIGrammar.g:222:8: ( 'multi' )
+            // InternalUIGrammar.g:222:10: 'multi'
             {
-            match("bottom-fill"); 
+            match("multi"); 
 
 
             }
@@ -4705,10 +4709,10 @@
         try {
             int _type = T__225;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:223:8: ( 'middle-center' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:223:10: 'middle-center'
+            // InternalUIGrammar.g:223:8: ( 'none' )
+            // InternalUIGrammar.g:223:10: 'none'
             {
-            match("middle-center"); 
+            match("none"); 
 
 
             }
@@ -4726,10 +4730,10 @@
         try {
             int _type = T__226;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:224:8: ( 'middle-left' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:224:10: 'middle-left'
+            // InternalUIGrammar.g:224:8: ( 'bottom-center' )
+            // InternalUIGrammar.g:224:10: 'bottom-center'
             {
-            match("middle-left"); 
+            match("bottom-center"); 
 
 
             }
@@ -4747,10 +4751,10 @@
         try {
             int _type = T__227;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:225:8: ( 'middle-right' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:225:10: 'middle-right'
+            // InternalUIGrammar.g:225:8: ( 'bottom-left' )
+            // InternalUIGrammar.g:225:10: 'bottom-left'
             {
-            match("middle-right"); 
+            match("bottom-left"); 
 
 
             }
@@ -4768,10 +4772,10 @@
         try {
             int _type = T__228;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:226:8: ( 'middle-fill' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:226:10: 'middle-fill'
+            // InternalUIGrammar.g:226:8: ( 'bottom-right' )
+            // InternalUIGrammar.g:226:10: 'bottom-right'
             {
-            match("middle-fill"); 
+            match("bottom-right"); 
 
 
             }
@@ -4789,10 +4793,10 @@
         try {
             int _type = T__229;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:227:8: ( 'top-center' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:227:10: 'top-center'
+            // InternalUIGrammar.g:227:8: ( 'bottom-fill' )
+            // InternalUIGrammar.g:227:10: 'bottom-fill'
             {
-            match("top-center"); 
+            match("bottom-fill"); 
 
 
             }
@@ -4810,10 +4814,10 @@
         try {
             int _type = T__230;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:228:8: ( 'top-left' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:228:10: 'top-left'
+            // InternalUIGrammar.g:228:8: ( 'middle-center' )
+            // InternalUIGrammar.g:228:10: 'middle-center'
             {
-            match("top-left"); 
+            match("middle-center"); 
 
 
             }
@@ -4831,10 +4835,10 @@
         try {
             int _type = T__231;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:229:8: ( 'top-right' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:229:10: 'top-right'
+            // InternalUIGrammar.g:229:8: ( 'middle-left' )
+            // InternalUIGrammar.g:229:10: 'middle-left'
             {
-            match("top-right"); 
+            match("middle-left"); 
 
 
             }
@@ -4852,10 +4856,10 @@
         try {
             int _type = T__232;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:230:8: ( 'top-fill' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:230:10: 'top-fill'
+            // InternalUIGrammar.g:230:8: ( 'middle-right' )
+            // InternalUIGrammar.g:230:10: 'middle-right'
             {
-            match("top-fill"); 
+            match("middle-right"); 
 
 
             }
@@ -4873,10 +4877,10 @@
         try {
             int _type = T__233;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:231:8: ( 'fill-center' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:231:10: 'fill-center'
+            // InternalUIGrammar.g:231:8: ( 'middle-fill' )
+            // InternalUIGrammar.g:231:10: 'middle-fill'
             {
-            match("fill-center"); 
+            match("middle-fill"); 
 
 
             }
@@ -4894,10 +4898,10 @@
         try {
             int _type = T__234;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:232:8: ( 'fill-left' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:232:10: 'fill-left'
+            // InternalUIGrammar.g:232:8: ( 'top-center' )
+            // InternalUIGrammar.g:232:10: 'top-center'
             {
-            match("fill-left"); 
+            match("top-center"); 
 
 
             }
@@ -4915,10 +4919,10 @@
         try {
             int _type = T__235;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:233:8: ( 'fill-right' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:233:10: 'fill-right'
+            // InternalUIGrammar.g:233:8: ( 'top-left' )
+            // InternalUIGrammar.g:233:10: 'top-left'
             {
-            match("fill-right"); 
+            match("top-left"); 
 
 
             }
@@ -4936,10 +4940,10 @@
         try {
             int _type = T__236;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:234:8: ( 'fill-fill' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:234:10: 'fill-fill'
+            // InternalUIGrammar.g:234:8: ( 'top-right' )
+            // InternalUIGrammar.g:234:10: 'top-right'
             {
-            match("fill-fill"); 
+            match("top-right"); 
 
 
             }
@@ -4952,15 +4956,120 @@
     }
     // $ANTLR end "T__236"
 
+    // $ANTLR start "T__237"
+    public final void mT__237() throws RecognitionException {
+        try {
+            int _type = T__237;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalUIGrammar.g:235:8: ( 'top-fill' )
+            // InternalUIGrammar.g:235:10: 'top-fill'
+            {
+            match("top-fill"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__237"
+
+    // $ANTLR start "T__238"
+    public final void mT__238() throws RecognitionException {
+        try {
+            int _type = T__238;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalUIGrammar.g:236:8: ( 'fill-center' )
+            // InternalUIGrammar.g:236:10: 'fill-center'
+            {
+            match("fill-center"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__238"
+
+    // $ANTLR start "T__239"
+    public final void mT__239() throws RecognitionException {
+        try {
+            int _type = T__239;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalUIGrammar.g:237:8: ( 'fill-left' )
+            // InternalUIGrammar.g:237:10: 'fill-left'
+            {
+            match("fill-left"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__239"
+
+    // $ANTLR start "T__240"
+    public final void mT__240() throws RecognitionException {
+        try {
+            int _type = T__240;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalUIGrammar.g:238:8: ( 'fill-right' )
+            // InternalUIGrammar.g:238:10: 'fill-right'
+            {
+            match("fill-right"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__240"
+
+    // $ANTLR start "T__241"
+    public final void mT__241() throws RecognitionException {
+        try {
+            int _type = T__241;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalUIGrammar.g:239:8: ( 'fill-fill' )
+            // InternalUIGrammar.g:239:10: 'fill-fill'
+            {
+            match("fill-fill"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__241"
+
     // $ANTLR start "RULE_HEX"
     public final void mRULE_HEX() throws RecognitionException {
         try {
             int _type = RULE_HEX;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23217:10: ( ( '0x' | '0X' ) ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+ ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )? )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23217:12: ( '0x' | '0X' ) ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+ ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )?
+            // InternalUIGrammar.g:24356:10: ( ( '0x' | '0X' ) ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+ ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )? )
+            // InternalUIGrammar.g:24356:12: ( '0x' | '0X' ) ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+ ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )?
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23217:12: ( '0x' | '0X' )
+            // InternalUIGrammar.g:24356:12: ( '0x' | '0X' )
             int alt1=2;
             int LA1_0 = input.LA(1);
 
@@ -4988,7 +5097,7 @@
             }
             switch (alt1) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23217:13: '0x'
+                    // InternalUIGrammar.g:24356:13: '0x'
                     {
                     match("0x"); 
 
@@ -4996,7 +5105,7 @@
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23217:18: '0X'
+                    // InternalUIGrammar.g:24356:18: '0X'
                     {
                     match("0X"); 
 
@@ -5006,7 +5115,7 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23217:24: ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+
+            // InternalUIGrammar.g:24356:24: ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+
             int cnt2=0;
             loop2:
             do {
@@ -5020,7 +5129,7 @@
 
                 switch (alt2) {
             	case 1 :
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:
+            	    // InternalUIGrammar.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();
@@ -5044,7 +5153,7 @@
                 cnt2++;
             } while (true);
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23217:58: ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )?
+            // InternalUIGrammar.g:24356:58: ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )?
             int alt4=2;
             int LA4_0 = input.LA(1);
 
@@ -5053,10 +5162,10 @@
             }
             switch (alt4) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23217:59: '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) )
+                    // InternalUIGrammar.g:24356:59: '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) )
                     {
                     match('#'); 
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23217:63: ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) )
+                    // InternalUIGrammar.g:24356:63: ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) )
                     int alt3=2;
                     int LA3_0 = input.LA(1);
 
@@ -5074,7 +5183,7 @@
                     }
                     switch (alt3) {
                         case 1 :
-                            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23217:64: ( 'b' | 'B' ) ( 'i' | 'I' )
+                            // InternalUIGrammar.g:24356:64: ( 'b' | 'B' ) ( 'i' | 'I' )
                             {
                             if ( input.LA(1)=='B'||input.LA(1)=='b' ) {
                                 input.consume();
@@ -5098,7 +5207,7 @@
                             }
                             break;
                         case 2 :
-                            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23217:84: ( 'l' | 'L' )
+                            // InternalUIGrammar.g:24356:84: ( 'l' | 'L' )
                             {
                             if ( input.LA(1)=='L'||input.LA(1)=='l' ) {
                                 input.consume();
@@ -5137,11 +5246,11 @@
         try {
             int _type = RULE_INT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23219:10: ( '0' .. '9' ( '0' .. '9' | '_' )* )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23219:12: '0' .. '9' ( '0' .. '9' | '_' )*
+            // InternalUIGrammar.g:24358:10: ( '0' .. '9' ( '0' .. '9' | '_' )* )
+            // InternalUIGrammar.g:24358:12: '0' .. '9' ( '0' .. '9' | '_' )*
             {
             matchRange('0','9'); 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23219:21: ( '0' .. '9' | '_' )*
+            // InternalUIGrammar.g:24358:21: ( '0' .. '9' | '_' )*
             loop5:
             do {
                 int alt5=2;
@@ -5154,7 +5263,7 @@
 
                 switch (alt5) {
             	case 1 :
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:
+            	    // InternalUIGrammar.g:
             	    {
             	    if ( (input.LA(1)>='0' && input.LA(1)<='9')||input.LA(1)=='_' ) {
             	        input.consume();
@@ -5190,11 +5299,11 @@
         try {
             int _type = RULE_DECIMAL;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23221:14: ( RULE_INT ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )? ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )? )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23221:16: RULE_INT ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )? ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )?
+            // InternalUIGrammar.g:24360:14: ( RULE_INT ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )? ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )? )
+            // InternalUIGrammar.g:24360:16: RULE_INT ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )? ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )?
             {
             mRULE_INT(); 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23221:25: ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )?
+            // InternalUIGrammar.g:24360:25: ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )?
             int alt7=2;
             int LA7_0 = input.LA(1);
 
@@ -5203,7 +5312,7 @@
             }
             switch (alt7) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23221:26: ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT
+                    // InternalUIGrammar.g:24360:26: ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT
                     {
                     if ( input.LA(1)=='E'||input.LA(1)=='e' ) {
                         input.consume();
@@ -5214,7 +5323,7 @@
                         recover(mse);
                         throw mse;}
 
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23221:36: ( '+' | '-' )?
+                    // InternalUIGrammar.g:24360:36: ( '+' | '-' )?
                     int alt6=2;
                     int LA6_0 = input.LA(1);
 
@@ -5223,7 +5332,7 @@
                     }
                     switch (alt6) {
                         case 1 :
-                            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:
+                            // InternalUIGrammar.g:
                             {
                             if ( input.LA(1)=='+'||input.LA(1)=='-' ) {
                                 input.consume();
@@ -5247,7 +5356,7 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23221:58: ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )?
+            // InternalUIGrammar.g:24360:58: ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )?
             int alt8=3;
             int LA8_0 = input.LA(1);
 
@@ -5259,7 +5368,7 @@
             }
             switch (alt8) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23221:59: ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' )
+                    // InternalUIGrammar.g:24360:59: ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' )
                     {
                     if ( input.LA(1)=='B'||input.LA(1)=='b' ) {
                         input.consume();
@@ -5283,7 +5392,7 @@
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23221:87: ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' )
+                    // InternalUIGrammar.g:24360: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();
@@ -5316,10 +5425,10 @@
         try {
             int _type = RULE_ID;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23223:9: ( ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )* )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23223:11: ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
+            // InternalUIGrammar.g:24362:9: ( ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )* )
+            // InternalUIGrammar.g:24362:11: ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23223:11: ( '^' )?
+            // InternalUIGrammar.g:24362:11: ( '^' )?
             int alt9=2;
             int LA9_0 = input.LA(1);
 
@@ -5328,7 +5437,7 @@
             }
             switch (alt9) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23223:11: '^'
+                    // InternalUIGrammar.g:24362:11: '^'
                     {
                     match('^'); 
 
@@ -5346,7 +5455,7 @@
                 recover(mse);
                 throw mse;}
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23223:44: ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
+            // InternalUIGrammar.g:24362:44: ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
             loop10:
             do {
                 int alt10=2;
@@ -5359,7 +5468,7 @@
 
                 switch (alt10) {
             	case 1 :
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:
+            	    // InternalUIGrammar.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();
@@ -5395,10 +5504,10 @@
         try {
             int _type = RULE_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23225:13: ( ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23225:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
+            // InternalUIGrammar.g:24364:13: ( ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? ) )
+            // InternalUIGrammar.g:24364:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23225:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
+            // InternalUIGrammar.g:24364:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
             int alt15=2;
             int LA15_0 = input.LA(1);
 
@@ -5416,10 +5525,10 @@
             }
             switch (alt15) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23225:16: '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )?
+                    // InternalUIGrammar.g:24364:16: '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )?
                     {
                     match('\"'); 
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23225:20: ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )*
+                    // InternalUIGrammar.g:24364:20: ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )*
                     loop11:
                     do {
                         int alt11=3;
@@ -5435,7 +5544,7 @@
 
                         switch (alt11) {
                     	case 1 :
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23225:21: '\\\\' .
+                    	    // InternalUIGrammar.g:24364:21: '\\\\' .
                     	    {
                     	    match('\\'); 
                     	    matchAny(); 
@@ -5443,7 +5552,7 @@
                     	    }
                     	    break;
                     	case 2 :
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23225:28: ~ ( ( '\\\\' | '\"' ) )
+                    	    // InternalUIGrammar.g:24364:28: ~ ( ( '\\\\' | '\"' ) )
                     	    {
                     	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
                     	        input.consume();
@@ -5463,7 +5572,7 @@
                         }
                     } while (true);
 
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23225:44: ( '\"' )?
+                    // InternalUIGrammar.g:24364:44: ( '\"' )?
                     int alt12=2;
                     int LA12_0 = input.LA(1);
 
@@ -5472,7 +5581,7 @@
                     }
                     switch (alt12) {
                         case 1 :
-                            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23225:44: '\"'
+                            // InternalUIGrammar.g:24364:44: '\"'
                             {
                             match('\"'); 
 
@@ -5485,10 +5594,10 @@
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23225:49: '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )?
+                    // InternalUIGrammar.g:24364:49: '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )?
                     {
                     match('\''); 
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23225:54: ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )*
+                    // InternalUIGrammar.g:24364:54: ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )*
                     loop13:
                     do {
                         int alt13=3;
@@ -5504,7 +5613,7 @@
 
                         switch (alt13) {
                     	case 1 :
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23225:55: '\\\\' .
+                    	    // InternalUIGrammar.g:24364:55: '\\\\' .
                     	    {
                     	    match('\\'); 
                     	    matchAny(); 
@@ -5512,7 +5621,7 @@
                     	    }
                     	    break;
                     	case 2 :
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23225:62: ~ ( ( '\\\\' | '\\'' ) )
+                    	    // InternalUIGrammar.g:24364:62: ~ ( ( '\\\\' | '\\'' ) )
                     	    {
                     	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
                     	        input.consume();
@@ -5532,7 +5641,7 @@
                         }
                     } while (true);
 
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23225:79: ( '\\'' )?
+                    // InternalUIGrammar.g:24364:79: ( '\\'' )?
                     int alt14=2;
                     int LA14_0 = input.LA(1);
 
@@ -5541,7 +5650,7 @@
                     }
                     switch (alt14) {
                         case 1 :
-                            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23225:79: '\\''
+                            // InternalUIGrammar.g:24364:79: '\\''
                             {
                             match('\''); 
 
@@ -5572,12 +5681,12 @@
         try {
             int _type = RULE_ML_COMMENT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23227:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23227:19: '/*' ( options {greedy=false; } : . )* '*/'
+            // InternalUIGrammar.g:24366:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
+            // InternalUIGrammar.g:24366:19: '/*' ( options {greedy=false; } : . )* '*/'
             {
             match("/*"); 
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23227:24: ( options {greedy=false; } : . )*
+            // InternalUIGrammar.g:24366:24: ( options {greedy=false; } : . )*
             loop16:
             do {
                 int alt16=2;
@@ -5602,7 +5711,7 @@
 
                 switch (alt16) {
             	case 1 :
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23227:52: .
+            	    // InternalUIGrammar.g:24366:52: .
             	    {
             	    matchAny(); 
 
@@ -5632,12 +5741,12 @@
         try {
             int _type = RULE_SL_COMMENT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23229:17: ( '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23229:19: '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
+            // InternalUIGrammar.g:24368:17: ( '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
+            // InternalUIGrammar.g:24368:19: '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
             {
             match("//"); 
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23229:24: (~ ( ( '\\n' | '\\r' ) ) )*
+            // InternalUIGrammar.g:24368:24: (~ ( ( '\\n' | '\\r' ) ) )*
             loop17:
             do {
                 int alt17=2;
@@ -5650,7 +5759,7 @@
 
                 switch (alt17) {
             	case 1 :
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23229:24: ~ ( ( '\\n' | '\\r' ) )
+            	    // InternalUIGrammar.g:24368: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();
@@ -5670,7 +5779,7 @@
                 }
             } while (true);
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23229:40: ( ( '\\r' )? '\\n' )?
+            // InternalUIGrammar.g:24368:40: ( ( '\\r' )? '\\n' )?
             int alt19=2;
             int LA19_0 = input.LA(1);
 
@@ -5679,9 +5788,9 @@
             }
             switch (alt19) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23229:41: ( '\\r' )? '\\n'
+                    // InternalUIGrammar.g:24368:41: ( '\\r' )? '\\n'
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23229:41: ( '\\r' )?
+                    // InternalUIGrammar.g:24368:41: ( '\\r' )?
                     int alt18=2;
                     int LA18_0 = input.LA(1);
 
@@ -5690,7 +5799,7 @@
                     }
                     switch (alt18) {
                         case 1 :
-                            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23229:41: '\\r'
+                            // InternalUIGrammar.g:24368:41: '\\r'
                             {
                             match('\r'); 
 
@@ -5722,10 +5831,10 @@
         try {
             int _type = RULE_WS;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23231:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23231:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // InternalUIGrammar.g:24370:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
+            // InternalUIGrammar.g:24370:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23231:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // InternalUIGrammar.g:24370:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
             int cnt20=0;
             loop20:
             do {
@@ -5739,7 +5848,7 @@
 
                 switch (alt20) {
             	case 1 :
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:
+            	    // InternalUIGrammar.g:
             	    {
             	    if ( (input.LA(1)>='\t' && input.LA(1)<='\n')||input.LA(1)=='\r'||input.LA(1)==' ' ) {
             	        input.consume();
@@ -5779,8 +5888,8 @@
         try {
             int _type = RULE_ANY_OTHER;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23233:16: ( . )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:23233:18: .
+            // InternalUIGrammar.g:24372:16: ( . )
+            // InternalUIGrammar.g:24372:18: .
             {
             matchAny(); 
 
@@ -5795,1636 +5904,1671 @@
     // $ANTLR end "RULE_ANY_OTHER"
 
     public void mTokens() throws RecognitionException {
-        // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.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 | T__157 | T__158 | T__159 | T__160 | T__161 | T__162 | T__163 | T__164 | T__165 | T__166 | T__167 | T__168 | T__169 | T__170 | T__171 | T__172 | T__173 | T__174 | T__175 | T__176 | T__177 | T__178 | T__179 | T__180 | T__181 | T__182 | T__183 | T__184 | T__185 | T__186 | T__187 | T__188 | T__189 | T__190 | T__191 | T__192 | T__193 | T__194 | T__195 | T__196 | T__197 | T__198 | T__199 | T__200 | T__201 | T__202 | T__203 | T__204 | T__205 | T__206 | T__207 | T__208 | T__209 | T__210 | T__211 | T__212 | T__213 | T__214 | T__215 | T__216 | T__217 | T__218 | T__219 | T__220 | T__221 | T__222 | T__223 | T__224 | T__225 | T__226 | T__227 | T__228 | T__229 | T__230 | T__231 | T__232 | T__233 | T__234 | T__235 | T__236 | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_ID | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER )
-        int alt21=233;
+        // InternalUIGrammar.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 | T__157 | T__158 | T__159 | T__160 | T__161 | T__162 | T__163 | T__164 | T__165 | T__166 | T__167 | T__168 | T__169 | T__170 | T__171 | T__172 | T__173 | T__174 | T__175 | T__176 | T__177 | T__178 | T__179 | T__180 | T__181 | T__182 | T__183 | T__184 | T__185 | T__186 | T__187 | T__188 | T__189 | T__190 | T__191 | T__192 | T__193 | T__194 | T__195 | T__196 | T__197 | T__198 | T__199 | T__200 | T__201 | T__202 | T__203 | T__204 | T__205 | T__206 | T__207 | T__208 | T__209 | T__210 | T__211 | T__212 | T__213 | T__214 | T__215 | T__216 | T__217 | T__218 | T__219 | T__220 | T__221 | T__222 | T__223 | T__224 | T__225 | T__226 | T__227 | T__228 | T__229 | T__230 | T__231 | T__232 | T__233 | T__234 | T__235 | T__236 | T__237 | T__238 | T__239 | T__240 | T__241 | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_ID | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER )
+        int alt21=238;
         alt21 = dfa21.predict(input);
         switch (alt21) {
             case 1 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:10: T__13
+                // InternalUIGrammar.g:1:10: T__13
                 {
                 mT__13(); 
 
                 }
                 break;
             case 2 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:16: T__14
+                // InternalUIGrammar.g:1:16: T__14
                 {
                 mT__14(); 
 
                 }
                 break;
             case 3 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:22: T__15
+                // InternalUIGrammar.g:1:22: T__15
                 {
                 mT__15(); 
 
                 }
                 break;
             case 4 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:28: T__16
+                // InternalUIGrammar.g:1:28: T__16
                 {
                 mT__16(); 
 
                 }
                 break;
             case 5 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:34: T__17
+                // InternalUIGrammar.g:1:34: T__17
                 {
                 mT__17(); 
 
                 }
                 break;
             case 6 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:40: T__18
+                // InternalUIGrammar.g:1:40: T__18
                 {
                 mT__18(); 
 
                 }
                 break;
             case 7 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:46: T__19
+                // InternalUIGrammar.g:1:46: T__19
                 {
                 mT__19(); 
 
                 }
                 break;
             case 8 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:52: T__20
+                // InternalUIGrammar.g:1:52: T__20
                 {
                 mT__20(); 
 
                 }
                 break;
             case 9 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:58: T__21
+                // InternalUIGrammar.g:1:58: T__21
                 {
                 mT__21(); 
 
                 }
                 break;
             case 10 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:64: T__22
+                // InternalUIGrammar.g:1:64: T__22
                 {
                 mT__22(); 
 
                 }
                 break;
             case 11 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:70: T__23
+                // InternalUIGrammar.g:1:70: T__23
                 {
                 mT__23(); 
 
                 }
                 break;
             case 12 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:76: T__24
+                // InternalUIGrammar.g:1:76: T__24
                 {
                 mT__24(); 
 
                 }
                 break;
             case 13 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:82: T__25
+                // InternalUIGrammar.g:1:82: T__25
                 {
                 mT__25(); 
 
                 }
                 break;
             case 14 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:88: T__26
+                // InternalUIGrammar.g:1:88: T__26
                 {
                 mT__26(); 
 
                 }
                 break;
             case 15 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:94: T__27
+                // InternalUIGrammar.g:1:94: T__27
                 {
                 mT__27(); 
 
                 }
                 break;
             case 16 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:100: T__28
+                // InternalUIGrammar.g:1:100: T__28
                 {
                 mT__28(); 
 
                 }
                 break;
             case 17 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:106: T__29
+                // InternalUIGrammar.g:1:106: T__29
                 {
                 mT__29(); 
 
                 }
                 break;
             case 18 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:112: T__30
+                // InternalUIGrammar.g:1:112: T__30
                 {
                 mT__30(); 
 
                 }
                 break;
             case 19 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:118: T__31
+                // InternalUIGrammar.g:1:118: T__31
                 {
                 mT__31(); 
 
                 }
                 break;
             case 20 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:124: T__32
+                // InternalUIGrammar.g:1:124: T__32
                 {
                 mT__32(); 
 
                 }
                 break;
             case 21 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:130: T__33
+                // InternalUIGrammar.g:1:130: T__33
                 {
                 mT__33(); 
 
                 }
                 break;
             case 22 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:136: T__34
+                // InternalUIGrammar.g:1:136: T__34
                 {
                 mT__34(); 
 
                 }
                 break;
             case 23 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:142: T__35
+                // InternalUIGrammar.g:1:142: T__35
                 {
                 mT__35(); 
 
                 }
                 break;
             case 24 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:148: T__36
+                // InternalUIGrammar.g:1:148: T__36
                 {
                 mT__36(); 
 
                 }
                 break;
             case 25 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:154: T__37
+                // InternalUIGrammar.g:1:154: T__37
                 {
                 mT__37(); 
 
                 }
                 break;
             case 26 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:160: T__38
+                // InternalUIGrammar.g:1:160: T__38
                 {
                 mT__38(); 
 
                 }
                 break;
             case 27 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:166: T__39
+                // InternalUIGrammar.g:1:166: T__39
                 {
                 mT__39(); 
 
                 }
                 break;
             case 28 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:172: T__40
+                // InternalUIGrammar.g:1:172: T__40
                 {
                 mT__40(); 
 
                 }
                 break;
             case 29 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:178: T__41
+                // InternalUIGrammar.g:1:178: T__41
                 {
                 mT__41(); 
 
                 }
                 break;
             case 30 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:184: T__42
+                // InternalUIGrammar.g:1:184: T__42
                 {
                 mT__42(); 
 
                 }
                 break;
             case 31 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:190: T__43
+                // InternalUIGrammar.g:1:190: T__43
                 {
                 mT__43(); 
 
                 }
                 break;
             case 32 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:196: T__44
+                // InternalUIGrammar.g:1:196: T__44
                 {
                 mT__44(); 
 
                 }
                 break;
             case 33 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:202: T__45
+                // InternalUIGrammar.g:1:202: T__45
                 {
                 mT__45(); 
 
                 }
                 break;
             case 34 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:208: T__46
+                // InternalUIGrammar.g:1:208: T__46
                 {
                 mT__46(); 
 
                 }
                 break;
             case 35 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:214: T__47
+                // InternalUIGrammar.g:1:214: T__47
                 {
                 mT__47(); 
 
                 }
                 break;
             case 36 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:220: T__48
+                // InternalUIGrammar.g:1:220: T__48
                 {
                 mT__48(); 
 
                 }
                 break;
             case 37 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:226: T__49
+                // InternalUIGrammar.g:1:226: T__49
                 {
                 mT__49(); 
 
                 }
                 break;
             case 38 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:232: T__50
+                // InternalUIGrammar.g:1:232: T__50
                 {
                 mT__50(); 
 
                 }
                 break;
             case 39 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:238: T__51
+                // InternalUIGrammar.g:1:238: T__51
                 {
                 mT__51(); 
 
                 }
                 break;
             case 40 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:244: T__52
+                // InternalUIGrammar.g:1:244: T__52
                 {
                 mT__52(); 
 
                 }
                 break;
             case 41 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:250: T__53
+                // InternalUIGrammar.g:1:250: T__53
                 {
                 mT__53(); 
 
                 }
                 break;
             case 42 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:256: T__54
+                // InternalUIGrammar.g:1:256: T__54
                 {
                 mT__54(); 
 
                 }
                 break;
             case 43 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:262: T__55
+                // InternalUIGrammar.g:1:262: T__55
                 {
                 mT__55(); 
 
                 }
                 break;
             case 44 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:268: T__56
+                // InternalUIGrammar.g:1:268: T__56
                 {
                 mT__56(); 
 
                 }
                 break;
             case 45 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:274: T__57
+                // InternalUIGrammar.g:1:274: T__57
                 {
                 mT__57(); 
 
                 }
                 break;
             case 46 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:280: T__58
+                // InternalUIGrammar.g:1:280: T__58
                 {
                 mT__58(); 
 
                 }
                 break;
             case 47 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:286: T__59
+                // InternalUIGrammar.g:1:286: T__59
                 {
                 mT__59(); 
 
                 }
                 break;
             case 48 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:292: T__60
+                // InternalUIGrammar.g:1:292: T__60
                 {
                 mT__60(); 
 
                 }
                 break;
             case 49 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:298: T__61
+                // InternalUIGrammar.g:1:298: T__61
                 {
                 mT__61(); 
 
                 }
                 break;
             case 50 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:304: T__62
+                // InternalUIGrammar.g:1:304: T__62
                 {
                 mT__62(); 
 
                 }
                 break;
             case 51 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:310: T__63
+                // InternalUIGrammar.g:1:310: T__63
                 {
                 mT__63(); 
 
                 }
                 break;
             case 52 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:316: T__64
+                // InternalUIGrammar.g:1:316: T__64
                 {
                 mT__64(); 
 
                 }
                 break;
             case 53 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:322: T__65
+                // InternalUIGrammar.g:1:322: T__65
                 {
                 mT__65(); 
 
                 }
                 break;
             case 54 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:328: T__66
+                // InternalUIGrammar.g:1:328: T__66
                 {
                 mT__66(); 
 
                 }
                 break;
             case 55 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:334: T__67
+                // InternalUIGrammar.g:1:334: T__67
                 {
                 mT__67(); 
 
                 }
                 break;
             case 56 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:340: T__68
+                // InternalUIGrammar.g:1:340: T__68
                 {
                 mT__68(); 
 
                 }
                 break;
             case 57 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:346: T__69
+                // InternalUIGrammar.g:1:346: T__69
                 {
                 mT__69(); 
 
                 }
                 break;
             case 58 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:352: T__70
+                // InternalUIGrammar.g:1:352: T__70
                 {
                 mT__70(); 
 
                 }
                 break;
             case 59 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:358: T__71
+                // InternalUIGrammar.g:1:358: T__71
                 {
                 mT__71(); 
 
                 }
                 break;
             case 60 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:364: T__72
+                // InternalUIGrammar.g:1:364: T__72
                 {
                 mT__72(); 
 
                 }
                 break;
             case 61 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:370: T__73
+                // InternalUIGrammar.g:1:370: T__73
                 {
                 mT__73(); 
 
                 }
                 break;
             case 62 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:376: T__74
+                // InternalUIGrammar.g:1:376: T__74
                 {
                 mT__74(); 
 
                 }
                 break;
             case 63 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:382: T__75
+                // InternalUIGrammar.g:1:382: T__75
                 {
                 mT__75(); 
 
                 }
                 break;
             case 64 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:388: T__76
+                // InternalUIGrammar.g:1:388: T__76
                 {
                 mT__76(); 
 
                 }
                 break;
             case 65 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:394: T__77
+                // InternalUIGrammar.g:1:394: T__77
                 {
                 mT__77(); 
 
                 }
                 break;
             case 66 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:400: T__78
+                // InternalUIGrammar.g:1:400: T__78
                 {
                 mT__78(); 
 
                 }
                 break;
             case 67 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:406: T__79
+                // InternalUIGrammar.g:1:406: T__79
                 {
                 mT__79(); 
 
                 }
                 break;
             case 68 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:412: T__80
+                // InternalUIGrammar.g:1:412: T__80
                 {
                 mT__80(); 
 
                 }
                 break;
             case 69 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:418: T__81
+                // InternalUIGrammar.g:1:418: T__81
                 {
                 mT__81(); 
 
                 }
                 break;
             case 70 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:424: T__82
+                // InternalUIGrammar.g:1:424: T__82
                 {
                 mT__82(); 
 
                 }
                 break;
             case 71 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:430: T__83
+                // InternalUIGrammar.g:1:430: T__83
                 {
                 mT__83(); 
 
                 }
                 break;
             case 72 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:436: T__84
+                // InternalUIGrammar.g:1:436: T__84
                 {
                 mT__84(); 
 
                 }
                 break;
             case 73 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:442: T__85
+                // InternalUIGrammar.g:1:442: T__85
                 {
                 mT__85(); 
 
                 }
                 break;
             case 74 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:448: T__86
+                // InternalUIGrammar.g:1:448: T__86
                 {
                 mT__86(); 
 
                 }
                 break;
             case 75 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:454: T__87
+                // InternalUIGrammar.g:1:454: T__87
                 {
                 mT__87(); 
 
                 }
                 break;
             case 76 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:460: T__88
+                // InternalUIGrammar.g:1:460: T__88
                 {
                 mT__88(); 
 
                 }
                 break;
             case 77 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:466: T__89
+                // InternalUIGrammar.g:1:466: T__89
                 {
                 mT__89(); 
 
                 }
                 break;
             case 78 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:472: T__90
+                // InternalUIGrammar.g:1:472: T__90
                 {
                 mT__90(); 
 
                 }
                 break;
             case 79 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:478: T__91
+                // InternalUIGrammar.g:1:478: T__91
                 {
                 mT__91(); 
 
                 }
                 break;
             case 80 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:484: T__92
+                // InternalUIGrammar.g:1:484: T__92
                 {
                 mT__92(); 
 
                 }
                 break;
             case 81 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:490: T__93
+                // InternalUIGrammar.g:1:490: T__93
                 {
                 mT__93(); 
 
                 }
                 break;
             case 82 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:496: T__94
+                // InternalUIGrammar.g:1:496: T__94
                 {
                 mT__94(); 
 
                 }
                 break;
             case 83 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:502: T__95
+                // InternalUIGrammar.g:1:502: T__95
                 {
                 mT__95(); 
 
                 }
                 break;
             case 84 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:508: T__96
+                // InternalUIGrammar.g:1:508: T__96
                 {
                 mT__96(); 
 
                 }
                 break;
             case 85 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:514: T__97
+                // InternalUIGrammar.g:1:514: T__97
                 {
                 mT__97(); 
 
                 }
                 break;
             case 86 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:520: T__98
+                // InternalUIGrammar.g:1:520: T__98
                 {
                 mT__98(); 
 
                 }
                 break;
             case 87 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:526: T__99
+                // InternalUIGrammar.g:1:526: T__99
                 {
                 mT__99(); 
 
                 }
                 break;
             case 88 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:532: T__100
+                // InternalUIGrammar.g:1:532: T__100
                 {
                 mT__100(); 
 
                 }
                 break;
             case 89 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:539: T__101
+                // InternalUIGrammar.g:1:539: T__101
                 {
                 mT__101(); 
 
                 }
                 break;
             case 90 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:546: T__102
+                // InternalUIGrammar.g:1:546: T__102
                 {
                 mT__102(); 
 
                 }
                 break;
             case 91 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:553: T__103
+                // InternalUIGrammar.g:1:553: T__103
                 {
                 mT__103(); 
 
                 }
                 break;
             case 92 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:560: T__104
+                // InternalUIGrammar.g:1:560: T__104
                 {
                 mT__104(); 
 
                 }
                 break;
             case 93 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:567: T__105
+                // InternalUIGrammar.g:1:567: T__105
                 {
                 mT__105(); 
 
                 }
                 break;
             case 94 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:574: T__106
+                // InternalUIGrammar.g:1:574: T__106
                 {
                 mT__106(); 
 
                 }
                 break;
             case 95 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:581: T__107
+                // InternalUIGrammar.g:1:581: T__107
                 {
                 mT__107(); 
 
                 }
                 break;
             case 96 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:588: T__108
+                // InternalUIGrammar.g:1:588: T__108
                 {
                 mT__108(); 
 
                 }
                 break;
             case 97 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:595: T__109
+                // InternalUIGrammar.g:1:595: T__109
                 {
                 mT__109(); 
 
                 }
                 break;
             case 98 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:602: T__110
+                // InternalUIGrammar.g:1:602: T__110
                 {
                 mT__110(); 
 
                 }
                 break;
             case 99 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:609: T__111
+                // InternalUIGrammar.g:1:609: T__111
                 {
                 mT__111(); 
 
                 }
                 break;
             case 100 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:616: T__112
+                // InternalUIGrammar.g:1:616: T__112
                 {
                 mT__112(); 
 
                 }
                 break;
             case 101 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:623: T__113
+                // InternalUIGrammar.g:1:623: T__113
                 {
                 mT__113(); 
 
                 }
                 break;
             case 102 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:630: T__114
+                // InternalUIGrammar.g:1:630: T__114
                 {
                 mT__114(); 
 
                 }
                 break;
             case 103 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:637: T__115
+                // InternalUIGrammar.g:1:637: T__115
                 {
                 mT__115(); 
 
                 }
                 break;
             case 104 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:644: T__116
+                // InternalUIGrammar.g:1:644: T__116
                 {
                 mT__116(); 
 
                 }
                 break;
             case 105 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:651: T__117
+                // InternalUIGrammar.g:1:651: T__117
                 {
                 mT__117(); 
 
                 }
                 break;
             case 106 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:658: T__118
+                // InternalUIGrammar.g:1:658: T__118
                 {
                 mT__118(); 
 
                 }
                 break;
             case 107 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:665: T__119
+                // InternalUIGrammar.g:1:665: T__119
                 {
                 mT__119(); 
 
                 }
                 break;
             case 108 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:672: T__120
+                // InternalUIGrammar.g:1:672: T__120
                 {
                 mT__120(); 
 
                 }
                 break;
             case 109 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:679: T__121
+                // InternalUIGrammar.g:1:679: T__121
                 {
                 mT__121(); 
 
                 }
                 break;
             case 110 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:686: T__122
+                // InternalUIGrammar.g:1:686: T__122
                 {
                 mT__122(); 
 
                 }
                 break;
             case 111 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:693: T__123
+                // InternalUIGrammar.g:1:693: T__123
                 {
                 mT__123(); 
 
                 }
                 break;
             case 112 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:700: T__124
+                // InternalUIGrammar.g:1:700: T__124
                 {
                 mT__124(); 
 
                 }
                 break;
             case 113 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:707: T__125
+                // InternalUIGrammar.g:1:707: T__125
                 {
                 mT__125(); 
 
                 }
                 break;
             case 114 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:714: T__126
+                // InternalUIGrammar.g:1:714: T__126
                 {
                 mT__126(); 
 
                 }
                 break;
             case 115 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:721: T__127
+                // InternalUIGrammar.g:1:721: T__127
                 {
                 mT__127(); 
 
                 }
                 break;
             case 116 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:728: T__128
+                // InternalUIGrammar.g:1:728: T__128
                 {
                 mT__128(); 
 
                 }
                 break;
             case 117 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:735: T__129
+                // InternalUIGrammar.g:1:735: T__129
                 {
                 mT__129(); 
 
                 }
                 break;
             case 118 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:742: T__130
+                // InternalUIGrammar.g:1:742: T__130
                 {
                 mT__130(); 
 
                 }
                 break;
             case 119 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:749: T__131
+                // InternalUIGrammar.g:1:749: T__131
                 {
                 mT__131(); 
 
                 }
                 break;
             case 120 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:756: T__132
+                // InternalUIGrammar.g:1:756: T__132
                 {
                 mT__132(); 
 
                 }
                 break;
             case 121 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:763: T__133
+                // InternalUIGrammar.g:1:763: T__133
                 {
                 mT__133(); 
 
                 }
                 break;
             case 122 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:770: T__134
+                // InternalUIGrammar.g:1:770: T__134
                 {
                 mT__134(); 
 
                 }
                 break;
             case 123 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:777: T__135
+                // InternalUIGrammar.g:1:777: T__135
                 {
                 mT__135(); 
 
                 }
                 break;
             case 124 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:784: T__136
+                // InternalUIGrammar.g:1:784: T__136
                 {
                 mT__136(); 
 
                 }
                 break;
             case 125 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:791: T__137
+                // InternalUIGrammar.g:1:791: T__137
                 {
                 mT__137(); 
 
                 }
                 break;
             case 126 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:798: T__138
+                // InternalUIGrammar.g:1:798: T__138
                 {
                 mT__138(); 
 
                 }
                 break;
             case 127 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:805: T__139
+                // InternalUIGrammar.g:1:805: T__139
                 {
                 mT__139(); 
 
                 }
                 break;
             case 128 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:812: T__140
+                // InternalUIGrammar.g:1:812: T__140
                 {
                 mT__140(); 
 
                 }
                 break;
             case 129 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:819: T__141
+                // InternalUIGrammar.g:1:819: T__141
                 {
                 mT__141(); 
 
                 }
                 break;
             case 130 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:826: T__142
+                // InternalUIGrammar.g:1:826: T__142
                 {
                 mT__142(); 
 
                 }
                 break;
             case 131 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:833: T__143
+                // InternalUIGrammar.g:1:833: T__143
                 {
                 mT__143(); 
 
                 }
                 break;
             case 132 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:840: T__144
+                // InternalUIGrammar.g:1:840: T__144
                 {
                 mT__144(); 
 
                 }
                 break;
             case 133 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:847: T__145
+                // InternalUIGrammar.g:1:847: T__145
                 {
                 mT__145(); 
 
                 }
                 break;
             case 134 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:854: T__146
+                // InternalUIGrammar.g:1:854: T__146
                 {
                 mT__146(); 
 
                 }
                 break;
             case 135 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:861: T__147
+                // InternalUIGrammar.g:1:861: T__147
                 {
                 mT__147(); 
 
                 }
                 break;
             case 136 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:868: T__148
+                // InternalUIGrammar.g:1:868: T__148
                 {
                 mT__148(); 
 
                 }
                 break;
             case 137 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:875: T__149
+                // InternalUIGrammar.g:1:875: T__149
                 {
                 mT__149(); 
 
                 }
                 break;
             case 138 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:882: T__150
+                // InternalUIGrammar.g:1:882: T__150
                 {
                 mT__150(); 
 
                 }
                 break;
             case 139 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:889: T__151
+                // InternalUIGrammar.g:1:889: T__151
                 {
                 mT__151(); 
 
                 }
                 break;
             case 140 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:896: T__152
+                // InternalUIGrammar.g:1:896: T__152
                 {
                 mT__152(); 
 
                 }
                 break;
             case 141 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:903: T__153
+                // InternalUIGrammar.g:1:903: T__153
                 {
                 mT__153(); 
 
                 }
                 break;
             case 142 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:910: T__154
+                // InternalUIGrammar.g:1:910: T__154
                 {
                 mT__154(); 
 
                 }
                 break;
             case 143 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:917: T__155
+                // InternalUIGrammar.g:1:917: T__155
                 {
                 mT__155(); 
 
                 }
                 break;
             case 144 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:924: T__156
+                // InternalUIGrammar.g:1:924: T__156
                 {
                 mT__156(); 
 
                 }
                 break;
             case 145 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:931: T__157
+                // InternalUIGrammar.g:1:931: T__157
                 {
                 mT__157(); 
 
                 }
                 break;
             case 146 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:938: T__158
+                // InternalUIGrammar.g:1:938: T__158
                 {
                 mT__158(); 
 
                 }
                 break;
             case 147 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:945: T__159
+                // InternalUIGrammar.g:1:945: T__159
                 {
                 mT__159(); 
 
                 }
                 break;
             case 148 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:952: T__160
+                // InternalUIGrammar.g:1:952: T__160
                 {
                 mT__160(); 
 
                 }
                 break;
             case 149 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:959: T__161
+                // InternalUIGrammar.g:1:959: T__161
                 {
                 mT__161(); 
 
                 }
                 break;
             case 150 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:966: T__162
+                // InternalUIGrammar.g:1:966: T__162
                 {
                 mT__162(); 
 
                 }
                 break;
             case 151 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:973: T__163
+                // InternalUIGrammar.g:1:973: T__163
                 {
                 mT__163(); 
 
                 }
                 break;
             case 152 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:980: T__164
+                // InternalUIGrammar.g:1:980: T__164
                 {
                 mT__164(); 
 
                 }
                 break;
             case 153 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:987: T__165
+                // InternalUIGrammar.g:1:987: T__165
                 {
                 mT__165(); 
 
                 }
                 break;
             case 154 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:994: T__166
+                // InternalUIGrammar.g:1:994: T__166
                 {
                 mT__166(); 
 
                 }
                 break;
             case 155 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1001: T__167
+                // InternalUIGrammar.g:1:1001: T__167
                 {
                 mT__167(); 
 
                 }
                 break;
             case 156 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1008: T__168
+                // InternalUIGrammar.g:1:1008: T__168
                 {
                 mT__168(); 
 
                 }
                 break;
             case 157 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1015: T__169
+                // InternalUIGrammar.g:1:1015: T__169
                 {
                 mT__169(); 
 
                 }
                 break;
             case 158 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1022: T__170
+                // InternalUIGrammar.g:1:1022: T__170
                 {
                 mT__170(); 
 
                 }
                 break;
             case 159 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1029: T__171
+                // InternalUIGrammar.g:1:1029: T__171
                 {
                 mT__171(); 
 
                 }
                 break;
             case 160 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1036: T__172
+                // InternalUIGrammar.g:1:1036: T__172
                 {
                 mT__172(); 
 
                 }
                 break;
             case 161 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1043: T__173
+                // InternalUIGrammar.g:1:1043: T__173
                 {
                 mT__173(); 
 
                 }
                 break;
             case 162 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1050: T__174
+                // InternalUIGrammar.g:1:1050: T__174
                 {
                 mT__174(); 
 
                 }
                 break;
             case 163 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1057: T__175
+                // InternalUIGrammar.g:1:1057: T__175
                 {
                 mT__175(); 
 
                 }
                 break;
             case 164 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1064: T__176
+                // InternalUIGrammar.g:1:1064: T__176
                 {
                 mT__176(); 
 
                 }
                 break;
             case 165 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1071: T__177
+                // InternalUIGrammar.g:1:1071: T__177
                 {
                 mT__177(); 
 
                 }
                 break;
             case 166 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1078: T__178
+                // InternalUIGrammar.g:1:1078: T__178
                 {
                 mT__178(); 
 
                 }
                 break;
             case 167 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1085: T__179
+                // InternalUIGrammar.g:1:1085: T__179
                 {
                 mT__179(); 
 
                 }
                 break;
             case 168 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1092: T__180
+                // InternalUIGrammar.g:1:1092: T__180
                 {
                 mT__180(); 
 
                 }
                 break;
             case 169 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1099: T__181
+                // InternalUIGrammar.g:1:1099: T__181
                 {
                 mT__181(); 
 
                 }
                 break;
             case 170 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1106: T__182
+                // InternalUIGrammar.g:1:1106: T__182
                 {
                 mT__182(); 
 
                 }
                 break;
             case 171 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1113: T__183
+                // InternalUIGrammar.g:1:1113: T__183
                 {
                 mT__183(); 
 
                 }
                 break;
             case 172 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1120: T__184
+                // InternalUIGrammar.g:1:1120: T__184
                 {
                 mT__184(); 
 
                 }
                 break;
             case 173 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1127: T__185
+                // InternalUIGrammar.g:1:1127: T__185
                 {
                 mT__185(); 
 
                 }
                 break;
             case 174 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1134: T__186
+                // InternalUIGrammar.g:1:1134: T__186
                 {
                 mT__186(); 
 
                 }
                 break;
             case 175 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1141: T__187
+                // InternalUIGrammar.g:1:1141: T__187
                 {
                 mT__187(); 
 
                 }
                 break;
             case 176 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1148: T__188
+                // InternalUIGrammar.g:1:1148: T__188
                 {
                 mT__188(); 
 
                 }
                 break;
             case 177 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1155: T__189
+                // InternalUIGrammar.g:1:1155: T__189
                 {
                 mT__189(); 
 
                 }
                 break;
             case 178 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1162: T__190
+                // InternalUIGrammar.g:1:1162: T__190
                 {
                 mT__190(); 
 
                 }
                 break;
             case 179 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1169: T__191
+                // InternalUIGrammar.g:1:1169: T__191
                 {
                 mT__191(); 
 
                 }
                 break;
             case 180 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1176: T__192
+                // InternalUIGrammar.g:1:1176: T__192
                 {
                 mT__192(); 
 
                 }
                 break;
             case 181 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1183: T__193
+                // InternalUIGrammar.g:1:1183: T__193
                 {
                 mT__193(); 
 
                 }
                 break;
             case 182 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1190: T__194
+                // InternalUIGrammar.g:1:1190: T__194
                 {
                 mT__194(); 
 
                 }
                 break;
             case 183 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1197: T__195
+                // InternalUIGrammar.g:1:1197: T__195
                 {
                 mT__195(); 
 
                 }
                 break;
             case 184 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1204: T__196
+                // InternalUIGrammar.g:1:1204: T__196
                 {
                 mT__196(); 
 
                 }
                 break;
             case 185 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1211: T__197
+                // InternalUIGrammar.g:1:1211: T__197
                 {
                 mT__197(); 
 
                 }
                 break;
             case 186 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1218: T__198
+                // InternalUIGrammar.g:1:1218: T__198
                 {
                 mT__198(); 
 
                 }
                 break;
             case 187 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1225: T__199
+                // InternalUIGrammar.g:1:1225: T__199
                 {
                 mT__199(); 
 
                 }
                 break;
             case 188 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1232: T__200
+                // InternalUIGrammar.g:1:1232: T__200
                 {
                 mT__200(); 
 
                 }
                 break;
             case 189 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1239: T__201
+                // InternalUIGrammar.g:1:1239: T__201
                 {
                 mT__201(); 
 
                 }
                 break;
             case 190 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1246: T__202
+                // InternalUIGrammar.g:1:1246: T__202
                 {
                 mT__202(); 
 
                 }
                 break;
             case 191 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1253: T__203
+                // InternalUIGrammar.g:1:1253: T__203
                 {
                 mT__203(); 
 
                 }
                 break;
             case 192 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1260: T__204
+                // InternalUIGrammar.g:1:1260: T__204
                 {
                 mT__204(); 
 
                 }
                 break;
             case 193 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1267: T__205
+                // InternalUIGrammar.g:1:1267: T__205
                 {
                 mT__205(); 
 
                 }
                 break;
             case 194 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1274: T__206
+                // InternalUIGrammar.g:1:1274: T__206
                 {
                 mT__206(); 
 
                 }
                 break;
             case 195 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1281: T__207
+                // InternalUIGrammar.g:1:1281: T__207
                 {
                 mT__207(); 
 
                 }
                 break;
             case 196 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1288: T__208
+                // InternalUIGrammar.g:1:1288: T__208
                 {
                 mT__208(); 
 
                 }
                 break;
             case 197 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1295: T__209
+                // InternalUIGrammar.g:1:1295: T__209
                 {
                 mT__209(); 
 
                 }
                 break;
             case 198 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1302: T__210
+                // InternalUIGrammar.g:1:1302: T__210
                 {
                 mT__210(); 
 
                 }
                 break;
             case 199 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1309: T__211
+                // InternalUIGrammar.g:1:1309: T__211
                 {
                 mT__211(); 
 
                 }
                 break;
             case 200 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1316: T__212
+                // InternalUIGrammar.g:1:1316: T__212
                 {
                 mT__212(); 
 
                 }
                 break;
             case 201 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1323: T__213
+                // InternalUIGrammar.g:1:1323: T__213
                 {
                 mT__213(); 
 
                 }
                 break;
             case 202 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1330: T__214
+                // InternalUIGrammar.g:1:1330: T__214
                 {
                 mT__214(); 
 
                 }
                 break;
             case 203 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1337: T__215
+                // InternalUIGrammar.g:1:1337: T__215
                 {
                 mT__215(); 
 
                 }
                 break;
             case 204 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1344: T__216
+                // InternalUIGrammar.g:1:1344: T__216
                 {
                 mT__216(); 
 
                 }
                 break;
             case 205 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1351: T__217
+                // InternalUIGrammar.g:1:1351: T__217
                 {
                 mT__217(); 
 
                 }
                 break;
             case 206 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1358: T__218
+                // InternalUIGrammar.g:1:1358: T__218
                 {
                 mT__218(); 
 
                 }
                 break;
             case 207 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1365: T__219
+                // InternalUIGrammar.g:1:1365: T__219
                 {
                 mT__219(); 
 
                 }
                 break;
             case 208 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1372: T__220
+                // InternalUIGrammar.g:1:1372: T__220
                 {
                 mT__220(); 
 
                 }
                 break;
             case 209 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1379: T__221
+                // InternalUIGrammar.g:1:1379: T__221
                 {
                 mT__221(); 
 
                 }
                 break;
             case 210 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1386: T__222
+                // InternalUIGrammar.g:1:1386: T__222
                 {
                 mT__222(); 
 
                 }
                 break;
             case 211 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1393: T__223
+                // InternalUIGrammar.g:1:1393: T__223
                 {
                 mT__223(); 
 
                 }
                 break;
             case 212 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1400: T__224
+                // InternalUIGrammar.g:1:1400: T__224
                 {
                 mT__224(); 
 
                 }
                 break;
             case 213 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1407: T__225
+                // InternalUIGrammar.g:1:1407: T__225
                 {
                 mT__225(); 
 
                 }
                 break;
             case 214 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1414: T__226
+                // InternalUIGrammar.g:1:1414: T__226
                 {
                 mT__226(); 
 
                 }
                 break;
             case 215 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1421: T__227
+                // InternalUIGrammar.g:1:1421: T__227
                 {
                 mT__227(); 
 
                 }
                 break;
             case 216 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1428: T__228
+                // InternalUIGrammar.g:1:1428: T__228
                 {
                 mT__228(); 
 
                 }
                 break;
             case 217 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1435: T__229
+                // InternalUIGrammar.g:1:1435: T__229
                 {
                 mT__229(); 
 
                 }
                 break;
             case 218 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1442: T__230
+                // InternalUIGrammar.g:1:1442: T__230
                 {
                 mT__230(); 
 
                 }
                 break;
             case 219 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1449: T__231
+                // InternalUIGrammar.g:1:1449: T__231
                 {
                 mT__231(); 
 
                 }
                 break;
             case 220 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1456: T__232
+                // InternalUIGrammar.g:1:1456: T__232
                 {
                 mT__232(); 
 
                 }
                 break;
             case 221 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1463: T__233
+                // InternalUIGrammar.g:1:1463: T__233
                 {
                 mT__233(); 
 
                 }
                 break;
             case 222 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1470: T__234
+                // InternalUIGrammar.g:1:1470: T__234
                 {
                 mT__234(); 
 
                 }
                 break;
             case 223 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1477: T__235
+                // InternalUIGrammar.g:1:1477: T__235
                 {
                 mT__235(); 
 
                 }
                 break;
             case 224 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1484: T__236
+                // InternalUIGrammar.g:1:1484: T__236
                 {
                 mT__236(); 
 
                 }
                 break;
             case 225 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1491: RULE_HEX
+                // InternalUIGrammar.g:1:1491: T__237
+                {
+                mT__237(); 
+
+                }
+                break;
+            case 226 :
+                // InternalUIGrammar.g:1:1498: T__238
+                {
+                mT__238(); 
+
+                }
+                break;
+            case 227 :
+                // InternalUIGrammar.g:1:1505: T__239
+                {
+                mT__239(); 
+
+                }
+                break;
+            case 228 :
+                // InternalUIGrammar.g:1:1512: T__240
+                {
+                mT__240(); 
+
+                }
+                break;
+            case 229 :
+                // InternalUIGrammar.g:1:1519: T__241
+                {
+                mT__241(); 
+
+                }
+                break;
+            case 230 :
+                // InternalUIGrammar.g:1:1526: RULE_HEX
                 {
                 mRULE_HEX(); 
 
                 }
                 break;
-            case 226 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1500: RULE_INT
+            case 231 :
+                // InternalUIGrammar.g:1:1535: RULE_INT
                 {
                 mRULE_INT(); 
 
                 }
                 break;
-            case 227 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1509: RULE_DECIMAL
+            case 232 :
+                // InternalUIGrammar.g:1:1544: RULE_DECIMAL
                 {
                 mRULE_DECIMAL(); 
 
                 }
                 break;
-            case 228 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1522: RULE_ID
+            case 233 :
+                // InternalUIGrammar.g:1:1557: RULE_ID
                 {
                 mRULE_ID(); 
 
                 }
                 break;
-            case 229 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1530: RULE_STRING
+            case 234 :
+                // InternalUIGrammar.g:1:1565: RULE_STRING
                 {
                 mRULE_STRING(); 
 
                 }
                 break;
-            case 230 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1542: RULE_ML_COMMENT
+            case 235 :
+                // InternalUIGrammar.g:1:1577: RULE_ML_COMMENT
                 {
                 mRULE_ML_COMMENT(); 
 
                 }
                 break;
-            case 231 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1558: RULE_SL_COMMENT
+            case 236 :
+                // InternalUIGrammar.g:1:1593: RULE_SL_COMMENT
                 {
                 mRULE_SL_COMMENT(); 
 
                 }
                 break;
-            case 232 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1574: RULE_WS
+            case 237 :
+                // InternalUIGrammar.g:1:1609: RULE_WS
                 {
                 mRULE_WS(); 
 
                 }
                 break;
-            case 233 :
-                // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1:1582: RULE_ANY_OTHER
+            case 238 :
+                // InternalUIGrammar.g:1:1617: RULE_ANY_OTHER
                 {
                 mRULE_ANY_OTHER(); 
 
@@ -7438,244 +7582,238 @@
 
     protected DFA21 dfa21 = new DFA21(this);
     static final String DFA21_eotS =
-        "\1\uffff\2\73\1\uffff\3\73\1\120\2\uffff\1\73\1\130\3\73\1\143\1\147\1\151\1\153\2\uffff\5\73\2\uffff\5\73\1\uffff\4\73\1\u009d\1\u00a0\1\u00a4\1\u00a6\1\u00a8\1\u00aa\1\u00ac\1\u00af\1\uffff\2\73\2\u00b5\1\70\5\uffff\2\73\1\uffff\1\73\1\u00c1\3\73\1\u00c6\1\uffff\3\73\1\u00ce\1\73\1\u00d0\5\73\5\uffff\3\73\1\u00df\2\uffff\11\73\10\uffff\1\u00eb\3\uffff\1\u00ec\24\73\2\uffff\20\73\1\uffff\5\73\1\u012f\17\uffff\1\u0131\5\uffff\2\73\1\uffff\1\u00b5\4\uffff\10\73\1\uffff\4\73\1\uffff\1\u0142\1\u0143\4\73\1\u0148\1\uffff\1\73\1\uffff\6\73\1\u0154\2\73\1\u0158\4\73\1\uffff\12\73\3\uffff\4\73\1\u0170\60\73\1\u01a6\2\73\1\u01a9\10\73\4\uffff\13\73\1\u01be\1\u01bf\3\73\2\uffff\4\73\1\uffff\12\73\1\u01d1\1\uffff\2\73\1\u01d7\1\uffff\1\73\1\u01da\5\73\1\u01e1\1\u01e2\3\73\1\u01e7\12\73\1\uffff\3\73\1\u01f5\1\73\1\u01f7\15\73\1\u0205\15\73\1\u0213\4\73\1\u0218\3\73\1\u021e\6\73\1\u0225\1\u0227\2\73\1\uffff\1\73\1\u022c\1\uffff\1\73\1\u022e\1\uffff\6\73\1\u0239\1\73\1\u023b\5\73\1\u0242\2\73\2\uffff\10\73\1\u024d\1\u024e\2\73\1\u0251\2\73\1\uffff\1\73\1\uffff\1\u0259\4\73\1\uffff\2\73\1\uffff\6\73\2\uffff\4\73\1\uffff\1\u026b\14\73\1\uffff\1\73\1\uffff\13\73\1\u0285\1\73\1\uffff\13\73\1\u0292\1\73\1\uffff\3\73\1\u0298\1\uffff\1\73\1\u029a\2\73\2\uffff\3\73\1\u02a0\2\73\1\uffff\1\73\1\uffff\1\73\1\u02a5\2\73\1\uffff\1\u02a8\5\uffff\5\73\1\u02ae\1\uffff\1\73\1\uffff\1\73\1\u02b2\2\73\1\u02b5\1\73\1\uffff\10\73\1\u02bf\1\73\2\uffff\2\73\1\uffff\1\u02c3\1\73\4\uffff\1\73\1\uffff\4\73\1\u02ca\11\73\1\u02d4\2\73\1\uffff\17\73\1\u02ea\1\73\1\u02ec\2\73\1\u02ef\1\u02f0\3\73\1\uffff\1\u02f5\1\73\1\u02f7\2\73\1\uffff\2\73\1\u02fc\3\73\1\uffff\3\73\1\u0304\1\73\1\uffff\1\u030a\1\uffff\3\73\1\u0310\1\73\1\uffff\2\73\1\u0314\1\73\1\uffff\2\73\1\uffff\5\73\1\uffff\1\u031d\2\73\1\uffff\2\73\1\uffff\1\73\1\u0323\4\73\1\u0328\2\73\1\uffff\3\73\1\uffff\1\73\1\u032f\4\73\1\uffff\2\73\1\u0336\3\73\1\u033a\1\73\1\u033c\2\uffff\5\73\1\u0346\1\u0347\15\73\1\uffff\1\73\1\uffff\2\73\2\uffff\4\73\1\uffff\1\73\1\uffff\4\73\1\uffff\6\73\1\u0368\1\uffff\1\u0369\4\73\1\uffff\5\73\2\uffff\2\73\1\uffff\10\73\1\uffff\5\73\1\uffff\1\u0386\3\73\1\uffff\6\73\1\uffff\3\73\1\u0394\2\73\1\uffff\3\73\1\uffff\1\73\5\uffff\5\73\2\uffff\20\73\1\u03b0\1\u03b1\1\73\1\u03b3\2\73\1\u03b6\2\73\1\u03b9\1\73\1\u03bb\2\73\1\u03be\3\uffff\11\73\4\uffff\2\73\1\u03ca\1\73\1\u03cc\6\73\1\uffff\3\73\1\uffff\12\73\1\u03e0\1\73\1\u03e2\1\uffff\5\73\1\u03e8\1\73\1\u03ea\1\73\1\u03ec\2\73\1\u03ef\13\73\1\u03fb\2\73\2\uffff\1\73\1\uffff\2\73\1\uffff\1\73\1\u0402\1\uffff\1\73\1\uffff\2\73\1\uffff\3\73\1\u0409\7\73\1\uffff\1\u0411\1\uffff\6\73\1\uffff\1\73\1\u0419\1\73\1\u041b\1\73\1\u041d\2\73\1\u0420\3\73\1\uffff\1\u0424\1\uffff\2\73\1\u0427\2\73\1\uffff\1\u042a\1\uffff\1\73\1\uffff\1\u042c\1\73\1\uffff\2\73\1\u0430\2\73\1\u0433\1\73\1\u0435\3\73\1\uffff\6\73\1\uffff\2\73\1\u0441\3\73\2\uffff\1\u0446\2\73\1\uffff\1\u0449\1\73\1\uffff\3\73\1\u044f\2\73\1\u0452\1\uffff\1\73\1\uffff\1\73\1\uffff\2\73\1\uffff\2\73\1\u0459\1\uffff\2\73\1\uffff\2\73\1\uffff\1\73\1\uffff\1\73\1\u0460\1\73\1\uffff\2\73\1\uffff\1\73\1\uffff\1\u0465\1\73\1\u0467\2\73\1\u046a\5\73\1\uffff\4\73\1\uffff\2\73\1\uffff\5\73\1\uffff\2\73\1\uffff\6\73\1\uffff\1\73\1\u0484\4\73\1\uffff\2\73\1\u048b\1\u048c\1\uffff\1\u048d\1\uffff\2\73\1\uffff\1\u0490\2\73\1\u0493\1\u0494\14\73\1\u04a1\3\73\1\u04a5\1\u04a6\2\73\1\uffff\3\73\1\u04ac\1\u04ad\1\73\3\uffff\1\u04af\1\73\1\uffff\2\73\2\uffff\4\73\1\u04b7\1\u04b8\6\73\1\uffff\1\73\1\u04c0\1\u04c1\2\uffff\2\73\1\u04c4\1\73\1\u04c6\2\uffff\1\u04c7\1\uffff\2\73\1\u04ca\4\73\2\uffff\4\73\1\u04d3\1\73\1\u04d5\2\uffff\1\u04d6\1\73\1\uffff\1\u04d8\2\uffff\1\73\1\u04da\1\uffff\10\73\1\uffff\1\73\2\uffff\1\u04e4\1\uffff\1\u04e5\1\uffff\4\73\1\u04ea\4\73\2\uffff\2\73\1\u04f1\1\73\1\uffff\6\73\1\uffff\2\73\1\u04fb\1\u04fc\5\73\2\uffff\1\73\1\u0503\1\73\1\u0505\2\73\1\uffff\1\73\1\uffff\1\u0509\1\73\1\u050b\1\uffff\1\73\1\uffff\1\u050d\1\uffff";
+        "\1\uffff\3\74\1\uffff\1\74\1\113\2\uffff\1\74\1\123\3\74\1\136\1\142\1\144\1\146\2\uffff\5\74\2\uffff\6\74\1\uffff\4\74\1\u00a0\1\uffff\1\u00a4\1\uffff\1\u00a9\1\u00ab\1\u00ad\1\u00af\1\u00b1\1\u00b4\2\74\2\u00b9\1\71\5\uffff\2\74\1\uffff\3\74\1\u00c9\1\74\1\u00cb\2\74\1\uffff\3\74\5\uffff\3\74\1\u00db\2\uffff\11\74\10\uffff\1\u00e7\3\uffff\1\u00e8\7\74\1\u00f5\16\74\2\uffff\1\u010f\4\74\1\u0116\20\74\1\uffff\5\74\4\uffff\1\u0137\15\uffff\1\u0139\4\uffff\2\74\1\uffff\1\u00b9\4\uffff\5\74\1\u0143\1\u0144\4\74\1\u0149\1\uffff\1\74\1\uffff\6\74\1\u0155\2\74\1\u0159\5\74\1\uffff\12\74\3\uffff\4\74\1\u0172\7\74\1\uffff\31\74\1\uffff\6\74\1\uffff\23\74\1\u01b1\2\74\1\u01b4\10\74\4\uffff\11\74\2\uffff\4\74\1\uffff\12\74\1\u01d4\1\uffff\2\74\1\u01da\1\uffff\2\74\1\u01de\5\74\1\u01e5\1\u01e6\3\74\1\u01eb\12\74\1\uffff\4\74\1\u01fa\1\74\1\u01fc\16\74\1\u020b\13\74\1\u0218\1\u0219\7\74\1\u0221\4\74\1\u0226\3\74\1\u022c\6\74\1\u0233\1\u0235\2\74\1\uffff\1\74\1\u023a\1\uffff\1\74\1\u023c\1\uffff\6\74\1\u0247\1\74\1\u0249\12\74\1\u0254\1\u0255\2\74\1\u0258\2\74\1\uffff\1\74\1\uffff\1\u0260\4\74\1\uffff\3\74\1\uffff\6\74\2\uffff\4\74\1\uffff\1\u0273\15\74\1\uffff\1\74\1\uffff\13\74\1\u028e\2\74\1\uffff\14\74\2\uffff\1\u029e\4\74\1\u02a3\1\74\1\uffff\3\74\1\u02a9\1\uffff\1\74\1\u02ab\2\74\2\uffff\3\74\1\u02b1\2\74\1\uffff\1\74\1\uffff\1\74\1\u02b6\2\74\1\uffff\1\u02b9\5\uffff\5\74\1\u02bf\1\uffff\1\74\1\uffff\1\74\1\u02c3\6\74\1\u02ca\1\74\2\uffff\2\74\1\uffff\1\u02ce\1\74\4\uffff\1\74\1\uffff\5\74\1\u02d6\11\74\1\u02e0\2\74\1\uffff\20\74\1\u02f7\1\74\1\u02f9\2\74\1\u02fc\1\u02fd\3\74\1\uffff\1\74\1\u0303\1\74\1\u0305\2\74\1\uffff\2\74\1\u030a\5\74\1\uffff\1\u0310\3\74\1\uffff\3\74\1\u0318\1\74\1\uffff\1\u031e\1\uffff\3\74\1\u0324\1\74\1\uffff\2\74\1\u0328\1\74\1\uffff\2\74\1\uffff\5\74\1\uffff\1\u0331\2\74\1\uffff\3\74\1\u0337\2\74\1\uffff\3\74\1\uffff\1\74\1\u033e\4\74\1\u0343\1\uffff\2\74\1\u0346\4\74\1\u034b\1\u034c\2\uffff\5\74\1\u0356\1\u0357\16\74\1\uffff\1\74\1\uffff\2\74\2\uffff\5\74\1\uffff\1\74\1\uffff\4\74\1\uffff\2\74\1\u0375\2\74\1\uffff\6\74\1\u037f\1\uffff\1\u0380\4\74\1\uffff\5\74\2\uffff\2\74\1\uffff\10\74\1\uffff\5\74\1\uffff\6\74\1\uffff\3\74\1\u03a7\1\uffff\2\74\1\uffff\4\74\6\uffff\5\74\2\uffff\21\74\1\u03c4\1\u03c5\2\74\1\u03c8\2\74\1\u03cb\2\74\1\u03ce\1\74\1\uffff\1\u03d0\3\74\1\u03d4\2\74\1\u03d7\3\uffff\11\74\4\uffff\2\74\1\u03e3\1\74\1\u03e5\6\74\1\uffff\12\74\1\u03f6\1\74\1\u03f8\1\uffff\5\74\1\u03fe\1\74\1\u0400\1\74\1\u0402\2\74\1\u0405\2\74\1\u0408\11\74\1\u0412\2\74\2\uffff\2\74\1\uffff\2\74\1\uffff\1\74\1\u041a\1\uffff\1\74\1\uffff\3\74\1\uffff\2\74\1\uffff\3\74\1\u0424\7\74\1\uffff\1\u042c\1\uffff\6\74\1\uffff\2\74\1\u0435\2\74\1\u0438\3\74\1\uffff\1\u043c\1\uffff\2\74\1\u043f\2\74\1\uffff\1\u0442\1\uffff\1\74\1\uffff\1\u0444\1\74\1\uffff\2\74\1\uffff\1\u0448\2\74\1\u044b\1\74\1\u044d\3\74\1\uffff\7\74\1\uffff\1\74\1\u0459\1\74\1\u045b\1\74\1\u045d\3\74\2\uffff\1\u0462\2\74\1\uffff\1\u0465\1\74\1\uffff\3\74\1\u046b\2\74\1\u046e\1\74\1\uffff\2\74\1\uffff\2\74\1\u0474\1\uffff\2\74\1\uffff\2\74\1\uffff\1\74\1\uffff\1\74\1\u047b\1\74\1\uffff\2\74\1\uffff\1\74\1\uffff\1\u0480\1\74\1\u0482\2\74\1\u0485\5\74\1\uffff\1\74\1\uffff\1\74\1\uffff\4\74\1\uffff\2\74\1\uffff\5\74\1\uffff\2\74\1\uffff\5\74\1\uffff\1\74\1\u04a0\4\74\1\uffff\2\74\1\u04a7\1\u04a8\1\uffff\1\u04a9\1\uffff\2\74\1\uffff\1\74\1\u04ad\2\74\1\u04b0\1\74\1\u04b2\14\74\1\u04bf\2\74\1\u04c2\1\u04c3\2\74\1\uffff\3\74\1\u04c9\1\u04ca\1\74\3\uffff\1\u04cc\2\74\1\uffff\2\74\1\uffff\1\74\1\uffff\4\74\1\u04d6\1\u04d7\6\74\1\uffff\1\u04de\1\u04df\2\uffff\2\74\1\u04e2\1\74\1\u04e4\2\uffff\1\u04e5\1\uffff\1\74\1\u04e7\1\74\1\u04e9\5\74\2\uffff\4\74\1\u04f3\1\74\2\uffff\1\u04f5\1\74\1\uffff\1\u04f7\2\uffff\1\74\1\uffff\1\u04f9\1\uffff\1\u04fa\10\74\1\uffff\1\74\1\uffff\1\u0504\1\uffff\1\u0505\2\uffff\4\74\1\u050a\4\74\2\uffff\2\74\1\u0511\1\74\1\uffff\6\74\1\uffff\2\74\1\u051b\1\u051c\5\74\2\uffff\1\74\1\u0523\1\74\1\u0525\2\74\1\uffff\1\74\1\uffff\1\u0529\1\74\1\u052b\1\uffff\1\74\1\uffff\1\u052d\1\uffff";
     static final String DFA21_eofS =
-        "\u050e\uffff";
+        "\u052e\uffff";
     static final String DFA21_minS =
-        "\1\0\1\141\1\61\1\uffff\1\141\1\144\1\141\1\53\2\uffff\1\141\1\72\1\154\1\151\1\141\1\76\1\55\1\75\1\56\2\uffff\1\151\1\141\1\160\2\145\2\uffff\2\141\1\162\1\157\1\141\1\uffff\1\141\1\145\1\170\1\145\1\75\2\52\1\75\1\174\1\46\1\75\1\56\1\uffff\1\150\1\145\2\60\1\44\5\uffff\1\143\1\145\1\uffff\1\141\1\44\1\157\1\70\1\115\1\44\1\uffff\1\154\1\145\1\162\1\44\1\144\1\44\1\151\1\164\1\145\1\162\1\154\5\uffff\1\164\1\141\1\143\1\44\2\uffff\1\145\1\160\1\163\1\156\1\157\2\164\1\163\1\142\10\uffff\1\74\3\uffff\1\44\1\151\1\145\1\144\1\166\1\167\1\101\1\154\1\145\3\141\1\154\1\147\1\151\1\162\2\156\1\141\1\157\1\143\2\uffff\1\160\1\145\1\144\1\142\1\163\1\144\1\154\1\151\1\162\1\160\1\142\1\170\1\165\1\162\1\155\1\160\1\uffff\1\170\1\156\1\147\1\160\1\141\1\75\17\uffff\1\75\5\uffff\1\151\1\141\1\uffff\1\60\4\uffff\1\153\1\145\1\163\1\143\1\147\1\157\1\147\1\166\1\uffff\2\156\1\145\1\164\1\uffff\2\44\1\167\1\151\1\164\1\154\1\44\1\uffff\1\124\1\uffff\1\141\1\157\1\154\1\145\1\154\1\141\1\44\1\163\1\141\1\44\1\154\1\143\1\151\1\141\1\uffff\1\156\1\157\2\145\1\144\1\167\3\164\1\145\3\uffff\1\144\1\102\1\145\1\102\1\44\1\165\1\162\1\141\2\145\1\154\1\156\1\151\1\162\1\144\1\157\1\145\1\162\1\154\1\164\1\151\1\147\1\145\2\164\1\143\1\147\1\157\1\144\1\145\1\123\1\165\1\164\1\150\1\143\1\164\1\145\1\143\1\165\1\164\1\142\1\145\1\151\1\164\1\114\1\153\1\114\1\144\1\164\1\144\1\151\1\162\1\145\1\44\1\164\1\145\1\44\1\157\1\145\1\55\2\114\1\145\1\162\1\156\4\uffff\1\154\1\162\1\141\1\154\1\167\2\151\2\162\1\145\1\151\2\44\1\155\1\141\1\144\2\uffff\1\163\1\142\1\151\1\157\1\uffff\1\157\1\156\1\163\1\110\1\144\1\164\1\117\1\145\1\55\1\154\1\44\1\uffff\1\145\1\101\1\44\1\uffff\1\157\1\44\1\155\1\165\1\164\1\163\1\156\2\44\1\163\2\157\1\44\1\154\1\106\1\145\1\146\1\147\1\157\2\141\1\165\1\156\1\uffff\1\164\1\157\1\162\1\44\1\162\1\44\1\104\1\157\1\143\1\105\1\156\1\143\2\145\1\151\1\164\1\145\1\162\1\143\1\44\1\150\1\154\1\166\1\157\1\170\1\162\1\157\1\162\1\124\1\164\1\147\1\150\1\151\1\44\1\153\1\155\1\145\1\157\1\44\1\154\1\150\1\145\1\44\1\145\1\164\1\154\1\151\1\154\1\172\2\44\1\150\1\145\1\uffff\1\141\1\44\1\uffff\1\167\1\44\1\143\2\145\1\170\1\145\1\126\1\145\1\44\1\147\1\44\1\157\1\170\1\163\1\145\1\164\1\44\1\145\1\141\2\uffff\1\157\1\156\1\141\1\145\1\151\1\143\1\142\1\124\2\44\1\151\1\126\1\44\1\156\1\162\1\143\1\154\1\uffff\1\44\1\154\1\157\2\151\1\uffff\1\147\1\151\1\uffff\1\141\1\154\1\124\1\145\1\156\1\144\2\uffff\1\145\1\156\1\155\1\145\1\uffff\1\44\1\151\1\141\1\151\1\141\1\157\1\147\1\162\1\164\1\163\1\157\1\165\1\153\1\uffff\1\151\1\uffff\1\151\1\156\1\150\1\166\1\144\1\164\1\144\1\163\1\143\1\120\1\163\1\44\1\150\1\uffff\1\162\2\145\1\156\1\75\1\145\1\165\1\156\1\171\1\145\1\157\1\44\1\157\1\uffff\1\104\2\156\1\44\1\uffff\1\145\1\44\1\156\1\144\2\uffff\1\156\2\145\1\44\1\141\1\157\1\uffff\1\146\1\uffff\1\145\1\44\1\151\1\162\1\uffff\1\44\5\uffff\2\156\1\126\1\163\1\141\1\44\1\uffff\1\145\1\uffff\1\162\1\44\1\151\1\163\1\44\1\151\1\uffff\1\167\1\164\1\162\1\143\2\164\1\154\1\141\1\44\1\141\2\uffff\1\144\1\141\1\uffff\1\44\1\106\4\uffff\1\171\1\uffff\1\151\1\165\1\145\1\155\1\44\1\160\1\154\1\164\1\157\1\144\1\141\1\163\1\151\1\162\1\44\1\55\1\154\1\uffff\1\145\2\156\2\164\1\145\1\101\2\164\1\124\1\160\1\116\1\143\1\141\1\163\1\44\1\145\1\44\1\151\1\123\2\44\1\145\1\157\1\164\1\uffff\1\44\1\157\1\44\1\106\1\154\1\uffff\1\156\1\162\1\44\1\160\1\170\1\162\1\uffff\1\156\1\151\1\157\1\44\1\164\1\uffff\1\44\1\uffff\1\147\1\104\1\147\1\44\1\55\1\uffff\1\171\1\156\1\44\1\145\1\uffff\2\145\1\uffff\2\147\1\141\1\163\1\154\1\uffff\1\44\1\144\1\163\1\uffff\1\157\1\163\1\uffff\1\145\1\44\1\150\1\171\1\145\1\157\1\44\1\151\1\154\1\uffff\1\142\1\145\1\154\1\uffff\1\151\1\44\1\141\1\162\1\154\1\145\1\uffff\1\164\1\106\1\44\1\160\1\101\1\154\1\44\1\157\1\44\1\uffff\1\143\1\145\1\154\1\123\2\145\2\44\1\143\1\157\1\141\1\162\1\151\1\145\1\106\1\154\1\147\1\151\1\141\2\151\1\uffff\1\156\1\uffff\1\157\1\164\2\uffff\1\162\1\163\1\124\1\164\1\uffff\1\156\1\uffff\1\162\1\171\2\143\1\uffff\1\145\1\164\1\171\1\106\1\162\1\170\1\44\1\uffff\1\44\1\145\1\157\1\145\1\141\1\uffff\1\164\1\145\1\165\1\145\1\164\1\uffff\1\143\1\157\1\164\1\uffff\1\164\1\154\1\141\2\164\1\154\2\151\1\uffff\1\106\1\75\1\156\1\142\1\154\1\uffff\1\44\1\123\1\157\1\162\1\uffff\1\164\1\107\1\154\1\120\1\151\1\145\1\uffff\1\163\1\143\1\144\1\44\2\151\1\uffff\1\151\1\143\1\103\1\uffff\1\156\5\uffff\1\143\1\144\1\145\1\144\1\124\2\uffff\1\164\2\156\1\151\1\156\1\147\1\151\1\157\1\162\1\164\1\156\1\141\1\145\1\164\1\156\1\141\2\44\1\145\1\44\1\151\1\157\1\44\2\145\1\44\1\101\1\44\1\151\1\164\1\44\3\uffff\2\162\1\141\1\142\1\150\1\170\1\155\1\143\1\150\4\uffff\1\165\1\141\1\44\1\144\1\44\2\150\1\151\1\157\1\144\1\151\1\uffff\1\75\1\141\1\144\1\uffff\1\145\1\146\1\101\1\171\1\141\1\162\1\145\1\157\1\144\1\154\1\44\1\145\1\44\1\uffff\1\157\1\145\1\143\1\164\1\157\1\44\1\164\1\44\1\162\1\44\1\157\1\151\1\44\1\143\2\147\1\141\1\145\1\147\1\157\1\150\1\145\2\154\1\44\1\124\1\164\2\uffff\1\170\1\uffff\1\172\1\155\1\uffff\1\106\1\44\1\uffff\1\162\1\uffff\1\145\1\171\1\uffff\1\164\1\151\1\162\1\44\1\75\1\164\1\145\1\151\1\75\1\164\1\154\1\uffff\1\44\1\uffff\2\126\1\144\1\156\1\141\1\145\1\uffff\1\162\1\44\1\162\1\44\1\154\1\44\1\171\1\157\1\44\1\160\1\141\1\144\1\uffff\1\44\1\uffff\1\156\1\154\1\44\1\151\1\155\1\uffff\1\44\1\uffff\1\166\1\uffff\1\44\1\157\1\uffff\1\145\1\147\1\44\1\164\1\154\1\44\1\165\1\44\1\154\1\157\1\144\1\uffff\1\171\1\145\1\164\1\145\1\124\1\151\1\uffff\1\145\1\154\1\44\1\151\1\172\1\143\2\uffff\1\44\1\162\1\155\1\uffff\1\44\1\102\1\uffff\3\141\1\44\1\164\1\154\1\44\1\uffff\1\166\1\uffff\1\151\1\uffff\1\157\1\165\1\uffff\1\165\1\164\1\44\1\uffff\1\106\1\144\1\uffff\1\157\1\155\1\uffff\1\151\1\uffff\1\156\1\44\1\145\1\uffff\1\151\1\144\1\uffff\1\160\1\uffff\1\44\1\147\1\44\1\160\1\107\1\44\1\144\1\141\1\145\1\141\1\144\1\uffff\1\143\1\157\1\150\1\151\1\uffff\1\151\1\141\1\uffff\1\141\1\165\2\154\1\164\1\uffff\1\151\1\144\1\uffff\1\151\1\141\1\165\2\160\1\151\1\uffff\1\151\1\44\1\156\1\141\1\143\1\163\1\uffff\1\162\1\166\2\44\1\uffff\1\44\1\uffff\1\145\1\162\1\uffff\1\44\1\142\1\154\2\44\1\141\1\156\1\120\1\164\1\143\1\154\1\171\1\164\2\151\2\157\1\44\1\143\1\163\1\164\2\44\1\157\1\145\1\uffff\1\163\1\156\1\145\2\44\1\145\3\uffff\1\44\1\157\1\uffff\1\154\1\144\2\uffff\1\154\1\164\1\141\1\150\2\44\1\157\1\164\2\144\1\162\1\156\1\uffff\1\145\2\44\2\uffff\1\156\1\154\1\44\1\144\1\44\2\uffff\1\44\1\uffff\1\165\1\145\1\44\1\114\1\141\1\156\1\120\2\uffff\1\165\1\157\2\141\1\44\1\126\1\44\2\uffff\1\44\1\144\1\uffff\1\44\2\uffff\1\160\1\44\1\uffff\1\141\1\154\1\145\1\162\1\164\1\156\2\164\1\uffff\1\141\2\uffff\1\44\1\uffff\1\44\1\uffff\1\171\1\114\1\154\1\145\1\44\1\107\2\157\1\154\2\uffff\1\157\1\141\1\44\1\146\1\uffff\3\162\1\151\1\165\1\171\1\uffff\1\151\1\157\2\44\1\144\1\164\1\157\1\170\1\165\2\uffff\1\141\1\44\1\165\1\44\1\160\1\164\1\uffff\1\164\1\uffff\1\44\1\157\1\44\1\uffff\1\162\1\uffff\1\44\1\uffff";
+        "\1\0\2\141\1\144\1\uffff\1\141\1\53\2\uffff\1\141\1\72\1\154\1\151\1\141\1\76\1\55\1\75\1\56\2\uffff\1\151\1\141\1\160\1\143\1\145\2\uffff\1\61\2\141\1\162\1\157\1\141\1\uffff\1\141\1\145\1\170\1\145\1\52\1\uffff\1\75\1\uffff\1\52\1\75\1\174\1\46\1\75\1\56\1\150\1\145\2\60\1\44\5\uffff\1\143\1\145\1\uffff\1\154\1\145\1\162\1\44\1\144\1\44\1\151\1\164\1\uffff\1\145\1\162\1\154\5\uffff\1\164\1\141\1\143\1\44\2\uffff\1\145\1\160\1\163\1\156\1\157\2\164\1\163\1\142\10\uffff\1\74\3\uffff\1\44\1\151\1\145\1\144\1\166\1\167\1\101\1\154\1\44\1\145\3\141\1\154\1\147\1\162\1\151\1\162\2\156\1\141\1\157\1\143\2\uffff\1\44\1\157\1\70\1\141\1\115\1\44\1\160\1\145\1\144\1\142\1\163\1\144\1\154\1\151\1\162\1\160\1\142\1\170\1\165\1\162\1\155\1\160\1\uffff\1\170\1\156\1\147\1\160\1\141\4\uffff\1\75\15\uffff\1\75\4\uffff\1\151\1\141\1\uffff\1\60\4\uffff\1\153\1\145\1\163\1\143\1\147\2\44\1\167\1\151\1\164\1\154\1\44\1\uffff\1\124\1\uffff\1\141\1\157\1\154\1\145\1\154\1\141\1\44\1\163\1\141\1\44\1\160\1\154\1\143\1\151\1\141\1\uffff\1\156\1\157\2\145\1\144\1\167\3\164\1\145\3\uffff\1\144\1\102\1\145\1\102\1\44\1\165\1\141\1\162\1\141\2\145\1\154\1\uffff\1\156\1\151\1\162\1\144\1\157\1\145\1\162\1\154\1\164\1\151\1\147\1\145\1\157\2\164\1\143\1\147\1\157\1\144\1\145\1\123\1\165\1\164\1\150\1\166\1\uffff\2\156\1\147\1\157\1\145\1\164\1\uffff\1\143\1\164\1\145\1\143\1\165\1\164\1\142\1\145\1\151\1\164\1\114\1\153\1\114\1\144\1\164\1\144\1\151\1\162\1\145\1\44\1\164\1\145\1\44\1\157\1\145\1\55\2\114\1\145\1\162\1\156\4\uffff\1\154\1\162\1\141\1\154\1\167\2\151\1\162\1\144\2\uffff\1\163\1\142\1\151\1\157\1\uffff\1\157\1\156\1\163\1\110\1\144\1\164\1\117\1\145\1\55\1\154\1\44\1\uffff\1\145\1\101\1\44\1\uffff\1\154\1\157\1\44\1\155\1\165\1\164\1\163\1\156\2\44\1\163\2\157\1\44\1\154\1\106\1\145\1\146\1\147\1\157\2\141\1\165\1\156\1\uffff\1\164\1\160\1\157\1\162\1\44\1\162\1\44\1\104\1\157\1\143\1\105\1\156\1\143\2\145\1\151\1\164\1\145\1\162\1\154\1\143\1\44\1\150\1\154\1\166\1\157\1\170\1\162\1\157\1\162\1\124\1\164\1\151\2\44\1\145\1\162\1\155\1\141\1\147\1\150\1\151\1\44\1\153\1\155\1\145\1\157\1\44\1\154\1\150\1\145\1\44\1\145\1\164\1\154\1\151\1\154\1\172\2\44\1\150\1\145\1\uffff\1\141\1\44\1\uffff\1\167\1\44\1\143\2\145\1\170\1\145\1\126\1\145\1\44\1\147\1\44\1\157\1\170\1\163\1\145\1\141\1\145\1\151\1\143\1\142\1\124\2\44\1\151\1\126\1\44\1\156\1\162\1\143\1\154\1\uffff\1\44\1\154\1\157\2\151\1\uffff\1\141\1\147\1\151\1\uffff\1\141\1\154\1\124\1\145\1\156\1\144\2\uffff\1\145\1\156\1\155\1\145\1\uffff\1\44\1\151\1\141\1\151\1\141\1\157\1\147\1\162\1\164\1\163\1\157\1\164\1\165\1\153\1\uffff\1\151\1\uffff\1\151\1\156\1\150\1\166\1\144\1\164\1\144\1\163\1\143\1\120\1\163\1\44\1\154\1\150\1\uffff\1\162\2\145\1\156\1\75\1\145\1\165\1\156\1\171\2\145\1\141\2\uffff\1\44\1\164\1\157\1\156\1\157\1\44\1\157\1\uffff\1\104\2\156\1\44\1\uffff\1\145\1\44\1\156\1\144\2\uffff\1\156\2\145\1\44\1\141\1\157\1\uffff\1\146\1\uffff\1\145\1\44\1\151\1\162\1\uffff\1\44\5\uffff\2\156\1\126\1\163\1\141\1\44\1\uffff\1\145\1\uffff\1\162\1\44\1\151\1\163\2\164\1\154\1\141\1\44\1\141\2\uffff\1\144\1\141\1\uffff\1\44\1\106\4\uffff\1\171\1\uffff\1\151\1\165\1\145\1\155\1\171\1\44\1\160\1\154\1\164\1\157\1\144\1\141\1\151\1\163\1\162\1\44\1\55\1\154\1\uffff\1\145\2\156\2\164\1\145\1\101\2\164\1\124\1\151\1\160\1\116\1\143\1\141\1\163\1\44\1\145\1\44\1\151\1\123\2\44\1\145\1\157\1\164\1\uffff\1\124\1\44\1\157\1\44\1\106\1\154\1\uffff\1\156\1\162\1\44\1\160\1\170\1\167\1\164\1\151\1\uffff\1\44\1\162\1\143\1\162\1\uffff\1\156\1\151\1\157\1\44\1\164\1\uffff\1\44\1\uffff\1\147\1\104\1\147\1\44\1\55\1\uffff\1\171\1\156\1\44\1\145\1\uffff\2\145\1\uffff\2\147\1\141\1\163\1\154\1\uffff\1\44\1\144\1\163\1\uffff\1\157\1\163\1\157\1\44\1\151\1\154\1\uffff\1\142\1\145\1\154\1\uffff\1\151\1\44\1\141\1\162\1\154\1\145\1\44\1\uffff\1\164\1\106\1\44\1\160\1\101\1\154\1\157\2\44\1\uffff\1\143\1\145\1\154\1\123\2\145\2\44\1\143\1\157\1\141\1\162\1\157\1\151\1\145\1\106\1\154\1\147\1\151\1\141\2\151\1\uffff\1\156\1\uffff\1\157\1\164\2\uffff\1\162\1\163\1\124\1\157\1\164\1\uffff\1\156\1\uffff\1\162\1\171\2\143\1\uffff\1\145\1\164\1\44\1\150\1\145\1\uffff\1\171\1\145\1\171\1\106\1\162\1\170\1\44\1\uffff\1\44\1\145\1\157\1\145\1\141\1\uffff\1\164\1\145\1\165\1\145\1\164\1\uffff\1\143\1\157\1\164\1\uffff\1\164\1\154\1\141\2\164\1\154\2\151\1\uffff\1\106\1\75\1\156\1\142\1\162\1\uffff\1\164\1\107\1\154\1\120\1\151\1\145\1\uffff\1\163\1\143\1\144\1\44\1\uffff\2\151\1\uffff\1\151\1\143\1\103\1\156\6\uffff\1\143\1\144\1\145\1\144\1\124\2\uffff\1\164\2\156\1\151\2\156\1\147\1\151\1\157\1\162\1\164\1\156\1\141\1\145\1\164\1\156\1\141\2\44\1\145\1\102\1\44\1\151\1\157\1\44\2\145\1\44\1\101\1\uffff\1\44\1\154\1\123\1\157\1\44\1\151\1\164\1\44\3\uffff\2\162\1\141\1\142\1\150\1\170\1\155\1\143\1\150\4\uffff\1\165\1\141\1\44\1\144\1\44\2\150\1\151\1\157\1\144\1\151\1\uffff\1\75\1\141\1\101\1\171\1\141\1\162\1\145\1\157\1\144\1\154\1\44\1\145\1\44\1\uffff\1\157\1\145\1\143\1\164\1\157\1\44\1\164\1\44\1\162\1\44\1\157\1\151\1\44\1\143\1\147\1\44\1\147\1\141\1\145\1\147\1\157\1\150\1\145\2\154\1\44\1\124\1\164\2\uffff\1\170\1\157\1\uffff\1\172\1\155\1\uffff\1\106\1\44\1\uffff\1\162\1\uffff\1\144\1\145\1\146\1\uffff\1\145\1\171\1\uffff\1\164\1\151\1\162\1\44\1\75\1\164\1\145\1\151\1\75\1\164\1\154\1\uffff\1\44\1\uffff\2\126\1\144\1\156\1\141\1\145\1\uffff\1\162\1\154\1\44\1\171\1\157\1\44\1\160\1\141\1\144\1\uffff\1\44\1\uffff\1\156\1\154\1\44\1\151\1\155\1\uffff\1\44\1\uffff\1\166\1\uffff\1\44\1\157\1\uffff\1\145\1\147\1\uffff\1\44\1\164\1\154\1\44\1\165\1\44\1\154\1\157\1\144\1\uffff\1\171\1\145\2\164\1\145\1\124\1\151\1\uffff\1\145\1\44\1\162\1\44\1\154\1\44\1\151\1\172\1\143\2\uffff\1\44\1\162\1\155\1\uffff\1\44\1\102\1\uffff\3\141\1\44\1\164\1\154\1\44\1\151\1\uffff\1\157\1\165\1\uffff\1\165\1\164\1\44\1\uffff\1\106\1\144\1\uffff\1\157\1\155\1\uffff\1\151\1\uffff\1\156\1\44\1\145\1\uffff\1\151\1\144\1\uffff\1\160\1\uffff\1\44\1\147\1\44\1\160\1\107\1\44\1\164\1\144\1\141\1\145\1\141\1\uffff\1\166\1\uffff\1\144\1\uffff\1\143\1\157\1\150\1\151\1\uffff\1\151\1\141\1\uffff\1\141\1\165\2\154\1\164\1\uffff\1\151\1\144\1\uffff\1\141\1\165\2\160\1\151\1\uffff\1\151\1\44\1\156\1\141\1\143\1\163\1\uffff\1\162\1\166\2\44\1\uffff\1\44\1\uffff\1\145\1\162\1\uffff\1\157\1\44\1\142\1\154\1\44\1\151\1\44\1\141\1\156\1\120\1\164\1\143\1\154\1\171\1\164\2\151\2\157\1\44\1\163\1\164\2\44\1\157\1\145\1\uffff\1\163\1\156\1\145\2\44\1\145\3\uffff\1\44\1\157\1\155\1\uffff\1\154\1\144\1\uffff\1\143\1\uffff\1\154\1\164\1\141\1\150\2\44\1\157\1\164\2\144\1\162\1\156\1\uffff\2\44\2\uffff\1\156\1\154\1\44\1\144\1\44\2\uffff\1\44\1\uffff\1\165\1\44\1\145\1\44\1\145\1\114\1\141\1\156\1\120\2\uffff\1\165\1\157\2\141\1\44\1\126\2\uffff\1\44\1\144\1\uffff\1\44\2\uffff\1\160\1\uffff\1\44\1\uffff\1\44\1\141\1\154\1\145\1\162\1\164\1\156\2\164\1\uffff\1\141\1\uffff\1\44\1\uffff\1\44\2\uffff\1\171\1\114\1\154\1\145\1\44\1\107\2\157\1\154\2\uffff\1\157\1\141\1\44\1\146\1\uffff\3\162\1\151\1\165\1\171\1\uffff\1\151\1\157\2\44\1\144\1\164\1\157\1\170\1\165\2\uffff\1\141\1\44\1\165\1\44\1\160\1\164\1\uffff\1\164\1\uffff\1\44\1\157\1\44\1\uffff\1\162\1\uffff\1\44\1\uffff";
     static final String DFA21_maxS =
-        "\1\uffff\1\162\1\156\1\uffff\1\151\1\165\1\157\1\75\2\uffff\1\157\1\72\1\170\1\165\1\151\2\76\1\75\1\56\2\uffff\2\165\1\160\1\171\1\157\2\uffff\1\157\1\165\1\162\1\157\1\171\1\uffff\1\151\1\145\1\170\1\145\1\76\3\75\1\174\1\46\1\75\1\72\1\uffff\1\150\1\145\1\170\1\154\1\172\5\uffff\1\163\1\157\1\uffff\1\160\1\172\1\157\1\70\1\163\1\172\1\uffff\1\162\1\163\1\162\1\172\1\144\1\172\1\151\1\164\2\162\1\154\5\uffff\1\171\1\141\1\163\1\172\2\uffff\1\145\1\164\1\163\1\156\1\157\2\164\1\163\1\142\10\uffff\1\74\3\uffff\1\172\1\151\1\145\1\144\1\166\1\167\1\156\1\155\1\164\1\156\1\141\1\171\1\154\1\160\1\151\1\162\2\156\1\164\1\157\1\143\2\uffff\1\164\1\145\2\156\1\170\1\156\1\154\1\151\1\165\1\160\1\142\1\170\1\171\1\162\1\155\1\160\1\uffff\1\170\1\156\1\147\1\160\1\141\1\75\17\uffff\1\75\5\uffff\1\151\1\141\1\uffff\1\154\4\uffff\1\153\1\145\1\163\1\146\1\147\1\157\1\147\1\166\1\uffff\2\156\1\145\1\164\1\uffff\2\172\1\167\1\151\1\164\1\154\1\172\1\uffff\1\124\1\uffff\1\147\1\157\1\154\1\163\1\164\1\141\1\172\1\163\1\145\1\172\1\154\1\143\1\151\1\141\1\uffff\1\156\1\157\2\145\1\144\1\167\3\164\1\145\3\uffff\1\144\1\102\1\145\1\151\1\172\1\165\1\162\1\141\2\145\1\154\1\156\1\151\1\162\1\144\1\157\1\145\1\162\1\154\1\164\1\151\1\147\1\145\2\164\1\143\1\147\1\157\1\144\2\145\1\165\1\164\1\150\1\145\1\164\1\145\1\143\1\165\1\164\1\142\1\145\1\151\1\164\1\114\1\153\1\165\1\144\1\164\1\144\1\151\1\162\1\145\1\172\1\164\1\145\1\172\1\157\1\145\1\55\2\114\1\145\1\162\1\156\4\uffff\1\154\1\162\1\141\1\154\1\167\2\151\2\162\1\145\1\151\2\172\1\155\1\141\1\144\2\uffff\1\163\1\142\1\151\1\157\1\uffff\1\157\1\156\1\163\1\110\1\144\1\164\1\117\1\145\1\55\1\154\1\172\1\uffff\1\145\1\163\1\172\1\uffff\1\157\1\172\1\155\1\165\1\164\1\163\1\162\2\172\1\163\2\157\1\172\1\154\1\106\1\145\1\146\1\147\1\157\2\141\1\165\1\156\1\uffff\1\164\1\157\1\162\1\172\1\162\1\172\1\104\1\157\1\143\1\105\1\156\1\143\2\145\1\151\1\164\1\145\1\162\1\143\1\172\1\150\1\154\1\166\1\157\1\170\1\162\1\157\1\162\1\124\1\164\1\147\1\150\1\151\1\172\1\153\1\155\1\145\1\157\1\172\1\154\1\150\1\145\1\172\1\145\1\164\1\154\1\151\1\154\3\172\1\150\1\145\1\uffff\1\146\1\172\1\uffff\1\167\1\172\1\162\2\145\1\170\1\145\1\126\1\145\1\172\1\147\1\172\1\157\1\170\1\163\1\145\1\164\1\172\1\145\1\141\2\uffff\1\157\1\156\1\141\1\145\1\151\1\143\1\142\1\124\2\172\1\151\1\126\1\172\1\156\2\162\1\154\1\uffff\1\172\1\154\1\157\2\151\1\uffff\1\147\1\151\1\uffff\1\141\1\154\1\124\1\145\1\156\1\163\2\uffff\1\145\1\156\1\155\1\145\1\uffff\1\172\1\151\1\141\1\151\1\141\1\157\1\147\1\162\1\164\1\163\1\157\1\165\1\153\1\uffff\1\151\1\uffff\1\151\1\156\1\150\1\166\1\144\1\164\1\144\1\163\1\143\1\164\1\163\1\172\1\150\1\uffff\1\162\2\145\1\156\1\75\1\145\1\165\1\156\1\171\1\145\1\157\1\172\1\157\1\uffff\1\142\2\156\1\172\1\uffff\1\145\1\172\1\156\1\144\2\uffff\1\156\2\145\1\172\1\141\1\157\1\uffff\1\146\1\uffff\1\145\1\172\1\151\1\162\1\uffff\1\172\5\uffff\2\156\1\126\1\163\1\141\1\172\1\uffff\1\145\1\uffff\1\162\1\172\1\151\1\163\1\172\1\151\1\uffff\1\167\1\164\1\162\1\143\2\164\1\154\1\141\1\172\1\141\2\uffff\1\144\1\141\1\uffff\1\172\1\106\4\uffff\1\171\1\uffff\1\151\1\165\1\145\1\155\1\172\1\160\1\154\1\164\1\157\1\144\1\141\1\163\1\151\1\162\1\172\1\55\1\154\1\uffff\1\145\2\156\2\164\1\145\1\101\2\164\1\124\1\160\1\116\1\143\1\141\1\163\1\172\1\145\1\172\1\151\1\123\2\172\1\145\1\157\1\164\1\uffff\1\172\1\157\1\172\1\106\1\154\1\uffff\1\156\1\162\1\172\1\160\1\170\1\162\1\uffff\1\156\1\151\1\157\1\172\1\164\1\uffff\1\172\1\uffff\1\147\1\124\1\147\1\172\1\55\1\uffff\1\171\1\156\1\172\1\145\1\uffff\2\145\1\uffff\2\147\1\141\1\163\1\154\1\uffff\1\172\1\144\1\163\1\uffff\1\157\1\163\1\uffff\1\145\1\172\1\150\1\171\1\145\1\157\1\172\1\151\1\154\1\uffff\1\142\1\145\1\154\1\uffff\1\151\1\172\1\141\1\162\1\154\1\145\1\uffff\1\164\1\106\1\172\1\160\1\101\1\154\1\172\1\157\1\172\1\uffff\1\162\1\145\1\154\1\123\2\145\2\172\1\143\1\157\1\141\1\162\1\151\1\145\1\106\1\154\1\147\1\151\1\141\2\151\1\uffff\1\156\1\uffff\1\157\1\164\2\uffff\1\162\1\163\1\124\1\164\1\uffff\1\156\1\uffff\1\162\1\171\2\143\1\uffff\1\145\1\164\1\171\1\106\1\162\1\170\1\172\1\uffff\1\172\1\145\1\157\1\145\1\141\1\uffff\1\164\1\145\1\165\1\145\1\164\1\uffff\1\162\1\157\1\164\1\uffff\1\164\1\154\1\141\2\164\1\154\2\151\1\uffff\1\106\1\75\1\156\1\142\1\154\1\uffff\1\172\1\123\1\157\1\162\1\uffff\1\164\1\114\1\154\1\120\1\151\1\145\1\uffff\1\163\1\143\1\144\1\172\2\151\1\uffff\1\151\1\143\1\103\1\uffff\1\156\5\uffff\1\143\1\144\1\145\1\144\1\124\2\uffff\1\164\2\156\1\151\1\156\1\147\1\151\1\157\1\162\1\164\1\156\1\141\1\145\1\164\1\156\1\141\2\172\1\145\1\172\1\151\1\157\1\172\2\145\1\172\1\101\1\172\1\151\1\164\1\172\3\uffff\2\162\1\141\1\142\1\150\1\170\1\155\1\143\1\150\4\uffff\1\165\1\141\1\172\1\144\1\172\2\150\1\151\1\157\1\144\1\151\1\uffff\1\75\1\141\1\144\1\uffff\1\145\1\146\1\101\1\171\1\141\1\162\1\145\1\157\1\144\1\154\1\172\1\145\1\172\1\uffff\1\157\1\145\1\143\1\164\1\157\1\172\1\164\1\172\1\162\1\172\1\157\1\151\1\172\1\143\2\147\1\141\1\145\1\147\1\157\1\150\1\145\2\154\1\172\1\124\1\164\2\uffff\1\170\1\uffff\1\172\1\155\1\uffff\1\106\1\172\1\uffff\1\162\1\uffff\1\145\1\171\1\uffff\1\164\1\151\1\162\1\172\1\75\1\164\1\145\1\151\1\75\1\164\1\154\1\uffff\1\172\1\uffff\2\126\1\144\1\156\1\141\1\145\1\uffff\1\162\1\172\1\162\1\172\1\154\1\172\1\171\1\157\1\172\1\160\1\141\1\144\1\uffff\1\172\1\uffff\1\156\1\154\1\172\1\151\1\155\1\uffff\1\172\1\uffff\1\166\1\uffff\1\172\1\157\1\uffff\1\145\1\147\1\172\1\164\1\154\1\172\1\165\1\172\1\154\1\157\1\144\1\uffff\1\171\1\145\1\164\1\145\1\124\1\151\1\uffff\1\145\1\154\1\172\1\151\1\172\1\143\2\uffff\1\172\1\162\1\155\1\uffff\1\172\1\114\1\uffff\3\141\1\172\1\164\1\154\1\172\1\uffff\1\166\1\uffff\1\151\1\uffff\1\157\1\165\1\uffff\1\165\1\164\1\172\1\uffff\1\106\1\144\1\uffff\1\157\1\155\1\uffff\1\151\1\uffff\1\156\1\172\1\145\1\uffff\1\151\1\144\1\uffff\1\160\1\uffff\1\172\1\147\1\172\1\160\1\107\1\172\1\144\1\141\1\145\1\141\1\144\1\uffff\1\143\1\157\1\150\1\151\1\uffff\1\151\1\141\1\uffff\1\141\1\165\2\154\1\164\1\uffff\1\151\1\144\1\uffff\1\151\1\141\1\165\2\160\1\151\1\uffff\1\151\1\172\1\156\1\141\1\143\1\163\1\uffff\1\162\1\166\2\172\1\uffff\1\172\1\uffff\1\145\1\162\1\uffff\1\172\1\142\1\154\2\172\1\141\1\156\1\120\1\164\1\143\1\154\1\171\1\164\2\151\2\157\1\172\1\143\1\163\1\164\2\172\1\157\1\145\1\uffff\1\163\1\156\1\145\2\172\1\145\3\uffff\1\172\1\157\1\uffff\1\154\1\144\2\uffff\1\154\1\164\1\141\1\150\2\172\1\157\1\164\2\144\1\162\1\156\1\uffff\1\145\2\172\2\uffff\1\156\1\154\1\172\1\144\1\172\2\uffff\1\172\1\uffff\1\165\1\145\1\172\1\114\1\141\1\156\1\120\2\uffff\1\165\1\157\2\141\1\172\1\126\1\172\2\uffff\1\172\1\144\1\uffff\1\172\2\uffff\1\160\1\172\1\uffff\1\141\1\154\1\145\1\162\1\164\1\156\2\164\1\uffff\1\141\2\uffff\1\172\1\uffff\1\172\1\uffff\1\171\1\114\1\154\1\145\1\172\1\107\2\157\1\154\2\uffff\1\157\1\141\1\172\1\146\1\uffff\3\162\1\151\1\165\1\171\1\uffff\1\151\1\157\2\172\1\144\1\164\1\157\1\170\1\165\2\uffff\1\141\1\172\1\165\1\172\1\160\1\164\1\uffff\1\164\1\uffff\1\172\1\157\1\172\1\uffff\1\162\1\uffff\1\172\1\uffff";
+        "\1\uffff\1\162\1\151\1\165\1\uffff\1\157\1\75\2\uffff\1\157\1\72\1\170\1\165\1\151\2\76\1\75\1\56\2\uffff\2\165\1\160\1\171\1\157\2\uffff\1\156\1\157\1\165\1\162\1\157\1\171\1\uffff\1\151\1\145\1\170\1\145\1\75\1\uffff\1\76\1\uffff\2\75\1\174\1\46\1\75\1\72\1\150\1\145\1\170\1\154\1\172\5\uffff\1\163\1\157\1\uffff\1\162\1\163\1\162\1\172\1\144\1\172\1\151\1\164\1\uffff\2\162\1\154\5\uffff\1\171\2\163\1\172\2\uffff\1\145\1\164\1\163\1\156\1\157\2\164\1\163\1\142\10\uffff\1\74\3\uffff\1\172\1\151\1\145\1\144\1\166\1\167\1\156\1\155\1\172\1\164\1\156\1\141\1\171\1\154\1\160\1\162\1\151\1\162\2\156\1\164\1\157\1\143\2\uffff\1\172\1\157\1\70\1\160\1\163\1\172\1\164\1\145\2\156\1\170\1\156\1\154\1\151\1\165\1\160\1\142\1\170\1\171\1\162\1\155\1\160\1\uffff\1\170\1\156\1\147\1\160\1\141\4\uffff\1\75\15\uffff\1\75\4\uffff\1\151\1\141\1\uffff\1\154\4\uffff\1\153\1\145\1\163\1\146\1\147\2\172\1\167\1\151\1\164\1\154\1\172\1\uffff\1\124\1\uffff\1\147\1\157\1\154\1\163\1\164\1\141\1\172\1\163\1\145\1\172\1\160\1\154\1\143\1\151\1\141\1\uffff\1\156\1\157\2\145\1\144\1\167\3\164\1\145\3\uffff\1\144\1\102\1\145\1\151\1\172\1\165\1\141\1\162\1\141\2\145\1\154\1\uffff\1\156\1\151\1\162\1\144\1\157\1\145\1\162\1\154\1\164\1\151\1\147\1\145\1\157\2\164\1\143\1\147\1\157\1\144\2\145\1\165\1\164\1\150\1\166\1\uffff\2\156\1\147\1\157\1\145\1\164\1\uffff\1\145\1\164\1\145\1\143\1\165\1\164\1\142\1\145\1\151\1\164\1\114\1\153\1\165\1\144\1\164\1\144\1\151\1\162\1\145\1\172\1\164\1\145\1\172\1\157\1\145\1\55\2\114\1\145\1\162\1\156\4\uffff\1\154\1\162\1\141\1\154\1\167\2\151\1\162\1\144\2\uffff\1\163\1\142\1\151\1\157\1\uffff\1\157\1\156\1\163\1\110\1\144\1\164\1\117\1\145\1\55\1\154\1\172\1\uffff\1\145\1\163\1\172\1\uffff\1\154\1\157\1\172\1\155\1\165\1\164\1\163\1\162\2\172\1\163\2\157\1\172\1\154\1\106\1\145\1\146\1\147\1\157\2\141\1\165\1\156\1\uffff\1\164\1\160\1\157\1\162\1\172\1\162\1\172\1\104\1\157\1\143\1\105\1\156\1\143\2\145\1\151\1\164\1\145\1\162\1\154\1\143\1\172\1\150\1\154\1\166\1\157\1\170\1\162\1\157\1\162\1\124\1\164\1\151\2\172\1\145\1\162\1\155\1\141\1\147\1\150\1\151\1\172\1\153\1\155\1\145\1\157\1\172\1\154\1\150\1\145\1\172\1\145\1\164\1\154\1\151\1\154\3\172\1\150\1\145\1\uffff\1\146\1\172\1\uffff\1\167\1\172\1\162\2\145\1\170\1\145\1\126\1\145\1\172\1\147\1\172\1\157\1\170\1\163\1\145\1\141\1\145\1\151\1\143\1\142\1\124\2\172\1\151\1\126\1\172\1\156\2\162\1\154\1\uffff\1\172\1\154\1\157\2\151\1\uffff\1\141\1\147\1\151\1\uffff\1\141\1\154\1\124\1\145\1\156\1\163\2\uffff\1\145\1\156\1\155\1\145\1\uffff\1\172\1\151\1\141\1\151\1\141\1\157\1\147\1\162\1\164\1\163\1\157\1\164\1\165\1\153\1\uffff\1\151\1\uffff\1\151\1\156\1\150\1\166\1\144\1\164\1\144\1\163\1\143\1\164\1\163\1\172\1\154\1\150\1\uffff\1\162\2\145\1\156\1\75\1\145\1\165\1\156\1\171\2\145\1\141\2\uffff\1\172\1\164\1\157\1\156\1\157\1\172\1\157\1\uffff\1\142\2\156\1\172\1\uffff\1\145\1\172\1\156\1\144\2\uffff\1\156\2\145\1\172\1\141\1\157\1\uffff\1\146\1\uffff\1\145\1\172\1\151\1\162\1\uffff\1\172\5\uffff\2\156\1\126\1\163\1\141\1\172\1\uffff\1\145\1\uffff\1\162\1\172\1\151\1\163\2\164\1\154\1\141\1\172\1\141\2\uffff\1\144\1\141\1\uffff\1\172\1\106\4\uffff\1\171\1\uffff\1\151\1\165\1\145\1\155\1\171\1\172\1\160\1\154\1\164\1\157\1\144\1\141\1\151\1\163\1\162\1\172\1\55\1\154\1\uffff\1\145\2\156\2\164\1\145\1\101\2\164\1\124\1\151\1\160\1\116\1\143\1\141\1\163\1\172\1\145\1\172\1\151\1\123\2\172\1\145\1\157\1\164\1\uffff\1\124\1\172\1\157\1\172\1\106\1\154\1\uffff\1\156\1\162\1\172\1\160\1\170\1\167\1\164\1\151\1\uffff\1\172\1\162\1\143\1\162\1\uffff\1\156\1\151\1\157\1\172\1\164\1\uffff\1\172\1\uffff\1\147\1\124\1\147\1\172\1\55\1\uffff\1\171\1\156\1\172\1\145\1\uffff\2\145\1\uffff\2\147\1\141\1\163\1\154\1\uffff\1\172\1\144\1\163\1\uffff\1\157\1\163\1\157\1\172\1\151\1\154\1\uffff\1\142\1\145\1\154\1\uffff\1\151\1\172\1\141\1\162\1\154\1\145\1\172\1\uffff\1\164\1\106\1\172\1\160\1\101\1\154\1\157\2\172\1\uffff\1\162\1\145\1\154\1\123\2\145\2\172\1\143\1\157\1\141\1\162\1\157\1\151\1\145\1\106\1\154\1\147\1\151\1\141\2\151\1\uffff\1\156\1\uffff\1\157\1\164\2\uffff\1\162\1\163\1\124\1\157\1\164\1\uffff\1\156\1\uffff\1\162\1\171\2\143\1\uffff\1\145\1\164\1\172\1\150\1\145\1\uffff\1\171\1\145\1\171\1\106\1\162\1\170\1\172\1\uffff\1\172\1\145\1\157\1\145\1\141\1\uffff\1\164\1\145\1\165\1\145\1\164\1\uffff\1\162\1\157\1\164\1\uffff\1\164\1\154\1\141\2\164\1\154\2\151\1\uffff\1\106\1\75\1\156\1\142\1\162\1\uffff\1\164\1\114\1\154\1\120\1\151\1\145\1\uffff\1\163\1\143\1\144\1\172\1\uffff\2\151\1\uffff\1\151\1\143\1\103\1\156\6\uffff\1\143\1\144\1\145\1\144\1\124\2\uffff\1\164\2\156\1\151\2\156\1\147\1\151\1\157\1\162\1\164\1\156\1\141\1\145\1\164\1\156\1\141\2\172\1\145\1\102\1\172\1\151\1\157\1\172\2\145\1\172\1\101\1\uffff\1\172\1\154\1\123\1\157\1\172\1\151\1\164\1\172\3\uffff\2\162\1\141\1\142\1\150\1\170\1\155\1\143\1\150\4\uffff\1\165\1\141\1\172\1\144\1\172\2\150\1\151\1\157\1\144\1\151\1\uffff\1\75\1\141\1\101\1\171\1\141\1\162\1\145\1\157\1\144\1\154\1\172\1\145\1\172\1\uffff\1\157\1\145\1\143\1\164\1\157\1\172\1\164\1\172\1\162\1\172\1\157\1\151\1\172\1\143\1\147\1\172\1\147\1\141\1\145\1\147\1\157\1\150\1\145\2\154\1\172\1\124\1\164\2\uffff\1\170\1\157\1\uffff\1\172\1\155\1\uffff\1\106\1\172\1\uffff\1\162\1\uffff\1\144\1\145\1\146\1\uffff\1\145\1\171\1\uffff\1\164\1\151\1\162\1\172\1\75\1\164\1\145\1\151\1\75\1\164\1\154\1\uffff\1\172\1\uffff\2\126\1\144\1\156\1\141\1\145\1\uffff\1\162\1\154\1\172\1\171\1\157\1\172\1\160\1\141\1\144\1\uffff\1\172\1\uffff\1\156\1\154\1\172\1\151\1\155\1\uffff\1\172\1\uffff\1\166\1\uffff\1\172\1\157\1\uffff\1\145\1\147\1\uffff\1\172\1\164\1\154\1\172\1\165\1\172\1\154\1\157\1\144\1\uffff\1\171\1\145\2\164\1\145\1\124\1\151\1\uffff\1\145\1\172\1\162\1\172\1\154\1\172\1\151\1\172\1\143\2\uffff\1\172\1\162\1\155\1\uffff\1\172\1\114\1\uffff\3\141\1\172\1\164\1\154\1\172\1\151\1\uffff\1\157\1\165\1\uffff\1\165\1\164\1\172\1\uffff\1\106\1\144\1\uffff\1\157\1\155\1\uffff\1\151\1\uffff\1\156\1\172\1\145\1\uffff\1\151\1\144\1\uffff\1\160\1\uffff\1\172\1\147\1\172\1\160\1\107\1\172\1\164\1\144\1\141\1\145\1\141\1\uffff\1\166\1\uffff\1\144\1\uffff\1\143\1\157\1\150\1\151\1\uffff\1\151\1\141\1\uffff\1\141\1\165\2\154\1\164\1\uffff\1\151\1\144\1\uffff\1\141\1\165\2\160\1\151\1\uffff\1\151\1\172\1\156\1\141\1\143\1\163\1\uffff\1\162\1\166\2\172\1\uffff\1\172\1\uffff\1\145\1\162\1\uffff\1\157\1\172\1\142\1\154\1\172\1\151\1\172\1\141\1\156\1\120\1\164\1\143\1\154\1\171\1\164\2\151\2\157\1\172\1\163\1\164\2\172\1\157\1\145\1\uffff\1\163\1\156\1\145\2\172\1\145\3\uffff\1\172\1\157\1\155\1\uffff\1\154\1\144\1\uffff\1\143\1\uffff\1\154\1\164\1\141\1\150\2\172\1\157\1\164\2\144\1\162\1\156\1\uffff\2\172\2\uffff\1\156\1\154\1\172\1\144\1\172\2\uffff\1\172\1\uffff\1\165\1\172\1\145\1\172\1\145\1\114\1\141\1\156\1\120\2\uffff\1\165\1\157\2\141\1\172\1\126\2\uffff\1\172\1\144\1\uffff\1\172\2\uffff\1\160\1\uffff\1\172\1\uffff\1\172\1\141\1\154\1\145\1\162\1\164\1\156\2\164\1\uffff\1\141\1\uffff\1\172\1\uffff\1\172\2\uffff\1\171\1\114\1\154\1\145\1\172\1\107\2\157\1\154\2\uffff\1\157\1\141\1\172\1\146\1\uffff\3\162\1\151\1\165\1\171\1\uffff\1\151\1\157\2\172\1\144\1\164\1\157\1\170\1\165\2\uffff\1\141\1\172\1\165\1\172\1\160\1\164\1\uffff\1\164\1\uffff\1\172\1\157\1\172\1\uffff\1\162\1\uffff\1\172\1\uffff";
     static final String DFA21_acceptS =
-        "\3\uffff\1\3\4\uffff\1\11\1\12\11\uffff\1\25\1\26\5\uffff\1\42\1\44\5\uffff\1\131\14\uffff\1\u00a9\5\uffff\1\u00e4\2\u00e5\1\u00e8\1\u00e9\2\uffff\1\u00e4\6\uffff\1\3\13\uffff\1\7\1\u00a6\1\u009f\1\11\1\12\4\uffff\1\u00a7\1\15\11\uffff\1\u009d\1\21\1\22\1\u008e\1\u009a\1\u00a0\1\u0092\1\23\1\uffff\1\24\1\25\1\26\25\uffff\1\42\1\44\20\uffff\1\131\6\uffff\1\u009c\1\u008d\1\u008f\1\u00a2\1\u00a1\1\u0090\1\u00e6\1\u00e7\1\u00a3\1\u0091\1\u00a4\1\u0093\1\u00aa\1\u0094\1\u00c4\1\uffff\1\u00a5\1\u009e\1\u00a8\1\u00c3\1\u00a9\2\uffff\1\u00e1\1\uffff\1\u00e2\1\u00e3\1\u00e5\1\u00e8\10\uffff\1\54\4\uffff\1\u00ab\7\uffff\1\5\1\uffff\1\40\16\uffff\1\u00b1\12\uffff\1\u009b\1\30\1\27\101\uffff\1\u0097\1\u0095\1\u0098\1\u0096\20\uffff\1\u00b3\1\u00b2\4\uffff\1\u0082\13\uffff\1\37\3\uffff\1\u00cb\27\uffff\1\u00b8\65\uffff\1\101\2\uffff\1\u00bf\24\uffff\1\53\1\60\21\uffff\1\65\5\uffff\1\u00c5\2\uffff\1\u0081\6\uffff\1\u00ac\1\17\4\uffff\1\20\15\uffff\1\u00d0\1\uffff\1\u00bb\15\uffff\1\177\15\uffff\1\u00af\4\uffff\1\u008a\4\uffff\1\124\1\133\6\uffff\1\u00ca\1\uffff\1\76\4\uffff\1\u00ba\1\uffff\1\u00c7\1\u00d9\1\u00da\1\u00db\1\u00dc\6\uffff\1\u00cd\1\uffff\1\107\6\uffff\1\155\12\uffff\1\52\1\165\2\uffff\1\104\2\uffff\1\u00dd\1\u00de\1\u00df\1\u00e0\1\uffff\1\u00b9\21\uffff\1\167\31\uffff\1\u00b7\5\uffff\1\121\6\uffff\1\u00c2\5\uffff\1\162\1\uffff\1\u00cc\5\uffff\1\u00cf\4\uffff\1\157\2\uffff\1\u00bd\5\uffff\1\u00b0\3\uffff\1\132\2\uffff\1\2\11\uffff\1\135\3\uffff\1\u008c\6\uffff\1\111\11\uffff\1\163\25\uffff\1\113\1\uffff\1\105\2\uffff\1\63\1\u00b5\4\uffff\1\u00ad\1\uffff\1\u00ce\4\uffff\1\u00be\7\uffff\1\u0080\5\uffff\1\57\5\uffff\1\u00c9\3\uffff\1\u00bc\10\uffff\1\1\5\uffff\1\45\4\uffff\1\10\6\uffff\1\u00c0\6\uffff\1\u00ae\3\uffff\1\u00b4\1\uffff\1\153\1\u00d1\1\u00d2\1\u00d3\1\u00d4\5\uffff\1\70\1\114\37\uffff\1\62\1\176\1\110\11\uffff\1\u00d5\1\u00d6\1\u00d7\1\u00d8\13\uffff\1\130\3\uffff\1\156\15\uffff\1\u00c6\33\uffff\1\103\1\106\1\uffff\1\166\2\uffff\1\64\2\uffff\1\50\1\uffff\1\47\2\uffff\1\u0084\13\uffff\1\102\1\uffff\1\151\6\uffff\1\173\14\uffff\1\13\1\uffff\1\152\5\uffff\1\u00b6\1\uffff\1\141\1\uffff\1\u00c8\2\uffff\1\164\13\uffff\1\41\6\uffff\1\144\6\uffff\1\100\1\117\3\uffff\1\120\2\uffff\1\116\7\uffff\1\146\1\uffff\1\u0099\1\uffff\1\u008b\2\uffff\1\34\3\uffff\1\14\2\uffff\1\16\2\uffff\1\175\1\uffff\1\31\3\uffff\1\171\2\uffff\1\32\1\uffff\1\33\13\uffff\1\55\4\uffff\1\123\2\uffff\1\61\5\uffff\1\u0088\2\uffff\1\154\6\uffff\1\140\6\uffff\1\36\4\uffff\1\75\1\uffff\1\150\2\uffff\1\136\31\uffff\1\170\6\uffff\1\u0083\1\174\1\112\2\uffff\1\u00c1\2\uffff\1\134\1\137\14\uffff\1\122\3\uffff\1\74\1\142\5\uffff\1\115\1\43\1\uffff\1\160\7\uffff\1\125\1\126\7\uffff\1\4\1\66\2\uffff\1\51\1\uffff\1\161\1\172\2\uffff\1\143\10\uffff\1\u0087\1\uffff\1\147\1\6\1\uffff\1\56\1\uffff\1\35\11\uffff\1\145\1\46\4\uffff\1\71\6\uffff\1\77\11\uffff\1\u0085\1\u0086\6\uffff\1\67\1\uffff\1\127\3\uffff\1\73\1\uffff\1\72\1\uffff\1\u0089";
+        "\4\uffff\1\4\2\uffff\1\10\1\11\11\uffff\1\24\1\25\5\uffff\1\41\1\43\6\uffff\1\132\5\uffff\1\u0094\1\uffff\1\u0096\13\uffff\1\u00e9\2\u00ea\1\u00ed\1\u00ee\2\uffff\1\u00e9\10\uffff\1\4\3\uffff\1\6\1\u00ae\1\u00a8\1\10\1\11\4\uffff\1\u00af\1\14\11\uffff\1\u00a6\1\20\1\21\1\u0097\1\u00a3\1\u00a9\1\u009b\1\22\1\uffff\1\23\1\24\1\25\27\uffff\1\41\1\43\26\uffff\1\132\5\uffff\1\u0098\1\u00aa\1\u0092\1\u0094\1\uffff\1\u00a5\1\u0095\1\u0096\1\u0099\1\u00eb\1\u00ec\1\u00ab\1\u009a\1\u00ac\1\u009c\1\u00b1\1\u009d\1\u00c9\1\uffff\1\u00ad\1\u00a7\1\u00b0\1\u00c8\2\uffff\1\u00e6\1\uffff\1\u00e7\1\u00e8\1\u00ea\1\u00ed\14\uffff\1\3\1\uffff\1\37\17\uffff\1\u00b8\12\uffff\1\u00a4\1\27\1\26\14\uffff\1\u0093\31\uffff\1\54\6\uffff\1\u00b2\37\uffff\1\u00a0\1\u009e\1\u00a1\1\u009f\11\uffff\1\u00ba\1\u00b9\4\uffff\1\u0084\13\uffff\1\36\3\uffff\1\u00d0\30\uffff\1\u00bd\76\uffff\1\102\2\uffff\1\u00c4\37\uffff\1\66\5\uffff\1\u00ca\3\uffff\1\u0083\6\uffff\1\u00b3\1\16\4\uffff\1\17\16\uffff\1\u00d5\1\uffff\1\u00c0\16\uffff\1\u0081\14\uffff\1\53\1\60\7\uffff\1\u00b6\4\uffff\1\u008c\4\uffff\1\125\1\134\6\uffff\1\u00cf\1\uffff\1\77\4\uffff\1\u00bf\1\uffff\1\u00cc\1\u00de\1\u00df\1\u00e0\1\u00e1\6\uffff\1\u00d2\1\uffff\1\110\12\uffff\1\51\1\167\2\uffff\1\105\2\uffff\1\u00e2\1\u00e3\1\u00e4\1\u00e5\1\uffff\1\u00be\22\uffff\1\171\32\uffff\1\u00bc\6\uffff\1\122\10\uffff\1\156\4\uffff\1\u00c7\5\uffff\1\164\1\uffff\1\u00d1\5\uffff\1\u00d4\4\uffff\1\160\2\uffff\1\u00c2\5\uffff\1\u00b7\3\uffff\1\133\6\uffff\1\136\3\uffff\1\u008e\7\uffff\1\112\11\uffff\1\165\26\uffff\1\114\1\uffff\1\106\2\uffff\1\64\1\u0090\5\uffff\1\u00b4\1\uffff\1\u00d3\4\uffff\1\u00c3\5\uffff\1\u008f\7\uffff\1\u0082\5\uffff\1\57\5\uffff\1\u00ce\3\uffff\1\u00c1\10\uffff\1\1\5\uffff\1\7\6\uffff\1\u00c5\4\uffff\1\52\2\uffff\1\u00b5\4\uffff\1\u00bb\1\154\1\u00d6\1\u00d7\1\u00d8\1\u00d9\5\uffff\1\71\1\115\35\uffff\1\44\10\uffff\1\63\1\u0080\1\111\11\uffff\1\u00da\1\u00db\1\u00dc\1\u00dd\13\uffff\1\131\15\uffff\1\u00cb\34\uffff\1\104\1\107\2\uffff\1\170\2\uffff\1\65\2\uffff\1\47\1\uffff\1\157\3\uffff\1\46\2\uffff\1\u0086\13\uffff\1\103\1\uffff\1\152\6\uffff\1\175\11\uffff\1\12\1\uffff\1\153\5\uffff\1\u0091\1\uffff\1\142\1\uffff\1\u00cd\2\uffff\1\166\2\uffff\1\61\11\uffff\1\40\7\uffff\1\145\11\uffff\1\101\1\120\3\uffff\1\121\2\uffff\1\117\10\uffff\1\u008d\2\uffff\1\33\3\uffff\1\13\2\uffff\1\15\2\uffff\1\177\1\uffff\1\30\3\uffff\1\173\2\uffff\1\31\1\uffff\1\32\13\uffff\1\147\1\uffff\1\u00a2\1\uffff\1\55\4\uffff\1\124\2\uffff\1\62\5\uffff\1\u008a\2\uffff\1\155\5\uffff\1\141\6\uffff\1\35\4\uffff\1\76\1\uffff\1\151\2\uffff\1\137\32\uffff\1\172\6\uffff\1\u0085\1\176\1\113\3\uffff\1\u00c6\2\uffff\1\135\1\uffff\1\140\14\uffff\1\123\2\uffff\1\75\1\143\5\uffff\1\116\1\42\1\uffff\1\161\11\uffff\1\126\1\127\6\uffff\1\2\1\67\2\uffff\1\50\1\uffff\1\162\1\174\1\uffff\1\163\1\uffff\1\144\11\uffff\1\u0089\1\uffff\1\5\1\uffff\1\56\1\uffff\1\34\1\150\11\uffff\1\146\1\45\4\uffff\1\72\6\uffff\1\100\11\uffff\1\u0087\1\u0088\6\uffff\1\70\1\uffff\1\130\3\uffff\1\74\1\uffff\1\73\1\uffff\1\u008b";
     static final String DFA21_specialS =
-        "\1\0\u050d\uffff}>";
+        "\1\0\u052d\uffff}>";
     static final String[] DFA21_transitionS = {
-            "\11\70\2\67\2\70\1\67\22\70\1\67\1\54\1\65\1\56\1\64\1\51\1\53\1\66\1\32\1\33\1\47\1\7\1\41\1\20\1\22\1\50\1\61\11\62\1\13\1\3\1\17\1\46\1\21\1\55\1\70\1\64\1\45\2\64\1\44\7\64\1\42\4\64\1\43\10\64\1\23\1\70\1\24\1\63\1\64\1\70\1\5\1\15\1\34\1\12\1\14\1\6\1\36\1\37\1\2\2\64\1\16\1\35\1\26\1\27\1\1\1\64\1\31\1\30\1\40\1\25\1\4\1\57\1\64\1\60\1\64\1\10\1\52\1\11\uff82\70",
-            "\1\71\20\uffff\1\72",
-            "\1\77\61\uffff\1\76\1\75\1\uffff\1\101\6\uffff\1\74\1\100",
+            "\11\71\2\70\2\71\1\70\22\71\1\70\1\56\1\66\1\51\1\65\1\53\1\55\1\67\1\31\1\32\1\46\1\6\1\41\1\17\1\21\1\52\1\62\11\63\1\12\1\4\1\16\1\50\1\20\1\57\1\47\1\65\1\45\2\65\1\44\7\65\1\42\4\65\1\43\10\65\1\22\1\71\1\23\1\64\1\65\1\71\1\3\1\14\1\34\1\11\1\13\1\5\1\36\1\37\1\33\2\65\1\15\1\35\1\25\1\26\1\1\1\65\1\30\1\27\1\40\1\24\1\2\1\60\1\65\1\61\1\65\1\7\1\54\1\10\uff82\71",
+            "\1\72\20\uffff\1\73",
+            "\1\75\3\uffff\1\77\3\uffff\1\76",
+            "\1\101\7\uffff\1\103\6\uffff\1\100\1\102\1\104",
             "",
-            "\1\103\3\uffff\1\105\3\uffff\1\104",
-            "\1\107\7\uffff\1\111\6\uffff\1\106\1\110\1\112",
-            "\1\115\7\uffff\1\113\5\uffff\1\114",
-            "\1\117\21\uffff\1\116",
+            "\1\110\7\uffff\1\106\5\uffff\1\107",
+            "\1\112\21\uffff\1\111",
             "",
             "",
-            "\1\123\3\uffff\1\125\3\uffff\1\124\5\uffff\1\126",
-            "\1\127",
-            "\1\133\11\uffff\1\131\1\uffff\1\132",
-            "\1\134\5\uffff\1\137\2\uffff\1\135\2\uffff\1\136",
-            "\1\141\7\uffff\1\140",
-            "\1\142",
-            "\1\144\17\uffff\1\145\1\146",
-            "\1\150",
-            "\1\152",
+            "\1\116\3\uffff\1\120\3\uffff\1\117\5\uffff\1\121",
+            "\1\122",
+            "\1\126\11\uffff\1\124\1\uffff\1\125",
+            "\1\127\5\uffff\1\132\2\uffff\1\130\2\uffff\1\131",
+            "\1\134\7\uffff\1\133",
+            "\1\135",
+            "\1\137\17\uffff\1\140\1\141",
+            "\1\143",
+            "\1\145",
             "",
             "",
-            "\1\156\4\uffff\1\161\4\uffff\1\160\1\uffff\1\157",
-            "\1\162\3\uffff\1\163\11\uffff\1\164\5\uffff\1\165",
-            "\1\166",
-            "\1\167\2\uffff\1\170\1\177\5\uffff\1\175\1\172\3\uffff\1\171\1\173\1\uffff\1\174\1\uffff\1\176",
-            "\1\u0080\3\uffff\1\u0082\5\uffff\1\u0081",
+            "\1\151\4\uffff\1\154\4\uffff\1\153\1\uffff\1\152",
+            "\1\155\3\uffff\1\156\11\uffff\1\157\3\uffff\1\161\1\uffff\1\160",
+            "\1\162",
+            "\1\170\1\uffff\1\163\2\uffff\1\164\1\174\5\uffff\1\172\1\166\3\uffff\1\165\1\167\1\uffff\1\171\1\uffff\1\173",
+            "\1\175\3\uffff\1\177\5\uffff\1\176",
             "",
             "",
-            "\1\u0085\6\uffff\1\u0086\6\uffff\1\u0087",
-            "\1\u0089\7\uffff\1\u008a\5\uffff\1\u0088\5\uffff\1\u008b",
-            "\1\u008c",
-            "\1\u008d",
-            "\1\u008f\3\uffff\1\u0090\2\uffff\1\u0092\1\u0093\5\uffff\1\u0094\2\uffff\1\u0091\6\uffff\1\u008e",
+            "\1\u0084\61\uffff\1\u0083\1\u0082\1\uffff\1\u0087\6\uffff\1\u0085\1\u0086",
+            "\1\u0088\6\uffff\1\u0089\6\uffff\1\u008a",
+            "\1\u008c\7\uffff\1\u008d\5\uffff\1\u008b\5\uffff\1\u008e",
+            "\1\u008f",
+            "\1\u0090",
+            "\1\u0092\3\uffff\1\u0093\2\uffff\1\u0095\1\u0096\5\uffff\1\u0097\2\uffff\1\u0094\6\uffff\1\u0091",
             "",
-            "\1\u0096\7\uffff\1\u0097",
-            "\1\u0098",
-            "\1\u0099",
-            "\1\u009a",
-            "\1\u009b\1\u009c",
+            "\1\u0099\7\uffff\1\u009a",
+            "\1\u009b",
+            "\1\u009c",
+            "\1\u009d",
             "\1\u009f\22\uffff\1\u009e",
-            "\1\u00a2\4\uffff\1\u00a3\15\uffff\1\u00a1",
-            "\1\u00a5",
-            "\1\u00a7",
-            "\1\u00a9",
-            "\1\u00ab",
-            "\1\u00ae\13\uffff\1\u00ad",
             "",
-            "\1\u00b1",
-            "\1\u00b2",
-            "\12\u00b4\10\uffff\1\u00b6\1\uffff\3\u00b6\5\uffff\1\u00b6\13\uffff\1\u00b3\6\uffff\1\u00b4\2\uffff\1\u00b6\1\uffff\3\u00b6\5\uffff\1\u00b6\13\uffff\1\u00b3",
-            "\12\u00b4\10\uffff\1\u00b6\1\uffff\3\u00b6\5\uffff\1\u00b6\22\uffff\1\u00b4\2\uffff\1\u00b6\1\uffff\3\u00b6\5\uffff\1\u00b6",
-            "\1\73\34\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u00a2\1\u00a3",
+            "",
+            "\1\u00a7\4\uffff\1\u00a8\15\uffff\1\u00a6",
+            "\1\u00aa",
+            "\1\u00ac",
+            "\1\u00ae",
+            "\1\u00b0",
+            "\1\u00b3\13\uffff\1\u00b2",
+            "\1\u00b5",
+            "\1\u00b6",
+            "\12\u00b8\10\uffff\1\u00ba\1\uffff\3\u00ba\5\uffff\1\u00ba\13\uffff\1\u00b7\6\uffff\1\u00b8\2\uffff\1\u00ba\1\uffff\3\u00ba\5\uffff\1\u00ba\13\uffff\1\u00b7",
+            "\12\u00b8\10\uffff\1\u00ba\1\uffff\3\u00ba\5\uffff\1\u00ba\22\uffff\1\u00b8\2\uffff\1\u00ba\1\uffff\3\u00ba\5\uffff\1\u00ba",
+            "\1\74\34\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "",
             "",
             "",
             "",
             "",
-            "\1\u00b9\12\uffff\1\u00ba\4\uffff\1\u00bb",
-            "\1\u00bc\11\uffff\1\u00bd",
+            "\1\u00bd\12\uffff\1\u00be\4\uffff\1\u00bf",
+            "\1\u00c0\11\uffff\1\u00c1",
             "",
-            "\1\u00bf\16\uffff\1\u00be",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\4\73\1\u00c0\25\73",
-            "\1\u00c2",
-            "\1\u00c3",
-            "\1\u00c4\45\uffff\1\u00c5",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u00c2\5\uffff\1\u00c3",
+            "\1\u00c4\15\uffff\1\u00c5",
+            "\1\u00c6",
+            "\1\74\13\uffff\12\74\7\uffff\1\74\1\u00c7\30\74\4\uffff\1\74\1\uffff\2\74\1\u00c8\27\74",
+            "\1\u00ca",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\u00cc",
+            "\1\u00cd",
             "",
-            "\1\u00c7\5\uffff\1\u00c8",
-            "\1\u00c9\15\uffff\1\u00ca",
-            "\1\u00cb",
-            "\1\73\13\uffff\12\73\7\uffff\1\73\1\u00cc\30\73\4\uffff\1\73\1\uffff\2\73\1\u00cd\27\73",
-            "\1\u00cf",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\u00d1",
+            "\1\u00ce\6\uffff\1\u00d0\1\uffff\1\u00d1\3\uffff\1\u00cf",
             "\1\u00d2",
-            "\1\u00d3\6\uffff\1\u00d5\1\uffff\1\u00d6\3\uffff\1\u00d4",
-            "\1\u00d7",
-            "\1\u00d8",
+            "\1\u00d3",
             "",
             "",
             "",
             "",
             "",
-            "\1\u00d9\4\uffff\1\u00da",
-            "\1\u00db",
-            "\1\u00dd\2\uffff\1\u00de\14\uffff\1\u00dc",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u00d4\4\uffff\1\u00d5",
+            "\1\u00d7\21\uffff\1\u00d6",
+            "\1\u00d9\2\uffff\1\u00da\14\uffff\1\u00d8",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "",
             "",
+            "\1\u00dc",
+            "\1\u00dd\3\uffff\1\u00de",
+            "\1\u00df",
             "\1\u00e0",
-            "\1\u00e1\3\uffff\1\u00e2",
+            "\1\u00e1",
+            "\1\u00e2",
             "\1\u00e3",
             "\1\u00e4",
             "\1\u00e5",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
             "\1\u00e6",
-            "\1\u00e7",
-            "\1\u00e8",
+            "",
+            "",
+            "",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u00e9",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
             "\1\u00ea",
-            "",
-            "",
-            "",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u00eb",
+            "\1\u00ec",
             "\1\u00ed",
-            "\1\u00ee",
-            "\1\u00ef",
-            "\1\u00f0",
-            "\1\u00f1",
-            "\1\u00f2\5\uffff\1\u00f3\5\uffff\1\u00f4\40\uffff\1\u00f5",
-            "\1\u00f7\1\u00f6",
-            "\1\u00f8\16\uffff\1\u00f9",
-            "\1\u00fa\1\uffff\1\u00fc\10\uffff\1\u00fd\1\uffff\1\u00fb",
-            "\1\u00fe",
-            "\1\u0100\27\uffff\1\u00ff",
-            "\1\u0101",
-            "\1\u0102\10\uffff\1\u0103",
+            "\1\u00ee\1\uffff\1\u00ef\3\uffff\1\u00f0\5\uffff\1\u00f1\40\uffff\1\u00f2",
+            "\1\u00f4\1\u00f3",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\u00f6\16\uffff\1\u00f7",
+            "\1\u00f8\1\uffff\1\u00fa\10\uffff\1\u00fb\1\uffff\1\u00f9",
+            "\1\u00fc",
+            "\1\u00fe\27\uffff\1\u00fd",
+            "\1\u00ff",
+            "\1\u0100\10\uffff\1\u0101",
+            "\1\u0102",
+            "\1\u0103",
             "\1\u0104",
             "\1\u0105",
             "\1\u0106",
-            "\1\u0107",
-            "\1\u0109\4\uffff\1\u010b\1\u010a\5\uffff\1\u0108\6\uffff\1\u010c",
+            "\1\u0108\4\uffff\1\u010a\1\u0109\5\uffff\1\u0107\6\uffff\1\u010b",
+            "\1\u010c",
             "\1\u010d",
-            "\1\u010e",
             "",
             "",
-            "\1\u0110\2\uffff\1\u0111\1\u010f",
-            "\1\u0112",
-            "\1\u0116\7\uffff\1\u0113\1\u0115\1\u0114",
-            "\1\u0117\13\uffff\1\u0118",
-            "\1\u011a\4\uffff\1\u0119",
-            "\1\u011c\11\uffff\1\u011b",
-            "\1\u011d",
-            "\1\u011e",
-            "\1\u011f\2\uffff\1\u0120",
-            "\1\u0121",
-            "\1\u0122",
-            "\1\u0123",
-            "\1\u0124\3\uffff\1\u0125",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\4\74\1\u010e\25\74",
+            "\1\u0110",
+            "\1\u0111",
+            "\1\u0112\16\uffff\1\u0113",
+            "\1\u0114\45\uffff\1\u0115",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\u0118\2\uffff\1\u0119\1\u0117",
+            "\1\u011a",
+            "\1\u011e\7\uffff\1\u011b\1\u011d\1\u011c",
+            "\1\u011f\13\uffff\1\u0120",
+            "\1\u0122\4\uffff\1\u0121",
+            "\1\u0124\11\uffff\1\u0123",
+            "\1\u0125",
             "\1\u0126",
-            "\1\u0127",
-            "\1\u0128",
-            "",
+            "\1\u0127\2\uffff\1\u0128",
             "\1\u0129",
             "\1\u012a",
             "\1\u012b",
-            "\1\u012c",
-            "\1\u012d",
+            "\1\u012c\3\uffff\1\u012d",
             "\1\u012e",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
+            "\1\u012f",
             "\1\u0130",
             "",
-            "",
-            "",
-            "",
-            "",
+            "\1\u0131",
             "\1\u0132",
             "\1\u0133",
-            "",
-            "\12\u00b4\10\uffff\1\u00b6\1\uffff\3\u00b6\5\uffff\1\u00b6\22\uffff\1\u00b4\2\uffff\1\u00b6\1\uffff\3\u00b6\5\uffff\1\u00b6",
-            "",
-            "",
-            "",
-            "",
             "\1\u0134",
             "\1\u0135",
+            "",
+            "",
+            "",
+            "",
             "\1\u0136",
-            "\1\u0138\2\uffff\1\u0137",
-            "\1\u0139",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\u0138",
+            "",
+            "",
+            "",
+            "",
             "\1\u013a",
             "\1\u013b",
-            "\1\u013c",
             "",
+            "\12\u00b8\10\uffff\1\u00ba\1\uffff\3\u00ba\5\uffff\1\u00ba\22\uffff\1\u00b8\2\uffff\1\u00ba\1\uffff\3\u00ba\5\uffff\1\u00ba",
+            "",
+            "",
+            "",
+            "",
+            "\1\u013c",
             "\1\u013d",
             "\1\u013e",
-            "\1\u013f",
-            "\1\u0140",
-            "",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\10\73\1\u0141\21\73",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\u0144",
+            "\1\u0140\2\uffff\1\u013f",
+            "\1\u0141",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\10\74\1\u0142\21\74",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u0145",
             "\1\u0146",
             "\1\u0147",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u0148",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "",
-            "\1\u0149",
+            "\1\u014a",
             "",
-            "\1\u014b\5\uffff\1\u014a",
-            "\1\u014c",
+            "\1\u014c\5\uffff\1\u014b",
             "\1\u014d",
-            "\1\u014f\15\uffff\1\u014e",
-            "\1\u0151\7\uffff\1\u0150",
-            "\1\u0152",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\14\73\1\u0153\15\73",
-            "\1\u0155",
-            "\1\u0156\3\uffff\1\u0157",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\u0159",
+            "\1\u014e",
+            "\1\u0150\15\uffff\1\u014f",
+            "\1\u0152\7\uffff\1\u0151",
+            "\1\u0153",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\14\74\1\u0154\15\74",
+            "\1\u0156",
+            "\1\u0157\3\uffff\1\u0158",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u015a",
             "\1\u015b",
             "\1\u015c",
-            "",
             "\1\u015d",
             "\1\u015e",
+            "",
             "\1\u015f",
             "\1\u0160",
             "\1\u0161",
@@ -7684,16 +7822,16 @@
             "\1\u0164",
             "\1\u0165",
             "\1\u0166",
-            "",
-            "",
-            "",
             "\1\u0167",
             "\1\u0168",
+            "",
+            "",
+            "",
             "\1\u0169",
-            "\1\u016e\15\uffff\1\u016c\1\uffff\1\u016b\17\uffff\1\u016d\6\uffff\1\u016a",
-            "\1\73\13\uffff\12\73\7\uffff\10\73\1\u016f\21\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\u0171",
-            "\1\u0172",
+            "\1\u016a",
+            "\1\u016b",
+            "\1\u0170\15\uffff\1\u016e\1\uffff\1\u016d\17\uffff\1\u016f\6\uffff\1\u016c",
+            "\1\74\13\uffff\12\74\7\uffff\10\74\1\u0171\21\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u0173",
             "\1\u0174",
             "\1\u0175",
@@ -7701,6 +7839,7 @@
             "\1\u0177",
             "\1\u0178",
             "\1\u0179",
+            "",
             "\1\u017a",
             "\1\u017b",
             "\1\u017c",
@@ -7717,48 +7856,46 @@
             "\1\u0187",
             "\1\u0188",
             "\1\u0189",
-            "\1\u018b\21\uffff\1\u018a",
+            "\1\u018a",
+            "\1\u018b",
             "\1\u018c",
             "\1\u018d",
-            "\1\u018e",
-            "\1\u0190\1\uffff\1\u018f",
+            "\1\u018f\21\uffff\1\u018e",
+            "\1\u0190",
             "\1\u0191",
             "\1\u0192",
             "\1\u0193",
+            "",
             "\1\u0194",
             "\1\u0195",
             "\1\u0196",
             "\1\u0197",
             "\1\u0198",
             "\1\u0199",
-            "\1\u019a",
-            "\1\u019b",
-            "\1\u019c\50\uffff\1\u019d",
+            "",
+            "\1\u019b\1\uffff\1\u019a",
+            "\1\u019c",
+            "\1\u019d",
             "\1\u019e",
             "\1\u019f",
             "\1\u01a0",
             "\1\u01a1",
             "\1\u01a2",
             "\1\u01a3",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\13\73\1\u01a5\6\73\1\u01a4\7\73",
-            "\1\u01a7",
-            "\1\u01a8",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u01a4",
+            "\1\u01a5",
+            "\1\u01a6",
+            "\1\u01a7\50\uffff\1\u01a8",
+            "\1\u01a9",
             "\1\u01aa",
             "\1\u01ab",
             "\1\u01ac",
             "\1\u01ad",
             "\1\u01ae",
-            "\1\u01af",
-            "\1\u01b0",
-            "\1\u01b1",
-            "",
-            "",
-            "",
-            "",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\13\74\1\u01b0\6\74\1\u01af\7\74",
             "\1\u01b2",
             "\1\u01b3",
-            "\1\u01b4",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u01b5",
             "\1\u01b6",
             "\1\u01b7",
@@ -7767,21 +7904,26 @@
             "\1\u01ba",
             "\1\u01bb",
             "\1\u01bc",
-            "\1\73\13\uffff\12\73\7\uffff\17\73\1\u01bd\12\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "",
+            "",
+            "",
+            "",
+            "\1\u01bd",
+            "\1\u01be",
+            "\1\u01bf",
             "\1\u01c0",
             "\1\u01c1",
             "\1\u01c2",
-            "",
-            "",
             "\1\u01c3",
             "\1\u01c4",
             "\1\u01c5",
-            "\1\u01c6",
             "",
+            "",
+            "\1\u01c6",
             "\1\u01c7",
             "\1\u01c8",
             "\1\u01c9",
+            "",
             "\1\u01ca",
             "\1\u01cb",
             "\1\u01cc",
@@ -7789,47 +7931,47 @@
             "\1\u01ce",
             "\1\u01cf",
             "\1\u01d0",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "",
+            "\1\u01d1",
             "\1\u01d2",
-            "\1\u01d3\61\uffff\1\u01d4",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\5\73\1\u01d5\15\73\1\u01d6\6\73",
+            "\1\u01d3",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "",
-            "\1\u01d8",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\21\73\1\u01d9\10\73",
+            "\1\u01d5",
+            "\1\u01d6\61\uffff\1\u01d7",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\5\74\1\u01d8\15\74\1\u01d9\6\74",
+            "",
             "\1\u01db",
             "\1\u01dc",
-            "\1\u01dd",
-            "\1\u01de",
-            "\1\u01e0\3\uffff\1\u01df",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\u01e3",
-            "\1\u01e4",
-            "\1\u01e5",
-            "\1\73\13\uffff\12\73\7\uffff\22\73\1\u01e6\7\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\21\74\1\u01dd\10\74",
+            "\1\u01df",
+            "\1\u01e0",
+            "\1\u01e1",
+            "\1\u01e2",
+            "\1\u01e4\3\uffff\1\u01e3",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\u01e7",
             "\1\u01e8",
             "\1\u01e9",
-            "\1\u01ea",
-            "\1\u01eb",
+            "\1\74\13\uffff\12\74\7\uffff\22\74\1\u01ea\7\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u01ec",
             "\1\u01ed",
             "\1\u01ee",
             "\1\u01ef",
             "\1\u01f0",
             "\1\u01f1",
-            "",
             "\1\u01f2",
             "\1\u01f3",
             "\1\u01f4",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u01f5",
+            "",
             "\1\u01f6",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u01f7",
             "\1\u01f8",
             "\1\u01f9",
-            "\1\u01fa",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u01fb",
-            "\1\u01fc",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u01fd",
             "\1\u01fe",
             "\1\u01ff",
@@ -7838,13 +7980,13 @@
             "\1\u0202",
             "\1\u0203",
             "\1\u0204",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u0205",
             "\1\u0206",
             "\1\u0207",
             "\1\u0208",
             "\1\u0209",
             "\1\u020a",
-            "\1\u020b",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u020c",
             "\1\u020d",
             "\1\u020e",
@@ -7852,108 +7994,104 @@
             "\1\u0210",
             "\1\u0211",
             "\1\u0212",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u0213",
             "\1\u0214",
             "\1\u0215",
             "\1\u0216",
-            "\1\u0217",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\u0219",
+            "\1\74\13\uffff\12\74\7\uffff\17\74\1\u0217\12\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u021a",
             "\1\u021b",
-            "\1\73\13\uffff\12\73\3\uffff\1\u021d\3\uffff\32\73\4\uffff\1\73\1\uffff\4\73\1\u021c\25\73",
+            "\1\u021c",
+            "\1\u021d",
+            "\1\u021e",
             "\1\u021f",
             "\1\u0220",
-            "\1\u0221",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u0222",
             "\1\u0223",
             "\1\u0224",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\16\73\1\u0226\13\73",
+            "\1\u0225",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\u0227",
             "\1\u0228",
             "\1\u0229",
-            "",
-            "\1\u022b\4\uffff\1\u022a",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "",
+            "\1\74\13\uffff\12\74\3\uffff\1\u022b\3\uffff\32\74\4\uffff\1\74\1\uffff\4\74\1\u022a\25\74",
             "\1\u022d",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\u022f\2\uffff\1\u0232\5\uffff\1\u0230\5\uffff\1\u0231",
-            "\1\u0233",
-            "\1\u0234",
-            "\1\u0235",
+            "\1\u022e",
+            "\1\u022f",
+            "\1\u0230",
+            "\1\u0231",
+            "\1\u0232",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\16\74\1\u0234\13\74",
             "\1\u0236",
             "\1\u0237",
-            "\1\u0238",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\u023a",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\u023c",
-            "\1\u023d",
-            "\1\u023e",
-            "\1\u023f",
-            "\1\u0240",
-            "\1\73\13\uffff\12\73\7\uffff\5\73\1\u0241\24\73\4\uffff\1\73\1\uffff\32\73",
+            "",
+            "\1\u0239\4\uffff\1\u0238",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "",
+            "\1\u023b",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\u023d\2\uffff\1\u0240\5\uffff\1\u023e\5\uffff\1\u023f",
+            "\1\u0241",
+            "\1\u0242",
             "\1\u0243",
             "\1\u0244",
-            "",
-            "",
             "\1\u0245",
             "\1\u0246",
-            "\1\u0247",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u0248",
-            "\1\u0249",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u024a",
             "\1\u024b",
             "\1\u024c",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u024d",
+            "\1\u024e",
             "\1\u024f",
             "\1\u0250",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u0251",
             "\1\u0252",
             "\1\u0253",
-            "\1\u0254\2\uffff\1\u0257\5\uffff\1\u0255\5\uffff\1\u0256",
-            "\1\u0258",
-            "",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\u0256",
+            "\1\u0257",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\u0259",
             "\1\u025a",
-            "\1\u025b",
-            "\1\u025c",
-            "\1\u025d",
-            "",
-            "\1\u025e",
+            "\1\u025b\2\uffff\1\u025e\5\uffff\1\u025c\5\uffff\1\u025d",
             "\1\u025f",
             "",
-            "\1\u0260",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u0261",
             "\1\u0262",
             "\1\u0263",
             "\1\u0264",
-            "\1\u0265\16\uffff\1\u0266",
             "",
-            "",
+            "\1\u0265",
+            "\1\u0266",
             "\1\u0267",
+            "",
             "\1\u0268",
             "\1\u0269",
             "\1\u026a",
-            "",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u026b",
             "\1\u026c",
-            "\1\u026d",
-            "\1\u026e",
+            "\1\u026e\16\uffff\1\u026d",
+            "",
+            "",
             "\1\u026f",
             "\1\u0270",
             "\1\u0271",
             "\1\u0272",
-            "\1\u0273",
+            "",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u0274",
             "\1\u0275",
             "\1\u0276",
             "\1\u0277",
-            "",
             "\1\u0278",
-            "",
             "\1\u0279",
             "\1\u027a",
             "\1\u027b",
@@ -7962,114 +8100,115 @@
             "\1\u027e",
             "\1\u027f",
             "\1\u0280",
-            "\1\u0281",
-            "\1\u0283\43\uffff\1\u0282",
-            "\1\u0284",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\u0286",
             "",
+            "\1\u0281",
+            "",
+            "\1\u0282",
+            "\1\u0283",
+            "\1\u0284",
+            "\1\u0285",
+            "\1\u0286",
             "\1\u0287",
             "\1\u0288",
             "\1\u0289",
             "\1\u028a",
-            "\1\u028b",
-            "\1\u028c",
+            "\1\u028c\43\uffff\1\u028b",
             "\1\u028d",
-            "\1\u028e",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u028f",
             "\1\u0290",
-            "\1\u0291",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\u0293",
             "",
-            "\1\u0294\35\uffff\1\u0295",
+            "\1\u0291",
+            "\1\u0292",
+            "\1\u0293",
+            "\1\u0294",
+            "\1\u0295",
             "\1\u0296",
             "\1\u0297",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "",
+            "\1\u0298",
             "\1\u0299",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u029a",
             "\1\u029b",
             "\1\u029c",
             "",
             "",
-            "\1\u029d",
-            "\1\u029e",
+            "\1\74\13\uffff\12\74\7\uffff\5\74\1\u029d\24\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u029f",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u02a0",
             "\1\u02a1",
             "\1\u02a2",
-            "",
-            "\1\u02a3",
-            "",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u02a4",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\u02a6",
+            "",
+            "\1\u02a5\35\uffff\1\u02a6",
             "\1\u02a7",
+            "\1\u02a8",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "\1\u02a9",
             "\1\u02aa",
-            "\1\u02ab",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u02ac",
             "\1\u02ad",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
             "",
+            "",
+            "\1\u02ae",
             "\1\u02af",
-            "",
             "\1\u02b0",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\4\73\1\u02b1\25\73",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\u02b2",
             "\1\u02b3",
-            "\1\u02b4",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\u02b6",
             "",
+            "\1\u02b4",
+            "",
+            "\1\u02b5",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u02b7",
             "\1\u02b8",
-            "\1\u02b9",
+            "",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "",
+            "",
+            "",
+            "",
+            "",
             "\1\u02ba",
             "\1\u02bb",
             "\1\u02bc",
             "\1\u02bd",
             "\1\u02be",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "",
             "\1\u02c0",
             "",
-            "",
             "\1\u02c1",
-            "\1\u02c2",
-            "",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\4\74\1\u02c2\25\74",
             "\1\u02c4",
-            "",
-            "",
-            "",
-            "",
             "\1\u02c5",
-            "",
             "\1\u02c6",
             "\1\u02c7",
             "\1\u02c8",
             "\1\u02c9",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u02cb",
+            "",
+            "",
             "\1\u02cc",
             "\1\u02cd",
-            "\1\u02ce",
+            "",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u02cf",
+            "",
+            "",
+            "",
+            "",
             "\1\u02d0",
+            "",
             "\1\u02d1",
             "\1\u02d2",
             "\1\u02d3",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u02d4",
             "\1\u02d5",
-            "\1\u02d6",
-            "",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u02d7",
             "\1\u02d8",
             "\1\u02d9",
@@ -8079,282 +8218,279 @@
             "\1\u02dd",
             "\1\u02de",
             "\1\u02df",
-            "\1\u02e0",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u02e1",
             "\1\u02e2",
+            "",
             "\1\u02e3",
             "\1\u02e4",
             "\1\u02e5",
-            "\1\73\13\uffff\12\73\7\uffff\17\73\1\u02e7\6\73\1\u02e6\3\73\4\uffff\1\73\1\uffff\3\73\1\u02e8\1\73\1\u02e9\24\73",
+            "\1\u02e6",
+            "\1\u02e7",
+            "\1\u02e8",
+            "\1\u02e9",
+            "\1\u02ea",
             "\1\u02eb",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u02ec",
             "\1\u02ed",
             "\1\u02ee",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u02ef",
+            "\1\u02f0",
             "\1\u02f1",
             "\1\u02f2",
-            "\1\u02f3",
-            "",
-            "\1\73\13\uffff\12\73\7\uffff\10\73\1\u02f4\21\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\u02f6",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\74\13\uffff\12\74\7\uffff\17\74\1\u02f4\6\74\1\u02f3\3\74\4\uffff\1\74\1\uffff\3\74\1\u02f5\1\74\1\u02f6\24\74",
             "\1\u02f8",
-            "\1\u02f9",
-            "",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u02fa",
             "\1\u02fb",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\u02fd",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u02fe",
             "\1\u02ff",
-            "",
             "\1\u0300",
+            "",
             "\1\u0301",
-            "\1\u0302",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\22\73\1\u0303\7\73",
-            "\1\u0305",
+            "\1\74\13\uffff\12\74\7\uffff\10\74\1\u0302\21\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\u0304",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\u0306",
+            "\1\u0307",
             "",
-            "\1\73\13\uffff\12\73\7\uffff\7\73\1\u0307\12\73\1\u0308\1\u0309\1\73\1\u0306\4\73\4\uffff\1\73\1\uffff\32\73",
-            "",
+            "\1\u0308",
+            "\1\u0309",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u030b",
-            "\1\u030e\11\uffff\1\u030d\5\uffff\1\u030c",
+            "\1\u030c",
+            "\1\u030d",
+            "\1\u030e",
             "\1\u030f",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\u0311",
             "",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\u0311",
             "\1\u0312",
             "\1\u0313",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "",
+            "\1\u0314",
             "\1\u0315",
-            "",
             "\1\u0316",
-            "\1\u0317",
-            "",
-            "\1\u0318",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\22\74\1\u0317\7\74",
             "\1\u0319",
-            "\1\u031a",
-            "\1\u031b",
-            "\1\u031c",
             "",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\u031e",
+            "\1\74\13\uffff\12\74\7\uffff\7\74\1\u031b\12\74\1\u031c\1\u031d\1\74\1\u031a\4\74\4\uffff\1\74\1\uffff\32\74",
+            "",
             "\1\u031f",
-            "",
-            "\1\u0320",
-            "\1\u0321",
-            "",
-            "\1\u0322",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\u0324",
+            "\1\u0322\11\uffff\1\u0321\5\uffff\1\u0320",
+            "\1\u0323",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u0325",
+            "",
             "\1\u0326",
             "\1\u0327",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u0329",
-            "\1\u032a",
             "",
+            "\1\u032a",
             "\1\u032b",
+            "",
             "\1\u032c",
             "\1\u032d",
-            "",
             "\1\u032e",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u032f",
             "\1\u0330",
-            "\1\u0331",
+            "",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u0332",
             "\1\u0333",
             "",
             "\1\u0334",
             "\1\u0335",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\u0337",
+            "\1\u0336",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u0338",
             "\1\u0339",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\u033b",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
             "",
-            "\1\u033d\2\uffff\1\u0340\5\uffff\1\u033e\5\uffff\1\u033f",
+            "\1\u033a",
+            "\1\u033b",
+            "\1\u033c",
+            "",
+            "\1\u033d",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\u033f",
+            "\1\u0340",
             "\1\u0341",
             "\1\u0342",
-            "\1\u0343",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "",
             "\1\u0344",
             "\1\u0345",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\u0347",
             "\1\u0348",
             "\1\u0349",
             "\1\u034a",
-            "\1\u034b",
-            "\1\u034c",
-            "\1\u034d",
-            "\1\u034e",
-            "\1\u034f",
-            "\1\u0350",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "",
+            "\1\u034d\2\uffff\1\u0350\5\uffff\1\u034e\5\uffff\1\u034f",
             "\1\u0351",
             "\1\u0352",
             "\1\u0353",
             "\1\u0354",
-            "",
             "\1\u0355",
-            "",
-            "\1\u0356",
-            "\1\u0357",
-            "",
-            "",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u0358",
             "\1\u0359",
             "\1\u035a",
             "\1\u035b",
-            "",
             "\1\u035c",
-            "",
             "\1\u035d",
             "\1\u035e",
             "\1\u035f",
             "\1\u0360",
-            "",
             "\1\u0361",
             "\1\u0362",
             "\1\u0363",
             "\1\u0364",
             "\1\u0365",
-            "\1\u0366",
-            "\1\73\13\uffff\12\73\3\uffff\1\u0367\3\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
             "",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u0366",
+            "",
+            "\1\u0367",
+            "\1\u0368",
+            "",
+            "",
+            "\1\u0369",
             "\1\u036a",
             "\1\u036b",
             "\1\u036c",
             "\1\u036d",
             "",
             "\1\u036e",
+            "",
             "\1\u036f",
             "\1\u0370",
             "\1\u0371",
             "\1\u0372",
             "",
-            "\1\u0373\2\uffff\1\u0376\5\uffff\1\u0374\5\uffff\1\u0375",
+            "\1\u0373",
+            "\1\u0374",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\u0376",
             "\1\u0377",
-            "\1\u0378",
             "",
+            "\1\u0378",
             "\1\u0379",
             "\1\u037a",
             "\1\u037b",
             "\1\u037c",
             "\1\u037d",
-            "\1\u037e",
-            "\1\u037f",
-            "\1\u0380",
+            "\1\74\13\uffff\12\74\3\uffff\1\u037e\3\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u0381",
             "\1\u0382",
             "\1\u0383",
             "\1\u0384",
-            "\1\u0385",
             "",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u0385",
+            "\1\u0386",
             "\1\u0387",
             "\1\u0388",
             "\1\u0389",
             "",
-            "\1\u038a",
-            "\1\u038c\4\uffff\1\u038b",
-            "\1\u038d",
+            "\1\u038a\2\uffff\1\u038d\5\uffff\1\u038b\5\uffff\1\u038c",
             "\1\u038e",
             "\1\u038f",
-            "\1\u0390",
             "",
+            "\1\u0390",
             "\1\u0391",
             "\1\u0392",
             "\1\u0393",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u0394",
             "\1\u0395",
             "\1\u0396",
-            "",
             "\1\u0397",
+            "",
             "\1\u0398",
             "\1\u0399",
-            "",
             "\1\u039a",
-            "",
-            "",
-            "",
-            "",
-            "",
             "\1\u039b",
             "\1\u039c",
+            "",
             "\1\u039d",
-            "\1\u039e",
-            "\1\u039f",
-            "",
-            "",
+            "\1\u039f\4\uffff\1\u039e",
             "\1\u03a0",
             "\1\u03a1",
             "\1\u03a2",
             "\1\u03a3",
+            "",
             "\1\u03a4",
             "\1\u03a5",
             "\1\u03a6",
-            "\1\u03a7",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "",
             "\1\u03a8",
             "\1\u03a9",
+            "",
             "\1\u03aa",
             "\1\u03ab",
             "\1\u03ac",
             "\1\u03ad",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
             "\1\u03ae",
             "\1\u03af",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u03b0",
+            "\1\u03b1",
             "\1\u03b2",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "",
+            "",
+            "\1\u03b3",
             "\1\u03b4",
             "\1\u03b5",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u03b6",
             "\1\u03b7",
             "\1\u03b8",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u03b9",
             "\1\u03ba",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u03bb",
             "\1\u03bc",
             "\1\u03bd",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "",
-            "",
-            "",
+            "\1\u03be",
             "\1\u03bf",
             "\1\u03c0",
             "\1\u03c1",
             "\1\u03c2",
             "\1\u03c3",
-            "\1\u03c4",
-            "\1\u03c5",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u03c6",
             "\1\u03c7",
-            "",
-            "",
-            "",
-            "",
-            "\1\u03c8",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u03c9",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\u03cb",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u03ca",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\u03cc",
             "\1\u03cd",
-            "\1\u03ce",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u03cf",
-            "\1\u03d0",
+            "",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u03d1",
             "\1\u03d2",
-            "",
             "\1\u03d3",
-            "\1\u03d4",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u03d5",
-            "",
             "\1\u03d6",
-            "\1\u03d7",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "",
+            "",
+            "",
             "\1\u03d8",
             "\1\u03d9",
             "\1\u03da",
@@ -8363,56 +8499,54 @@
             "\1\u03dd",
             "\1\u03de",
             "\1\u03df",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\u03e1",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u03e0",
             "",
-            "\1\u03e3",
+            "",
+            "",
+            "",
+            "\1\u03e1",
+            "\1\u03e2",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u03e4",
-            "\1\u03e5",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u03e6",
             "\1\u03e7",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u03e8",
             "\1\u03e9",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u03ea",
             "\1\u03eb",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "",
+            "\1\u03ec",
             "\1\u03ed",
             "\1\u03ee",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u03ef",
             "\1\u03f0",
             "\1\u03f1",
             "\1\u03f2",
             "\1\u03f3",
             "\1\u03f4",
             "\1\u03f5",
-            "\1\u03f6",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u03f7",
-            "\1\u03f8",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "",
             "\1\u03f9",
             "\1\u03fa",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u03fb",
             "\1\u03fc",
             "\1\u03fd",
-            "",
-            "",
-            "\1\u03fe",
-            "",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u03ff",
-            "\1\u0400",
-            "",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u0401",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u0403",
-            "",
             "\1\u0404",
-            "\1\u0405",
-            "",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u0406",
             "\1\u0407",
-            "\1\u0408",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\u0409",
             "\1\u040a",
             "\1\u040b",
             "\1\u040c",
@@ -8420,284 +8554,280 @@
             "\1\u040e",
             "\1\u040f",
             "\1\u0410",
-            "",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "",
-            "\1\u0412",
+            "\1\u0411",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u0413",
             "\1\u0414",
+            "",
+            "",
             "\1\u0415",
             "\1\u0416",
-            "\1\u0417",
             "",
+            "\1\u0417",
             "\1\u0418",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\u041a",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "",
+            "\1\u0419",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "",
+            "\1\u041b",
+            "",
             "\1\u041c",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u041d",
             "\1\u041e",
+            "",
             "\1\u041f",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u0420",
+            "",
             "\1\u0421",
             "\1\u0422",
             "\1\u0423",
-            "",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u0425",
             "\1\u0426",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u0427",
             "\1\u0428",
             "\1\u0429",
-            "",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "",
+            "\1\u042a",
             "\1\u042b",
             "",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\u042d",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "",
+            "\1\u042d",
             "\1\u042e",
             "\1\u042f",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u0430",
             "\1\u0431",
             "\1\u0432",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "",
+            "\1\u0433",
             "\1\u0434",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u0436",
             "\1\u0437",
-            "\1\u0438",
-            "",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u0439",
             "\1\u043a",
             "\1\u043b",
-            "\1\u043c",
+            "",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "",
             "\1\u043d",
             "\1\u043e",
-            "",
-            "\1\u043f",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u0440",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\u0442",
+            "\1\u0441",
+            "",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "",
             "\1\u0443",
-            "\1\u0444",
             "",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\u0445",
             "",
-            "\1\73\13\uffff\12\73\7\uffff\26\73\1\u0445\3\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u0446",
             "\1\u0447",
-            "\1\u0448",
             "",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\u044b\11\uffff\1\u044a",
-            "",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\u0449",
+            "\1\u044a",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u044c",
-            "\1\u044d",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u044e",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u044f",
             "\1\u0450",
+            "",
             "\1\u0451",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "",
+            "\1\u0452",
             "\1\u0453",
-            "",
             "\1\u0454",
-            "",
             "\1\u0455",
             "\1\u0456",
-            "",
             "\1\u0457",
+            "",
             "\1\u0458",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u045a",
-            "\1\u045b",
-            "",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u045c",
-            "\1\u045d",
-            "",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u045e",
-            "",
             "\1\u045f",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\u0461",
+            "\1\u0460",
             "",
-            "\1\u0462",
+            "",
+            "\1\74\13\uffff\12\74\7\uffff\26\74\1\u0461\3\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u0463",
-            "",
             "\1\u0464",
             "",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\u0466",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\u0467\11\uffff\1\u0466",
+            "",
             "\1\u0468",
             "\1\u0469",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\u046b",
+            "\1\u046a",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u046c",
             "\1\u046d",
-            "\1\u046e",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u046f",
             "",
             "\1\u0470",
             "\1\u0471",
+            "",
             "\1\u0472",
             "\1\u0473",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "",
-            "\1\u0474",
             "\1\u0475",
-            "",
             "\1\u0476",
+            "",
             "\1\u0477",
             "\1\u0478",
-            "\1\u0479",
-            "\1\u047a",
             "",
-            "\1\u047b",
+            "\1\u0479",
+            "",
+            "\1\u047a",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u047c",
             "",
             "\1\u047d",
             "\1\u047e",
-            "\1\u047f",
-            "\1\u0480",
-            "\1\u0481",
-            "\1\u0482",
             "",
+            "\1\u047f",
+            "",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\u0481",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u0483",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\u0485",
+            "\1\u0484",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u0486",
             "\1\u0487",
             "\1\u0488",
-            "",
             "\1\u0489",
             "\1\u048a",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
             "",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u048b",
             "",
+            "\1\u048c",
+            "",
+            "\1\u048d",
             "\1\u048e",
             "\1\u048f",
+            "\1\u0490",
             "",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
             "\1\u0491",
             "\1\u0492",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "",
+            "\1\u0493",
+            "\1\u0494",
             "\1\u0495",
             "\1\u0496",
             "\1\u0497",
+            "",
             "\1\u0498",
             "\1\u0499",
+            "",
             "\1\u049a",
             "\1\u049b",
             "\1\u049c",
             "\1\u049d",
             "\1\u049e",
+            "",
             "\1\u049f",
-            "\1\u04a0",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\u04a1",
             "\1\u04a2",
             "\1\u04a3",
             "\1\u04a4",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\u04a7",
-            "\1\u04a8",
             "",
-            "\1\u04a9",
+            "\1\u04a5",
+            "\1\u04a6",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "",
             "\1\u04aa",
             "\1\u04ab",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "",
+            "\1\u04ac",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u04ae",
-            "",
-            "",
-            "",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\u04b0",
-            "",
+            "\1\u04af",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u04b1",
-            "\1\u04b2",
-            "",
-            "",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u04b3",
             "\1\u04b4",
             "\1\u04b5",
             "\1\u04b6",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u04b7",
+            "\1\u04b8",
             "\1\u04b9",
             "\1\u04ba",
             "\1\u04bb",
             "\1\u04bc",
             "\1\u04bd",
             "\1\u04be",
-            "",
-            "\1\u04bf",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "",
-            "",
-            "\1\u04c2",
-            "\1\u04c3",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\u04c0",
+            "\1\u04c1",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\u04c4",
             "\1\u04c5",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
             "",
-            "",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "",
+            "\1\u04c6",
+            "\1\u04c7",
             "\1\u04c8",
-            "\1\u04c9",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u04cb",
-            "\1\u04cc",
+            "",
+            "",
+            "",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u04cd",
             "\1\u04ce",
             "",
-            "",
             "\1\u04cf",
             "\1\u04d0",
+            "",
             "\1\u04d1",
+            "",
             "\1\u04d2",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u04d3",
             "\1\u04d4",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "",
-            "",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\u04d7",
-            "",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "",
-            "",
+            "\1\u04d5",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\u04d8",
             "\1\u04d9",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "",
+            "\1\u04da",
             "\1\u04db",
             "\1\u04dc",
             "\1\u04dd",
-            "\1\u04de",
-            "\1\u04df",
+            "",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "",
+            "",
             "\1\u04e0",
             "\1\u04e1",
-            "\1\u04e2",
-            "",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u04e3",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "",
             "",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "",
             "\1\u04e6",
-            "\1\u04e7",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u04e8",
-            "\1\u04e9",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\u04ea",
             "\1\u04eb",
             "\1\u04ec",
             "\1\u04ed",
@@ -8706,43 +8836,89 @@
             "",
             "\1\u04ef",
             "\1\u04f0",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\u04f1",
             "\1\u04f2",
-            "",
-            "\1\u04f3",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u04f4",
-            "\1\u04f5",
+            "",
+            "",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             "\1\u04f6",
-            "\1\u04f7",
+            "",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "",
+            "",
             "\1\u04f8",
             "",
-            "\1\u04f9",
-            "\1\u04fa",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\u04fb",
+            "\1\u04fc",
             "\1\u04fd",
             "\1\u04fe",
             "\1\u04ff",
             "\1\u0500",
             "\1\u0501",
-            "",
-            "",
             "\1\u0502",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\u0504",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "",
+            "\1\u0503",
+            "",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "",
+            "",
             "\1\u0506",
             "\1\u0507",
-            "",
             "\1\u0508",
-            "",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "\1\u050a",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
-            "",
+            "\1\u0509",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\u050b",
             "\1\u050c",
+            "\1\u050d",
+            "\1\u050e",
             "",
-            "\1\73\13\uffff\12\73\7\uffff\32\73\4\uffff\1\73\1\uffff\32\73",
+            "",
+            "\1\u050f",
+            "\1\u0510",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\u0512",
+            "",
+            "\1\u0513",
+            "\1\u0514",
+            "\1\u0515",
+            "\1\u0516",
+            "\1\u0517",
+            "\1\u0518",
+            "",
+            "\1\u0519",
+            "\1\u051a",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\u051d",
+            "\1\u051e",
+            "\1\u051f",
+            "\1\u0520",
+            "\1\u0521",
+            "",
+            "",
+            "\1\u0522",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\u0524",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\u0526",
+            "\1\u0527",
+            "",
+            "\1\u0528",
+            "",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "\1\u052a",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
+            "",
+            "\1\u052c",
+            "",
+            "\1\74\13\uffff\12\74\7\uffff\32\74\4\uffff\1\74\1\uffff\32\74",
             ""
     };
 
@@ -8762,7 +8938,7 @@
         }
     }
 
-    static class DFA21 extends DFA {
+    class DFA21 extends DFA {
 
         public DFA21(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
@@ -8776,7 +8952,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 | T__157 | T__158 | T__159 | T__160 | T__161 | T__162 | T__163 | T__164 | T__165 | T__166 | T__167 | T__168 | T__169 | T__170 | T__171 | T__172 | T__173 | T__174 | T__175 | T__176 | T__177 | T__178 | T__179 | T__180 | T__181 | T__182 | T__183 | T__184 | T__185 | T__186 | T__187 | T__188 | T__189 | T__190 | T__191 | T__192 | T__193 | T__194 | T__195 | T__196 | T__197 | T__198 | T__199 | T__200 | T__201 | T__202 | T__203 | T__204 | T__205 | T__206 | T__207 | T__208 | T__209 | T__210 | T__211 | T__212 | T__213 | T__214 | T__215 | T__216 | T__217 | T__218 | T__219 | T__220 | T__221 | T__222 | T__223 | T__224 | T__225 | T__226 | T__227 | T__228 | T__229 | T__230 | T__231 | T__232 | T__233 | T__234 | T__235 | T__236 | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_ID | 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 | T__157 | T__158 | T__159 | T__160 | T__161 | T__162 | T__163 | T__164 | T__165 | T__166 | T__167 | T__168 | T__169 | T__170 | T__171 | T__172 | T__173 | T__174 | T__175 | T__176 | T__177 | T__178 | T__179 | T__180 | T__181 | T__182 | T__183 | T__184 | T__185 | T__186 | T__187 | T__188 | T__189 | T__190 | T__191 | T__192 | T__193 | T__194 | T__195 | T__196 | T__197 | T__198 | T__199 | T__200 | T__201 | T__202 | T__203 | T__204 | T__205 | T__206 | T__207 | T__208 | T__209 | T__210 | T__211 | T__212 | T__213 | T__214 | T__215 | T__216 | T__217 | T__218 | T__219 | T__220 | T__221 | T__222 | T__223 | T__224 | T__225 | T__226 | T__227 | T__228 | T__229 | T__230 | T__231 | T__232 | T__233 | T__234 | T__235 | T__236 | T__237 | T__238 | T__239 | T__240 | T__241 | 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;
@@ -8788,57 +8964,57 @@
                         s = -1;
                         if ( (LA21_0=='p') ) {s = 1;}
 
-                        else if ( (LA21_0=='i') ) {s = 2;}
+                        else if ( (LA21_0=='v') ) {s = 2;}
 
-                        else if ( (LA21_0==';') ) {s = 3;}
+                        else if ( (LA21_0=='a') ) {s = 3;}
 
-                        else if ( (LA21_0=='v') ) {s = 4;}
+                        else if ( (LA21_0==';') ) {s = 4;}
 
-                        else if ( (LA21_0=='a') ) {s = 5;}
+                        else if ( (LA21_0=='f') ) {s = 5;}
 
-                        else if ( (LA21_0=='f') ) {s = 6;}
+                        else if ( (LA21_0=='+') ) {s = 6;}
 
-                        else if ( (LA21_0=='+') ) {s = 7;}
+                        else if ( (LA21_0=='{') ) {s = 7;}
 
-                        else if ( (LA21_0=='{') ) {s = 8;}
+                        else if ( (LA21_0=='}') ) {s = 8;}
 
-                        else if ( (LA21_0=='}') ) {s = 9;}
+                        else if ( (LA21_0=='d') ) {s = 9;}
 
-                        else if ( (LA21_0=='d') ) {s = 10;}
+                        else if ( (LA21_0==':') ) {s = 10;}
 
-                        else if ( (LA21_0==':') ) {s = 11;}
+                        else if ( (LA21_0=='e') ) {s = 11;}
 
-                        else if ( (LA21_0=='e') ) {s = 12;}
+                        else if ( (LA21_0=='b') ) {s = 12;}
 
-                        else if ( (LA21_0=='b') ) {s = 13;}
+                        else if ( (LA21_0=='l') ) {s = 13;}
 
-                        else if ( (LA21_0=='l') ) {s = 14;}
+                        else if ( (LA21_0=='<') ) {s = 14;}
 
-                        else if ( (LA21_0=='<') ) {s = 15;}
+                        else if ( (LA21_0=='-') ) {s = 15;}
 
-                        else if ( (LA21_0=='-') ) {s = 16;}
+                        else if ( (LA21_0=='>') ) {s = 16;}
 
-                        else if ( (LA21_0=='>') ) {s = 17;}
+                        else if ( (LA21_0=='.') ) {s = 17;}
 
-                        else if ( (LA21_0=='.') ) {s = 18;}
+                        else if ( (LA21_0=='[') ) {s = 18;}
 
-                        else if ( (LA21_0=='[') ) {s = 19;}
+                        else if ( (LA21_0==']') ) {s = 19;}
 
-                        else if ( (LA21_0==']') ) {s = 20;}
+                        else if ( (LA21_0=='u') ) {s = 20;}
 
-                        else if ( (LA21_0=='u') ) {s = 21;}
+                        else if ( (LA21_0=='n') ) {s = 21;}
 
-                        else if ( (LA21_0=='n') ) {s = 22;}
+                        else if ( (LA21_0=='o') ) {s = 22;}
 
-                        else if ( (LA21_0=='o') ) {s = 23;}
+                        else if ( (LA21_0=='s') ) {s = 23;}
 
-                        else if ( (LA21_0=='s') ) {s = 24;}
+                        else if ( (LA21_0=='r') ) {s = 24;}
 
-                        else if ( (LA21_0=='r') ) {s = 25;}
+                        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=='i') ) {s = 27;}
 
                         else if ( (LA21_0=='c') ) {s = 28;}
 
@@ -8860,43 +9036,45 @@
 
                         else if ( (LA21_0=='B') ) {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=='|') ) {s = 42;}
+                        else if ( (LA21_0=='/') ) {s = 42;}
 
-                        else if ( (LA21_0=='&') ) {s = 43;}
+                        else if ( (LA21_0=='%') ) {s = 43;}
 
-                        else if ( (LA21_0=='!') ) {s = 44;}
+                        else if ( (LA21_0=='|') ) {s = 44;}
 
-                        else if ( (LA21_0=='?') ) {s = 45;}
+                        else if ( (LA21_0=='&') ) {s = 45;}
 
-                        else if ( (LA21_0=='#') ) {s = 46;}
+                        else if ( (LA21_0=='!') ) {s = 46;}
 
-                        else if ( (LA21_0=='w') ) {s = 47;}
+                        else if ( (LA21_0=='?') ) {s = 47;}
 
-                        else if ( (LA21_0=='y') ) {s = 48;}
+                        else if ( (LA21_0=='w') ) {s = 48;}
 
-                        else if ( (LA21_0=='0') ) {s = 49;}
+                        else if ( (LA21_0=='y') ) {s = 49;}
 
-                        else if ( ((LA21_0>='1' && LA21_0<='9')) ) {s = 50;}
+                        else if ( (LA21_0=='0') ) {s = 50;}
 
-                        else if ( (LA21_0=='^') ) {s = 51;}
+                        else if ( ((LA21_0>='1' && LA21_0<='9')) ) {s = 51;}
 
-                        else if ( (LA21_0=='$'||LA21_0=='A'||(LA21_0>='C' && LA21_0<='D')||(LA21_0>='F' && LA21_0<='L')||(LA21_0>='N' && LA21_0<='Q')||(LA21_0>='S' && LA21_0<='Z')||LA21_0=='_'||(LA21_0>='j' && LA21_0<='k')||LA21_0=='q'||LA21_0=='x'||LA21_0=='z') ) {s = 52;}
+                        else if ( (LA21_0=='^') ) {s = 52;}
 
-                        else if ( (LA21_0=='\"') ) {s = 53;}
+                        else if ( (LA21_0=='$'||LA21_0=='A'||(LA21_0>='C' && LA21_0<='D')||(LA21_0>='F' && LA21_0<='L')||(LA21_0>='N' && LA21_0<='Q')||(LA21_0>='S' && LA21_0<='Z')||LA21_0=='_'||(LA21_0>='j' && LA21_0<='k')||LA21_0=='q'||LA21_0=='x'||LA21_0=='z') ) {s = 53;}
 
-                        else if ( (LA21_0=='\'') ) {s = 54;}
+                        else if ( (LA21_0=='\"') ) {s = 54;}
 
-                        else if ( ((LA21_0>='\t' && LA21_0<='\n')||LA21_0=='\r'||LA21_0==' ') ) {s = 55;}
+                        else if ( (LA21_0=='\'') ) {s = 55;}
 
-                        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>='~' && LA21_0<='\uFFFF')) ) {s = 56;}
+                        else if ( ((LA21_0>='\t' && LA21_0<='\n')||LA21_0=='\r'||LA21_0==' ') ) {s = 56;}
+
+                        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 = 57;}
 
                         if ( s>=0 ) return s;
                         break;
diff --git a/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammarParser.java b/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammarParser.java
index f0633f6..6eaf313 100644
--- a/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammarParser.java
+++ b/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammarParser.java
@@ -1,15 +1,4 @@
-/**
- * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf), Loetz GmbH&Co.KG (Heidelberg)
- * 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:
- *         Florian Pirchner - Initial implementation
- */
-
-package org.eclipse.osbp.ecview.dsl.parser.antlr.internal; 
+package org.eclipse.osbp.ecview.dsl.parser.antlr.internal;
 
 import org.eclipse.xtext.*;
 import org.eclipse.xtext.parser.*;
@@ -31,10 +20,23 @@
 import java.util.ArrayList;
 import java.util.Map;
 import java.util.HashMap;
+/**
+ * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf), Loetz GmbH&Co.KG (Heidelberg)
+ * 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:
+ *         Florian Pirchner - Initial implementation
+ *
+ * generated by Xtext 2.11.0
+ *
+ */
 @SuppressWarnings("all")
 public class InternalUIGrammarParser extends AbstractInternalAntlrParser {
     public static final String[] tokenNames = new String[] {
-        "<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'", "'import'", "';'", "'validatorAlias'", "'as'", "'fieldValidation'", "'+='", "'viewset'", "'{'", "'}'", "'dataAlias'", "'datasource'", "':'", "'eventTopic'", "'bind'", "'list'", "'<'", "'--'", "'>'", "'.'", "'['", "']'", "'ui'", "'..'", "'navigateTo'", "'openDialog'", "'searchWith'", "'addToTable'", "'removeFromTable'", "'newInstance'", "'for'", "'at'", "'sendEvent'", "'('", "'noAutoTrigger'", "')'", "'ideview'", "'sharedStateGroup'", "'category'", "'rootType'", "'exposedActions'", "'align'", "'icon'", "'id'", "'checkDirty'", "'externalCommand'", "'mobile'", "'i18n'", "'gridlayout'", "'columns='", "'styles'", "'readonly'", "'form'", "'verticalLayout'", "'mobileVerticalLayout'", "'navRoot'", "'horizontalLayout'", "'mobileHorizontalLayout'", "'horizontalButtonGroup'", "'verticalGroup'", "'searchPanel'", "'type'", "'mobileSearchPanel'", "'mobileTab'", "'tab'", "'tabsheet'", "'splitter'", "'first'", "'second'", "'splitPos'", "'panel'", "'content'", "'dialog'", "'searchdialog'", "'search'", "'navPage'", "'navbarActions'", "'textfield'", "'maxLength='", "'minLength='", "'regex='", "'passwordField'", "'maskedText'", "'mask='", "'maskedNumeric'", "'maskedDecimal'", "'maskedTextWithPrefix'", "'prefixes='", "','", "'prefix'", "'mask'", "'richtextArea'", "'asBlob'", "'suggestText'", "'captionField'", "'filterField'", "'uuidField'", "'autoHidePopup'", "'referenceField'", "'refSource'", "'descriptionField'", "'imageField'", "'inMemoryService'", "'searchfield'", "'textarea'", "'datefield'", "'browser'", "'progressbar'", "'image'", "'iconPath'", "'table'", "'selectionType'", "'useBeanService'", "'combo'", "'button'", "'navButton'", "'alias'", "'switchIt'", "'label'", "'decimalField'", "'noGrouping'", "'noMarkNegative'", "'precision='", "'optionsgroup'", "'listSelect'", "'columns'", "'sort'", "'column'", "'desc'", "'asc'", "'numericField'", "'checkbox'", "'MaxLengthValidator'", "'MinLengthValidator'", "'RegexValidator'", "'Expression'", "'BeanValidationValidator'", "'code'", "'visibility'", "'fireOn'", "'='", "'-='", "'*='", "'/='", "'%='", "'>='", "'||'", "'&&'", "'=='", "'!='", "'==='", "'!=='", "'instanceof'", "'->'", "'..<'", "'=>'", "'<>'", "'?:'", "'+'", "'-'", "'*'", "'**'", "'/'", "'%'", "'!'", "'++'", "'::'", "'?.'", "'#'", "'|'", "'if'", "'else'", "'switch'", "'default'", "'case'", "'while'", "'do'", "'var'", "'val'", "'extends'", "'static'", "'extension'", "'super'", "'new'", "'false'", "'true'", "'null'", "'typeof'", "'throw'", "'return'", "'try'", "'finally'", "'synchronized'", "'catch'", "'?'", "'&'", "'date'", "'datetime'", "'time'", "'undefined'", "'minute'", "'hour'", "'day'", "'month'", "'year'", "'single'", "'multi'", "'none'", "'bottom-center'", "'bottom-left'", "'bottom-right'", "'bottom-fill'", "'middle-center'", "'middle-left'", "'middle-right'", "'middle-fill'", "'top-center'", "'top-left'", "'top-right'", "'top-fill'", "'fill-center'", "'fill-left'", "'fill-right'", "'fill-fill'"
+        "<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'", "'validatorAlias'", "'as'", "';'", "'fieldValidation'", "'+='", "'viewset'", "'{'", "'}'", "'dataAlias'", "'datasource'", "':'", "'eventTopic'", "'bind'", "'list'", "'<'", "'--'", "'>'", "'.'", "'['", "']'", "'ui'", "'..'", "'navigateTo'", "'openDialog'", "'searchWith'", "'addToTable'", "'removeFromTable'", "'newInstance'", "'for'", "'at'", "'sendEvent'", "'('", "'noAutoTrigger'", "')'", "'ideview'", "'sharedStateGroup'", "'category'", "'rootType'", "'exposedActions'", "'align'", "'display'", "'icon'", "'id'", "'checkDirty'", "'externalCommand'", "'mobile'", "'i18n'", "'noCaption'", "'gridlayout'", "'columns='", "'styles'", "'readonly'", "'form'", "'verticalLayout'", "'mobileVerticalLayout'", "'navRoot'", "'horizontalLayout'", "'mobileHorizontalLayout'", "'horizontalButtonGroup'", "'verticalGroup'", "'searchPanel'", "'type'", "'mobileSearchPanel'", "'mobileTab'", "'tab'", "'tabsheet'", "'splitter'", "'first'", "'second'", "'splitPos'", "'panel'", "'content'", "'dialog'", "'searchdialog'", "'search'", "'navPage'", "'navbarActions'", "'textfield'", "'maxLength='", "'minLength='", "'regex='", "'passwordField'", "'maskedText'", "'mask='", "'maskedNumeric'", "'maskedDecimal'", "'maskedTextWithPrefix'", "'prefixes='", "','", "'prefix'", "'mask'", "'richtextArea'", "'asBlob'", "'suggestText'", "'captionField'", "'filterField'", "'uuidField'", "'autoHidePopup'", "'referenceField'", "'refSource'", "'descriptionField'", "'imageField'", "'inMemoryService'", "'searchfield'", "'textarea'", "'datefield'", "'browser'", "'progressbar'", "'image'", "'iconPath'", "'table'", "'selectionType'", "'useBeanService'", "'scrollToBottom'", "'combo'", "'button'", "'navButton'", "'alias'", "'switchIt'", "'label'", "'decimalField'", "'noGrouping'", "'noMarkNegative'", "'precision='", "'optionsgroup'", "'listSelect'", "'columns'", "'sort'", "'column'", "'desc'", "'asc'", "'numericField'", "'checkbox'", "'MaxLengthValidator'", "'MinLengthValidator'", "'RegexValidator'", "'Expression'", "'BeanValidationValidator'", "'code'", "'visibility'", "'fireOn'", "'import'", "'static'", "'extension'", "'*'", "'ns'", "'@'", "'='", "'#'", "'-='", "'*='", "'/='", "'%='", "'>='", "'||'", "'&&'", "'=='", "'!='", "'==='", "'!=='", "'instanceof'", "'->'", "'..<'", "'=>'", "'<>'", "'?:'", "'+'", "'-'", "'**'", "'/'", "'%'", "'!'", "'++'", "'::'", "'?.'", "'|'", "'if'", "'else'", "'switch'", "'default'", "'case'", "'while'", "'do'", "'var'", "'val'", "'extends'", "'super'", "'new'", "'false'", "'true'", "'null'", "'typeof'", "'throw'", "'return'", "'try'", "'finally'", "'synchronized'", "'catch'", "'?'", "'&'", "'date'", "'datetime'", "'time'", "'undefined'", "'minute'", "'hour'", "'day'", "'month'", "'year'", "'single'", "'multi'", "'none'", "'bottom-center'", "'bottom-left'", "'bottom-right'", "'bottom-fill'", "'middle-center'", "'middle-left'", "'middle-right'", "'middle-fill'", "'top-center'", "'top-left'", "'top-right'", "'top-fill'", "'fill-center'", "'fill-left'", "'fill-right'", "'fill-fill'"
     };
     public static final int T__144=144;
     public static final int T__143=143;
@@ -170,16 +172,21 @@
     public static final int T__124=124;
     public static final int T__123=123;
     public static final int T__120=120;
+    public static final int T__241=241;
+    public static final int T__240=240;
     public static final int RULE_SL_COMMENT=10;
     public static final int T__119=119;
     public static final int T__118=118;
+    public static final int T__239=239;
     public static final int T__115=115;
     public static final int T__236=236;
     public static final int EOF=-1;
     public static final int T__114=114;
     public static final int T__235=235;
     public static final int T__117=117;
+    public static final int T__238=238;
     public static final int T__116=116;
+    public static final int T__237=237;
     public static final int T__111=111;
     public static final int T__232=232;
     public static final int T__110=110;
@@ -285,23 +292,23 @@
         
 
     public String[] getTokenNames() { return InternalUIGrammarParser.tokenNames; }
-    public String getGrammarFileName() { return "../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g"; }
+    public String getGrammarFileName() { return "InternalUIGrammar.g"; }
 
 
 
      	private UIGrammarGrammarAccess grammarAccess;
-     	
+
         public InternalUIGrammarParser(TokenStream input, UIGrammarGrammarAccess grammarAccess) {
             this(input);
             this.grammarAccess = grammarAccess;
             registerRules(grammarAccess.getGrammar());
         }
-        
+
         @Override
         protected String getFirstRuleName() {
-        	return "UiModel";	
+        	return "UiModel";
        	}
-       	
+
        	@Override
        	protected UIGrammarGrammarAccess getGrammarAccess() {
        		return grammarAccess;
@@ -309,8 +316,9 @@
 
 
 
+
     // $ANTLR start "entryRuleUiModel"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:68:1: entryRuleUiModel returns [EObject current=null] : iv_ruleUiModel= ruleUiModel EOF ;
+    // InternalUIGrammar.g:76:1: entryRuleUiModel returns [EObject current=null] : iv_ruleUiModel= ruleUiModel EOF ;
     public final EObject entryRuleUiModel() throws RecognitionException {
         EObject current = null;
 
@@ -318,13 +326,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:69:2: (iv_ruleUiModel= ruleUiModel EOF )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:70:2: iv_ruleUiModel= ruleUiModel EOF
+            // InternalUIGrammar.g:76:48: (iv_ruleUiModel= ruleUiModel EOF )
+            // InternalUIGrammar.g:77:2: iv_ruleUiModel= ruleUiModel EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUiModelRule()); 
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiModel_in_entryRuleUiModel75);
+            pushFollow(FOLLOW_1);
             iv_ruleUiModel=ruleUiModel();
 
             state._fsp--;
@@ -332,16 +340,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUiModel; 
             }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiModel85); 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;
@@ -350,61 +358,62 @@
 
 
     // $ANTLR start "ruleUiModel"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:77:1: ruleUiModel returns [EObject current=null] : (otherlv_0= 'package' ( (lv_packageName_1_0= ruleQualifiedName ) ) ( (lv_imports_2_0= ruleUiImports ) )* ( (lv_roots_3_0= ruleUiRootElements ) )* ) ;
+    // InternalUIGrammar.g:83:1: ruleUiModel returns [EObject current=null] : (otherlv_0= 'package' ( (lv_packageName_1_0= ruleQualifiedName ) ) ( (lv_importSection_2_0= ruleXImportSection ) )? ( (lv_roots_3_0= ruleUiRootElements ) )* ) ;
     public final EObject ruleUiModel() throws RecognitionException {
         EObject current = null;
 
         Token otherlv_0=null;
         AntlrDatatypeRuleToken lv_packageName_1_0 = null;
 
-        EObject lv_imports_2_0 = null;
+        EObject lv_importSection_2_0 = null;
 
         EObject lv_roots_3_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:80:28: ( (otherlv_0= 'package' ( (lv_packageName_1_0= ruleQualifiedName ) ) ( (lv_imports_2_0= ruleUiImports ) )* ( (lv_roots_3_0= ruleUiRootElements ) )* ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:81:1: (otherlv_0= 'package' ( (lv_packageName_1_0= ruleQualifiedName ) ) ( (lv_imports_2_0= ruleUiImports ) )* ( (lv_roots_3_0= ruleUiRootElements ) )* )
+            // InternalUIGrammar.g:89:2: ( (otherlv_0= 'package' ( (lv_packageName_1_0= ruleQualifiedName ) ) ( (lv_importSection_2_0= ruleXImportSection ) )? ( (lv_roots_3_0= ruleUiRootElements ) )* ) )
+            // InternalUIGrammar.g:90:2: (otherlv_0= 'package' ( (lv_packageName_1_0= ruleQualifiedName ) ) ( (lv_importSection_2_0= ruleXImportSection ) )? ( (lv_roots_3_0= ruleUiRootElements ) )* )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:81:1: (otherlv_0= 'package' ( (lv_packageName_1_0= ruleQualifiedName ) ) ( (lv_imports_2_0= ruleUiImports ) )* ( (lv_roots_3_0= ruleUiRootElements ) )* )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:81:3: otherlv_0= 'package' ( (lv_packageName_1_0= ruleQualifiedName ) ) ( (lv_imports_2_0= ruleUiImports ) )* ( (lv_roots_3_0= ruleUiRootElements ) )*
+            // InternalUIGrammar.g:90:2: (otherlv_0= 'package' ( (lv_packageName_1_0= ruleQualifiedName ) ) ( (lv_importSection_2_0= ruleXImportSection ) )? ( (lv_roots_3_0= ruleUiRootElements ) )* )
+            // InternalUIGrammar.g:91:3: otherlv_0= 'package' ( (lv_packageName_1_0= ruleQualifiedName ) ) ( (lv_importSection_2_0= ruleXImportSection ) )? ( (lv_roots_3_0= ruleUiRootElements ) )*
             {
-            otherlv_0=(Token)match(input,13,FollowSets000.FOLLOW_13_in_ruleUiModel122); if (state.failed) return current;
+            otherlv_0=(Token)match(input,13,FOLLOW_3); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getUiModelAccess().getPackageKeyword_0());
-                  
+              			newLeafNode(otherlv_0, grammarAccess.getUiModelAccess().getPackageKeyword_0());
+              		
             }
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:85:1: ( (lv_packageName_1_0= ruleQualifiedName ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:86:1: (lv_packageName_1_0= ruleQualifiedName )
+            // InternalUIGrammar.g:95:3: ( (lv_packageName_1_0= ruleQualifiedName ) )
+            // InternalUIGrammar.g:96:4: (lv_packageName_1_0= ruleQualifiedName )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:86:1: (lv_packageName_1_0= ruleQualifiedName )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:87:3: lv_packageName_1_0= ruleQualifiedName
+            // InternalUIGrammar.g:96:4: (lv_packageName_1_0= ruleQualifiedName )
+            // InternalUIGrammar.g:97:5: lv_packageName_1_0= ruleQualifiedName
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getUiModelAccess().getPackageNameQualifiedNameParserRuleCall_1_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getUiModelAccess().getPackageNameQualifiedNameParserRuleCall_1_0());
+              				
             }
-            pushFollow(FollowSets000.FOLLOW_ruleQualifiedName_in_ruleUiModel143);
+            pushFollow(FOLLOW_4);
             lv_packageName_1_0=ruleQualifiedName();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getUiModelRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"packageName",
-                      		lv_packageName_1_0, 
-                      		"QualifiedName");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getUiModelRule());
+              					}
+              					set(
+              						current,
+              						"packageName",
+              						lv_packageName_1_0,
+              						"org.eclipse.xtext.xbase.Xbase.QualifiedName");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -412,99 +421,92 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:103:2: ( (lv_imports_2_0= ruleUiImports ) )*
-            loop1:
-            do {
-                int alt1=2;
-                int LA1_0 = input.LA(1);
+            // InternalUIGrammar.g:114:3: ( (lv_importSection_2_0= ruleXImportSection ) )?
+            int alt1=2;
+            int LA1_0 = input.LA(1);
 
-                if ( (LA1_0==14) ) {
-                    alt1=1;
-                }
+            if ( (LA1_0==155) ) {
+                alt1=1;
+            }
+            switch (alt1) {
+                case 1 :
+                    // InternalUIGrammar.g:115:4: (lv_importSection_2_0= ruleXImportSection )
+                    {
+                    // InternalUIGrammar.g:115:4: (lv_importSection_2_0= ruleXImportSection )
+                    // InternalUIGrammar.g:116:5: lv_importSection_2_0= ruleXImportSection
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getUiModelAccess().getImportSectionXImportSectionParserRuleCall_2_0());
+                      				
+                    }
+                    pushFollow(FOLLOW_5);
+                    lv_importSection_2_0=ruleXImportSection();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getUiModelRule());
+                      					}
+                      					set(
+                      						current,
+                      						"importSection",
+                      						lv_importSection_2_0,
+                      						"org.eclipse.xtext.xbase.Xtype.XImportSection");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
 
 
-                switch (alt1) {
-            	case 1 :
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:104:1: (lv_imports_2_0= ruleUiImports )
-            	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:104:1: (lv_imports_2_0= ruleUiImports )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:105:3: lv_imports_2_0= ruleUiImports
-            	    {
-            	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getUiModelAccess().getImportsUiImportsParserRuleCall_2_0()); 
-            	      	    
-            	    }
-            	    pushFollow(FollowSets000.FOLLOW_ruleUiImports_in_ruleUiModel164);
-            	    lv_imports_2_0=ruleUiImports();
+                    }
+                    break;
 
-            	    state._fsp--;
-            	    if (state.failed) return current;
-            	    if ( state.backtracking==0 ) {
+            }
 
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getUiModelRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"imports",
-            	              		lv_imports_2_0, 
-            	              		"UiImports");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
-            	    }
-
-            	    }
-
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop1;
-                }
-            } while (true);
-
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:121:3: ( (lv_roots_3_0= ruleUiRootElements ) )*
+            // InternalUIGrammar.g:133:3: ( (lv_roots_3_0= ruleUiRootElements ) )*
             loop2:
             do {
                 int alt2=2;
                 int LA2_0 = input.LA(1);
 
-                if ( (LA2_0==16||LA2_0==20||LA2_0==49||LA2_0==59) ) {
+                if ( (LA2_0==14||LA2_0==19||LA2_0==48||LA2_0==54||LA2_0==59) ) {
                     alt2=1;
                 }
 
 
                 switch (alt2) {
             	case 1 :
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:122:1: (lv_roots_3_0= ruleUiRootElements )
+            	    // InternalUIGrammar.g:134:4: (lv_roots_3_0= ruleUiRootElements )
             	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:122:1: (lv_roots_3_0= ruleUiRootElements )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:123:3: lv_roots_3_0= ruleUiRootElements
+            	    // InternalUIGrammar.g:134:4: (lv_roots_3_0= ruleUiRootElements )
+            	    // InternalUIGrammar.g:135:5: lv_roots_3_0= ruleUiRootElements
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getUiModelAccess().getRootsUiRootElementsParserRuleCall_3_0()); 
-            	      	    
+
+            	      					newCompositeNode(grammarAccess.getUiModelAccess().getRootsUiRootElementsParserRuleCall_3_0());
+            	      				
             	    }
-            	    pushFollow(FollowSets000.FOLLOW_ruleUiRootElements_in_ruleUiModel186);
+            	    pushFollow(FOLLOW_5);
             	    lv_roots_3_0=ruleUiRootElements();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getUiModelRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"roots",
-            	              		lv_roots_3_0, 
-            	              		"UiRootElements");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiModelRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"roots",
+            	      						lv_roots_3_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiRootElements");
+            	      					afterParserOrEnumRuleCall();
+            	      				
             	    }
 
             	    }
@@ -525,14 +527,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -540,153 +544,8 @@
     // $ANTLR end "ruleUiModel"
 
 
-    // $ANTLR start "entryRuleUiImports"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:147:1: entryRuleUiImports returns [EObject current=null] : iv_ruleUiImports= ruleUiImports EOF ;
-    public final EObject entryRuleUiImports() throws RecognitionException {
-        EObject current = null;
-
-        EObject iv_ruleUiImports = null;
-
-
-        try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:148:2: (iv_ruleUiImports= ruleUiImports EOF )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:149:2: iv_ruleUiImports= ruleUiImports EOF
-            {
-            if ( state.backtracking==0 ) {
-               newCompositeNode(grammarAccess.getUiImportsRule()); 
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiImports_in_entryRuleUiImports223);
-            iv_ruleUiImports=ruleUiImports();
-
-            state._fsp--;
-            if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-               current =iv_ruleUiImports; 
-            }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiImports233); if (state.failed) return current;
-
-            }
-
-        }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
-                appendSkippedTokens();
-            } 
-        finally {
-        }
-        return current;
-    }
-    // $ANTLR end "entryRuleUiImports"
-
-
-    // $ANTLR start "ruleUiImports"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:156:1: ruleUiImports returns [EObject current=null] : (otherlv_0= 'import' ( (lv_importedNamespace_1_0= ruleQualifiedNameWithWildcard ) ) (otherlv_2= ';' )? ) ;
-    public final EObject ruleUiImports() throws RecognitionException {
-        EObject current = null;
-
-        Token otherlv_0=null;
-        Token otherlv_2=null;
-        AntlrDatatypeRuleToken lv_importedNamespace_1_0 = null;
-
-
-         enterRule(); 
-            
-        try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:159:28: ( (otherlv_0= 'import' ( (lv_importedNamespace_1_0= ruleQualifiedNameWithWildcard ) ) (otherlv_2= ';' )? ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:160:1: (otherlv_0= 'import' ( (lv_importedNamespace_1_0= ruleQualifiedNameWithWildcard ) ) (otherlv_2= ';' )? )
-            {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:160:1: (otherlv_0= 'import' ( (lv_importedNamespace_1_0= ruleQualifiedNameWithWildcard ) ) (otherlv_2= ';' )? )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:160:3: otherlv_0= 'import' ( (lv_importedNamespace_1_0= ruleQualifiedNameWithWildcard ) ) (otherlv_2= ';' )?
-            {
-            otherlv_0=(Token)match(input,14,FollowSets000.FOLLOW_14_in_ruleUiImports270); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-                  	newLeafNode(otherlv_0, grammarAccess.getUiImportsAccess().getImportKeyword_0());
-                  
-            }
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:164:1: ( (lv_importedNamespace_1_0= ruleQualifiedNameWithWildcard ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:165:1: (lv_importedNamespace_1_0= ruleQualifiedNameWithWildcard )
-            {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:165:1: (lv_importedNamespace_1_0= ruleQualifiedNameWithWildcard )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:166:3: lv_importedNamespace_1_0= ruleQualifiedNameWithWildcard
-            {
-            if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getUiImportsAccess().getImportedNamespaceQualifiedNameWithWildcardParserRuleCall_1_0()); 
-              	    
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleQualifiedNameWithWildcard_in_ruleUiImports291);
-            lv_importedNamespace_1_0=ruleQualifiedNameWithWildcard();
-
-            state._fsp--;
-            if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getUiImportsRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"importedNamespace",
-                      		lv_importedNamespace_1_0, 
-                      		"QualifiedNameWithWildcard");
-              	        afterParserOrEnumRuleCall();
-              	    
-            }
-
-            }
-
-
-            }
-
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:182:2: (otherlv_2= ';' )?
-            int alt3=2;
-            int LA3_0 = input.LA(1);
-
-            if ( (LA3_0==15) ) {
-                alt3=1;
-            }
-            switch (alt3) {
-                case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:182:4: otherlv_2= ';'
-                    {
-                    otherlv_2=(Token)match(input,15,FollowSets000.FOLLOW_15_in_ruleUiImports304); if (state.failed) return current;
-                    if ( state.backtracking==0 ) {
-
-                          	newLeafNode(otherlv_2, grammarAccess.getUiImportsAccess().getSemicolonKeyword_2());
-                          
-                    }
-
-                    }
-                    break;
-
-            }
-
-
-            }
-
-
-            }
-
-            if ( state.backtracking==0 ) {
-               leaveRule(); 
-            }
-        }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
-                appendSkippedTokens();
-            } 
-        finally {
-        }
-        return current;
-    }
-    // $ANTLR end "ruleUiImports"
-
-
     // $ANTLR start "entryRuleUiRootElements"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:194:1: entryRuleUiRootElements returns [EObject current=null] : iv_ruleUiRootElements= ruleUiRootElements EOF ;
+    // InternalUIGrammar.g:156:1: entryRuleUiRootElements returns [EObject current=null] : iv_ruleUiRootElements= ruleUiRootElements EOF ;
     public final EObject entryRuleUiRootElements() throws RecognitionException {
         EObject current = null;
 
@@ -694,13 +553,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:195:2: (iv_ruleUiRootElements= ruleUiRootElements EOF )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:196:2: iv_ruleUiRootElements= ruleUiRootElements EOF
+            // InternalUIGrammar.g:156:55: (iv_ruleUiRootElements= ruleUiRootElements EOF )
+            // InternalUIGrammar.g:157:2: iv_ruleUiRootElements= ruleUiRootElements EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUiRootElementsRule()); 
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiRootElements_in_entryRuleUiRootElements342);
+            pushFollow(FOLLOW_1);
             iv_ruleUiRootElements=ruleUiRootElements();
 
             state._fsp--;
@@ -708,16 +567,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUiRootElements; 
             }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiRootElements352); 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;
@@ -726,141 +585,171 @@
 
 
     // $ANTLR start "ruleUiRootElements"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:203:1: ruleUiRootElements returns [EObject current=null] : (this_UiView_0= ruleUiView | this_UiViewSet_1= ruleUiViewSet | this_UiValidatorAlias_2= ruleUiValidatorAlias | this_UiMobileView_3= ruleUiMobileView ) ;
+    // InternalUIGrammar.g:163:1: ruleUiRootElements returns [EObject current=null] : (this_UiView_0= ruleUiView | this_UiDisplayView_1= ruleUiDisplayView | this_UiViewSet_2= ruleUiViewSet | this_UiValidatorAlias_3= ruleUiValidatorAlias | this_UiMobileView_4= ruleUiMobileView ) ;
     public final EObject ruleUiRootElements() throws RecognitionException {
         EObject current = null;
 
         EObject this_UiView_0 = null;
 
-        EObject this_UiViewSet_1 = null;
+        EObject this_UiDisplayView_1 = null;
 
-        EObject this_UiValidatorAlias_2 = null;
+        EObject this_UiViewSet_2 = null;
 
-        EObject this_UiMobileView_3 = null;
+        EObject this_UiValidatorAlias_3 = null;
+
+        EObject this_UiMobileView_4 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:206:28: ( (this_UiView_0= ruleUiView | this_UiViewSet_1= ruleUiViewSet | this_UiValidatorAlias_2= ruleUiValidatorAlias | this_UiMobileView_3= ruleUiMobileView ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:207:1: (this_UiView_0= ruleUiView | this_UiViewSet_1= ruleUiViewSet | this_UiValidatorAlias_2= ruleUiValidatorAlias | this_UiMobileView_3= ruleUiMobileView )
+            // InternalUIGrammar.g:169:2: ( (this_UiView_0= ruleUiView | this_UiDisplayView_1= ruleUiDisplayView | this_UiViewSet_2= ruleUiViewSet | this_UiValidatorAlias_3= ruleUiValidatorAlias | this_UiMobileView_4= ruleUiMobileView ) )
+            // InternalUIGrammar.g:170:2: (this_UiView_0= ruleUiView | this_UiDisplayView_1= ruleUiDisplayView | this_UiViewSet_2= ruleUiViewSet | this_UiValidatorAlias_3= ruleUiValidatorAlias | this_UiMobileView_4= ruleUiMobileView )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:207:1: (this_UiView_0= ruleUiView | this_UiViewSet_1= ruleUiViewSet | this_UiValidatorAlias_2= ruleUiValidatorAlias | this_UiMobileView_3= ruleUiMobileView )
-            int alt4=4;
+            // InternalUIGrammar.g:170:2: (this_UiView_0= ruleUiView | this_UiDisplayView_1= ruleUiDisplayView | this_UiViewSet_2= ruleUiViewSet | this_UiValidatorAlias_3= ruleUiValidatorAlias | this_UiMobileView_4= ruleUiMobileView )
+            int alt3=5;
             switch ( input.LA(1) ) {
-            case 49:
+            case 48:
                 {
-                alt4=1;
+                alt3=1;
                 }
                 break;
-            case 20:
+            case 54:
                 {
-                alt4=2;
+                alt3=2;
                 }
                 break;
-            case 16:
+            case 19:
                 {
-                alt4=3;
+                alt3=3;
+                }
+                break;
+            case 14:
+                {
+                alt3=4;
                 }
                 break;
             case 59:
                 {
-                alt4=4;
+                alt3=5;
                 }
                 break;
             default:
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 4, 0, input);
+                    new NoViableAltException("", 3, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt4) {
+            switch (alt3) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:208:5: this_UiView_0= ruleUiView
+                    // InternalUIGrammar.g:171:3: this_UiView_0= ruleUiView
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getUiRootElementsAccess().getUiViewParserRuleCall_0()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getUiRootElementsAccess().getUiViewParserRuleCall_0());
+                      		
                     }
-                    pushFollow(FollowSets000.FOLLOW_ruleUiView_in_ruleUiRootElements399);
+                    pushFollow(FOLLOW_2);
                     this_UiView_0=ruleUiView();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_UiView_0; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_UiView_0;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:218:5: this_UiViewSet_1= ruleUiViewSet
+                    // InternalUIGrammar.g:180:3: this_UiDisplayView_1= ruleUiDisplayView
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getUiRootElementsAccess().getUiViewSetParserRuleCall_1()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getUiRootElementsAccess().getUiDisplayViewParserRuleCall_1());
+                      		
                     }
-                    pushFollow(FollowSets000.FOLLOW_ruleUiViewSet_in_ruleUiRootElements426);
-                    this_UiViewSet_1=ruleUiViewSet();
+                    pushFollow(FOLLOW_2);
+                    this_UiDisplayView_1=ruleUiDisplayView();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_UiViewSet_1; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_UiDisplayView_1;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 3 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:228:5: this_UiValidatorAlias_2= ruleUiValidatorAlias
+                    // InternalUIGrammar.g:189:3: this_UiViewSet_2= ruleUiViewSet
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getUiRootElementsAccess().getUiValidatorAliasParserRuleCall_2()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getUiRootElementsAccess().getUiViewSetParserRuleCall_2());
+                      		
                     }
-                    pushFollow(FollowSets000.FOLLOW_ruleUiValidatorAlias_in_ruleUiRootElements453);
-                    this_UiValidatorAlias_2=ruleUiValidatorAlias();
+                    pushFollow(FOLLOW_2);
+                    this_UiViewSet_2=ruleUiViewSet();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_UiValidatorAlias_2; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_UiViewSet_2;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 4 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:238:5: this_UiMobileView_3= ruleUiMobileView
+                    // InternalUIGrammar.g:198:3: this_UiValidatorAlias_3= ruleUiValidatorAlias
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getUiRootElementsAccess().getUiMobileViewParserRuleCall_3()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getUiRootElementsAccess().getUiValidatorAliasParserRuleCall_3());
+                      		
                     }
-                    pushFollow(FollowSets000.FOLLOW_ruleUiMobileView_in_ruleUiRootElements480);
-                    this_UiMobileView_3=ruleUiMobileView();
+                    pushFollow(FOLLOW_2);
+                    this_UiValidatorAlias_3=ruleUiValidatorAlias();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_UiMobileView_3; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_UiValidatorAlias_3;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 5 :
+                    // InternalUIGrammar.g:207:3: this_UiMobileView_4= ruleUiMobileView
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiRootElementsAccess().getUiMobileViewParserRuleCall_4());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiMobileView_4=ruleUiMobileView();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiMobileView_4;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
@@ -872,14 +761,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -888,7 +779,7 @@
 
 
     // $ANTLR start "entryRuleUiValidatorAlias"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:254:1: entryRuleUiValidatorAlias returns [EObject current=null] : iv_ruleUiValidatorAlias= ruleUiValidatorAlias EOF ;
+    // InternalUIGrammar.g:219:1: entryRuleUiValidatorAlias returns [EObject current=null] : iv_ruleUiValidatorAlias= ruleUiValidatorAlias EOF ;
     public final EObject entryRuleUiValidatorAlias() throws RecognitionException {
         EObject current = null;
 
@@ -896,13 +787,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:255:2: (iv_ruleUiValidatorAlias= ruleUiValidatorAlias EOF )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:256:2: iv_ruleUiValidatorAlias= ruleUiValidatorAlias EOF
+            // InternalUIGrammar.g:219:57: (iv_ruleUiValidatorAlias= ruleUiValidatorAlias EOF )
+            // InternalUIGrammar.g:220:2: iv_ruleUiValidatorAlias= ruleUiValidatorAlias EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUiValidatorAliasRule()); 
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiValidatorAlias_in_entryRuleUiValidatorAlias515);
+            pushFollow(FOLLOW_1);
             iv_ruleUiValidatorAlias=ruleUiValidatorAlias();
 
             state._fsp--;
@@ -910,16 +801,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUiValidatorAlias; 
             }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiValidatorAlias525); 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;
@@ -928,7 +819,7 @@
 
 
     // $ANTLR start "ruleUiValidatorAlias"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:263:1: ruleUiValidatorAlias returns [EObject current=null] : (otherlv_0= 'validatorAlias' ( (lv_validator_1_0= ruleUiValidator ) ) otherlv_2= 'as' ( (lv_alias_3_0= RULE_ID ) ) (otherlv_4= ';' )? ) ;
+    // InternalUIGrammar.g:226:1: ruleUiValidatorAlias returns [EObject current=null] : (otherlv_0= 'validatorAlias' ( (lv_validator_1_0= ruleUiValidator ) ) otherlv_2= 'as' ( (lv_alias_3_0= RULE_ID ) ) (otherlv_4= ';' )? ) ;
     public final EObject ruleUiValidatorAlias() throws RecognitionException {
         EObject current = null;
 
@@ -939,49 +830,50 @@
         EObject lv_validator_1_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:266:28: ( (otherlv_0= 'validatorAlias' ( (lv_validator_1_0= ruleUiValidator ) ) otherlv_2= 'as' ( (lv_alias_3_0= RULE_ID ) ) (otherlv_4= ';' )? ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:267:1: (otherlv_0= 'validatorAlias' ( (lv_validator_1_0= ruleUiValidator ) ) otherlv_2= 'as' ( (lv_alias_3_0= RULE_ID ) ) (otherlv_4= ';' )? )
+            // InternalUIGrammar.g:232:2: ( (otherlv_0= 'validatorAlias' ( (lv_validator_1_0= ruleUiValidator ) ) otherlv_2= 'as' ( (lv_alias_3_0= RULE_ID ) ) (otherlv_4= ';' )? ) )
+            // InternalUIGrammar.g:233:2: (otherlv_0= 'validatorAlias' ( (lv_validator_1_0= ruleUiValidator ) ) otherlv_2= 'as' ( (lv_alias_3_0= RULE_ID ) ) (otherlv_4= ';' )? )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:267:1: (otherlv_0= 'validatorAlias' ( (lv_validator_1_0= ruleUiValidator ) ) otherlv_2= 'as' ( (lv_alias_3_0= RULE_ID ) ) (otherlv_4= ';' )? )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:267:3: otherlv_0= 'validatorAlias' ( (lv_validator_1_0= ruleUiValidator ) ) otherlv_2= 'as' ( (lv_alias_3_0= RULE_ID ) ) (otherlv_4= ';' )?
+            // InternalUIGrammar.g:233:2: (otherlv_0= 'validatorAlias' ( (lv_validator_1_0= ruleUiValidator ) ) otherlv_2= 'as' ( (lv_alias_3_0= RULE_ID ) ) (otherlv_4= ';' )? )
+            // InternalUIGrammar.g:234:3: otherlv_0= 'validatorAlias' ( (lv_validator_1_0= ruleUiValidator ) ) otherlv_2= 'as' ( (lv_alias_3_0= RULE_ID ) ) (otherlv_4= ';' )?
             {
-            otherlv_0=(Token)match(input,16,FollowSets000.FOLLOW_16_in_ruleUiValidatorAlias562); if (state.failed) return current;
+            otherlv_0=(Token)match(input,14,FOLLOW_6); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getUiValidatorAliasAccess().getValidatorAliasKeyword_0());
-                  
+              			newLeafNode(otherlv_0, grammarAccess.getUiValidatorAliasAccess().getValidatorAliasKeyword_0());
+              		
             }
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:271:1: ( (lv_validator_1_0= ruleUiValidator ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:272:1: (lv_validator_1_0= ruleUiValidator )
+            // InternalUIGrammar.g:238:3: ( (lv_validator_1_0= ruleUiValidator ) )
+            // InternalUIGrammar.g:239:4: (lv_validator_1_0= ruleUiValidator )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:272:1: (lv_validator_1_0= ruleUiValidator )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:273:3: lv_validator_1_0= ruleUiValidator
+            // InternalUIGrammar.g:239:4: (lv_validator_1_0= ruleUiValidator )
+            // InternalUIGrammar.g:240:5: lv_validator_1_0= ruleUiValidator
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getUiValidatorAliasAccess().getValidatorUiValidatorParserRuleCall_1_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getUiValidatorAliasAccess().getValidatorUiValidatorParserRuleCall_1_0());
+              				
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiValidator_in_ruleUiValidatorAlias583);
+            pushFollow(FOLLOW_7);
             lv_validator_1_0=ruleUiValidator();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getUiValidatorAliasRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"validator",
-                      		lv_validator_1_0, 
-                      		"UiValidator");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getUiValidatorAliasRule());
+              					}
+              					set(
+              						current,
+              						"validator",
+              						lv_validator_1_0,
+              						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -989,35 +881,35 @@
 
             }
 
-            otherlv_2=(Token)match(input,17,FollowSets000.FOLLOW_17_in_ruleUiValidatorAlias595); if (state.failed) return current;
+            otherlv_2=(Token)match(input,15,FOLLOW_3); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_2, grammarAccess.getUiValidatorAliasAccess().getAsKeyword_2());
-                  
-            }
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:293:1: ( (lv_alias_3_0= RULE_ID ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:294:1: (lv_alias_3_0= RULE_ID )
-            {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:294:1: (lv_alias_3_0= RULE_ID )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:295:3: lv_alias_3_0= RULE_ID
-            {
-            lv_alias_3_0=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_RULE_ID_in_ruleUiValidatorAlias612); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-              			newLeafNode(lv_alias_3_0, grammarAccess.getUiValidatorAliasAccess().getAliasIDTerminalRuleCall_3_0()); 
+              			newLeafNode(otherlv_2, grammarAccess.getUiValidatorAliasAccess().getAsKeyword_2());
               		
             }
+            // InternalUIGrammar.g:261:3: ( (lv_alias_3_0= RULE_ID ) )
+            // InternalUIGrammar.g:262:4: (lv_alias_3_0= RULE_ID )
+            {
+            // InternalUIGrammar.g:262:4: (lv_alias_3_0= RULE_ID )
+            // InternalUIGrammar.g:263:5: lv_alias_3_0= RULE_ID
+            {
+            lv_alias_3_0=(Token)match(input,RULE_ID,FOLLOW_8); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElement(grammarAccess.getUiValidatorAliasRule());
-              	        }
-                     		setWithLastConsumed(
-                     			current, 
-                     			"alias",
-                      		lv_alias_3_0, 
-                      		"ID");
-              	    
+              					newLeafNode(lv_alias_3_0, grammarAccess.getUiValidatorAliasAccess().getAliasIDTerminalRuleCall_3_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getUiValidatorAliasRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"alias",
+              						lv_alias_3_0,
+              						"org.eclipse.xtext.xbase.Xtype.ID");
+              				
             }
 
             }
@@ -1025,22 +917,22 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:311:2: (otherlv_4= ';' )?
-            int alt5=2;
-            int LA5_0 = input.LA(1);
+            // InternalUIGrammar.g:279:3: (otherlv_4= ';' )?
+            int alt4=2;
+            int LA4_0 = input.LA(1);
 
-            if ( (LA5_0==15) ) {
-                alt5=1;
+            if ( (LA4_0==16) ) {
+                alt4=1;
             }
-            switch (alt5) {
+            switch (alt4) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:311:4: otherlv_4= ';'
+                    // InternalUIGrammar.g:280:4: otherlv_4= ';'
                     {
-                    otherlv_4=(Token)match(input,15,FollowSets000.FOLLOW_15_in_ruleUiValidatorAlias630); if (state.failed) return current;
+                    otherlv_4=(Token)match(input,16,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_4, grammarAccess.getUiValidatorAliasAccess().getSemicolonKeyword_4());
-                          
+                      				newLeafNode(otherlv_4, grammarAccess.getUiValidatorAliasAccess().getSemicolonKeyword_4());
+                      			
                     }
 
                     }
@@ -1055,14 +947,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -1071,7 +965,7 @@
 
 
     // $ANTLR start "entryRuleUiValidatorAssignment"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:323:1: entryRuleUiValidatorAssignment returns [EObject current=null] : iv_ruleUiValidatorAssignment= ruleUiValidatorAssignment EOF ;
+    // InternalUIGrammar.g:289:1: entryRuleUiValidatorAssignment returns [EObject current=null] : iv_ruleUiValidatorAssignment= ruleUiValidatorAssignment EOF ;
     public final EObject entryRuleUiValidatorAssignment() throws RecognitionException {
         EObject current = null;
 
@@ -1079,13 +973,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:324:2: (iv_ruleUiValidatorAssignment= ruleUiValidatorAssignment EOF )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:325:2: iv_ruleUiValidatorAssignment= ruleUiValidatorAssignment EOF
+            // InternalUIGrammar.g:289:62: (iv_ruleUiValidatorAssignment= ruleUiValidatorAssignment EOF )
+            // InternalUIGrammar.g:290:2: iv_ruleUiValidatorAssignment= ruleUiValidatorAssignment EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUiValidatorAssignmentRule()); 
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiValidatorAssignment_in_entryRuleUiValidatorAssignment668);
+            pushFollow(FOLLOW_1);
             iv_ruleUiValidatorAssignment=ruleUiValidatorAssignment();
 
             state._fsp--;
@@ -1093,16 +987,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUiValidatorAssignment; 
             }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiValidatorAssignment678); 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;
@@ -1111,7 +1005,7 @@
 
 
     // $ANTLR start "ruleUiValidatorAssignment"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:332:1: ruleUiValidatorAssignment returns [EObject current=null] : (otherlv_0= 'fieldValidation' ( (otherlv_1= RULE_ID ) ) otherlv_2= '+=' ( ( (lv_validatorDef_3_0= ruleUiValidatorDef ) ) | ( ( ( ruleQualifiedName ) ) (otherlv_5= ';' )? ) ) ) ;
+    // InternalUIGrammar.g:296:1: ruleUiValidatorAssignment returns [EObject current=null] : (otherlv_0= 'fieldValidation' ( (otherlv_1= RULE_ID ) ) otherlv_2= '+=' ( ( (lv_validatorDef_3_0= ruleUiValidatorDef ) ) | ( ( ( ruleQualifiedName ) ) (otherlv_5= ';' )? ) ) ) ;
     public final EObject ruleUiValidatorAssignment() throws RecognitionException {
         EObject current = null;
 
@@ -1122,39 +1016,40 @@
         EObject lv_validatorDef_3_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:335:28: ( (otherlv_0= 'fieldValidation' ( (otherlv_1= RULE_ID ) ) otherlv_2= '+=' ( ( (lv_validatorDef_3_0= ruleUiValidatorDef ) ) | ( ( ( ruleQualifiedName ) ) (otherlv_5= ';' )? ) ) ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:336:1: (otherlv_0= 'fieldValidation' ( (otherlv_1= RULE_ID ) ) otherlv_2= '+=' ( ( (lv_validatorDef_3_0= ruleUiValidatorDef ) ) | ( ( ( ruleQualifiedName ) ) (otherlv_5= ';' )? ) ) )
+            // InternalUIGrammar.g:302:2: ( (otherlv_0= 'fieldValidation' ( (otherlv_1= RULE_ID ) ) otherlv_2= '+=' ( ( (lv_validatorDef_3_0= ruleUiValidatorDef ) ) | ( ( ( ruleQualifiedName ) ) (otherlv_5= ';' )? ) ) ) )
+            // InternalUIGrammar.g:303:2: (otherlv_0= 'fieldValidation' ( (otherlv_1= RULE_ID ) ) otherlv_2= '+=' ( ( (lv_validatorDef_3_0= ruleUiValidatorDef ) ) | ( ( ( ruleQualifiedName ) ) (otherlv_5= ';' )? ) ) )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:336:1: (otherlv_0= 'fieldValidation' ( (otherlv_1= RULE_ID ) ) otherlv_2= '+=' ( ( (lv_validatorDef_3_0= ruleUiValidatorDef ) ) | ( ( ( ruleQualifiedName ) ) (otherlv_5= ';' )? ) ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:336:3: otherlv_0= 'fieldValidation' ( (otherlv_1= RULE_ID ) ) otherlv_2= '+=' ( ( (lv_validatorDef_3_0= ruleUiValidatorDef ) ) | ( ( ( ruleQualifiedName ) ) (otherlv_5= ';' )? ) )
+            // InternalUIGrammar.g:303:2: (otherlv_0= 'fieldValidation' ( (otherlv_1= RULE_ID ) ) otherlv_2= '+=' ( ( (lv_validatorDef_3_0= ruleUiValidatorDef ) ) | ( ( ( ruleQualifiedName ) ) (otherlv_5= ';' )? ) ) )
+            // InternalUIGrammar.g:304:3: otherlv_0= 'fieldValidation' ( (otherlv_1= RULE_ID ) ) otherlv_2= '+=' ( ( (lv_validatorDef_3_0= ruleUiValidatorDef ) ) | ( ( ( ruleQualifiedName ) ) (otherlv_5= ';' )? ) )
             {
-            otherlv_0=(Token)match(input,18,FollowSets000.FOLLOW_18_in_ruleUiValidatorAssignment715); if (state.failed) return current;
+            otherlv_0=(Token)match(input,17,FOLLOW_3); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getUiValidatorAssignmentAccess().getFieldValidationKeyword_0());
-                  
+              			newLeafNode(otherlv_0, grammarAccess.getUiValidatorAssignmentAccess().getFieldValidationKeyword_0());
+              		
             }
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:340:1: ( (otherlv_1= RULE_ID ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:341:1: (otherlv_1= RULE_ID )
+            // InternalUIGrammar.g:308:3: ( (otherlv_1= RULE_ID ) )
+            // InternalUIGrammar.g:309:4: (otherlv_1= RULE_ID )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:341:1: (otherlv_1= RULE_ID )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:342:3: otherlv_1= RULE_ID
+            // InternalUIGrammar.g:309:4: (otherlv_1= RULE_ID )
+            // InternalUIGrammar.g:310:5: otherlv_1= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
-              			if (current==null) {
-              	            current = createModelElement(grammarAccess.getUiValidatorAssignmentRule());
-              	        }
-                      
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getUiValidatorAssignmentRule());
+              					}
+              				
             }
-            otherlv_1=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_RULE_ID_in_ruleUiValidatorAssignment735); if (state.failed) return current;
+            otherlv_1=(Token)match(input,RULE_ID,FOLLOW_9); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              		newLeafNode(otherlv_1, grammarAccess.getUiValidatorAssignmentAccess().getFieldUiFieldCrossReference_1_0()); 
-              	
+              					newLeafNode(otherlv_1, grammarAccess.getUiValidatorAssignmentAccess().getFieldUiFieldCrossReference_1_0());
+              				
             }
 
             }
@@ -1162,61 +1057,61 @@
 
             }
 
-            otherlv_2=(Token)match(input,19,FollowSets000.FOLLOW_19_in_ruleUiValidatorAssignment747); if (state.failed) return current;
+            otherlv_2=(Token)match(input,18,FOLLOW_10); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_2, grammarAccess.getUiValidatorAssignmentAccess().getPlusSignEqualsSignKeyword_2());
-                  
+              			newLeafNode(otherlv_2, grammarAccess.getUiValidatorAssignmentAccess().getPlusSignEqualsSignKeyword_2());
+              		
             }
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:357:1: ( ( (lv_validatorDef_3_0= ruleUiValidatorDef ) ) | ( ( ( ruleQualifiedName ) ) (otherlv_5= ';' )? ) )
-            int alt7=2;
-            int LA7_0 = input.LA(1);
+            // InternalUIGrammar.g:325:3: ( ( (lv_validatorDef_3_0= ruleUiValidatorDef ) ) | ( ( ( ruleQualifiedName ) ) (otherlv_5= ';' )? ) )
+            int alt6=2;
+            int LA6_0 = input.LA(1);
 
-            if ( ((LA7_0>=145 && LA7_0<=149)) ) {
-                alt7=1;
+            if ( ((LA6_0>=147 && LA6_0<=151)) ) {
+                alt6=1;
             }
-            else if ( (LA7_0==RULE_ID) ) {
-                alt7=2;
+            else if ( (LA6_0==RULE_ID) ) {
+                alt6=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 7, 0, input);
+                    new NoViableAltException("", 6, 0, input);
 
                 throw nvae;
             }
-            switch (alt7) {
+            switch (alt6) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:357:2: ( (lv_validatorDef_3_0= ruleUiValidatorDef ) )
+                    // InternalUIGrammar.g:326:4: ( (lv_validatorDef_3_0= ruleUiValidatorDef ) )
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:357:2: ( (lv_validatorDef_3_0= ruleUiValidatorDef ) )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:358:1: (lv_validatorDef_3_0= ruleUiValidatorDef )
+                    // InternalUIGrammar.g:326:4: ( (lv_validatorDef_3_0= ruleUiValidatorDef ) )
+                    // InternalUIGrammar.g:327:5: (lv_validatorDef_3_0= ruleUiValidatorDef )
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:358:1: (lv_validatorDef_3_0= ruleUiValidatorDef )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:359:3: lv_validatorDef_3_0= ruleUiValidatorDef
+                    // InternalUIGrammar.g:327:5: (lv_validatorDef_3_0= ruleUiValidatorDef )
+                    // InternalUIGrammar.g:328:6: lv_validatorDef_3_0= ruleUiValidatorDef
                     {
                     if ( state.backtracking==0 ) {
-                       
-                      	        newCompositeNode(grammarAccess.getUiValidatorAssignmentAccess().getValidatorDefUiValidatorDefParserRuleCall_3_0_0()); 
-                      	    
+
+                      						newCompositeNode(grammarAccess.getUiValidatorAssignmentAccess().getValidatorDefUiValidatorDefParserRuleCall_3_0_0());
+                      					
                     }
-                    pushFollow(FollowSets000.FOLLOW_ruleUiValidatorDef_in_ruleUiValidatorAssignment769);
+                    pushFollow(FOLLOW_2);
                     lv_validatorDef_3_0=ruleUiValidatorDef();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElementForParent(grammarAccess.getUiValidatorAssignmentRule());
-                      	        }
-                             		set(
-                             			current, 
-                             			"validatorDef",
-                              		lv_validatorDef_3_0, 
-                              		"UiValidatorDef");
-                      	        afterParserOrEnumRuleCall();
-                      	    
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getUiValidatorAssignmentRule());
+                      						}
+                      						set(
+                      							current,
+                      							"validatorDef",
+                      							lv_validatorDef_3_0,
+                      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidatorDef");
+                      						afterParserOrEnumRuleCall();
+                      					
                     }
 
                     }
@@ -1228,38 +1123,38 @@
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:376:6: ( ( ( ruleQualifiedName ) ) (otherlv_5= ';' )? )
+                    // InternalUIGrammar.g:346:4: ( ( ( ruleQualifiedName ) ) (otherlv_5= ';' )? )
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:376:6: ( ( ( ruleQualifiedName ) ) (otherlv_5= ';' )? )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:376:7: ( ( ruleQualifiedName ) ) (otherlv_5= ';' )?
+                    // InternalUIGrammar.g:346:4: ( ( ( ruleQualifiedName ) ) (otherlv_5= ';' )? )
+                    // InternalUIGrammar.g:347:5: ( ( ruleQualifiedName ) ) (otherlv_5= ';' )?
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:376:7: ( ( ruleQualifiedName ) )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:377:1: ( ruleQualifiedName )
+                    // InternalUIGrammar.g:347:5: ( ( ruleQualifiedName ) )
+                    // InternalUIGrammar.g:348:6: ( ruleQualifiedName )
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:377:1: ( ruleQualifiedName )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:378:3: ruleQualifiedName
+                    // InternalUIGrammar.g:348:6: ( ruleQualifiedName )
+                    // InternalUIGrammar.g:349:7: ruleQualifiedName
                     {
                     if ( state.backtracking==0 ) {
 
-                      			if (current==null) {
-                      	            current = createModelElement(grammarAccess.getUiValidatorAssignmentRule());
-                      	        }
-                              
+                      							if (current==null) {
+                      								current = createModelElement(grammarAccess.getUiValidatorAssignmentRule());
+                      							}
+                      						
                     }
                     if ( state.backtracking==0 ) {
-                       
-                      	        newCompositeNode(grammarAccess.getUiValidatorAssignmentAccess().getValidatorAliasUiValidatorAliasCrossReference_3_1_0_0()); 
-                      	    
+
+                      							newCompositeNode(grammarAccess.getUiValidatorAssignmentAccess().getValidatorAliasUiValidatorAliasCrossReference_3_1_0_0());
+                      						
                     }
-                    pushFollow(FollowSets000.FOLLOW_ruleQualifiedName_in_ruleUiValidatorAssignment799);
+                    pushFollow(FOLLOW_8);
                     ruleQualifiedName();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                      	        afterParserOrEnumRuleCall();
-                      	    
+
+                      							afterParserOrEnumRuleCall();
+                      						
                     }
 
                     }
@@ -1267,22 +1162,22 @@
 
                     }
 
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:391:2: (otherlv_5= ';' )?
-                    int alt6=2;
-                    int LA6_0 = input.LA(1);
+                    // InternalUIGrammar.g:363:5: (otherlv_5= ';' )?
+                    int alt5=2;
+                    int LA5_0 = input.LA(1);
 
-                    if ( (LA6_0==15) ) {
-                        alt6=1;
+                    if ( (LA5_0==16) ) {
+                        alt5=1;
                     }
-                    switch (alt6) {
+                    switch (alt5) {
                         case 1 :
-                            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:391:4: otherlv_5= ';'
+                            // InternalUIGrammar.g:364:6: otherlv_5= ';'
                             {
-                            otherlv_5=(Token)match(input,15,FollowSets000.FOLLOW_15_in_ruleUiValidatorAssignment812); if (state.failed) return current;
+                            otherlv_5=(Token)match(input,16,FOLLOW_2); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
-                                  	newLeafNode(otherlv_5, grammarAccess.getUiValidatorAssignmentAccess().getSemicolonKeyword_3_1_1());
-                                  
+                              						newLeafNode(otherlv_5, grammarAccess.getUiValidatorAssignmentAccess().getSemicolonKeyword_3_1_1());
+                              					
                             }
 
                             }
@@ -1306,14 +1201,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -1322,7 +1219,7 @@
 
 
     // $ANTLR start "entryRuleUiValidatorDef"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:403:1: entryRuleUiValidatorDef returns [EObject current=null] : iv_ruleUiValidatorDef= ruleUiValidatorDef EOF ;
+    // InternalUIGrammar.g:375:1: entryRuleUiValidatorDef returns [EObject current=null] : iv_ruleUiValidatorDef= ruleUiValidatorDef EOF ;
     public final EObject entryRuleUiValidatorDef() throws RecognitionException {
         EObject current = null;
 
@@ -1330,13 +1227,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:404:2: (iv_ruleUiValidatorDef= ruleUiValidatorDef EOF )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:405:2: iv_ruleUiValidatorDef= ruleUiValidatorDef EOF
+            // InternalUIGrammar.g:375:55: (iv_ruleUiValidatorDef= ruleUiValidatorDef EOF )
+            // InternalUIGrammar.g:376:2: iv_ruleUiValidatorDef= ruleUiValidatorDef EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUiValidatorDefRule()); 
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiValidatorDef_in_entryRuleUiValidatorDef852);
+            pushFollow(FOLLOW_1);
             iv_ruleUiValidatorDef=ruleUiValidatorDef();
 
             state._fsp--;
@@ -1344,16 +1241,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUiValidatorDef; 
             }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiValidatorDef862); 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;
@@ -1362,47 +1259,48 @@
 
 
     // $ANTLR start "ruleUiValidatorDef"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:412:1: ruleUiValidatorDef returns [EObject current=null] : ( (lv_validator_0_0= ruleUiValidator ) ) ;
+    // InternalUIGrammar.g:382:1: ruleUiValidatorDef returns [EObject current=null] : ( (lv_validator_0_0= ruleUiValidator ) ) ;
     public final EObject ruleUiValidatorDef() throws RecognitionException {
         EObject current = null;
 
         EObject lv_validator_0_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:415:28: ( ( (lv_validator_0_0= ruleUiValidator ) ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:416:1: ( (lv_validator_0_0= ruleUiValidator ) )
+            // InternalUIGrammar.g:388:2: ( ( (lv_validator_0_0= ruleUiValidator ) ) )
+            // InternalUIGrammar.g:389:2: ( (lv_validator_0_0= ruleUiValidator ) )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:416:1: ( (lv_validator_0_0= ruleUiValidator ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:417:1: (lv_validator_0_0= ruleUiValidator )
+            // InternalUIGrammar.g:389:2: ( (lv_validator_0_0= ruleUiValidator ) )
+            // InternalUIGrammar.g:390:3: (lv_validator_0_0= ruleUiValidator )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:417:1: (lv_validator_0_0= ruleUiValidator )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:418:3: lv_validator_0_0= ruleUiValidator
+            // InternalUIGrammar.g:390:3: (lv_validator_0_0= ruleUiValidator )
+            // InternalUIGrammar.g:391:4: lv_validator_0_0= ruleUiValidator
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getUiValidatorDefAccess().getValidatorUiValidatorParserRuleCall_0()); 
-              	    
+
+              				newCompositeNode(grammarAccess.getUiValidatorDefAccess().getValidatorUiValidatorParserRuleCall_0());
+              			
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiValidator_in_ruleUiValidatorDef907);
+            pushFollow(FOLLOW_2);
             lv_validator_0_0=ruleUiValidator();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getUiValidatorDefRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"validator",
-                      		lv_validator_0_0, 
-                      		"UiValidator");
-              	        afterParserOrEnumRuleCall();
-              	    
+              				if (current==null) {
+              					current = createModelElementForParent(grammarAccess.getUiValidatorDefRule());
+              				}
+              				set(
+              					current,
+              					"validator",
+              					lv_validator_0_0,
+              					"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+              				afterParserOrEnumRuleCall();
+              			
             }
 
             }
@@ -1414,14 +1312,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -1430,7 +1330,7 @@
 
 
     // $ANTLR start "entryRuleUiViewSet"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:442:1: entryRuleUiViewSet returns [EObject current=null] : iv_ruleUiViewSet= ruleUiViewSet EOF ;
+    // InternalUIGrammar.g:411:1: entryRuleUiViewSet returns [EObject current=null] : iv_ruleUiViewSet= ruleUiViewSet EOF ;
     public final EObject entryRuleUiViewSet() throws RecognitionException {
         EObject current = null;
 
@@ -1438,13 +1338,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:443:2: (iv_ruleUiViewSet= ruleUiViewSet EOF )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:444:2: iv_ruleUiViewSet= ruleUiViewSet EOF
+            // InternalUIGrammar.g:411:50: (iv_ruleUiViewSet= ruleUiViewSet EOF )
+            // InternalUIGrammar.g:412:2: iv_ruleUiViewSet= ruleUiViewSet EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUiViewSetRule()); 
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiViewSet_in_entryRuleUiViewSet942);
+            pushFollow(FOLLOW_1);
             iv_ruleUiViewSet=ruleUiViewSet();
 
             state._fsp--;
@@ -1452,16 +1352,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUiViewSet; 
             }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiViewSet952); 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;
@@ -1470,7 +1370,7 @@
 
 
     // $ANTLR start "ruleUiViewSet"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:451:1: ruleUiViewSet returns [EObject current=null] : (otherlv_0= 'viewset' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_beanSlots_3_0= ruleUiBeanSlot ) )* ( (lv_bindingEndpointAlias_4_0= ruleUiBindingEndpointAlias ) )* otherlv_5= '}' ) ;
+    // InternalUIGrammar.g:418:1: ruleUiViewSet returns [EObject current=null] : (otherlv_0= 'viewset' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_beanSlots_3_0= ruleUiBeanSlot ) )* ( (lv_bindingEndpointAlias_4_0= ruleUiBindingEndpointAlias ) )* otherlv_5= '}' ) ;
     public final EObject ruleUiViewSet() throws RecognitionException {
         EObject current = null;
 
@@ -1483,97 +1383,151 @@
         EObject lv_bindingEndpointAlias_4_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:454:28: ( (otherlv_0= 'viewset' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_beanSlots_3_0= ruleUiBeanSlot ) )* ( (lv_bindingEndpointAlias_4_0= ruleUiBindingEndpointAlias ) )* otherlv_5= '}' ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:455:1: (otherlv_0= 'viewset' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_beanSlots_3_0= ruleUiBeanSlot ) )* ( (lv_bindingEndpointAlias_4_0= ruleUiBindingEndpointAlias ) )* otherlv_5= '}' )
+            // InternalUIGrammar.g:424:2: ( (otherlv_0= 'viewset' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_beanSlots_3_0= ruleUiBeanSlot ) )* ( (lv_bindingEndpointAlias_4_0= ruleUiBindingEndpointAlias ) )* otherlv_5= '}' ) )
+            // InternalUIGrammar.g:425:2: (otherlv_0= 'viewset' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_beanSlots_3_0= ruleUiBeanSlot ) )* ( (lv_bindingEndpointAlias_4_0= ruleUiBindingEndpointAlias ) )* otherlv_5= '}' )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:455:1: (otherlv_0= 'viewset' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_beanSlots_3_0= ruleUiBeanSlot ) )* ( (lv_bindingEndpointAlias_4_0= ruleUiBindingEndpointAlias ) )* otherlv_5= '}' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:455:3: otherlv_0= 'viewset' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_beanSlots_3_0= ruleUiBeanSlot ) )* ( (lv_bindingEndpointAlias_4_0= ruleUiBindingEndpointAlias ) )* otherlv_5= '}'
+            // InternalUIGrammar.g:425:2: (otherlv_0= 'viewset' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_beanSlots_3_0= ruleUiBeanSlot ) )* ( (lv_bindingEndpointAlias_4_0= ruleUiBindingEndpointAlias ) )* otherlv_5= '}' )
+            // InternalUIGrammar.g:426:3: otherlv_0= 'viewset' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_beanSlots_3_0= ruleUiBeanSlot ) )* ( (lv_bindingEndpointAlias_4_0= ruleUiBindingEndpointAlias ) )* otherlv_5= '}'
             {
-            otherlv_0=(Token)match(input,20,FollowSets000.FOLLOW_20_in_ruleUiViewSet989); if (state.failed) return current;
+            otherlv_0=(Token)match(input,19,FOLLOW_3); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getUiViewSetAccess().getViewsetKeyword_0());
-                  
-            }
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:459:1: ( (lv_name_1_0= RULE_ID ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:460:1: (lv_name_1_0= RULE_ID )
-            {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:460:1: (lv_name_1_0= RULE_ID )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:461:3: lv_name_1_0= RULE_ID
-            {
-            lv_name_1_0=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_RULE_ID_in_ruleUiViewSet1006); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-              			newLeafNode(lv_name_1_0, grammarAccess.getUiViewSetAccess().getNameIDTerminalRuleCall_1_0()); 
+              			newLeafNode(otherlv_0, grammarAccess.getUiViewSetAccess().getViewsetKeyword_0());
               		
             }
+            // InternalUIGrammar.g:430:3: ( (lv_name_1_0= RULE_ID ) )
+            // InternalUIGrammar.g:431:4: (lv_name_1_0= RULE_ID )
+            {
+            // InternalUIGrammar.g:431:4: (lv_name_1_0= RULE_ID )
+            // InternalUIGrammar.g:432:5: lv_name_1_0= RULE_ID
+            {
+            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_11); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElement(grammarAccess.getUiViewSetRule());
-              	        }
-                     		setWithLastConsumed(
-                     			current, 
-                     			"name",
-                      		lv_name_1_0, 
-                      		"ID");
-              	    
+              					newLeafNode(lv_name_1_0, grammarAccess.getUiViewSetAccess().getNameIDTerminalRuleCall_1_0());
+              				
             }
-
-            }
-
-
-            }
-
-            otherlv_2=(Token)match(input,21,FollowSets000.FOLLOW_21_in_ruleUiViewSet1023); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_2, grammarAccess.getUiViewSetAccess().getLeftCurlyBracketKeyword_2());
-                  
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getUiViewSetRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"name",
+              						lv_name_1_0,
+              						"org.eclipse.xtext.xbase.Xtype.ID");
+              				
             }
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:481:1: ( (lv_beanSlots_3_0= ruleUiBeanSlot ) )*
-            loop8:
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,20,FOLLOW_12); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getUiViewSetAccess().getLeftCurlyBracketKeyword_2());
+              		
+            }
+            // InternalUIGrammar.g:452:3: ( (lv_beanSlots_3_0= ruleUiBeanSlot ) )*
+            loop7:
             do {
-                int alt8=2;
-                int LA8_0 = input.LA(1);
+                int alt7=2;
+                int LA7_0 = input.LA(1);
 
-                if ( (LA8_0==24) ) {
-                    alt8=1;
+                if ( (LA7_0==23) ) {
+                    alt7=1;
                 }
 
 
-                switch (alt8) {
+                switch (alt7) {
             	case 1 :
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:482:1: (lv_beanSlots_3_0= ruleUiBeanSlot )
+            	    // InternalUIGrammar.g:453:4: (lv_beanSlots_3_0= ruleUiBeanSlot )
             	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:482:1: (lv_beanSlots_3_0= ruleUiBeanSlot )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:483:3: lv_beanSlots_3_0= ruleUiBeanSlot
+            	    // InternalUIGrammar.g:453:4: (lv_beanSlots_3_0= ruleUiBeanSlot )
+            	    // InternalUIGrammar.g:454:5: lv_beanSlots_3_0= ruleUiBeanSlot
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getUiViewSetAccess().getBeanSlotsUiBeanSlotParserRuleCall_3_0()); 
-            	      	    
+
+            	      					newCompositeNode(grammarAccess.getUiViewSetAccess().getBeanSlotsUiBeanSlotParserRuleCall_3_0());
+            	      				
             	    }
-            	    pushFollow(FollowSets000.FOLLOW_ruleUiBeanSlot_in_ruleUiViewSet1044);
+            	    pushFollow(FOLLOW_12);
             	    lv_beanSlots_3_0=ruleUiBeanSlot();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getUiViewSetRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"beanSlots",
-            	              		lv_beanSlots_3_0, 
-            	              		"UiBeanSlot");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiViewSetRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"beanSlots",
+            	      						lv_beanSlots_3_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBeanSlot");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop7;
+                }
+            } while (true);
+
+            // InternalUIGrammar.g:471:3: ( (lv_bindingEndpointAlias_4_0= ruleUiBindingEndpointAlias ) )*
+            loop8:
+            do {
+                int alt8=2;
+                int LA8_0 = input.LA(1);
+
+                if ( (LA8_0==22) ) {
+                    alt8=1;
+                }
+
+
+                switch (alt8) {
+            	case 1 :
+            	    // InternalUIGrammar.g:472:4: (lv_bindingEndpointAlias_4_0= ruleUiBindingEndpointAlias )
+            	    {
+            	    // InternalUIGrammar.g:472:4: (lv_bindingEndpointAlias_4_0= ruleUiBindingEndpointAlias )
+            	    // InternalUIGrammar.g:473:5: lv_bindingEndpointAlias_4_0= ruleUiBindingEndpointAlias
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiViewSetAccess().getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_4_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_13);
+            	    lv_bindingEndpointAlias_4_0=ruleUiBindingEndpointAlias();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiViewSetRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"bindingEndpointAlias",
+            	      						lv_bindingEndpointAlias_4_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAlias");
+            	      					afterParserOrEnumRuleCall();
+            	      				
             	    }
 
             	    }
@@ -1587,64 +1541,11 @@
                 }
             } while (true);
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:499:3: ( (lv_bindingEndpointAlias_4_0= ruleUiBindingEndpointAlias ) )*
-            loop9:
-            do {
-                int alt9=2;
-                int LA9_0 = input.LA(1);
-
-                if ( (LA9_0==23) ) {
-                    alt9=1;
-                }
-
-
-                switch (alt9) {
-            	case 1 :
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:500:1: (lv_bindingEndpointAlias_4_0= ruleUiBindingEndpointAlias )
-            	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:500:1: (lv_bindingEndpointAlias_4_0= ruleUiBindingEndpointAlias )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:501:3: lv_bindingEndpointAlias_4_0= ruleUiBindingEndpointAlias
-            	    {
-            	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getUiViewSetAccess().getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_4_0()); 
-            	      	    
-            	    }
-            	    pushFollow(FollowSets000.FOLLOW_ruleUiBindingEndpointAlias_in_ruleUiViewSet1066);
-            	    lv_bindingEndpointAlias_4_0=ruleUiBindingEndpointAlias();
-
-            	    state._fsp--;
-            	    if (state.failed) return current;
-            	    if ( state.backtracking==0 ) {
-
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getUiViewSetRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"bindingEndpointAlias",
-            	              		lv_bindingEndpointAlias_4_0, 
-            	              		"UiBindingEndpointAlias");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
-            	    }
-
-            	    }
-
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop9;
-                }
-            } while (true);
-
-            otherlv_5=(Token)match(input,22,FollowSets000.FOLLOW_22_in_ruleUiViewSet1079); if (state.failed) return current;
+            otherlv_5=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_5, grammarAccess.getUiViewSetAccess().getRightCurlyBracketKeyword_5());
-                  
+              			newLeafNode(otherlv_5, grammarAccess.getUiViewSetAccess().getRightCurlyBracketKeyword_5());
+              		
             }
 
             }
@@ -1653,14 +1554,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -1669,7 +1572,7 @@
 
 
     // $ANTLR start "entryRuleUiBindingEndpointAlias"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:529:1: entryRuleUiBindingEndpointAlias returns [EObject current=null] : iv_ruleUiBindingEndpointAlias= ruleUiBindingEndpointAlias EOF ;
+    // InternalUIGrammar.g:498:1: entryRuleUiBindingEndpointAlias returns [EObject current=null] : iv_ruleUiBindingEndpointAlias= ruleUiBindingEndpointAlias EOF ;
     public final EObject entryRuleUiBindingEndpointAlias() throws RecognitionException {
         EObject current = null;
 
@@ -1677,13 +1580,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:530:2: (iv_ruleUiBindingEndpointAlias= ruleUiBindingEndpointAlias EOF )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:531:2: iv_ruleUiBindingEndpointAlias= ruleUiBindingEndpointAlias EOF
+            // InternalUIGrammar.g:498:63: (iv_ruleUiBindingEndpointAlias= ruleUiBindingEndpointAlias EOF )
+            // InternalUIGrammar.g:499:2: iv_ruleUiBindingEndpointAlias= ruleUiBindingEndpointAlias EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUiBindingEndpointAliasRule()); 
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiBindingEndpointAlias_in_entryRuleUiBindingEndpointAlias1115);
+            pushFollow(FOLLOW_1);
             iv_ruleUiBindingEndpointAlias=ruleUiBindingEndpointAlias();
 
             state._fsp--;
@@ -1691,16 +1594,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUiBindingEndpointAlias; 
             }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiBindingEndpointAlias1125); 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;
@@ -1709,7 +1612,7 @@
 
 
     // $ANTLR start "ruleUiBindingEndpointAlias"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:538:1: ruleUiBindingEndpointAlias returns [EObject current=null] : (otherlv_0= 'dataAlias' ( (lv_endpoint_1_0= ruleUiBindingEndpointAssignment ) ) otherlv_2= 'as' ( (lv_alias_3_0= RULE_ID ) ) (otherlv_4= ';' )? ) ;
+    // InternalUIGrammar.g:505:1: ruleUiBindingEndpointAlias returns [EObject current=null] : (otherlv_0= 'dataAlias' ( (lv_endpoint_1_0= ruleUiBindingEndpointAssignment ) ) otherlv_2= 'as' ( (lv_alias_3_0= RULE_ID ) ) (otherlv_4= ';' )? ) ;
     public final EObject ruleUiBindingEndpointAlias() throws RecognitionException {
         EObject current = null;
 
@@ -1720,49 +1623,50 @@
         EObject lv_endpoint_1_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:541:28: ( (otherlv_0= 'dataAlias' ( (lv_endpoint_1_0= ruleUiBindingEndpointAssignment ) ) otherlv_2= 'as' ( (lv_alias_3_0= RULE_ID ) ) (otherlv_4= ';' )? ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:542:1: (otherlv_0= 'dataAlias' ( (lv_endpoint_1_0= ruleUiBindingEndpointAssignment ) ) otherlv_2= 'as' ( (lv_alias_3_0= RULE_ID ) ) (otherlv_4= ';' )? )
+            // InternalUIGrammar.g:511:2: ( (otherlv_0= 'dataAlias' ( (lv_endpoint_1_0= ruleUiBindingEndpointAssignment ) ) otherlv_2= 'as' ( (lv_alias_3_0= RULE_ID ) ) (otherlv_4= ';' )? ) )
+            // InternalUIGrammar.g:512:2: (otherlv_0= 'dataAlias' ( (lv_endpoint_1_0= ruleUiBindingEndpointAssignment ) ) otherlv_2= 'as' ( (lv_alias_3_0= RULE_ID ) ) (otherlv_4= ';' )? )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:542:1: (otherlv_0= 'dataAlias' ( (lv_endpoint_1_0= ruleUiBindingEndpointAssignment ) ) otherlv_2= 'as' ( (lv_alias_3_0= RULE_ID ) ) (otherlv_4= ';' )? )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:542:3: otherlv_0= 'dataAlias' ( (lv_endpoint_1_0= ruleUiBindingEndpointAssignment ) ) otherlv_2= 'as' ( (lv_alias_3_0= RULE_ID ) ) (otherlv_4= ';' )?
+            // InternalUIGrammar.g:512:2: (otherlv_0= 'dataAlias' ( (lv_endpoint_1_0= ruleUiBindingEndpointAssignment ) ) otherlv_2= 'as' ( (lv_alias_3_0= RULE_ID ) ) (otherlv_4= ';' )? )
+            // InternalUIGrammar.g:513:3: otherlv_0= 'dataAlias' ( (lv_endpoint_1_0= ruleUiBindingEndpointAssignment ) ) otherlv_2= 'as' ( (lv_alias_3_0= RULE_ID ) ) (otherlv_4= ';' )?
             {
-            otherlv_0=(Token)match(input,23,FollowSets000.FOLLOW_23_in_ruleUiBindingEndpointAlias1162); if (state.failed) return current;
+            otherlv_0=(Token)match(input,22,FOLLOW_14); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getUiBindingEndpointAliasAccess().getDataAliasKeyword_0());
-                  
+              			newLeafNode(otherlv_0, grammarAccess.getUiBindingEndpointAliasAccess().getDataAliasKeyword_0());
+              		
             }
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:546:1: ( (lv_endpoint_1_0= ruleUiBindingEndpointAssignment ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:547:1: (lv_endpoint_1_0= ruleUiBindingEndpointAssignment )
+            // InternalUIGrammar.g:517:3: ( (lv_endpoint_1_0= ruleUiBindingEndpointAssignment ) )
+            // InternalUIGrammar.g:518:4: (lv_endpoint_1_0= ruleUiBindingEndpointAssignment )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:547:1: (lv_endpoint_1_0= ruleUiBindingEndpointAssignment )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:548:3: lv_endpoint_1_0= ruleUiBindingEndpointAssignment
+            // InternalUIGrammar.g:518:4: (lv_endpoint_1_0= ruleUiBindingEndpointAssignment )
+            // InternalUIGrammar.g:519:5: lv_endpoint_1_0= ruleUiBindingEndpointAssignment
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getUiBindingEndpointAliasAccess().getEndpointUiBindingEndpointAssignmentParserRuleCall_1_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getUiBindingEndpointAliasAccess().getEndpointUiBindingEndpointAssignmentParserRuleCall_1_0());
+              				
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiBindingEndpointAssignment_in_ruleUiBindingEndpointAlias1183);
+            pushFollow(FOLLOW_7);
             lv_endpoint_1_0=ruleUiBindingEndpointAssignment();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getUiBindingEndpointAliasRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"endpoint",
-                      		lv_endpoint_1_0, 
-                      		"UiBindingEndpointAssignment");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getUiBindingEndpointAliasRule());
+              					}
+              					set(
+              						current,
+              						"endpoint",
+              						lv_endpoint_1_0,
+              						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAssignment");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -1770,35 +1674,35 @@
 
             }
 
-            otherlv_2=(Token)match(input,17,FollowSets000.FOLLOW_17_in_ruleUiBindingEndpointAlias1195); if (state.failed) return current;
+            otherlv_2=(Token)match(input,15,FOLLOW_3); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_2, grammarAccess.getUiBindingEndpointAliasAccess().getAsKeyword_2());
-                  
-            }
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:568:1: ( (lv_alias_3_0= RULE_ID ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:569:1: (lv_alias_3_0= RULE_ID )
-            {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:569:1: (lv_alias_3_0= RULE_ID )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:570:3: lv_alias_3_0= RULE_ID
-            {
-            lv_alias_3_0=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_RULE_ID_in_ruleUiBindingEndpointAlias1212); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-              			newLeafNode(lv_alias_3_0, grammarAccess.getUiBindingEndpointAliasAccess().getAliasIDTerminalRuleCall_3_0()); 
+              			newLeafNode(otherlv_2, grammarAccess.getUiBindingEndpointAliasAccess().getAsKeyword_2());
               		
             }
+            // InternalUIGrammar.g:540:3: ( (lv_alias_3_0= RULE_ID ) )
+            // InternalUIGrammar.g:541:4: (lv_alias_3_0= RULE_ID )
+            {
+            // InternalUIGrammar.g:541:4: (lv_alias_3_0= RULE_ID )
+            // InternalUIGrammar.g:542:5: lv_alias_3_0= RULE_ID
+            {
+            lv_alias_3_0=(Token)match(input,RULE_ID,FOLLOW_8); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElement(grammarAccess.getUiBindingEndpointAliasRule());
-              	        }
-                     		setWithLastConsumed(
-                     			current, 
-                     			"alias",
-                      		lv_alias_3_0, 
-                      		"ID");
-              	    
+              					newLeafNode(lv_alias_3_0, grammarAccess.getUiBindingEndpointAliasAccess().getAliasIDTerminalRuleCall_3_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getUiBindingEndpointAliasRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"alias",
+              						lv_alias_3_0,
+              						"org.eclipse.xtext.xbase.Xtype.ID");
+              				
             }
 
             }
@@ -1806,22 +1710,22 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:586:2: (otherlv_4= ';' )?
-            int alt10=2;
-            int LA10_0 = input.LA(1);
+            // InternalUIGrammar.g:558:3: (otherlv_4= ';' )?
+            int alt9=2;
+            int LA9_0 = input.LA(1);
 
-            if ( (LA10_0==15) ) {
-                alt10=1;
+            if ( (LA9_0==16) ) {
+                alt9=1;
             }
-            switch (alt10) {
+            switch (alt9) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:586:4: otherlv_4= ';'
+                    // InternalUIGrammar.g:559:4: otherlv_4= ';'
                     {
-                    otherlv_4=(Token)match(input,15,FollowSets000.FOLLOW_15_in_ruleUiBindingEndpointAlias1230); if (state.failed) return current;
+                    otherlv_4=(Token)match(input,16,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_4, grammarAccess.getUiBindingEndpointAliasAccess().getSemicolonKeyword_4());
-                          
+                      				newLeafNode(otherlv_4, grammarAccess.getUiBindingEndpointAliasAccess().getSemicolonKeyword_4());
+                      			
                     }
 
                     }
@@ -1836,14 +1740,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -1852,7 +1758,7 @@
 
 
     // $ANTLR start "entryRuleUiBeanSlot"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:598:1: entryRuleUiBeanSlot returns [EObject current=null] : iv_ruleUiBeanSlot= ruleUiBeanSlot EOF ;
+    // InternalUIGrammar.g:568:1: entryRuleUiBeanSlot returns [EObject current=null] : iv_ruleUiBeanSlot= ruleUiBeanSlot EOF ;
     public final EObject entryRuleUiBeanSlot() throws RecognitionException {
         EObject current = null;
 
@@ -1860,13 +1766,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:599:2: (iv_ruleUiBeanSlot= ruleUiBeanSlot EOF )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:600:2: iv_ruleUiBeanSlot= ruleUiBeanSlot EOF
+            // InternalUIGrammar.g:568:51: (iv_ruleUiBeanSlot= ruleUiBeanSlot EOF )
+            // InternalUIGrammar.g:569:2: iv_ruleUiBeanSlot= ruleUiBeanSlot EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUiBeanSlotRule()); 
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiBeanSlot_in_entryRuleUiBeanSlot1268);
+            pushFollow(FOLLOW_1);
             iv_ruleUiBeanSlot=ruleUiBeanSlot();
 
             state._fsp--;
@@ -1874,16 +1780,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUiBeanSlot; 
             }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiBeanSlot1278); 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;
@@ -1892,7 +1798,7 @@
 
 
     // $ANTLR start "ruleUiBeanSlot"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:607:1: ruleUiBeanSlot returns [EObject current=null] : (otherlv_0= 'datasource' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= ':' ( (lv_jvmType_3_0= ruleJvmTypeReference ) ) (otherlv_4= 'eventTopic' ( (lv_eventTopic_5_0= RULE_STRING ) ) )? (otherlv_6= ';' )? ) ;
+    // InternalUIGrammar.g:575:1: ruleUiBeanSlot returns [EObject current=null] : (otherlv_0= 'datasource' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= ':' ( (lv_jvmType_3_0= ruleJvmTypeReference ) ) (otherlv_4= 'eventTopic' ( (lv_eventTopic_5_0= RULE_STRING ) ) )? (otherlv_6= ';' )? ) ;
     public final EObject ruleUiBeanSlot() throws RecognitionException {
         EObject current = null;
 
@@ -1905,85 +1811,86 @@
         EObject lv_jvmType_3_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:610:28: ( (otherlv_0= 'datasource' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= ':' ( (lv_jvmType_3_0= ruleJvmTypeReference ) ) (otherlv_4= 'eventTopic' ( (lv_eventTopic_5_0= RULE_STRING ) ) )? (otherlv_6= ';' )? ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:611:1: (otherlv_0= 'datasource' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= ':' ( (lv_jvmType_3_0= ruleJvmTypeReference ) ) (otherlv_4= 'eventTopic' ( (lv_eventTopic_5_0= RULE_STRING ) ) )? (otherlv_6= ';' )? )
+            // InternalUIGrammar.g:581:2: ( (otherlv_0= 'datasource' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= ':' ( (lv_jvmType_3_0= ruleJvmTypeReference ) ) (otherlv_4= 'eventTopic' ( (lv_eventTopic_5_0= RULE_STRING ) ) )? (otherlv_6= ';' )? ) )
+            // InternalUIGrammar.g:582:2: (otherlv_0= 'datasource' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= ':' ( (lv_jvmType_3_0= ruleJvmTypeReference ) ) (otherlv_4= 'eventTopic' ( (lv_eventTopic_5_0= RULE_STRING ) ) )? (otherlv_6= ';' )? )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:611:1: (otherlv_0= 'datasource' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= ':' ( (lv_jvmType_3_0= ruleJvmTypeReference ) ) (otherlv_4= 'eventTopic' ( (lv_eventTopic_5_0= RULE_STRING ) ) )? (otherlv_6= ';' )? )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:611:3: otherlv_0= 'datasource' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= ':' ( (lv_jvmType_3_0= ruleJvmTypeReference ) ) (otherlv_4= 'eventTopic' ( (lv_eventTopic_5_0= RULE_STRING ) ) )? (otherlv_6= ';' )?
+            // InternalUIGrammar.g:582:2: (otherlv_0= 'datasource' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= ':' ( (lv_jvmType_3_0= ruleJvmTypeReference ) ) (otherlv_4= 'eventTopic' ( (lv_eventTopic_5_0= RULE_STRING ) ) )? (otherlv_6= ';' )? )
+            // InternalUIGrammar.g:583:3: otherlv_0= 'datasource' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= ':' ( (lv_jvmType_3_0= ruleJvmTypeReference ) ) (otherlv_4= 'eventTopic' ( (lv_eventTopic_5_0= RULE_STRING ) ) )? (otherlv_6= ';' )?
             {
-            otherlv_0=(Token)match(input,24,FollowSets000.FOLLOW_24_in_ruleUiBeanSlot1315); if (state.failed) return current;
+            otherlv_0=(Token)match(input,23,FOLLOW_3); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getUiBeanSlotAccess().getDatasourceKeyword_0());
-                  
-            }
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:615:1: ( (lv_name_1_0= RULE_ID ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:616:1: (lv_name_1_0= RULE_ID )
-            {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:616:1: (lv_name_1_0= RULE_ID )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:617:3: lv_name_1_0= RULE_ID
-            {
-            lv_name_1_0=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_RULE_ID_in_ruleUiBeanSlot1332); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-              			newLeafNode(lv_name_1_0, grammarAccess.getUiBeanSlotAccess().getNameIDTerminalRuleCall_1_0()); 
+              			newLeafNode(otherlv_0, grammarAccess.getUiBeanSlotAccess().getDatasourceKeyword_0());
               		
             }
-            if ( state.backtracking==0 ) {
-
-              	        if (current==null) {
-              	            current = createModelElement(grammarAccess.getUiBeanSlotRule());
-              	        }
-                     		setWithLastConsumed(
-                     			current, 
-                     			"name",
-                      		lv_name_1_0, 
-                      		"ID");
-              	    
-            }
-
-            }
-
-
-            }
-
-            otherlv_2=(Token)match(input,25,FollowSets000.FOLLOW_25_in_ruleUiBeanSlot1349); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-                  	newLeafNode(otherlv_2, grammarAccess.getUiBeanSlotAccess().getColonKeyword_2());
-                  
-            }
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:637:1: ( (lv_jvmType_3_0= ruleJvmTypeReference ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:638:1: (lv_jvmType_3_0= ruleJvmTypeReference )
+            // InternalUIGrammar.g:587:3: ( (lv_name_1_0= RULE_ID ) )
+            // InternalUIGrammar.g:588:4: (lv_name_1_0= RULE_ID )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:638:1: (lv_jvmType_3_0= ruleJvmTypeReference )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:639:3: lv_jvmType_3_0= ruleJvmTypeReference
+            // InternalUIGrammar.g:588:4: (lv_name_1_0= RULE_ID )
+            // InternalUIGrammar.g:589:5: lv_name_1_0= RULE_ID
+            {
+            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_15); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_name_1_0, grammarAccess.getUiBeanSlotAccess().getNameIDTerminalRuleCall_1_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getUiBeanSlotRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"name",
+              						lv_name_1_0,
+              						"org.eclipse.xtext.xbase.Xtype.ID");
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,24,FOLLOW_16); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getUiBeanSlotAccess().getColonKeyword_2());
+              		
+            }
+            // InternalUIGrammar.g:609:3: ( (lv_jvmType_3_0= ruleJvmTypeReference ) )
+            // InternalUIGrammar.g:610:4: (lv_jvmType_3_0= ruleJvmTypeReference )
+            {
+            // InternalUIGrammar.g:610:4: (lv_jvmType_3_0= ruleJvmTypeReference )
+            // InternalUIGrammar.g:611:5: lv_jvmType_3_0= ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getUiBeanSlotAccess().getJvmTypeJvmTypeReferenceParserRuleCall_3_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getUiBeanSlotAccess().getJvmTypeJvmTypeReferenceParserRuleCall_3_0());
+              				
             }
-            pushFollow(FollowSets000.FOLLOW_ruleJvmTypeReference_in_ruleUiBeanSlot1370);
+            pushFollow(FOLLOW_17);
             lv_jvmType_3_0=ruleJvmTypeReference();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getUiBeanSlotRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"jvmType",
-                      		lv_jvmType_3_0, 
-                      		"JvmTypeReference");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getUiBeanSlotRule());
+              					}
+              					set(
+              						current,
+              						"jvmType",
+              						lv_jvmType_3_0,
+              						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -1991,46 +1898,46 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:655:2: (otherlv_4= 'eventTopic' ( (lv_eventTopic_5_0= RULE_STRING ) ) )?
-            int alt11=2;
-            int LA11_0 = input.LA(1);
+            // InternalUIGrammar.g:628:3: (otherlv_4= 'eventTopic' ( (lv_eventTopic_5_0= RULE_STRING ) ) )?
+            int alt10=2;
+            int LA10_0 = input.LA(1);
 
-            if ( (LA11_0==26) ) {
-                alt11=1;
+            if ( (LA10_0==25) ) {
+                alt10=1;
             }
-            switch (alt11) {
+            switch (alt10) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:655:4: otherlv_4= 'eventTopic' ( (lv_eventTopic_5_0= RULE_STRING ) )
+                    // InternalUIGrammar.g:629:4: otherlv_4= 'eventTopic' ( (lv_eventTopic_5_0= RULE_STRING ) )
                     {
-                    otherlv_4=(Token)match(input,26,FollowSets000.FOLLOW_26_in_ruleUiBeanSlot1383); 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.getUiBeanSlotAccess().getEventTopicKeyword_4_0());
-                          
+                      				newLeafNode(otherlv_4, grammarAccess.getUiBeanSlotAccess().getEventTopicKeyword_4_0());
+                      			
                     }
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:659:1: ( (lv_eventTopic_5_0= RULE_STRING ) )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:660:1: (lv_eventTopic_5_0= RULE_STRING )
+                    // InternalUIGrammar.g:633:4: ( (lv_eventTopic_5_0= RULE_STRING ) )
+                    // InternalUIGrammar.g:634:5: (lv_eventTopic_5_0= RULE_STRING )
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:660:1: (lv_eventTopic_5_0= RULE_STRING )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:661:3: lv_eventTopic_5_0= RULE_STRING
+                    // InternalUIGrammar.g:634:5: (lv_eventTopic_5_0= RULE_STRING )
+                    // InternalUIGrammar.g:635:6: lv_eventTopic_5_0= RULE_STRING
                     {
-                    lv_eventTopic_5_0=(Token)match(input,RULE_STRING,FollowSets000.FOLLOW_RULE_STRING_in_ruleUiBeanSlot1400); if (state.failed) return current;
+                    lv_eventTopic_5_0=(Token)match(input,RULE_STRING,FOLLOW_8); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      			newLeafNode(lv_eventTopic_5_0, grammarAccess.getUiBeanSlotAccess().getEventTopicSTRINGTerminalRuleCall_4_1_0()); 
-                      		
+                      						newLeafNode(lv_eventTopic_5_0, grammarAccess.getUiBeanSlotAccess().getEventTopicSTRINGTerminalRuleCall_4_1_0());
+                      					
                     }
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElement(grammarAccess.getUiBeanSlotRule());
-                      	        }
-                             		setWithLastConsumed(
-                             			current, 
-                             			"eventTopic",
-                              		lv_eventTopic_5_0, 
-                              		"STRING");
-                      	    
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getUiBeanSlotRule());
+                      						}
+                      						setWithLastConsumed(
+                      							current,
+                      							"eventTopic",
+                      							lv_eventTopic_5_0,
+                      							"org.eclipse.xtext.xbase.Xtype.STRING");
+                      					
                     }
 
                     }
@@ -2044,22 +1951,22 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:677:4: (otherlv_6= ';' )?
-            int alt12=2;
-            int LA12_0 = input.LA(1);
+            // InternalUIGrammar.g:652:3: (otherlv_6= ';' )?
+            int alt11=2;
+            int LA11_0 = input.LA(1);
 
-            if ( (LA12_0==15) ) {
-                alt12=1;
+            if ( (LA11_0==16) ) {
+                alt11=1;
             }
-            switch (alt12) {
+            switch (alt11) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:677:6: otherlv_6= ';'
+                    // InternalUIGrammar.g:653:4: otherlv_6= ';'
                     {
-                    otherlv_6=(Token)match(input,15,FollowSets000.FOLLOW_15_in_ruleUiBeanSlot1420); if (state.failed) return current;
+                    otherlv_6=(Token)match(input,16,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_6, grammarAccess.getUiBeanSlotAccess().getSemicolonKeyword_5());
-                          
+                      				newLeafNode(otherlv_6, grammarAccess.getUiBeanSlotAccess().getSemicolonKeyword_5());
+                      			
                     }
 
                     }
@@ -2074,14 +1981,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -2090,7 +1999,7 @@
 
 
     // $ANTLR start "entryRuleUiBinding"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:689:1: entryRuleUiBinding returns [EObject current=null] : iv_ruleUiBinding= ruleUiBinding EOF ;
+    // InternalUIGrammar.g:662:1: entryRuleUiBinding returns [EObject current=null] : iv_ruleUiBinding= ruleUiBinding EOF ;
     public final EObject entryRuleUiBinding() throws RecognitionException {
         EObject current = null;
 
@@ -2098,13 +2007,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:690:2: (iv_ruleUiBinding= ruleUiBinding EOF )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:691:2: iv_ruleUiBinding= ruleUiBinding EOF
+            // InternalUIGrammar.g:662:50: (iv_ruleUiBinding= ruleUiBinding EOF )
+            // InternalUIGrammar.g:663:2: iv_ruleUiBinding= ruleUiBinding EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUiBindingRule()); 
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiBinding_in_entryRuleUiBinding1458);
+            pushFollow(FOLLOW_1);
             iv_ruleUiBinding=ruleUiBinding();
 
             state._fsp--;
@@ -2112,16 +2021,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUiBinding; 
             }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiBinding1468); 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;
@@ -2130,7 +2039,7 @@
 
 
     // $ANTLR start "ruleUiBinding"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:698:1: ruleUiBinding returns [EObject current=null] : (otherlv_0= 'bind' ( (lv_listBinding_1_0= 'list' ) )? ( (lv_source_2_0= ruleUiBindingEndpointAssignment ) ) ( ( (lv_targetToSource_3_0= '<' ) )? otherlv_4= '--' ( (lv_sourceToTarget_5_0= '>' ) )? ) ( (lv_target_6_0= ruleUiBindingEndpointAssignment ) ) (otherlv_7= ';' )? ) ;
+    // InternalUIGrammar.g:669:1: ruleUiBinding returns [EObject current=null] : (otherlv_0= 'bind' ( (lv_listBinding_1_0= 'list' ) )? ( (lv_source_2_0= ruleUiBindingEndpointAssignment ) ) ( ( (lv_targetToSource_3_0= '<' ) )? otherlv_4= '--' ( (lv_sourceToTarget_5_0= '>' ) )? ) ( (lv_target_6_0= ruleUiBindingEndpointAssignment ) ) (otherlv_7= ';' )? ) ;
     public final EObject ruleUiBinding() throws RecognitionException {
         EObject current = null;
 
@@ -2145,22 +2054,98 @@
         EObject lv_target_6_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:701:28: ( (otherlv_0= 'bind' ( (lv_listBinding_1_0= 'list' ) )? ( (lv_source_2_0= ruleUiBindingEndpointAssignment ) ) ( ( (lv_targetToSource_3_0= '<' ) )? otherlv_4= '--' ( (lv_sourceToTarget_5_0= '>' ) )? ) ( (lv_target_6_0= ruleUiBindingEndpointAssignment ) ) (otherlv_7= ';' )? ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:702:1: (otherlv_0= 'bind' ( (lv_listBinding_1_0= 'list' ) )? ( (lv_source_2_0= ruleUiBindingEndpointAssignment ) ) ( ( (lv_targetToSource_3_0= '<' ) )? otherlv_4= '--' ( (lv_sourceToTarget_5_0= '>' ) )? ) ( (lv_target_6_0= ruleUiBindingEndpointAssignment ) ) (otherlv_7= ';' )? )
+            // InternalUIGrammar.g:675:2: ( (otherlv_0= 'bind' ( (lv_listBinding_1_0= 'list' ) )? ( (lv_source_2_0= ruleUiBindingEndpointAssignment ) ) ( ( (lv_targetToSource_3_0= '<' ) )? otherlv_4= '--' ( (lv_sourceToTarget_5_0= '>' ) )? ) ( (lv_target_6_0= ruleUiBindingEndpointAssignment ) ) (otherlv_7= ';' )? ) )
+            // InternalUIGrammar.g:676:2: (otherlv_0= 'bind' ( (lv_listBinding_1_0= 'list' ) )? ( (lv_source_2_0= ruleUiBindingEndpointAssignment ) ) ( ( (lv_targetToSource_3_0= '<' ) )? otherlv_4= '--' ( (lv_sourceToTarget_5_0= '>' ) )? ) ( (lv_target_6_0= ruleUiBindingEndpointAssignment ) ) (otherlv_7= ';' )? )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:702:1: (otherlv_0= 'bind' ( (lv_listBinding_1_0= 'list' ) )? ( (lv_source_2_0= ruleUiBindingEndpointAssignment ) ) ( ( (lv_targetToSource_3_0= '<' ) )? otherlv_4= '--' ( (lv_sourceToTarget_5_0= '>' ) )? ) ( (lv_target_6_0= ruleUiBindingEndpointAssignment ) ) (otherlv_7= ';' )? )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:702:3: otherlv_0= 'bind' ( (lv_listBinding_1_0= 'list' ) )? ( (lv_source_2_0= ruleUiBindingEndpointAssignment ) ) ( ( (lv_targetToSource_3_0= '<' ) )? otherlv_4= '--' ( (lv_sourceToTarget_5_0= '>' ) )? ) ( (lv_target_6_0= ruleUiBindingEndpointAssignment ) ) (otherlv_7= ';' )?
+            // InternalUIGrammar.g:676:2: (otherlv_0= 'bind' ( (lv_listBinding_1_0= 'list' ) )? ( (lv_source_2_0= ruleUiBindingEndpointAssignment ) ) ( ( (lv_targetToSource_3_0= '<' ) )? otherlv_4= '--' ( (lv_sourceToTarget_5_0= '>' ) )? ) ( (lv_target_6_0= ruleUiBindingEndpointAssignment ) ) (otherlv_7= ';' )? )
+            // InternalUIGrammar.g:677:3: otherlv_0= 'bind' ( (lv_listBinding_1_0= 'list' ) )? ( (lv_source_2_0= ruleUiBindingEndpointAssignment ) ) ( ( (lv_targetToSource_3_0= '<' ) )? otherlv_4= '--' ( (lv_sourceToTarget_5_0= '>' ) )? ) ( (lv_target_6_0= ruleUiBindingEndpointAssignment ) ) (otherlv_7= ';' )?
             {
-            otherlv_0=(Token)match(input,27,FollowSets000.FOLLOW_27_in_ruleUiBinding1505); if (state.failed) return current;
+            otherlv_0=(Token)match(input,26,FOLLOW_19); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getUiBindingAccess().getBindKeyword_0());
-                  
+              			newLeafNode(otherlv_0, grammarAccess.getUiBindingAccess().getBindKeyword_0());
+              		
             }
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:706:1: ( (lv_listBinding_1_0= 'list' ) )?
+            // InternalUIGrammar.g:681:3: ( (lv_listBinding_1_0= 'list' ) )?
+            int alt12=2;
+            int LA12_0 = input.LA(1);
+
+            if ( (LA12_0==27) ) {
+                alt12=1;
+            }
+            switch (alt12) {
+                case 1 :
+                    // InternalUIGrammar.g:682:4: (lv_listBinding_1_0= 'list' )
+                    {
+                    // InternalUIGrammar.g:682:4: (lv_listBinding_1_0= 'list' )
+                    // InternalUIGrammar.g:683:5: lv_listBinding_1_0= 'list'
+                    {
+                    lv_listBinding_1_0=(Token)match(input,27,FOLLOW_14); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_listBinding_1_0, grammarAccess.getUiBindingAccess().getListBindingListKeyword_1_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiBindingRule());
+                      					}
+                      					setWithLastConsumed(current, "listBinding", true, "list");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:695:3: ( (lv_source_2_0= ruleUiBindingEndpointAssignment ) )
+            // InternalUIGrammar.g:696:4: (lv_source_2_0= ruleUiBindingEndpointAssignment )
+            {
+            // InternalUIGrammar.g:696:4: (lv_source_2_0= ruleUiBindingEndpointAssignment )
+            // InternalUIGrammar.g:697:5: lv_source_2_0= ruleUiBindingEndpointAssignment
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getUiBindingAccess().getSourceUiBindingEndpointAssignmentParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FOLLOW_20);
+            lv_source_2_0=ruleUiBindingEndpointAssignment();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getUiBindingRule());
+              					}
+              					set(
+              						current,
+              						"source",
+              						lv_source_2_0,
+              						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAssignment");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalUIGrammar.g:714:3: ( ( (lv_targetToSource_3_0= '<' ) )? otherlv_4= '--' ( (lv_sourceToTarget_5_0= '>' ) )? )
+            // InternalUIGrammar.g:715:4: ( (lv_targetToSource_3_0= '<' ) )? otherlv_4= '--' ( (lv_sourceToTarget_5_0= '>' ) )?
+            {
+            // InternalUIGrammar.g:715:4: ( (lv_targetToSource_3_0= '<' ) )?
             int alt13=2;
             int LA13_0 = input.LA(1);
 
@@ -2169,24 +2154,24 @@
             }
             switch (alt13) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:707:1: (lv_listBinding_1_0= 'list' )
+                    // InternalUIGrammar.g:716:5: (lv_targetToSource_3_0= '<' )
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:707:1: (lv_listBinding_1_0= 'list' )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:708:3: lv_listBinding_1_0= 'list'
+                    // InternalUIGrammar.g:716:5: (lv_targetToSource_3_0= '<' )
+                    // InternalUIGrammar.g:717:6: lv_targetToSource_3_0= '<'
                     {
-                    lv_listBinding_1_0=(Token)match(input,28,FollowSets000.FOLLOW_28_in_ruleUiBinding1523); if (state.failed) return current;
+                    lv_targetToSource_3_0=(Token)match(input,28,FOLLOW_21); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              newLeafNode(lv_listBinding_1_0, grammarAccess.getUiBindingAccess().getListBindingListKeyword_1_0());
-                          
+                      						newLeafNode(lv_targetToSource_3_0, grammarAccess.getUiBindingAccess().getTargetToSourceLessThanSignKeyword_3_0_0());
+                      					
                     }
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElement(grammarAccess.getUiBindingRule());
-                      	        }
-                             		setWithLastConsumed(current, "listBinding", true, "list");
-                      	    
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getUiBindingRule());
+                      						}
+                      						setWithLastConsumed(current, "targetToSource", true, "<");
+                      					
                     }
 
                     }
@@ -2197,114 +2182,39 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:721:3: ( (lv_source_2_0= ruleUiBindingEndpointAssignment ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:722:1: (lv_source_2_0= ruleUiBindingEndpointAssignment )
-            {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:722:1: (lv_source_2_0= ruleUiBindingEndpointAssignment )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:723:3: lv_source_2_0= ruleUiBindingEndpointAssignment
-            {
-            if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getUiBindingAccess().getSourceUiBindingEndpointAssignmentParserRuleCall_2_0()); 
-              	    
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiBindingEndpointAssignment_in_ruleUiBinding1558);
-            lv_source_2_0=ruleUiBindingEndpointAssignment();
-
-            state._fsp--;
-            if (state.failed) return current;
+            otherlv_4=(Token)match(input,29,FOLLOW_22); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getUiBindingRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"source",
-                      		lv_source_2_0, 
-                      		"UiBindingEndpointAssignment");
-              	        afterParserOrEnumRuleCall();
-              	    
+              				newLeafNode(otherlv_4, grammarAccess.getUiBindingAccess().getHyphenMinusHyphenMinusKeyword_3_1());
+              			
             }
-
-            }
-
-
-            }
-
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:739:2: ( ( (lv_targetToSource_3_0= '<' ) )? otherlv_4= '--' ( (lv_sourceToTarget_5_0= '>' ) )? )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:739:3: ( (lv_targetToSource_3_0= '<' ) )? otherlv_4= '--' ( (lv_sourceToTarget_5_0= '>' ) )?
-            {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:739:3: ( (lv_targetToSource_3_0= '<' ) )?
+            // InternalUIGrammar.g:733:4: ( (lv_sourceToTarget_5_0= '>' ) )?
             int alt14=2;
             int LA14_0 = input.LA(1);
 
-            if ( (LA14_0==29) ) {
+            if ( (LA14_0==30) ) {
                 alt14=1;
             }
             switch (alt14) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:740:1: (lv_targetToSource_3_0= '<' )
+                    // InternalUIGrammar.g:734:5: (lv_sourceToTarget_5_0= '>' )
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:740:1: (lv_targetToSource_3_0= '<' )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:741:3: lv_targetToSource_3_0= '<'
+                    // InternalUIGrammar.g:734:5: (lv_sourceToTarget_5_0= '>' )
+                    // InternalUIGrammar.g:735:6: lv_sourceToTarget_5_0= '>'
                     {
-                    lv_targetToSource_3_0=(Token)match(input,29,FollowSets000.FOLLOW_29_in_ruleUiBinding1577); if (state.failed) return current;
+                    lv_sourceToTarget_5_0=(Token)match(input,30,FOLLOW_14); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              newLeafNode(lv_targetToSource_3_0, grammarAccess.getUiBindingAccess().getTargetToSourceLessThanSignKeyword_3_0_0());
-                          
+                      						newLeafNode(lv_sourceToTarget_5_0, grammarAccess.getUiBindingAccess().getSourceToTargetGreaterThanSignKeyword_3_2_0());
+                      					
                     }
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElement(grammarAccess.getUiBindingRule());
-                      	        }
-                             		setWithLastConsumed(current, "targetToSource", true, "<");
-                      	    
-                    }
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-
-            otherlv_4=(Token)match(input,30,FollowSets000.FOLLOW_30_in_ruleUiBinding1603); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-                  	newLeafNode(otherlv_4, grammarAccess.getUiBindingAccess().getHyphenMinusHyphenMinusKeyword_3_1());
-                  
-            }
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:758:1: ( (lv_sourceToTarget_5_0= '>' ) )?
-            int alt15=2;
-            int LA15_0 = input.LA(1);
-
-            if ( (LA15_0==31) ) {
-                alt15=1;
-            }
-            switch (alt15) {
-                case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:759:1: (lv_sourceToTarget_5_0= '>' )
-                    {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:759:1: (lv_sourceToTarget_5_0= '>' )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:760:3: lv_sourceToTarget_5_0= '>'
-                    {
-                    lv_sourceToTarget_5_0=(Token)match(input,31,FollowSets000.FOLLOW_31_in_ruleUiBinding1621); if (state.failed) return current;
-                    if ( state.backtracking==0 ) {
-
-                              newLeafNode(lv_sourceToTarget_5_0, grammarAccess.getUiBindingAccess().getSourceToTargetGreaterThanSignKeyword_3_2_0());
-                          
-                    }
-                    if ( state.backtracking==0 ) {
-
-                      	        if (current==null) {
-                      	            current = createModelElement(grammarAccess.getUiBindingRule());
-                      	        }
-                             		setWithLastConsumed(current, "sourceToTarget", true, ">");
-                      	    
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getUiBindingRule());
+                      						}
+                      						setWithLastConsumed(current, "sourceToTarget", true, ">");
+                      					
                     }
 
                     }
@@ -2318,34 +2228,34 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:773:4: ( (lv_target_6_0= ruleUiBindingEndpointAssignment ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:774:1: (lv_target_6_0= ruleUiBindingEndpointAssignment )
+            // InternalUIGrammar.g:748:3: ( (lv_target_6_0= ruleUiBindingEndpointAssignment ) )
+            // InternalUIGrammar.g:749:4: (lv_target_6_0= ruleUiBindingEndpointAssignment )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:774:1: (lv_target_6_0= ruleUiBindingEndpointAssignment )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:775:3: lv_target_6_0= ruleUiBindingEndpointAssignment
+            // InternalUIGrammar.g:749:4: (lv_target_6_0= ruleUiBindingEndpointAssignment )
+            // InternalUIGrammar.g:750:5: lv_target_6_0= ruleUiBindingEndpointAssignment
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getUiBindingAccess().getTargetUiBindingEndpointAssignmentParserRuleCall_4_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getUiBindingAccess().getTargetUiBindingEndpointAssignmentParserRuleCall_4_0());
+              				
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiBindingEndpointAssignment_in_ruleUiBinding1657);
+            pushFollow(FOLLOW_8);
             lv_target_6_0=ruleUiBindingEndpointAssignment();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getUiBindingRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"target",
-                      		lv_target_6_0, 
-                      		"UiBindingEndpointAssignment");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getUiBindingRule());
+              					}
+              					set(
+              						current,
+              						"target",
+              						lv_target_6_0,
+              						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAssignment");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -2353,22 +2263,22 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:791:2: (otherlv_7= ';' )?
-            int alt16=2;
-            int LA16_0 = input.LA(1);
+            // InternalUIGrammar.g:767:3: (otherlv_7= ';' )?
+            int alt15=2;
+            int LA15_0 = input.LA(1);
 
-            if ( (LA16_0==15) ) {
-                alt16=1;
+            if ( (LA15_0==16) ) {
+                alt15=1;
             }
-            switch (alt16) {
+            switch (alt15) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:791:4: otherlv_7= ';'
+                    // InternalUIGrammar.g:768:4: otherlv_7= ';'
                     {
-                    otherlv_7=(Token)match(input,15,FollowSets000.FOLLOW_15_in_ruleUiBinding1670); if (state.failed) return current;
+                    otherlv_7=(Token)match(input,16,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_7, grammarAccess.getUiBindingAccess().getSemicolonKeyword_5());
-                          
+                      				newLeafNode(otherlv_7, grammarAccess.getUiBindingAccess().getSemicolonKeyword_5());
+                      			
                     }
 
                     }
@@ -2383,14 +2293,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -2399,7 +2311,7 @@
 
 
     // $ANTLR start "entryRuleUiBindingEndpointAssignment"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:803:1: entryRuleUiBindingEndpointAssignment returns [EObject current=null] : iv_ruleUiBindingEndpointAssignment= ruleUiBindingEndpointAssignment EOF ;
+    // InternalUIGrammar.g:777:1: entryRuleUiBindingEndpointAssignment returns [EObject current=null] : iv_ruleUiBindingEndpointAssignment= ruleUiBindingEndpointAssignment EOF ;
     public final EObject entryRuleUiBindingEndpointAssignment() throws RecognitionException {
         EObject current = null;
 
@@ -2407,13 +2319,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:804:2: (iv_ruleUiBindingEndpointAssignment= ruleUiBindingEndpointAssignment EOF )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:805:2: iv_ruleUiBindingEndpointAssignment= ruleUiBindingEndpointAssignment EOF
+            // InternalUIGrammar.g:777:68: (iv_ruleUiBindingEndpointAssignment= ruleUiBindingEndpointAssignment EOF )
+            // InternalUIGrammar.g:778:2: iv_ruleUiBindingEndpointAssignment= ruleUiBindingEndpointAssignment EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUiBindingEndpointAssignmentRule()); 
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiBindingEndpointAssignment_in_entryRuleUiBindingEndpointAssignment1708);
+            pushFollow(FOLLOW_1);
             iv_ruleUiBindingEndpointAssignment=ruleUiBindingEndpointAssignment();
 
             state._fsp--;
@@ -2421,16 +2333,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUiBindingEndpointAssignment; 
             }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiBindingEndpointAssignment1718); 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;
@@ -2439,7 +2351,7 @@
 
 
     // $ANTLR start "ruleUiBindingEndpointAssignment"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:812:1: ruleUiBindingEndpointAssignment returns [EObject current=null] : ( (this_UiTypedBindableDef_0= ruleUiTypedBindableDef () ( (lv_path_2_0= ruleUiPathSegment ) )? ) | (this_UiCommandBindableDef_3= ruleUiCommandBindableDef () ) | ( () ( (otherlv_6= RULE_ID ) ) ( (lv_path_7_0= ruleUiPathSegment ) )? ) ) ;
+    // InternalUIGrammar.g:784:1: ruleUiBindingEndpointAssignment returns [EObject current=null] : ( (this_UiTypedBindableDef_0= ruleUiTypedBindableDef () ( (lv_path_2_0= ruleUiPathSegment ) )? ) | (this_UiCommandBindableDef_3= ruleUiCommandBindableDef () ) | ( () ( (otherlv_6= RULE_ID ) ) ( (lv_path_7_0= ruleUiPathSegment ) )? ) ) ;
     public final EObject ruleUiBindingEndpointAssignment() throws RecognitionException {
         EObject current = null;
 
@@ -2453,116 +2365,117 @@
         EObject lv_path_7_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:815:28: ( ( (this_UiTypedBindableDef_0= ruleUiTypedBindableDef () ( (lv_path_2_0= ruleUiPathSegment ) )? ) | (this_UiCommandBindableDef_3= ruleUiCommandBindableDef () ) | ( () ( (otherlv_6= RULE_ID ) ) ( (lv_path_7_0= ruleUiPathSegment ) )? ) ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:816:1: ( (this_UiTypedBindableDef_0= ruleUiTypedBindableDef () ( (lv_path_2_0= ruleUiPathSegment ) )? ) | (this_UiCommandBindableDef_3= ruleUiCommandBindableDef () ) | ( () ( (otherlv_6= RULE_ID ) ) ( (lv_path_7_0= ruleUiPathSegment ) )? ) )
+            // InternalUIGrammar.g:790:2: ( ( (this_UiTypedBindableDef_0= ruleUiTypedBindableDef () ( (lv_path_2_0= ruleUiPathSegment ) )? ) | (this_UiCommandBindableDef_3= ruleUiCommandBindableDef () ) | ( () ( (otherlv_6= RULE_ID ) ) ( (lv_path_7_0= ruleUiPathSegment ) )? ) ) )
+            // InternalUIGrammar.g:791:2: ( (this_UiTypedBindableDef_0= ruleUiTypedBindableDef () ( (lv_path_2_0= ruleUiPathSegment ) )? ) | (this_UiCommandBindableDef_3= ruleUiCommandBindableDef () ) | ( () ( (otherlv_6= RULE_ID ) ) ( (lv_path_7_0= ruleUiPathSegment ) )? ) )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:816:1: ( (this_UiTypedBindableDef_0= ruleUiTypedBindableDef () ( (lv_path_2_0= ruleUiPathSegment ) )? ) | (this_UiCommandBindableDef_3= ruleUiCommandBindableDef () ) | ( () ( (otherlv_6= RULE_ID ) ) ( (lv_path_7_0= ruleUiPathSegment ) )? ) )
-            int alt19=3;
+            // InternalUIGrammar.g:791:2: ( (this_UiTypedBindableDef_0= ruleUiTypedBindableDef () ( (lv_path_2_0= ruleUiPathSegment ) )? ) | (this_UiCommandBindableDef_3= ruleUiCommandBindableDef () ) | ( () ( (otherlv_6= RULE_ID ) ) ( (lv_path_7_0= ruleUiPathSegment ) )? ) )
+            int alt18=3;
             switch ( input.LA(1) ) {
-            case 33:
+            case 32:
                 {
-                alt19=1;
+                alt18=1;
                 }
                 break;
+            case 36:
             case 37:
             case 38:
             case 39:
             case 40:
             case 41:
-            case 42:
-            case 45:
+            case 44:
                 {
-                alt19=2;
+                alt18=2;
                 }
                 break;
             case RULE_ID:
                 {
-                alt19=3;
+                alt18=3;
                 }
                 break;
             default:
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 19, 0, input);
+                    new NoViableAltException("", 18, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt19) {
+            switch (alt18) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:816:2: (this_UiTypedBindableDef_0= ruleUiTypedBindableDef () ( (lv_path_2_0= ruleUiPathSegment ) )? )
+                    // InternalUIGrammar.g:792:3: (this_UiTypedBindableDef_0= ruleUiTypedBindableDef () ( (lv_path_2_0= ruleUiPathSegment ) )? )
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:816:2: (this_UiTypedBindableDef_0= ruleUiTypedBindableDef () ( (lv_path_2_0= ruleUiPathSegment ) )? )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:817:5: this_UiTypedBindableDef_0= ruleUiTypedBindableDef () ( (lv_path_2_0= ruleUiPathSegment ) )?
+                    // InternalUIGrammar.g:792:3: (this_UiTypedBindableDef_0= ruleUiTypedBindableDef () ( (lv_path_2_0= ruleUiPathSegment ) )? )
+                    // InternalUIGrammar.g:793:4: this_UiTypedBindableDef_0= ruleUiTypedBindableDef () ( (lv_path_2_0= ruleUiPathSegment ) )?
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getUiBindingEndpointAssignmentAccess().getUiTypedBindableDefParserRuleCall_0_0()); 
-                          
+
+                      				newCompositeNode(grammarAccess.getUiBindingEndpointAssignmentAccess().getUiTypedBindableDefParserRuleCall_0_0());
+                      			
                     }
-                    pushFollow(FollowSets000.FOLLOW_ruleUiTypedBindableDef_in_ruleUiBindingEndpointAssignment1766);
+                    pushFollow(FOLLOW_23);
                     this_UiTypedBindableDef_0=ruleUiTypedBindableDef();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_UiTypedBindableDef_0; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      				current = this_UiTypedBindableDef_0;
+                      				afterParserOrEnumRuleCall();
+                      			
                     }
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:825:1: ()
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:826:5: 
+                    // InternalUIGrammar.g:801:4: ()
+                    // InternalUIGrammar.g:802:5: 
                     {
                     if ( state.backtracking==0 ) {
 
-                              current = forceCreateModelElementAndSet(
-                                  grammarAccess.getUiBindingEndpointAssignmentAccess().getUiBindingEndpointAssignmentTypedBindableDefAction_0_1(),
-                                  current);
-                          
+                      					current = forceCreateModelElementAndSet(
+                      						grammarAccess.getUiBindingEndpointAssignmentAccess().getUiBindingEndpointAssignmentTypedBindableDefAction_0_1(),
+                      						current);
+                      				
                     }
 
                     }
 
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:831:2: ( (lv_path_2_0= ruleUiPathSegment ) )?
-                    int alt17=2;
-                    int LA17_0 = input.LA(1);
+                    // InternalUIGrammar.g:808:4: ( (lv_path_2_0= ruleUiPathSegment ) )?
+                    int alt16=2;
+                    int LA16_0 = input.LA(1);
 
-                    if ( (LA17_0==32) ) {
-                        alt17=1;
+                    if ( (LA16_0==31) ) {
+                        alt16=1;
                     }
-                    switch (alt17) {
+                    switch (alt16) {
                         case 1 :
-                            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:832:1: (lv_path_2_0= ruleUiPathSegment )
+                            // InternalUIGrammar.g:809:5: (lv_path_2_0= ruleUiPathSegment )
                             {
-                            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:832:1: (lv_path_2_0= ruleUiPathSegment )
-                            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:833:3: lv_path_2_0= ruleUiPathSegment
+                            // InternalUIGrammar.g:809:5: (lv_path_2_0= ruleUiPathSegment )
+                            // InternalUIGrammar.g:810:6: lv_path_2_0= ruleUiPathSegment
                             {
                             if ( state.backtracking==0 ) {
-                               
-                              	        newCompositeNode(grammarAccess.getUiBindingEndpointAssignmentAccess().getPathUiPathSegmentParserRuleCall_0_2_0()); 
-                              	    
+
+                              						newCompositeNode(grammarAccess.getUiBindingEndpointAssignmentAccess().getPathUiPathSegmentParserRuleCall_0_2_0());
+                              					
                             }
-                            pushFollow(FollowSets000.FOLLOW_ruleUiPathSegment_in_ruleUiBindingEndpointAssignment1795);
+                            pushFollow(FOLLOW_2);
                             lv_path_2_0=ruleUiPathSegment();
 
                             state._fsp--;
                             if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
-                              	        if (current==null) {
-                              	            current = createModelElementForParent(grammarAccess.getUiBindingEndpointAssignmentRule());
-                              	        }
-                                     		set(
-                                     			current, 
-                                     			"path",
-                                      		lv_path_2_0, 
-                                      		"UiPathSegment");
-                              	        afterParserOrEnumRuleCall();
-                              	    
+                              						if (current==null) {
+                              							current = createModelElementForParent(grammarAccess.getUiBindingEndpointAssignmentRule());
+                              						}
+                              						set(
+                              							current,
+                              							"path",
+                              							lv_path_2_0,
+                              							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiPathSegment");
+                              						afterParserOrEnumRuleCall();
+                              					
                             }
 
                             }
@@ -2580,36 +2493,36 @@
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:850:6: (this_UiCommandBindableDef_3= ruleUiCommandBindableDef () )
+                    // InternalUIGrammar.g:829:3: (this_UiCommandBindableDef_3= ruleUiCommandBindableDef () )
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:850:6: (this_UiCommandBindableDef_3= ruleUiCommandBindableDef () )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:851:5: this_UiCommandBindableDef_3= ruleUiCommandBindableDef ()
+                    // InternalUIGrammar.g:829:3: (this_UiCommandBindableDef_3= ruleUiCommandBindableDef () )
+                    // InternalUIGrammar.g:830:4: this_UiCommandBindableDef_3= ruleUiCommandBindableDef ()
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getUiBindingEndpointAssignmentAccess().getUiCommandBindableDefParserRuleCall_1_0()); 
-                          
+
+                      				newCompositeNode(grammarAccess.getUiBindingEndpointAssignmentAccess().getUiCommandBindableDefParserRuleCall_1_0());
+                      			
                     }
-                    pushFollow(FollowSets000.FOLLOW_ruleUiCommandBindableDef_in_ruleUiBindingEndpointAssignment1826);
+                    pushFollow(FOLLOW_2);
                     this_UiCommandBindableDef_3=ruleUiCommandBindableDef();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_UiCommandBindableDef_3; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      				current = this_UiCommandBindableDef_3;
+                      				afterParserOrEnumRuleCall();
+                      			
                     }
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:859:1: ()
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:860:5: 
+                    // InternalUIGrammar.g:838:4: ()
+                    // InternalUIGrammar.g:839:5: 
                     {
                     if ( state.backtracking==0 ) {
 
-                              current = forceCreateModelElementAndSet(
-                                  grammarAccess.getUiBindingEndpointAssignmentAccess().getUiBindingEndpointAssignmentTypedBindableDefAction_1_1(),
-                                  current);
-                          
+                      					current = forceCreateModelElementAndSet(
+                      						grammarAccess.getUiBindingEndpointAssignmentAccess().getUiBindingEndpointAssignmentTypedBindableDefAction_1_1(),
+                      						current);
+                      				
                     }
 
                     }
@@ -2621,42 +2534,42 @@
                     }
                     break;
                 case 3 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:866:6: ( () ( (otherlv_6= RULE_ID ) ) ( (lv_path_7_0= ruleUiPathSegment ) )? )
+                    // InternalUIGrammar.g:847:3: ( () ( (otherlv_6= RULE_ID ) ) ( (lv_path_7_0= ruleUiPathSegment ) )? )
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:866:6: ( () ( (otherlv_6= RULE_ID ) ) ( (lv_path_7_0= ruleUiPathSegment ) )? )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:866:7: () ( (otherlv_6= RULE_ID ) ) ( (lv_path_7_0= ruleUiPathSegment ) )?
+                    // InternalUIGrammar.g:847:3: ( () ( (otherlv_6= RULE_ID ) ) ( (lv_path_7_0= ruleUiPathSegment ) )? )
+                    // InternalUIGrammar.g:848:4: () ( (otherlv_6= RULE_ID ) ) ( (lv_path_7_0= ruleUiPathSegment ) )?
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:866:7: ()
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:867:5: 
+                    // InternalUIGrammar.g:848:4: ()
+                    // InternalUIGrammar.g:849:5: 
                     {
                     if ( state.backtracking==0 ) {
 
-                              current = forceCreateModelElement(
-                                  grammarAccess.getUiBindingEndpointAssignmentAccess().getUiBindingEndpointAssignmentAction_2_0(),
-                                  current);
-                          
+                      					current = forceCreateModelElement(
+                      						grammarAccess.getUiBindingEndpointAssignmentAccess().getUiBindingEndpointAssignmentAction_2_0(),
+                      						current);
+                      				
                     }
 
                     }
 
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:872:2: ( (otherlv_6= RULE_ID ) )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:873:1: (otherlv_6= RULE_ID )
+                    // InternalUIGrammar.g:855:4: ( (otherlv_6= RULE_ID ) )
+                    // InternalUIGrammar.g:856:5: (otherlv_6= RULE_ID )
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:873:1: (otherlv_6= RULE_ID )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:874:3: otherlv_6= RULE_ID
+                    // InternalUIGrammar.g:856:5: (otherlv_6= RULE_ID )
+                    // InternalUIGrammar.g:857:6: otherlv_6= RULE_ID
                     {
                     if ( state.backtracking==0 ) {
 
-                      			if (current==null) {
-                      	            current = createModelElement(grammarAccess.getUiBindingEndpointAssignmentRule());
-                      	        }
-                              
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getUiBindingEndpointAssignmentRule());
+                      						}
+                      					
                     }
-                    otherlv_6=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_RULE_ID_in_ruleUiBindingEndpointAssignment1871); if (state.failed) return current;
+                    otherlv_6=(Token)match(input,RULE_ID,FOLLOW_23); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      		newLeafNode(otherlv_6, grammarAccess.getUiBindingEndpointAssignmentAccess().getTypedBindableAliasUiTypedBindableCrossReference_2_1_0()); 
-                      	
+                      						newLeafNode(otherlv_6, grammarAccess.getUiBindingEndpointAssignmentAccess().getTypedBindableAliasUiTypedBindableCrossReference_2_1_0());
+                      					
                     }
 
                     }
@@ -2664,42 +2577,42 @@
 
                     }
 
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:885:2: ( (lv_path_7_0= ruleUiPathSegment ) )?
-                    int alt18=2;
-                    int LA18_0 = input.LA(1);
+                    // InternalUIGrammar.g:868:4: ( (lv_path_7_0= ruleUiPathSegment ) )?
+                    int alt17=2;
+                    int LA17_0 = input.LA(1);
 
-                    if ( (LA18_0==32) ) {
-                        alt18=1;
+                    if ( (LA17_0==31) ) {
+                        alt17=1;
                     }
-                    switch (alt18) {
+                    switch (alt17) {
                         case 1 :
-                            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:886:1: (lv_path_7_0= ruleUiPathSegment )
+                            // InternalUIGrammar.g:869:5: (lv_path_7_0= ruleUiPathSegment )
                             {
-                            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:886:1: (lv_path_7_0= ruleUiPathSegment )
-                            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:887:3: lv_path_7_0= ruleUiPathSegment
+                            // InternalUIGrammar.g:869:5: (lv_path_7_0= ruleUiPathSegment )
+                            // InternalUIGrammar.g:870:6: lv_path_7_0= ruleUiPathSegment
                             {
                             if ( state.backtracking==0 ) {
-                               
-                              	        newCompositeNode(grammarAccess.getUiBindingEndpointAssignmentAccess().getPathUiPathSegmentParserRuleCall_2_2_0()); 
-                              	    
+
+                              						newCompositeNode(grammarAccess.getUiBindingEndpointAssignmentAccess().getPathUiPathSegmentParserRuleCall_2_2_0());
+                              					
                             }
-                            pushFollow(FollowSets000.FOLLOW_ruleUiPathSegment_in_ruleUiBindingEndpointAssignment1892);
+                            pushFollow(FOLLOW_2);
                             lv_path_7_0=ruleUiPathSegment();
 
                             state._fsp--;
                             if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
-                              	        if (current==null) {
-                              	            current = createModelElementForParent(grammarAccess.getUiBindingEndpointAssignmentRule());
-                              	        }
-                                     		set(
-                                     			current, 
-                                     			"path",
-                                      		lv_path_7_0, 
-                                      		"UiPathSegment");
-                              	        afterParserOrEnumRuleCall();
-                              	    
+                              						if (current==null) {
+                              							current = createModelElementForParent(grammarAccess.getUiBindingEndpointAssignmentRule());
+                              						}
+                              						set(
+                              							current,
+                              							"path",
+                              							lv_path_7_0,
+                              							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiPathSegment");
+                              						afterParserOrEnumRuleCall();
+                              					
                             }
 
                             }
@@ -2723,14 +2636,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -2739,7 +2654,7 @@
 
 
     // $ANTLR start "entryRuleUiPathSegment"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:911:1: entryRuleUiPathSegment returns [EObject current=null] : iv_ruleUiPathSegment= ruleUiPathSegment EOF ;
+    // InternalUIGrammar.g:892:1: entryRuleUiPathSegment returns [EObject current=null] : iv_ruleUiPathSegment= ruleUiPathSegment EOF ;
     public final EObject entryRuleUiPathSegment() throws RecognitionException {
         EObject current = null;
 
@@ -2747,13 +2662,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:912:2: (iv_ruleUiPathSegment= ruleUiPathSegment EOF )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:913:2: iv_ruleUiPathSegment= ruleUiPathSegment EOF
+            // InternalUIGrammar.g:892:54: (iv_ruleUiPathSegment= ruleUiPathSegment EOF )
+            // InternalUIGrammar.g:893:2: iv_ruleUiPathSegment= ruleUiPathSegment EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUiPathSegmentRule()); 
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiPathSegment_in_entryRuleUiPathSegment1930);
+            pushFollow(FOLLOW_1);
             iv_ruleUiPathSegment=ruleUiPathSegment();
 
             state._fsp--;
@@ -2761,16 +2676,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUiPathSegment; 
             }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiPathSegment1940); 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;
@@ -2779,7 +2694,7 @@
 
 
     // $ANTLR start "ruleUiPathSegment"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:920:1: ruleUiPathSegment returns [EObject current=null] : ( () otherlv_1= '.' ( (otherlv_2= RULE_ID ) ) ( (lv_path_3_0= ruleUiPathSegment ) )? ) ;
+    // InternalUIGrammar.g:899:1: ruleUiPathSegment returns [EObject current=null] : ( () otherlv_1= '.' ( (otherlv_2= RULE_ID ) ) ( (lv_path_3_0= ruleUiPathSegment ) )? ) ;
     public final EObject ruleUiPathSegment() throws RecognitionException {
         EObject current = null;
 
@@ -2788,52 +2703,53 @@
         EObject lv_path_3_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:923:28: ( ( () otherlv_1= '.' ( (otherlv_2= RULE_ID ) ) ( (lv_path_3_0= ruleUiPathSegment ) )? ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:924:1: ( () otherlv_1= '.' ( (otherlv_2= RULE_ID ) ) ( (lv_path_3_0= ruleUiPathSegment ) )? )
+            // InternalUIGrammar.g:905:2: ( ( () otherlv_1= '.' ( (otherlv_2= RULE_ID ) ) ( (lv_path_3_0= ruleUiPathSegment ) )? ) )
+            // InternalUIGrammar.g:906:2: ( () otherlv_1= '.' ( (otherlv_2= RULE_ID ) ) ( (lv_path_3_0= ruleUiPathSegment ) )? )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:924:1: ( () otherlv_1= '.' ( (otherlv_2= RULE_ID ) ) ( (lv_path_3_0= ruleUiPathSegment ) )? )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:924:2: () otherlv_1= '.' ( (otherlv_2= RULE_ID ) ) ( (lv_path_3_0= ruleUiPathSegment ) )?
+            // InternalUIGrammar.g:906:2: ( () otherlv_1= '.' ( (otherlv_2= RULE_ID ) ) ( (lv_path_3_0= ruleUiPathSegment ) )? )
+            // InternalUIGrammar.g:907:3: () otherlv_1= '.' ( (otherlv_2= RULE_ID ) ) ( (lv_path_3_0= ruleUiPathSegment ) )?
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:924:2: ()
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:925:5: 
+            // InternalUIGrammar.g:907:3: ()
+            // InternalUIGrammar.g:908:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getUiPathSegmentAccess().getUiPathSegmentAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiPathSegmentAccess().getUiPathSegmentAction_0(),
+              					current);
+              			
             }
 
             }
 
-            otherlv_1=(Token)match(input,32,FollowSets000.FOLLOW_32_in_ruleUiPathSegment1986); if (state.failed) return current;
+            otherlv_1=(Token)match(input,31,FOLLOW_3); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getUiPathSegmentAccess().getFullStopKeyword_1());
-                  
+              			newLeafNode(otherlv_1, grammarAccess.getUiPathSegmentAccess().getFullStopKeyword_1());
+              		
             }
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:934:1: ( (otherlv_2= RULE_ID ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:935:1: (otherlv_2= RULE_ID )
+            // InternalUIGrammar.g:918:3: ( (otherlv_2= RULE_ID ) )
+            // InternalUIGrammar.g:919:4: (otherlv_2= RULE_ID )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:935:1: (otherlv_2= RULE_ID )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:936:3: otherlv_2= RULE_ID
+            // InternalUIGrammar.g:919:4: (otherlv_2= RULE_ID )
+            // InternalUIGrammar.g:920:5: otherlv_2= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
-              			if (current==null) {
-              	            current = createModelElement(grammarAccess.getUiPathSegmentRule());
-              	        }
-                      
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getUiPathSegmentRule());
+              					}
+              				
             }
-            otherlv_2=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_RULE_ID_in_ruleUiPathSegment2006); if (state.failed) return current;
+            otherlv_2=(Token)match(input,RULE_ID,FOLLOW_23); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              		newLeafNode(otherlv_2, grammarAccess.getUiPathSegmentAccess().getGetterJvmOperationCrossReference_2_0()); 
-              	
+              					newLeafNode(otherlv_2, grammarAccess.getUiPathSegmentAccess().getGetterJvmOperationCrossReference_2_0());
+              				
             }
 
             }
@@ -2841,42 +2757,42 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:947:2: ( (lv_path_3_0= ruleUiPathSegment ) )?
-            int alt20=2;
-            int LA20_0 = input.LA(1);
+            // InternalUIGrammar.g:931:3: ( (lv_path_3_0= ruleUiPathSegment ) )?
+            int alt19=2;
+            int LA19_0 = input.LA(1);
 
-            if ( (LA20_0==32) ) {
-                alt20=1;
+            if ( (LA19_0==31) ) {
+                alt19=1;
             }
-            switch (alt20) {
+            switch (alt19) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:948:1: (lv_path_3_0= ruleUiPathSegment )
+                    // InternalUIGrammar.g:932:4: (lv_path_3_0= ruleUiPathSegment )
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:948:1: (lv_path_3_0= ruleUiPathSegment )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:949:3: lv_path_3_0= ruleUiPathSegment
+                    // InternalUIGrammar.g:932:4: (lv_path_3_0= ruleUiPathSegment )
+                    // InternalUIGrammar.g:933:5: lv_path_3_0= ruleUiPathSegment
                     {
                     if ( state.backtracking==0 ) {
-                       
-                      	        newCompositeNode(grammarAccess.getUiPathSegmentAccess().getPathUiPathSegmentParserRuleCall_3_0()); 
-                      	    
+
+                      					newCompositeNode(grammarAccess.getUiPathSegmentAccess().getPathUiPathSegmentParserRuleCall_3_0());
+                      				
                     }
-                    pushFollow(FollowSets000.FOLLOW_ruleUiPathSegment_in_ruleUiPathSegment2027);
+                    pushFollow(FOLLOW_2);
                     lv_path_3_0=ruleUiPathSegment();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElementForParent(grammarAccess.getUiPathSegmentRule());
-                      	        }
-                             		set(
-                             			current, 
-                             			"path",
-                              		lv_path_3_0, 
-                              		"UiPathSegment");
-                      	        afterParserOrEnumRuleCall();
-                      	    
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getUiPathSegmentRule());
+                      					}
+                      					set(
+                      						current,
+                      						"path",
+                      						lv_path_3_0,
+                      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiPathSegment");
+                      					afterParserOrEnumRuleCall();
+                      				
                     }
 
                     }
@@ -2894,14 +2810,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -2910,7 +2828,7 @@
 
 
     // $ANTLR start "entryRuleUiNestedProperty"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:973:1: entryRuleUiNestedProperty returns [EObject current=null] : iv_ruleUiNestedProperty= ruleUiNestedProperty EOF ;
+    // InternalUIGrammar.g:954:1: entryRuleUiNestedProperty returns [EObject current=null] : iv_ruleUiNestedProperty= ruleUiNestedProperty EOF ;
     public final EObject entryRuleUiNestedProperty() throws RecognitionException {
         EObject current = null;
 
@@ -2918,13 +2836,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:974:2: (iv_ruleUiNestedProperty= ruleUiNestedProperty EOF )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:975:2: iv_ruleUiNestedProperty= ruleUiNestedProperty EOF
+            // InternalUIGrammar.g:954:57: (iv_ruleUiNestedProperty= ruleUiNestedProperty EOF )
+            // InternalUIGrammar.g:955:2: iv_ruleUiNestedProperty= ruleUiNestedProperty EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUiNestedPropertyRule()); 
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiNestedProperty_in_entryRuleUiNestedProperty2064);
+            pushFollow(FOLLOW_1);
             iv_ruleUiNestedProperty=ruleUiNestedProperty();
 
             state._fsp--;
@@ -2932,16 +2850,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUiNestedProperty; 
             }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiNestedProperty2074); 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;
@@ -2950,7 +2868,7 @@
 
 
     // $ANTLR start "ruleUiNestedProperty"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:982:1: ruleUiNestedProperty returns [EObject current=null] : ( () ( (otherlv_1= RULE_ID ) ) ( (lv_path_2_0= ruleUiPathSegment ) )? ) ;
+    // InternalUIGrammar.g:961:1: ruleUiNestedProperty returns [EObject current=null] : ( () ( (otherlv_1= RULE_ID ) ) ( (lv_path_2_0= ruleUiPathSegment ) )? ) ;
     public final EObject ruleUiNestedProperty() throws RecognitionException {
         EObject current = null;
 
@@ -2958,46 +2876,47 @@
         EObject lv_path_2_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:985:28: ( ( () ( (otherlv_1= RULE_ID ) ) ( (lv_path_2_0= ruleUiPathSegment ) )? ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:986:1: ( () ( (otherlv_1= RULE_ID ) ) ( (lv_path_2_0= ruleUiPathSegment ) )? )
+            // InternalUIGrammar.g:967:2: ( ( () ( (otherlv_1= RULE_ID ) ) ( (lv_path_2_0= ruleUiPathSegment ) )? ) )
+            // InternalUIGrammar.g:968:2: ( () ( (otherlv_1= RULE_ID ) ) ( (lv_path_2_0= ruleUiPathSegment ) )? )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:986:1: ( () ( (otherlv_1= RULE_ID ) ) ( (lv_path_2_0= ruleUiPathSegment ) )? )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:986:2: () ( (otherlv_1= RULE_ID ) ) ( (lv_path_2_0= ruleUiPathSegment ) )?
+            // InternalUIGrammar.g:968:2: ( () ( (otherlv_1= RULE_ID ) ) ( (lv_path_2_0= ruleUiPathSegment ) )? )
+            // InternalUIGrammar.g:969:3: () ( (otherlv_1= RULE_ID ) ) ( (lv_path_2_0= ruleUiPathSegment ) )?
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:986:2: ()
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:987:5: 
+            // InternalUIGrammar.g:969:3: ()
+            // InternalUIGrammar.g:970:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getUiNestedPropertyAccess().getUiNestedPropertyAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiNestedPropertyAccess().getUiNestedPropertyAction_0(),
+              					current);
+              			
             }
 
             }
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:992:2: ( (otherlv_1= RULE_ID ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:993:1: (otherlv_1= RULE_ID )
+            // InternalUIGrammar.g:976:3: ( (otherlv_1= RULE_ID ) )
+            // InternalUIGrammar.g:977:4: (otherlv_1= RULE_ID )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:993:1: (otherlv_1= RULE_ID )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:994:3: otherlv_1= RULE_ID
+            // InternalUIGrammar.g:977:4: (otherlv_1= RULE_ID )
+            // InternalUIGrammar.g:978:5: otherlv_1= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
-              			if (current==null) {
-              	            current = createModelElement(grammarAccess.getUiNestedPropertyRule());
-              	        }
-                      
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getUiNestedPropertyRule());
+              					}
+              				
             }
-            otherlv_1=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_RULE_ID_in_ruleUiNestedProperty2128); if (state.failed) return current;
+            otherlv_1=(Token)match(input,RULE_ID,FOLLOW_23); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              		newLeafNode(otherlv_1, grammarAccess.getUiNestedPropertyAccess().getGetterJvmOperationCrossReference_1_0()); 
-              	
+              					newLeafNode(otherlv_1, grammarAccess.getUiNestedPropertyAccess().getGetterJvmOperationCrossReference_1_0());
+              				
             }
 
             }
@@ -3005,42 +2924,42 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1005:2: ( (lv_path_2_0= ruleUiPathSegment ) )?
-            int alt21=2;
-            int LA21_0 = input.LA(1);
+            // InternalUIGrammar.g:989:3: ( (lv_path_2_0= ruleUiPathSegment ) )?
+            int alt20=2;
+            int LA20_0 = input.LA(1);
 
-            if ( (LA21_0==32) ) {
-                alt21=1;
+            if ( (LA20_0==31) ) {
+                alt20=1;
             }
-            switch (alt21) {
+            switch (alt20) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1006:1: (lv_path_2_0= ruleUiPathSegment )
+                    // InternalUIGrammar.g:990:4: (lv_path_2_0= ruleUiPathSegment )
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1006:1: (lv_path_2_0= ruleUiPathSegment )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1007:3: lv_path_2_0= ruleUiPathSegment
+                    // InternalUIGrammar.g:990:4: (lv_path_2_0= ruleUiPathSegment )
+                    // InternalUIGrammar.g:991:5: lv_path_2_0= ruleUiPathSegment
                     {
                     if ( state.backtracking==0 ) {
-                       
-                      	        newCompositeNode(grammarAccess.getUiNestedPropertyAccess().getPathUiPathSegmentParserRuleCall_2_0()); 
-                      	    
+
+                      					newCompositeNode(grammarAccess.getUiNestedPropertyAccess().getPathUiPathSegmentParserRuleCall_2_0());
+                      				
                     }
-                    pushFollow(FollowSets000.FOLLOW_ruleUiPathSegment_in_ruleUiNestedProperty2149);
+                    pushFollow(FOLLOW_2);
                     lv_path_2_0=ruleUiPathSegment();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElementForParent(grammarAccess.getUiNestedPropertyRule());
-                      	        }
-                             		set(
-                             			current, 
-                             			"path",
-                              		lv_path_2_0, 
-                              		"UiPathSegment");
-                      	        afterParserOrEnumRuleCall();
-                      	    
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getUiNestedPropertyRule());
+                      					}
+                      					set(
+                      						current,
+                      						"path",
+                      						lv_path_2_0,
+                      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiPathSegment");
+                      					afterParserOrEnumRuleCall();
+                      				
                     }
 
                     }
@@ -3058,14 +2977,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -3074,7 +2995,7 @@
 
 
     // $ANTLR start "entryRuleUiTypedBindableDef"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1031:1: entryRuleUiTypedBindableDef returns [EObject current=null] : iv_ruleUiTypedBindableDef= ruleUiTypedBindableDef EOF ;
+    // InternalUIGrammar.g:1012:1: entryRuleUiTypedBindableDef returns [EObject current=null] : iv_ruleUiTypedBindableDef= ruleUiTypedBindableDef EOF ;
     public final EObject entryRuleUiTypedBindableDef() throws RecognitionException {
         EObject current = null;
 
@@ -3082,13 +3003,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1032:2: (iv_ruleUiTypedBindableDef= ruleUiTypedBindableDef EOF )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1033:2: iv_ruleUiTypedBindableDef= ruleUiTypedBindableDef EOF
+            // InternalUIGrammar.g:1012:59: (iv_ruleUiTypedBindableDef= ruleUiTypedBindableDef EOF )
+            // InternalUIGrammar.g:1013:2: iv_ruleUiTypedBindableDef= ruleUiTypedBindableDef EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUiTypedBindableDefRule()); 
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiTypedBindableDef_in_entryRuleUiTypedBindableDef2186);
+            pushFollow(FOLLOW_1);
             iv_ruleUiTypedBindableDef=ruleUiTypedBindableDef();
 
             state._fsp--;
@@ -3096,16 +3017,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUiTypedBindableDef; 
             }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiTypedBindableDef2196); 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;
@@ -3114,7 +3035,7 @@
 
 
     // $ANTLR start "ruleUiTypedBindableDef"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1040:1: ruleUiTypedBindableDef returns [EObject current=null] : ( () (otherlv_1= '[' ( (otherlv_2= RULE_ID ) ) ( (lv_rawBindablePath_3_0= ruleUiRawBindablePathSegment ) )? otherlv_4= ']' otherlv_5= '.' ( (otherlv_6= RULE_ID ) ) ) ) ;
+    // InternalUIGrammar.g:1019:1: ruleUiTypedBindableDef returns [EObject current=null] : ( () (otherlv_1= '[' ( (otherlv_2= RULE_ID ) ) ( (lv_rawBindablePath_3_0= ruleUiRawBindablePathSegment ) )? otherlv_4= ']' otherlv_5= '.' ( (otherlv_6= RULE_ID ) ) ) ) ;
     public final EObject ruleUiTypedBindableDef() throws RecognitionException {
         EObject current = null;
 
@@ -3126,55 +3047,56 @@
         EObject lv_rawBindablePath_3_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1043:28: ( ( () (otherlv_1= '[' ( (otherlv_2= RULE_ID ) ) ( (lv_rawBindablePath_3_0= ruleUiRawBindablePathSegment ) )? otherlv_4= ']' otherlv_5= '.' ( (otherlv_6= RULE_ID ) ) ) ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1044:1: ( () (otherlv_1= '[' ( (otherlv_2= RULE_ID ) ) ( (lv_rawBindablePath_3_0= ruleUiRawBindablePathSegment ) )? otherlv_4= ']' otherlv_5= '.' ( (otherlv_6= RULE_ID ) ) ) )
+            // InternalUIGrammar.g:1025:2: ( ( () (otherlv_1= '[' ( (otherlv_2= RULE_ID ) ) ( (lv_rawBindablePath_3_0= ruleUiRawBindablePathSegment ) )? otherlv_4= ']' otherlv_5= '.' ( (otherlv_6= RULE_ID ) ) ) ) )
+            // InternalUIGrammar.g:1026:2: ( () (otherlv_1= '[' ( (otherlv_2= RULE_ID ) ) ( (lv_rawBindablePath_3_0= ruleUiRawBindablePathSegment ) )? otherlv_4= ']' otherlv_5= '.' ( (otherlv_6= RULE_ID ) ) ) )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1044:1: ( () (otherlv_1= '[' ( (otherlv_2= RULE_ID ) ) ( (lv_rawBindablePath_3_0= ruleUiRawBindablePathSegment ) )? otherlv_4= ']' otherlv_5= '.' ( (otherlv_6= RULE_ID ) ) ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1044:2: () (otherlv_1= '[' ( (otherlv_2= RULE_ID ) ) ( (lv_rawBindablePath_3_0= ruleUiRawBindablePathSegment ) )? otherlv_4= ']' otherlv_5= '.' ( (otherlv_6= RULE_ID ) ) )
+            // InternalUIGrammar.g:1026:2: ( () (otherlv_1= '[' ( (otherlv_2= RULE_ID ) ) ( (lv_rawBindablePath_3_0= ruleUiRawBindablePathSegment ) )? otherlv_4= ']' otherlv_5= '.' ( (otherlv_6= RULE_ID ) ) ) )
+            // InternalUIGrammar.g:1027:3: () (otherlv_1= '[' ( (otherlv_2= RULE_ID ) ) ( (lv_rawBindablePath_3_0= ruleUiRawBindablePathSegment ) )? otherlv_4= ']' otherlv_5= '.' ( (otherlv_6= RULE_ID ) ) )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1044:2: ()
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1045:5: 
+            // InternalUIGrammar.g:1027:3: ()
+            // InternalUIGrammar.g:1028:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getUiTypedBindableDefAccess().getUiTypedBindableDefAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiTypedBindableDefAccess().getUiTypedBindableDefAction_0(),
+              					current);
+              			
             }
 
             }
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1050:2: (otherlv_1= '[' ( (otherlv_2= RULE_ID ) ) ( (lv_rawBindablePath_3_0= ruleUiRawBindablePathSegment ) )? otherlv_4= ']' otherlv_5= '.' ( (otherlv_6= RULE_ID ) ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1050:4: otherlv_1= '[' ( (otherlv_2= RULE_ID ) ) ( (lv_rawBindablePath_3_0= ruleUiRawBindablePathSegment ) )? otherlv_4= ']' otherlv_5= '.' ( (otherlv_6= RULE_ID ) )
+            // InternalUIGrammar.g:1034:3: (otherlv_1= '[' ( (otherlv_2= RULE_ID ) ) ( (lv_rawBindablePath_3_0= ruleUiRawBindablePathSegment ) )? otherlv_4= ']' otherlv_5= '.' ( (otherlv_6= RULE_ID ) ) )
+            // InternalUIGrammar.g:1035:4: otherlv_1= '[' ( (otherlv_2= RULE_ID ) ) ( (lv_rawBindablePath_3_0= ruleUiRawBindablePathSegment ) )? otherlv_4= ']' otherlv_5= '.' ( (otherlv_6= RULE_ID ) )
             {
-            otherlv_1=(Token)match(input,33,FollowSets000.FOLLOW_33_in_ruleUiTypedBindableDef2243); if (state.failed) return current;
+            otherlv_1=(Token)match(input,32,FOLLOW_3); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getUiTypedBindableDefAccess().getLeftSquareBracketKeyword_1_0());
-                  
+              				newLeafNode(otherlv_1, grammarAccess.getUiTypedBindableDefAccess().getLeftSquareBracketKeyword_1_0());
+              			
             }
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1054:1: ( (otherlv_2= RULE_ID ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1055:1: (otherlv_2= RULE_ID )
+            // InternalUIGrammar.g:1039:4: ( (otherlv_2= RULE_ID ) )
+            // InternalUIGrammar.g:1040:5: (otherlv_2= RULE_ID )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1055:1: (otherlv_2= RULE_ID )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1056:3: otherlv_2= RULE_ID
+            // InternalUIGrammar.g:1040:5: (otherlv_2= RULE_ID )
+            // InternalUIGrammar.g:1041:6: otherlv_2= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
-              			if (current==null) {
-              	            current = createModelElement(grammarAccess.getUiTypedBindableDefRule());
-              	        }
-                      
+              						if (current==null) {
+              							current = createModelElement(grammarAccess.getUiTypedBindableDefRule());
+              						}
+              					
             }
-            otherlv_2=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_RULE_ID_in_ruleUiTypedBindableDef2263); if (state.failed) return current;
+            otherlv_2=(Token)match(input,RULE_ID,FOLLOW_24); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              		newLeafNode(otherlv_2, grammarAccess.getUiTypedBindableDefAccess().getRawBindableUiRawBindableCrossReference_1_1_0()); 
-              	
+              						newLeafNode(otherlv_2, grammarAccess.getUiTypedBindableDefAccess().getRawBindableUiRawBindableCrossReference_1_1_0());
+              					
             }
 
             }
@@ -3182,42 +3104,42 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1067:2: ( (lv_rawBindablePath_3_0= ruleUiRawBindablePathSegment ) )?
-            int alt22=2;
-            int LA22_0 = input.LA(1);
+            // InternalUIGrammar.g:1052:4: ( (lv_rawBindablePath_3_0= ruleUiRawBindablePathSegment ) )?
+            int alt21=2;
+            int LA21_0 = input.LA(1);
 
-            if ( (LA22_0==32||LA22_0==36) ) {
-                alt22=1;
+            if ( (LA21_0==31||LA21_0==35) ) {
+                alt21=1;
             }
-            switch (alt22) {
+            switch (alt21) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1068:1: (lv_rawBindablePath_3_0= ruleUiRawBindablePathSegment )
+                    // InternalUIGrammar.g:1053:5: (lv_rawBindablePath_3_0= ruleUiRawBindablePathSegment )
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1068:1: (lv_rawBindablePath_3_0= ruleUiRawBindablePathSegment )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1069:3: lv_rawBindablePath_3_0= ruleUiRawBindablePathSegment
+                    // InternalUIGrammar.g:1053:5: (lv_rawBindablePath_3_0= ruleUiRawBindablePathSegment )
+                    // InternalUIGrammar.g:1054:6: lv_rawBindablePath_3_0= ruleUiRawBindablePathSegment
                     {
                     if ( state.backtracking==0 ) {
-                       
-                      	        newCompositeNode(grammarAccess.getUiTypedBindableDefAccess().getRawBindablePathUiRawBindablePathSegmentParserRuleCall_1_2_0()); 
-                      	    
+
+                      						newCompositeNode(grammarAccess.getUiTypedBindableDefAccess().getRawBindablePathUiRawBindablePathSegmentParserRuleCall_1_2_0());
+                      					
                     }
-                    pushFollow(FollowSets000.FOLLOW_ruleUiRawBindablePathSegment_in_ruleUiTypedBindableDef2284);
+                    pushFollow(FOLLOW_25);
                     lv_rawBindablePath_3_0=ruleUiRawBindablePathSegment();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElementForParent(grammarAccess.getUiTypedBindableDefRule());
-                      	        }
-                             		set(
-                             			current, 
-                             			"rawBindablePath",
-                              		lv_rawBindablePath_3_0, 
-                              		"UiRawBindablePathSegment");
-                      	        afterParserOrEnumRuleCall();
-                      	    
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getUiTypedBindableDefRule());
+                      						}
+                      						set(
+                      							current,
+                      							"rawBindablePath",
+                      							lv_rawBindablePath_3_0,
+                      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiRawBindablePathSegment");
+                      						afterParserOrEnumRuleCall();
+                      					
                     }
 
                     }
@@ -3228,36 +3150,36 @@
 
             }
 
-            otherlv_4=(Token)match(input,34,FollowSets000.FOLLOW_34_in_ruleUiTypedBindableDef2297); if (state.failed) return current;
+            otherlv_4=(Token)match(input,33,FOLLOW_26); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_4, grammarAccess.getUiTypedBindableDefAccess().getRightSquareBracketKeyword_1_3());
-                  
+              				newLeafNode(otherlv_4, grammarAccess.getUiTypedBindableDefAccess().getRightSquareBracketKeyword_1_3());
+              			
             }
-            otherlv_5=(Token)match(input,32,FollowSets000.FOLLOW_32_in_ruleUiTypedBindableDef2309); if (state.failed) return current;
+            otherlv_5=(Token)match(input,31,FOLLOW_3); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_5, grammarAccess.getUiTypedBindableDefAccess().getFullStopKeyword_1_4());
-                  
+              				newLeafNode(otherlv_5, grammarAccess.getUiTypedBindableDefAccess().getFullStopKeyword_1_4());
+              			
             }
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1093:1: ( (otherlv_6= RULE_ID ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1094:1: (otherlv_6= RULE_ID )
+            // InternalUIGrammar.g:1079:4: ( (otherlv_6= RULE_ID ) )
+            // InternalUIGrammar.g:1080:5: (otherlv_6= RULE_ID )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1094:1: (otherlv_6= RULE_ID )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1095:3: otherlv_6= RULE_ID
+            // InternalUIGrammar.g:1080:5: (otherlv_6= RULE_ID )
+            // InternalUIGrammar.g:1081:6: otherlv_6= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
-              			if (current==null) {
-              	            current = createModelElement(grammarAccess.getUiTypedBindableDefRule());
-              	        }
-                      
+              						if (current==null) {
+              							current = createModelElement(grammarAccess.getUiTypedBindableDefRule());
+              						}
+              					
             }
-            otherlv_6=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_RULE_ID_in_ruleUiTypedBindableDef2329); if (state.failed) return current;
+            otherlv_6=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              		newLeafNode(otherlv_6, grammarAccess.getUiTypedBindableDefAccess().getMethodUxEndpointDefCrossReference_1_5_0()); 
-              	
+              						newLeafNode(otherlv_6, grammarAccess.getUiTypedBindableDefAccess().getMethodUxEndpointDefCrossReference_1_5_0());
+              					
             }
 
             }
@@ -3275,14 +3197,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -3291,7 +3215,7 @@
 
 
     // $ANTLR start "entryRuleUiTypedBindableRawType"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1114:1: entryRuleUiTypedBindableRawType returns [EObject current=null] : iv_ruleUiTypedBindableRawType= ruleUiTypedBindableRawType EOF ;
+    // InternalUIGrammar.g:1097:1: entryRuleUiTypedBindableRawType returns [EObject current=null] : iv_ruleUiTypedBindableRawType= ruleUiTypedBindableRawType EOF ;
     public final EObject entryRuleUiTypedBindableRawType() throws RecognitionException {
         EObject current = null;
 
@@ -3299,13 +3223,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1115:2: (iv_ruleUiTypedBindableRawType= ruleUiTypedBindableRawType EOF )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1116:2: iv_ruleUiTypedBindableRawType= ruleUiTypedBindableRawType EOF
+            // InternalUIGrammar.g:1097:63: (iv_ruleUiTypedBindableRawType= ruleUiTypedBindableRawType EOF )
+            // InternalUIGrammar.g:1098:2: iv_ruleUiTypedBindableRawType= ruleUiTypedBindableRawType EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUiTypedBindableRawTypeRule()); 
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiTypedBindableRawType_in_entryRuleUiTypedBindableRawType2366);
+            pushFollow(FOLLOW_1);
             iv_ruleUiTypedBindableRawType=ruleUiTypedBindableRawType();
 
             state._fsp--;
@@ -3313,16 +3237,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUiTypedBindableRawType; 
             }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiTypedBindableRawType2376); 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;
@@ -3331,7 +3255,7 @@
 
 
     // $ANTLR start "ruleUiTypedBindableRawType"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1123:1: ruleUiTypedBindableRawType returns [EObject current=null] : ( () otherlv_1= '[' ( (otherlv_2= RULE_ID ) ) ( (lv_rawBindablePath_3_0= ruleUiRawBindablePathSegment ) )? otherlv_4= ']' ) ;
+    // InternalUIGrammar.g:1104:1: ruleUiTypedBindableRawType returns [EObject current=null] : ( () otherlv_1= '[' ( (otherlv_2= RULE_ID ) ) ( (lv_rawBindablePath_3_0= ruleUiRawBindablePathSegment ) )? otherlv_4= ']' ) ;
     public final EObject ruleUiTypedBindableRawType() throws RecognitionException {
         EObject current = null;
 
@@ -3341,52 +3265,53 @@
         EObject lv_rawBindablePath_3_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1126:28: ( ( () otherlv_1= '[' ( (otherlv_2= RULE_ID ) ) ( (lv_rawBindablePath_3_0= ruleUiRawBindablePathSegment ) )? otherlv_4= ']' ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1127:1: ( () otherlv_1= '[' ( (otherlv_2= RULE_ID ) ) ( (lv_rawBindablePath_3_0= ruleUiRawBindablePathSegment ) )? otherlv_4= ']' )
+            // InternalUIGrammar.g:1110:2: ( ( () otherlv_1= '[' ( (otherlv_2= RULE_ID ) ) ( (lv_rawBindablePath_3_0= ruleUiRawBindablePathSegment ) )? otherlv_4= ']' ) )
+            // InternalUIGrammar.g:1111:2: ( () otherlv_1= '[' ( (otherlv_2= RULE_ID ) ) ( (lv_rawBindablePath_3_0= ruleUiRawBindablePathSegment ) )? otherlv_4= ']' )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1127:1: ( () otherlv_1= '[' ( (otherlv_2= RULE_ID ) ) ( (lv_rawBindablePath_3_0= ruleUiRawBindablePathSegment ) )? otherlv_4= ']' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1127:2: () otherlv_1= '[' ( (otherlv_2= RULE_ID ) ) ( (lv_rawBindablePath_3_0= ruleUiRawBindablePathSegment ) )? otherlv_4= ']'
+            // InternalUIGrammar.g:1111:2: ( () otherlv_1= '[' ( (otherlv_2= RULE_ID ) ) ( (lv_rawBindablePath_3_0= ruleUiRawBindablePathSegment ) )? otherlv_4= ']' )
+            // InternalUIGrammar.g:1112:3: () otherlv_1= '[' ( (otherlv_2= RULE_ID ) ) ( (lv_rawBindablePath_3_0= ruleUiRawBindablePathSegment ) )? otherlv_4= ']'
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1127:2: ()
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1128:5: 
+            // InternalUIGrammar.g:1112:3: ()
+            // InternalUIGrammar.g:1113:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getUiTypedBindableRawTypeAccess().getUiTypedBindableRawTypeAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiTypedBindableRawTypeAccess().getUiTypedBindableRawTypeAction_0(),
+              					current);
+              			
             }
 
             }
 
-            otherlv_1=(Token)match(input,33,FollowSets000.FOLLOW_33_in_ruleUiTypedBindableRawType2422); if (state.failed) return current;
+            otherlv_1=(Token)match(input,32,FOLLOW_3); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getUiTypedBindableRawTypeAccess().getLeftSquareBracketKeyword_1());
-                  
+              			newLeafNode(otherlv_1, grammarAccess.getUiTypedBindableRawTypeAccess().getLeftSquareBracketKeyword_1());
+              		
             }
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1137:1: ( (otherlv_2= RULE_ID ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1138:1: (otherlv_2= RULE_ID )
+            // InternalUIGrammar.g:1123:3: ( (otherlv_2= RULE_ID ) )
+            // InternalUIGrammar.g:1124:4: (otherlv_2= RULE_ID )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1138:1: (otherlv_2= RULE_ID )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1139:3: otherlv_2= RULE_ID
+            // InternalUIGrammar.g:1124:4: (otherlv_2= RULE_ID )
+            // InternalUIGrammar.g:1125:5: otherlv_2= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
-              			if (current==null) {
-              	            current = createModelElement(grammarAccess.getUiTypedBindableRawTypeRule());
-              	        }
-                      
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getUiTypedBindableRawTypeRule());
+              					}
+              				
             }
-            otherlv_2=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_RULE_ID_in_ruleUiTypedBindableRawType2442); if (state.failed) return current;
+            otherlv_2=(Token)match(input,RULE_ID,FOLLOW_24); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              		newLeafNode(otherlv_2, grammarAccess.getUiTypedBindableRawTypeAccess().getRawBindableUiRawBindableCrossReference_2_0()); 
-              	
+              					newLeafNode(otherlv_2, grammarAccess.getUiTypedBindableRawTypeAccess().getRawBindableUiRawBindableCrossReference_2_0());
+              				
             }
 
             }
@@ -3394,42 +3319,42 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1150:2: ( (lv_rawBindablePath_3_0= ruleUiRawBindablePathSegment ) )?
-            int alt23=2;
-            int LA23_0 = input.LA(1);
+            // InternalUIGrammar.g:1136:3: ( (lv_rawBindablePath_3_0= ruleUiRawBindablePathSegment ) )?
+            int alt22=2;
+            int LA22_0 = input.LA(1);
 
-            if ( (LA23_0==32||LA23_0==36) ) {
-                alt23=1;
+            if ( (LA22_0==31||LA22_0==35) ) {
+                alt22=1;
             }
-            switch (alt23) {
+            switch (alt22) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1151:1: (lv_rawBindablePath_3_0= ruleUiRawBindablePathSegment )
+                    // InternalUIGrammar.g:1137:4: (lv_rawBindablePath_3_0= ruleUiRawBindablePathSegment )
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1151:1: (lv_rawBindablePath_3_0= ruleUiRawBindablePathSegment )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1152:3: lv_rawBindablePath_3_0= ruleUiRawBindablePathSegment
+                    // InternalUIGrammar.g:1137:4: (lv_rawBindablePath_3_0= ruleUiRawBindablePathSegment )
+                    // InternalUIGrammar.g:1138:5: lv_rawBindablePath_3_0= ruleUiRawBindablePathSegment
                     {
                     if ( state.backtracking==0 ) {
-                       
-                      	        newCompositeNode(grammarAccess.getUiTypedBindableRawTypeAccess().getRawBindablePathUiRawBindablePathSegmentParserRuleCall_3_0()); 
-                      	    
+
+                      					newCompositeNode(grammarAccess.getUiTypedBindableRawTypeAccess().getRawBindablePathUiRawBindablePathSegmentParserRuleCall_3_0());
+                      				
                     }
-                    pushFollow(FollowSets000.FOLLOW_ruleUiRawBindablePathSegment_in_ruleUiTypedBindableRawType2463);
+                    pushFollow(FOLLOW_25);
                     lv_rawBindablePath_3_0=ruleUiRawBindablePathSegment();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElementForParent(grammarAccess.getUiTypedBindableRawTypeRule());
-                      	        }
-                             		set(
-                             			current, 
-                             			"rawBindablePath",
-                              		lv_rawBindablePath_3_0, 
-                              		"UiRawBindablePathSegment");
-                      	        afterParserOrEnumRuleCall();
-                      	    
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getUiTypedBindableRawTypeRule());
+                      					}
+                      					set(
+                      						current,
+                      						"rawBindablePath",
+                      						lv_rawBindablePath_3_0,
+                      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiRawBindablePathSegment");
+                      					afterParserOrEnumRuleCall();
+                      				
                     }
 
                     }
@@ -3440,11 +3365,11 @@
 
             }
 
-            otherlv_4=(Token)match(input,34,FollowSets000.FOLLOW_34_in_ruleUiTypedBindableRawType2476); if (state.failed) return current;
+            otherlv_4=(Token)match(input,33,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_4, grammarAccess.getUiTypedBindableRawTypeAccess().getRightSquareBracketKeyword_4());
-                  
+              			newLeafNode(otherlv_4, grammarAccess.getUiTypedBindableRawTypeAccess().getRightSquareBracketKeyword_4());
+              		
             }
 
             }
@@ -3453,14 +3378,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -3469,7 +3396,7 @@
 
 
     // $ANTLR start "entryRuleUiTypedBindableRawTypeAlias"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1180:1: entryRuleUiTypedBindableRawTypeAlias returns [EObject current=null] : iv_ruleUiTypedBindableRawTypeAlias= ruleUiTypedBindableRawTypeAlias EOF ;
+    // InternalUIGrammar.g:1163:1: entryRuleUiTypedBindableRawTypeAlias returns [EObject current=null] : iv_ruleUiTypedBindableRawTypeAlias= ruleUiTypedBindableRawTypeAlias EOF ;
     public final EObject entryRuleUiTypedBindableRawTypeAlias() throws RecognitionException {
         EObject current = null;
 
@@ -3477,13 +3404,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1181:2: (iv_ruleUiTypedBindableRawTypeAlias= ruleUiTypedBindableRawTypeAlias EOF )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1182:2: iv_ruleUiTypedBindableRawTypeAlias= ruleUiTypedBindableRawTypeAlias EOF
+            // InternalUIGrammar.g:1163:68: (iv_ruleUiTypedBindableRawTypeAlias= ruleUiTypedBindableRawTypeAlias EOF )
+            // InternalUIGrammar.g:1164:2: iv_ruleUiTypedBindableRawTypeAlias= ruleUiTypedBindableRawTypeAlias EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUiTypedBindableRawTypeAliasRule()); 
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiTypedBindableRawTypeAlias_in_entryRuleUiTypedBindableRawTypeAlias2512);
+            pushFollow(FOLLOW_1);
             iv_ruleUiTypedBindableRawTypeAlias=ruleUiTypedBindableRawTypeAlias();
 
             state._fsp--;
@@ -3491,16 +3418,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUiTypedBindableRawTypeAlias; 
             }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiTypedBindableRawTypeAlias2522); 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;
@@ -3509,7 +3436,7 @@
 
 
     // $ANTLR start "ruleUiTypedBindableRawTypeAlias"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1189:1: ruleUiTypedBindableRawTypeAlias returns [EObject current=null] : (otherlv_0= 'ui' ( (lv_type_1_0= ruleUiTypedBindableRawType ) ) otherlv_2= 'as' ( (lv_alias_3_0= RULE_ID ) ) (otherlv_4= ';' )? ) ;
+    // InternalUIGrammar.g:1170:1: ruleUiTypedBindableRawTypeAlias returns [EObject current=null] : (otherlv_0= 'ui' ( (lv_type_1_0= ruleUiTypedBindableRawType ) ) otherlv_2= 'as' ( (lv_alias_3_0= RULE_ID ) ) (otherlv_4= ';' )? ) ;
     public final EObject ruleUiTypedBindableRawTypeAlias() throws RecognitionException {
         EObject current = null;
 
@@ -3520,49 +3447,50 @@
         EObject lv_type_1_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1192:28: ( (otherlv_0= 'ui' ( (lv_type_1_0= ruleUiTypedBindableRawType ) ) otherlv_2= 'as' ( (lv_alias_3_0= RULE_ID ) ) (otherlv_4= ';' )? ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1193:1: (otherlv_0= 'ui' ( (lv_type_1_0= ruleUiTypedBindableRawType ) ) otherlv_2= 'as' ( (lv_alias_3_0= RULE_ID ) ) (otherlv_4= ';' )? )
+            // InternalUIGrammar.g:1176:2: ( (otherlv_0= 'ui' ( (lv_type_1_0= ruleUiTypedBindableRawType ) ) otherlv_2= 'as' ( (lv_alias_3_0= RULE_ID ) ) (otherlv_4= ';' )? ) )
+            // InternalUIGrammar.g:1177:2: (otherlv_0= 'ui' ( (lv_type_1_0= ruleUiTypedBindableRawType ) ) otherlv_2= 'as' ( (lv_alias_3_0= RULE_ID ) ) (otherlv_4= ';' )? )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1193:1: (otherlv_0= 'ui' ( (lv_type_1_0= ruleUiTypedBindableRawType ) ) otherlv_2= 'as' ( (lv_alias_3_0= RULE_ID ) ) (otherlv_4= ';' )? )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1193:3: otherlv_0= 'ui' ( (lv_type_1_0= ruleUiTypedBindableRawType ) ) otherlv_2= 'as' ( (lv_alias_3_0= RULE_ID ) ) (otherlv_4= ';' )?
+            // InternalUIGrammar.g:1177:2: (otherlv_0= 'ui' ( (lv_type_1_0= ruleUiTypedBindableRawType ) ) otherlv_2= 'as' ( (lv_alias_3_0= RULE_ID ) ) (otherlv_4= ';' )? )
+            // InternalUIGrammar.g:1178:3: otherlv_0= 'ui' ( (lv_type_1_0= ruleUiTypedBindableRawType ) ) otherlv_2= 'as' ( (lv_alias_3_0= RULE_ID ) ) (otherlv_4= ';' )?
             {
-            otherlv_0=(Token)match(input,35,FollowSets000.FOLLOW_35_in_ruleUiTypedBindableRawTypeAlias2559); if (state.failed) return current;
+            otherlv_0=(Token)match(input,34,FOLLOW_27); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getUiTypedBindableRawTypeAliasAccess().getUiKeyword_0());
-                  
+              			newLeafNode(otherlv_0, grammarAccess.getUiTypedBindableRawTypeAliasAccess().getUiKeyword_0());
+              		
             }
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1197:1: ( (lv_type_1_0= ruleUiTypedBindableRawType ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1198:1: (lv_type_1_0= ruleUiTypedBindableRawType )
+            // InternalUIGrammar.g:1182:3: ( (lv_type_1_0= ruleUiTypedBindableRawType ) )
+            // InternalUIGrammar.g:1183:4: (lv_type_1_0= ruleUiTypedBindableRawType )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1198:1: (lv_type_1_0= ruleUiTypedBindableRawType )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1199:3: lv_type_1_0= ruleUiTypedBindableRawType
+            // InternalUIGrammar.g:1183:4: (lv_type_1_0= ruleUiTypedBindableRawType )
+            // InternalUIGrammar.g:1184:5: lv_type_1_0= ruleUiTypedBindableRawType
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getUiTypedBindableRawTypeAliasAccess().getTypeUiTypedBindableRawTypeParserRuleCall_1_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getUiTypedBindableRawTypeAliasAccess().getTypeUiTypedBindableRawTypeParserRuleCall_1_0());
+              				
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiTypedBindableRawType_in_ruleUiTypedBindableRawTypeAlias2580);
+            pushFollow(FOLLOW_7);
             lv_type_1_0=ruleUiTypedBindableRawType();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getUiTypedBindableRawTypeAliasRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"type",
-                      		lv_type_1_0, 
-                      		"UiTypedBindableRawType");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getUiTypedBindableRawTypeAliasRule());
+              					}
+              					set(
+              						current,
+              						"type",
+              						lv_type_1_0,
+              						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiTypedBindableRawType");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -3570,35 +3498,35 @@
 
             }
 
-            otherlv_2=(Token)match(input,17,FollowSets000.FOLLOW_17_in_ruleUiTypedBindableRawTypeAlias2592); if (state.failed) return current;
+            otherlv_2=(Token)match(input,15,FOLLOW_3); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_2, grammarAccess.getUiTypedBindableRawTypeAliasAccess().getAsKeyword_2());
-                  
-            }
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1219:1: ( (lv_alias_3_0= RULE_ID ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1220:1: (lv_alias_3_0= RULE_ID )
-            {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1220:1: (lv_alias_3_0= RULE_ID )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1221:3: lv_alias_3_0= RULE_ID
-            {
-            lv_alias_3_0=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_RULE_ID_in_ruleUiTypedBindableRawTypeAlias2609); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-              			newLeafNode(lv_alias_3_0, grammarAccess.getUiTypedBindableRawTypeAliasAccess().getAliasIDTerminalRuleCall_3_0()); 
+              			newLeafNode(otherlv_2, grammarAccess.getUiTypedBindableRawTypeAliasAccess().getAsKeyword_2());
               		
             }
+            // InternalUIGrammar.g:1205:3: ( (lv_alias_3_0= RULE_ID ) )
+            // InternalUIGrammar.g:1206:4: (lv_alias_3_0= RULE_ID )
+            {
+            // InternalUIGrammar.g:1206:4: (lv_alias_3_0= RULE_ID )
+            // InternalUIGrammar.g:1207:5: lv_alias_3_0= RULE_ID
+            {
+            lv_alias_3_0=(Token)match(input,RULE_ID,FOLLOW_8); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElement(grammarAccess.getUiTypedBindableRawTypeAliasRule());
-              	        }
-                     		setWithLastConsumed(
-                     			current, 
-                     			"alias",
-                      		lv_alias_3_0, 
-                      		"ID");
-              	    
+              					newLeafNode(lv_alias_3_0, grammarAccess.getUiTypedBindableRawTypeAliasAccess().getAliasIDTerminalRuleCall_3_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getUiTypedBindableRawTypeAliasRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"alias",
+              						lv_alias_3_0,
+              						"org.eclipse.xtext.xbase.Xtype.ID");
+              				
             }
 
             }
@@ -3606,22 +3534,22 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1237:2: (otherlv_4= ';' )?
-            int alt24=2;
-            int LA24_0 = input.LA(1);
+            // InternalUIGrammar.g:1223:3: (otherlv_4= ';' )?
+            int alt23=2;
+            int LA23_0 = input.LA(1);
 
-            if ( (LA24_0==15) ) {
-                alt24=1;
+            if ( (LA23_0==16) ) {
+                alt23=1;
             }
-            switch (alt24) {
+            switch (alt23) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1237:4: otherlv_4= ';'
+                    // InternalUIGrammar.g:1224:4: otherlv_4= ';'
                     {
-                    otherlv_4=(Token)match(input,15,FollowSets000.FOLLOW_15_in_ruleUiTypedBindableRawTypeAlias2627); if (state.failed) return current;
+                    otherlv_4=(Token)match(input,16,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_4, grammarAccess.getUiTypedBindableRawTypeAliasAccess().getSemicolonKeyword_4());
-                          
+                      				newLeafNode(otherlv_4, grammarAccess.getUiTypedBindableRawTypeAliasAccess().getSemicolonKeyword_4());
+                      			
                     }
 
                     }
@@ -3636,14 +3564,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -3652,7 +3582,7 @@
 
 
     // $ANTLR start "entryRuleUiRawBindablePathSegment"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1249:1: entryRuleUiRawBindablePathSegment returns [EObject current=null] : iv_ruleUiRawBindablePathSegment= ruleUiRawBindablePathSegment EOF ;
+    // InternalUIGrammar.g:1233:1: entryRuleUiRawBindablePathSegment returns [EObject current=null] : iv_ruleUiRawBindablePathSegment= ruleUiRawBindablePathSegment EOF ;
     public final EObject entryRuleUiRawBindablePathSegment() throws RecognitionException {
         EObject current = null;
 
@@ -3660,13 +3590,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1250:2: (iv_ruleUiRawBindablePathSegment= ruleUiRawBindablePathSegment EOF )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1251:2: iv_ruleUiRawBindablePathSegment= ruleUiRawBindablePathSegment EOF
+            // InternalUIGrammar.g:1233:65: (iv_ruleUiRawBindablePathSegment= ruleUiRawBindablePathSegment EOF )
+            // InternalUIGrammar.g:1234:2: iv_ruleUiRawBindablePathSegment= ruleUiRawBindablePathSegment EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUiRawBindablePathSegmentRule()); 
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiRawBindablePathSegment_in_entryRuleUiRawBindablePathSegment2665);
+            pushFollow(FOLLOW_1);
             iv_ruleUiRawBindablePathSegment=ruleUiRawBindablePathSegment();
 
             state._fsp--;
@@ -3674,16 +3604,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUiRawBindablePathSegment; 
             }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiRawBindablePathSegment2675); 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;
@@ -3692,7 +3622,7 @@
 
 
     // $ANTLR start "ruleUiRawBindablePathSegment"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1258:1: ruleUiRawBindablePathSegment returns [EObject current=null] : ( () (otherlv_1= '.' | ( (lv_toParent_2_0= '..' ) ) ) ( (otherlv_3= RULE_ID ) ) ( (lv_path_4_0= ruleUiRawBindablePathSegment ) )? ) ;
+    // InternalUIGrammar.g:1240:1: ruleUiRawBindablePathSegment returns [EObject current=null] : ( () (otherlv_1= '.' | ( (lv_toParent_2_0= '..' ) ) ) ( (otherlv_3= RULE_ID ) ) ( (lv_path_4_0= ruleUiRawBindablePathSegment ) )? ) ;
     public final EObject ruleUiRawBindablePathSegment() throws RecognitionException {
         EObject current = null;
 
@@ -3702,80 +3632,81 @@
         EObject lv_path_4_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1261:28: ( ( () (otherlv_1= '.' | ( (lv_toParent_2_0= '..' ) ) ) ( (otherlv_3= RULE_ID ) ) ( (lv_path_4_0= ruleUiRawBindablePathSegment ) )? ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1262:1: ( () (otherlv_1= '.' | ( (lv_toParent_2_0= '..' ) ) ) ( (otherlv_3= RULE_ID ) ) ( (lv_path_4_0= ruleUiRawBindablePathSegment ) )? )
+            // InternalUIGrammar.g:1246:2: ( ( () (otherlv_1= '.' | ( (lv_toParent_2_0= '..' ) ) ) ( (otherlv_3= RULE_ID ) ) ( (lv_path_4_0= ruleUiRawBindablePathSegment ) )? ) )
+            // InternalUIGrammar.g:1247:2: ( () (otherlv_1= '.' | ( (lv_toParent_2_0= '..' ) ) ) ( (otherlv_3= RULE_ID ) ) ( (lv_path_4_0= ruleUiRawBindablePathSegment ) )? )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1262:1: ( () (otherlv_1= '.' | ( (lv_toParent_2_0= '..' ) ) ) ( (otherlv_3= RULE_ID ) ) ( (lv_path_4_0= ruleUiRawBindablePathSegment ) )? )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1262:2: () (otherlv_1= '.' | ( (lv_toParent_2_0= '..' ) ) ) ( (otherlv_3= RULE_ID ) ) ( (lv_path_4_0= ruleUiRawBindablePathSegment ) )?
+            // InternalUIGrammar.g:1247:2: ( () (otherlv_1= '.' | ( (lv_toParent_2_0= '..' ) ) ) ( (otherlv_3= RULE_ID ) ) ( (lv_path_4_0= ruleUiRawBindablePathSegment ) )? )
+            // InternalUIGrammar.g:1248:3: () (otherlv_1= '.' | ( (lv_toParent_2_0= '..' ) ) ) ( (otherlv_3= RULE_ID ) ) ( (lv_path_4_0= ruleUiRawBindablePathSegment ) )?
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1262:2: ()
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1263:5: 
+            // InternalUIGrammar.g:1248:3: ()
+            // InternalUIGrammar.g:1249:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getUiRawBindablePathSegmentAccess().getUiRawBindablePathSegmentAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiRawBindablePathSegmentAccess().getUiRawBindablePathSegmentAction_0(),
+              					current);
+              			
             }
 
             }
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1268:2: (otherlv_1= '.' | ( (lv_toParent_2_0= '..' ) ) )
-            int alt25=2;
-            int LA25_0 = input.LA(1);
+            // InternalUIGrammar.g:1255:3: (otherlv_1= '.' | ( (lv_toParent_2_0= '..' ) ) )
+            int alt24=2;
+            int LA24_0 = input.LA(1);
 
-            if ( (LA25_0==32) ) {
-                alt25=1;
+            if ( (LA24_0==31) ) {
+                alt24=1;
             }
-            else if ( (LA25_0==36) ) {
-                alt25=2;
+            else if ( (LA24_0==35) ) {
+                alt24=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 25, 0, input);
+                    new NoViableAltException("", 24, 0, input);
 
                 throw nvae;
             }
-            switch (alt25) {
+            switch (alt24) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1268:4: otherlv_1= '.'
+                    // InternalUIGrammar.g:1256:4: otherlv_1= '.'
                     {
-                    otherlv_1=(Token)match(input,32,FollowSets000.FOLLOW_32_in_ruleUiRawBindablePathSegment2722); if (state.failed) return current;
+                    otherlv_1=(Token)match(input,31,FOLLOW_3); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_1, grammarAccess.getUiRawBindablePathSegmentAccess().getFullStopKeyword_1_0());
-                          
+                      				newLeafNode(otherlv_1, grammarAccess.getUiRawBindablePathSegmentAccess().getFullStopKeyword_1_0());
+                      			
                     }
 
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1273:6: ( (lv_toParent_2_0= '..' ) )
+                    // InternalUIGrammar.g:1261:4: ( (lv_toParent_2_0= '..' ) )
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1273:6: ( (lv_toParent_2_0= '..' ) )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1274:1: (lv_toParent_2_0= '..' )
+                    // InternalUIGrammar.g:1261:4: ( (lv_toParent_2_0= '..' ) )
+                    // InternalUIGrammar.g:1262:5: (lv_toParent_2_0= '..' )
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1274:1: (lv_toParent_2_0= '..' )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1275:3: lv_toParent_2_0= '..'
+                    // InternalUIGrammar.g:1262:5: (lv_toParent_2_0= '..' )
+                    // InternalUIGrammar.g:1263:6: lv_toParent_2_0= '..'
                     {
-                    lv_toParent_2_0=(Token)match(input,36,FollowSets000.FOLLOW_36_in_ruleUiRawBindablePathSegment2746); if (state.failed) return current;
+                    lv_toParent_2_0=(Token)match(input,35,FOLLOW_3); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              newLeafNode(lv_toParent_2_0, grammarAccess.getUiRawBindablePathSegmentAccess().getToParentFullStopFullStopKeyword_1_1_0());
-                          
+                      						newLeafNode(lv_toParent_2_0, grammarAccess.getUiRawBindablePathSegmentAccess().getToParentFullStopFullStopKeyword_1_1_0());
+                      					
                     }
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElement(grammarAccess.getUiRawBindablePathSegmentRule());
-                      	        }
-                             		setWithLastConsumed(current, "toParent", true, "..");
-                      	    
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getUiRawBindablePathSegmentRule());
+                      						}
+                      						setWithLastConsumed(current, "toParent", true, "..");
+                      					
                     }
 
                     }
@@ -3789,24 +3720,24 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1288:3: ( (otherlv_3= RULE_ID ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1289:1: (otherlv_3= RULE_ID )
+            // InternalUIGrammar.g:1276:3: ( (otherlv_3= RULE_ID ) )
+            // InternalUIGrammar.g:1277:4: (otherlv_3= RULE_ID )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1289:1: (otherlv_3= RULE_ID )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1290:3: otherlv_3= RULE_ID
+            // InternalUIGrammar.g:1277:4: (otherlv_3= RULE_ID )
+            // InternalUIGrammar.g:1278:5: otherlv_3= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
-              			if (current==null) {
-              	            current = createModelElement(grammarAccess.getUiRawBindablePathSegmentRule());
-              	        }
-                      
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getUiRawBindablePathSegmentRule());
+              					}
+              				
             }
-            otherlv_3=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_RULE_ID_in_ruleUiRawBindablePathSegment2780); if (state.failed) return current;
+            otherlv_3=(Token)match(input,RULE_ID,FOLLOW_28); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              		newLeafNode(otherlv_3, grammarAccess.getUiRawBindablePathSegmentAccess().getRawBindableUiRawBindableCrossReference_2_0()); 
-              	
+              					newLeafNode(otherlv_3, grammarAccess.getUiRawBindablePathSegmentAccess().getRawBindableUiRawBindableCrossReference_2_0());
+              				
             }
 
             }
@@ -3814,42 +3745,42 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1301:2: ( (lv_path_4_0= ruleUiRawBindablePathSegment ) )?
-            int alt26=2;
-            int LA26_0 = input.LA(1);
+            // InternalUIGrammar.g:1289:3: ( (lv_path_4_0= ruleUiRawBindablePathSegment ) )?
+            int alt25=2;
+            int LA25_0 = input.LA(1);
 
-            if ( (LA26_0==32||LA26_0==36) ) {
-                alt26=1;
+            if ( (LA25_0==31||LA25_0==35) ) {
+                alt25=1;
             }
-            switch (alt26) {
+            switch (alt25) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1302:1: (lv_path_4_0= ruleUiRawBindablePathSegment )
+                    // InternalUIGrammar.g:1290:4: (lv_path_4_0= ruleUiRawBindablePathSegment )
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1302:1: (lv_path_4_0= ruleUiRawBindablePathSegment )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1303:3: lv_path_4_0= ruleUiRawBindablePathSegment
+                    // InternalUIGrammar.g:1290:4: (lv_path_4_0= ruleUiRawBindablePathSegment )
+                    // InternalUIGrammar.g:1291:5: lv_path_4_0= ruleUiRawBindablePathSegment
                     {
                     if ( state.backtracking==0 ) {
-                       
-                      	        newCompositeNode(grammarAccess.getUiRawBindablePathSegmentAccess().getPathUiRawBindablePathSegmentParserRuleCall_3_0()); 
-                      	    
+
+                      					newCompositeNode(grammarAccess.getUiRawBindablePathSegmentAccess().getPathUiRawBindablePathSegmentParserRuleCall_3_0());
+                      				
                     }
-                    pushFollow(FollowSets000.FOLLOW_ruleUiRawBindablePathSegment_in_ruleUiRawBindablePathSegment2801);
+                    pushFollow(FOLLOW_2);
                     lv_path_4_0=ruleUiRawBindablePathSegment();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElementForParent(grammarAccess.getUiRawBindablePathSegmentRule());
-                      	        }
-                             		set(
-                             			current, 
-                             			"path",
-                              		lv_path_4_0, 
-                              		"UiRawBindablePathSegment");
-                      	        afterParserOrEnumRuleCall();
-                      	    
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getUiRawBindablePathSegmentRule());
+                      					}
+                      					set(
+                      						current,
+                      						"path",
+                      						lv_path_4_0,
+                      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiRawBindablePathSegment");
+                      					afterParserOrEnumRuleCall();
+                      				
                     }
 
                     }
@@ -3867,14 +3798,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -3883,7 +3816,7 @@
 
 
     // $ANTLR start "entryRuleUiCommandBindableDef"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1327:1: entryRuleUiCommandBindableDef returns [EObject current=null] : iv_ruleUiCommandBindableDef= ruleUiCommandBindableDef EOF ;
+    // InternalUIGrammar.g:1312:1: entryRuleUiCommandBindableDef returns [EObject current=null] : iv_ruleUiCommandBindableDef= ruleUiCommandBindableDef EOF ;
     public final EObject entryRuleUiCommandBindableDef() throws RecognitionException {
         EObject current = null;
 
@@ -3891,13 +3824,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1328:2: (iv_ruleUiCommandBindableDef= ruleUiCommandBindableDef EOF )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1329:2: iv_ruleUiCommandBindableDef= ruleUiCommandBindableDef EOF
+            // InternalUIGrammar.g:1312:61: (iv_ruleUiCommandBindableDef= ruleUiCommandBindableDef EOF )
+            // InternalUIGrammar.g:1313:2: iv_ruleUiCommandBindableDef= ruleUiCommandBindableDef EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUiCommandBindableDefRule()); 
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiCommandBindableDef_in_entryRuleUiCommandBindableDef2838);
+            pushFollow(FOLLOW_1);
             iv_ruleUiCommandBindableDef=ruleUiCommandBindableDef();
 
             state._fsp--;
@@ -3905,16 +3838,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUiCommandBindableDef; 
             }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiCommandBindableDef2848); 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;
@@ -3923,63 +3856,64 @@
 
 
     // $ANTLR start "ruleUiCommandBindableDef"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1336:1: ruleUiCommandBindableDef returns [EObject current=null] : ( () ( (lv_command_1_0= ruleUiCommand ) ) ) ;
+    // InternalUIGrammar.g:1319:1: ruleUiCommandBindableDef returns [EObject current=null] : ( () ( (lv_command_1_0= ruleUiCommand ) ) ) ;
     public final EObject ruleUiCommandBindableDef() throws RecognitionException {
         EObject current = null;
 
         EObject lv_command_1_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1339:28: ( ( () ( (lv_command_1_0= ruleUiCommand ) ) ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1340:1: ( () ( (lv_command_1_0= ruleUiCommand ) ) )
+            // InternalUIGrammar.g:1325:2: ( ( () ( (lv_command_1_0= ruleUiCommand ) ) ) )
+            // InternalUIGrammar.g:1326:2: ( () ( (lv_command_1_0= ruleUiCommand ) ) )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1340:1: ( () ( (lv_command_1_0= ruleUiCommand ) ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1340:2: () ( (lv_command_1_0= ruleUiCommand ) )
+            // InternalUIGrammar.g:1326:2: ( () ( (lv_command_1_0= ruleUiCommand ) ) )
+            // InternalUIGrammar.g:1327:3: () ( (lv_command_1_0= ruleUiCommand ) )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1340:2: ()
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1341:5: 
+            // InternalUIGrammar.g:1327:3: ()
+            // InternalUIGrammar.g:1328:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getUiCommandBindableDefAccess().getUiCommandBindableDefAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiCommandBindableDefAccess().getUiCommandBindableDefAction_0(),
+              					current);
+              			
             }
 
             }
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1346:2: ( (lv_command_1_0= ruleUiCommand ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1347:1: (lv_command_1_0= ruleUiCommand )
+            // InternalUIGrammar.g:1334:3: ( (lv_command_1_0= ruleUiCommand ) )
+            // InternalUIGrammar.g:1335:4: (lv_command_1_0= ruleUiCommand )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1347:1: (lv_command_1_0= ruleUiCommand )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1348:3: lv_command_1_0= ruleUiCommand
+            // InternalUIGrammar.g:1335:4: (lv_command_1_0= ruleUiCommand )
+            // InternalUIGrammar.g:1336:5: lv_command_1_0= ruleUiCommand
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getUiCommandBindableDefAccess().getCommandUiCommandParserRuleCall_1_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getUiCommandBindableDefAccess().getCommandUiCommandParserRuleCall_1_0());
+              				
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiCommand_in_ruleUiCommandBindableDef2903);
+            pushFollow(FOLLOW_2);
             lv_command_1_0=ruleUiCommand();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getUiCommandBindableDefRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"command",
-                      		lv_command_1_0, 
-                      		"UiCommand");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getUiCommandBindableDefRule());
+              					}
+              					set(
+              						current,
+              						"command",
+              						lv_command_1_0,
+              						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiCommand");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -3994,14 +3928,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -4010,7 +3946,7 @@
 
 
     // $ANTLR start "entryRuleUiCommand"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1372:1: entryRuleUiCommand returns [EObject current=null] : iv_ruleUiCommand= ruleUiCommand EOF ;
+    // InternalUIGrammar.g:1357:1: entryRuleUiCommand returns [EObject current=null] : iv_ruleUiCommand= ruleUiCommand EOF ;
     public final EObject entryRuleUiCommand() throws RecognitionException {
         EObject current = null;
 
@@ -4018,13 +3954,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1373:2: (iv_ruleUiCommand= ruleUiCommand EOF )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1374:2: iv_ruleUiCommand= ruleUiCommand EOF
+            // InternalUIGrammar.g:1357:50: (iv_ruleUiCommand= ruleUiCommand EOF )
+            // InternalUIGrammar.g:1358:2: iv_ruleUiCommand= ruleUiCommand EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUiCommandRule()); 
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiCommand_in_entryRuleUiCommand2939);
+            pushFollow(FOLLOW_1);
             iv_ruleUiCommand=ruleUiCommand();
 
             state._fsp--;
@@ -4032,16 +3968,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUiCommand; 
             }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiCommand2949); 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;
@@ -4050,7 +3986,7 @@
 
 
     // $ANTLR start "ruleUiCommand"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1381:1: ruleUiCommand returns [EObject current=null] : (this_UiMobileNavigationCommand_0= ruleUiMobileNavigationCommand | this_UiOpenDialogCommand_1= ruleUiOpenDialogCommand | this_UiSearchWithDialogCommand_2= ruleUiSearchWithDialogCommand | this_UiAddToTableCommand_3= ruleUiAddToTableCommand | this_UiRemoveFromTableCommand_4= ruleUiRemoveFromTableCommand | this_UiSendEventCommand_5= ruleUiSendEventCommand | this_UiSetNewInstanceCommand_6= ruleUiSetNewInstanceCommand ) ;
+    // InternalUIGrammar.g:1364:1: ruleUiCommand returns [EObject current=null] : (this_UiMobileNavigationCommand_0= ruleUiMobileNavigationCommand | this_UiOpenDialogCommand_1= ruleUiOpenDialogCommand | this_UiSearchWithDialogCommand_2= ruleUiSearchWithDialogCommand | this_UiAddToTableCommand_3= ruleUiAddToTableCommand | this_UiRemoveFromTableCommand_4= ruleUiRemoveFromTableCommand | this_UiSendEventCommand_5= ruleUiSendEventCommand | this_UiSetNewInstanceCommand_6= ruleUiSetNewInstanceCommand ) ;
     public final EObject ruleUiCommand() throws RecognitionException {
         EObject current = null;
 
@@ -4069,209 +4005,210 @@
         EObject this_UiSetNewInstanceCommand_6 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1384:28: ( (this_UiMobileNavigationCommand_0= ruleUiMobileNavigationCommand | this_UiOpenDialogCommand_1= ruleUiOpenDialogCommand | this_UiSearchWithDialogCommand_2= ruleUiSearchWithDialogCommand | this_UiAddToTableCommand_3= ruleUiAddToTableCommand | this_UiRemoveFromTableCommand_4= ruleUiRemoveFromTableCommand | this_UiSendEventCommand_5= ruleUiSendEventCommand | this_UiSetNewInstanceCommand_6= ruleUiSetNewInstanceCommand ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1385:1: (this_UiMobileNavigationCommand_0= ruleUiMobileNavigationCommand | this_UiOpenDialogCommand_1= ruleUiOpenDialogCommand | this_UiSearchWithDialogCommand_2= ruleUiSearchWithDialogCommand | this_UiAddToTableCommand_3= ruleUiAddToTableCommand | this_UiRemoveFromTableCommand_4= ruleUiRemoveFromTableCommand | this_UiSendEventCommand_5= ruleUiSendEventCommand | this_UiSetNewInstanceCommand_6= ruleUiSetNewInstanceCommand )
+            // InternalUIGrammar.g:1370:2: ( (this_UiMobileNavigationCommand_0= ruleUiMobileNavigationCommand | this_UiOpenDialogCommand_1= ruleUiOpenDialogCommand | this_UiSearchWithDialogCommand_2= ruleUiSearchWithDialogCommand | this_UiAddToTableCommand_3= ruleUiAddToTableCommand | this_UiRemoveFromTableCommand_4= ruleUiRemoveFromTableCommand | this_UiSendEventCommand_5= ruleUiSendEventCommand | this_UiSetNewInstanceCommand_6= ruleUiSetNewInstanceCommand ) )
+            // InternalUIGrammar.g:1371:2: (this_UiMobileNavigationCommand_0= ruleUiMobileNavigationCommand | this_UiOpenDialogCommand_1= ruleUiOpenDialogCommand | this_UiSearchWithDialogCommand_2= ruleUiSearchWithDialogCommand | this_UiAddToTableCommand_3= ruleUiAddToTableCommand | this_UiRemoveFromTableCommand_4= ruleUiRemoveFromTableCommand | this_UiSendEventCommand_5= ruleUiSendEventCommand | this_UiSetNewInstanceCommand_6= ruleUiSetNewInstanceCommand )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1385:1: (this_UiMobileNavigationCommand_0= ruleUiMobileNavigationCommand | this_UiOpenDialogCommand_1= ruleUiOpenDialogCommand | this_UiSearchWithDialogCommand_2= ruleUiSearchWithDialogCommand | this_UiAddToTableCommand_3= ruleUiAddToTableCommand | this_UiRemoveFromTableCommand_4= ruleUiRemoveFromTableCommand | this_UiSendEventCommand_5= ruleUiSendEventCommand | this_UiSetNewInstanceCommand_6= ruleUiSetNewInstanceCommand )
-            int alt27=7;
+            // InternalUIGrammar.g:1371:2: (this_UiMobileNavigationCommand_0= ruleUiMobileNavigationCommand | this_UiOpenDialogCommand_1= ruleUiOpenDialogCommand | this_UiSearchWithDialogCommand_2= ruleUiSearchWithDialogCommand | this_UiAddToTableCommand_3= ruleUiAddToTableCommand | this_UiRemoveFromTableCommand_4= ruleUiRemoveFromTableCommand | this_UiSendEventCommand_5= ruleUiSendEventCommand | this_UiSetNewInstanceCommand_6= ruleUiSetNewInstanceCommand )
+            int alt26=7;
             switch ( input.LA(1) ) {
+            case 36:
+                {
+                alt26=1;
+                }
+                break;
             case 37:
                 {
-                alt27=1;
+                alt26=2;
                 }
                 break;
             case 38:
                 {
-                alt27=2;
+                alt26=3;
                 }
                 break;
             case 39:
                 {
-                alt27=3;
+                alt26=4;
                 }
                 break;
             case 40:
                 {
-                alt27=4;
+                alt26=5;
+                }
+                break;
+            case 44:
+                {
+                alt26=6;
                 }
                 break;
             case 41:
                 {
-                alt27=5;
-                }
-                break;
-            case 45:
-                {
-                alt27=6;
-                }
-                break;
-            case 42:
-                {
-                alt27=7;
+                alt26=7;
                 }
                 break;
             default:
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 27, 0, input);
+                    new NoViableAltException("", 26, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt27) {
+            switch (alt26) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1386:5: this_UiMobileNavigationCommand_0= ruleUiMobileNavigationCommand
+                    // InternalUIGrammar.g:1372:3: this_UiMobileNavigationCommand_0= ruleUiMobileNavigationCommand
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getUiCommandAccess().getUiMobileNavigationCommandParserRuleCall_0()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getUiCommandAccess().getUiMobileNavigationCommandParserRuleCall_0());
+                      		
                     }
-                    pushFollow(FollowSets000.FOLLOW_ruleUiMobileNavigationCommand_in_ruleUiCommand2996);
+                    pushFollow(FOLLOW_2);
                     this_UiMobileNavigationCommand_0=ruleUiMobileNavigationCommand();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_UiMobileNavigationCommand_0; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_UiMobileNavigationCommand_0;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1396:5: this_UiOpenDialogCommand_1= ruleUiOpenDialogCommand
+                    // InternalUIGrammar.g:1381:3: this_UiOpenDialogCommand_1= ruleUiOpenDialogCommand
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getUiCommandAccess().getUiOpenDialogCommandParserRuleCall_1()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getUiCommandAccess().getUiOpenDialogCommandParserRuleCall_1());
+                      		
                     }
-                    pushFollow(FollowSets000.FOLLOW_ruleUiOpenDialogCommand_in_ruleUiCommand3023);
+                    pushFollow(FOLLOW_2);
                     this_UiOpenDialogCommand_1=ruleUiOpenDialogCommand();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_UiOpenDialogCommand_1; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_UiOpenDialogCommand_1;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 3 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1406:5: this_UiSearchWithDialogCommand_2= ruleUiSearchWithDialogCommand
+                    // InternalUIGrammar.g:1390:3: this_UiSearchWithDialogCommand_2= ruleUiSearchWithDialogCommand
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getUiCommandAccess().getUiSearchWithDialogCommandParserRuleCall_2()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getUiCommandAccess().getUiSearchWithDialogCommandParserRuleCall_2());
+                      		
                     }
-                    pushFollow(FollowSets000.FOLLOW_ruleUiSearchWithDialogCommand_in_ruleUiCommand3050);
+                    pushFollow(FOLLOW_2);
                     this_UiSearchWithDialogCommand_2=ruleUiSearchWithDialogCommand();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_UiSearchWithDialogCommand_2; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_UiSearchWithDialogCommand_2;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 4 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1416:5: this_UiAddToTableCommand_3= ruleUiAddToTableCommand
+                    // InternalUIGrammar.g:1399:3: this_UiAddToTableCommand_3= ruleUiAddToTableCommand
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getUiCommandAccess().getUiAddToTableCommandParserRuleCall_3()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getUiCommandAccess().getUiAddToTableCommandParserRuleCall_3());
+                      		
                     }
-                    pushFollow(FollowSets000.FOLLOW_ruleUiAddToTableCommand_in_ruleUiCommand3077);
+                    pushFollow(FOLLOW_2);
                     this_UiAddToTableCommand_3=ruleUiAddToTableCommand();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_UiAddToTableCommand_3; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_UiAddToTableCommand_3;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 5 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1426:5: this_UiRemoveFromTableCommand_4= ruleUiRemoveFromTableCommand
+                    // InternalUIGrammar.g:1408:3: this_UiRemoveFromTableCommand_4= ruleUiRemoveFromTableCommand
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getUiCommandAccess().getUiRemoveFromTableCommandParserRuleCall_4()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getUiCommandAccess().getUiRemoveFromTableCommandParserRuleCall_4());
+                      		
                     }
-                    pushFollow(FollowSets000.FOLLOW_ruleUiRemoveFromTableCommand_in_ruleUiCommand3104);
+                    pushFollow(FOLLOW_2);
                     this_UiRemoveFromTableCommand_4=ruleUiRemoveFromTableCommand();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_UiRemoveFromTableCommand_4; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_UiRemoveFromTableCommand_4;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 6 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1436:5: this_UiSendEventCommand_5= ruleUiSendEventCommand
+                    // InternalUIGrammar.g:1417:3: this_UiSendEventCommand_5= ruleUiSendEventCommand
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getUiCommandAccess().getUiSendEventCommandParserRuleCall_5()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getUiCommandAccess().getUiSendEventCommandParserRuleCall_5());
+                      		
                     }
-                    pushFollow(FollowSets000.FOLLOW_ruleUiSendEventCommand_in_ruleUiCommand3131);
+                    pushFollow(FOLLOW_2);
                     this_UiSendEventCommand_5=ruleUiSendEventCommand();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_UiSendEventCommand_5; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_UiSendEventCommand_5;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 7 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1446:5: this_UiSetNewInstanceCommand_6= ruleUiSetNewInstanceCommand
+                    // InternalUIGrammar.g:1426:3: this_UiSetNewInstanceCommand_6= ruleUiSetNewInstanceCommand
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getUiCommandAccess().getUiSetNewInstanceCommandParserRuleCall_6()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getUiCommandAccess().getUiSetNewInstanceCommandParserRuleCall_6());
+                      		
                     }
-                    pushFollow(FollowSets000.FOLLOW_ruleUiSetNewInstanceCommand_in_ruleUiCommand3158);
+                    pushFollow(FOLLOW_2);
                     this_UiSetNewInstanceCommand_6=ruleUiSetNewInstanceCommand();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_UiSetNewInstanceCommand_6; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_UiSetNewInstanceCommand_6;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
@@ -4283,14 +4220,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -4299,7 +4238,7 @@
 
 
     // $ANTLR start "entryRuleUiMobileNavigationCommand"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1462:1: entryRuleUiMobileNavigationCommand returns [EObject current=null] : iv_ruleUiMobileNavigationCommand= ruleUiMobileNavigationCommand EOF ;
+    // InternalUIGrammar.g:1438:1: entryRuleUiMobileNavigationCommand returns [EObject current=null] : iv_ruleUiMobileNavigationCommand= ruleUiMobileNavigationCommand EOF ;
     public final EObject entryRuleUiMobileNavigationCommand() throws RecognitionException {
         EObject current = null;
 
@@ -4307,13 +4246,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1463:2: (iv_ruleUiMobileNavigationCommand= ruleUiMobileNavigationCommand EOF )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1464:2: iv_ruleUiMobileNavigationCommand= ruleUiMobileNavigationCommand EOF
+            // InternalUIGrammar.g:1438:66: (iv_ruleUiMobileNavigationCommand= ruleUiMobileNavigationCommand EOF )
+            // InternalUIGrammar.g:1439:2: iv_ruleUiMobileNavigationCommand= ruleUiMobileNavigationCommand EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUiMobileNavigationCommandRule()); 
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiMobileNavigationCommand_in_entryRuleUiMobileNavigationCommand3193);
+            pushFollow(FOLLOW_1);
             iv_ruleUiMobileNavigationCommand=ruleUiMobileNavigationCommand();
 
             state._fsp--;
@@ -4321,16 +4260,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUiMobileNavigationCommand; 
             }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiMobileNavigationCommand3203); 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;
@@ -4339,7 +4278,7 @@
 
 
     // $ANTLR start "ruleUiMobileNavigationCommand"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1471:1: ruleUiMobileNavigationCommand returns [EObject current=null] : ( () otherlv_1= 'navigateTo' ( (lv_targetPage_2_0= ruleUiMobileNavigationPage ) ) ) ;
+    // InternalUIGrammar.g:1445:1: ruleUiMobileNavigationCommand returns [EObject current=null] : ( () otherlv_1= 'navigateTo' ( (lv_targetPage_2_0= ruleUiMobileNavigationPage ) ) ) ;
     public final EObject ruleUiMobileNavigationCommand() throws RecognitionException {
         EObject current = null;
 
@@ -4347,62 +4286,63 @@
         EObject lv_targetPage_2_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1474:28: ( ( () otherlv_1= 'navigateTo' ( (lv_targetPage_2_0= ruleUiMobileNavigationPage ) ) ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1475:1: ( () otherlv_1= 'navigateTo' ( (lv_targetPage_2_0= ruleUiMobileNavigationPage ) ) )
+            // InternalUIGrammar.g:1451:2: ( ( () otherlv_1= 'navigateTo' ( (lv_targetPage_2_0= ruleUiMobileNavigationPage ) ) ) )
+            // InternalUIGrammar.g:1452:2: ( () otherlv_1= 'navigateTo' ( (lv_targetPage_2_0= ruleUiMobileNavigationPage ) ) )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1475:1: ( () otherlv_1= 'navigateTo' ( (lv_targetPage_2_0= ruleUiMobileNavigationPage ) ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1475:2: () otherlv_1= 'navigateTo' ( (lv_targetPage_2_0= ruleUiMobileNavigationPage ) )
+            // InternalUIGrammar.g:1452:2: ( () otherlv_1= 'navigateTo' ( (lv_targetPage_2_0= ruleUiMobileNavigationPage ) ) )
+            // InternalUIGrammar.g:1453:3: () otherlv_1= 'navigateTo' ( (lv_targetPage_2_0= ruleUiMobileNavigationPage ) )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1475:2: ()
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1476:5: 
+            // InternalUIGrammar.g:1453:3: ()
+            // InternalUIGrammar.g:1454:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getUiMobileNavigationCommandAccess().getUiMobileNavigationCommandAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiMobileNavigationCommandAccess().getUiMobileNavigationCommandAction_0(),
+              					current);
+              			
             }
 
             }
 
-            otherlv_1=(Token)match(input,37,FollowSets000.FOLLOW_37_in_ruleUiMobileNavigationCommand3249); if (state.failed) return current;
+            otherlv_1=(Token)match(input,36,FOLLOW_29); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getUiMobileNavigationCommandAccess().getNavigateToKeyword_1());
-                  
+              			newLeafNode(otherlv_1, grammarAccess.getUiMobileNavigationCommandAccess().getNavigateToKeyword_1());
+              		
             }
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1485:1: ( (lv_targetPage_2_0= ruleUiMobileNavigationPage ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1486:1: (lv_targetPage_2_0= ruleUiMobileNavigationPage )
+            // InternalUIGrammar.g:1464:3: ( (lv_targetPage_2_0= ruleUiMobileNavigationPage ) )
+            // InternalUIGrammar.g:1465:4: (lv_targetPage_2_0= ruleUiMobileNavigationPage )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1486:1: (lv_targetPage_2_0= ruleUiMobileNavigationPage )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1487:3: lv_targetPage_2_0= ruleUiMobileNavigationPage
+            // InternalUIGrammar.g:1465:4: (lv_targetPage_2_0= ruleUiMobileNavigationPage )
+            // InternalUIGrammar.g:1466:5: lv_targetPage_2_0= ruleUiMobileNavigationPage
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getUiMobileNavigationCommandAccess().getTargetPageUiMobileNavigationPageParserRuleCall_2_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getUiMobileNavigationCommandAccess().getTargetPageUiMobileNavigationPageParserRuleCall_2_0());
+              				
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiMobileNavigationPage_in_ruleUiMobileNavigationCommand3270);
+            pushFollow(FOLLOW_2);
             lv_targetPage_2_0=ruleUiMobileNavigationPage();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getUiMobileNavigationCommandRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"targetPage",
-                      		lv_targetPage_2_0, 
-                      		"UiMobileNavigationPage");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getUiMobileNavigationCommandRule());
+              					}
+              					set(
+              						current,
+              						"targetPage",
+              						lv_targetPage_2_0,
+              						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileNavigationPage");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -4417,14 +4357,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -4433,7 +4375,7 @@
 
 
     // $ANTLR start "entryRuleUiOpenDialogCommand"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1511:1: entryRuleUiOpenDialogCommand returns [EObject current=null] : iv_ruleUiOpenDialogCommand= ruleUiOpenDialogCommand EOF ;
+    // InternalUIGrammar.g:1487:1: entryRuleUiOpenDialogCommand returns [EObject current=null] : iv_ruleUiOpenDialogCommand= ruleUiOpenDialogCommand EOF ;
     public final EObject entryRuleUiOpenDialogCommand() throws RecognitionException {
         EObject current = null;
 
@@ -4441,13 +4383,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1512:2: (iv_ruleUiOpenDialogCommand= ruleUiOpenDialogCommand EOF )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1513:2: iv_ruleUiOpenDialogCommand= ruleUiOpenDialogCommand EOF
+            // InternalUIGrammar.g:1487:60: (iv_ruleUiOpenDialogCommand= ruleUiOpenDialogCommand EOF )
+            // InternalUIGrammar.g:1488:2: iv_ruleUiOpenDialogCommand= ruleUiOpenDialogCommand EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUiOpenDialogCommandRule()); 
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiOpenDialogCommand_in_entryRuleUiOpenDialogCommand3306);
+            pushFollow(FOLLOW_1);
             iv_ruleUiOpenDialogCommand=ruleUiOpenDialogCommand();
 
             state._fsp--;
@@ -4455,16 +4397,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUiOpenDialogCommand; 
             }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiOpenDialogCommand3316); 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;
@@ -4473,7 +4415,7 @@
 
 
     // $ANTLR start "ruleUiOpenDialogCommand"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1520:1: ruleUiOpenDialogCommand returns [EObject current=null] : ( () otherlv_1= 'openDialog' ( (lv_dialog_2_0= ruleUiDialog ) ) ) ;
+    // InternalUIGrammar.g:1494:1: ruleUiOpenDialogCommand returns [EObject current=null] : ( () otherlv_1= 'openDialog' ( (lv_dialog_2_0= ruleUiDialog ) ) ) ;
     public final EObject ruleUiOpenDialogCommand() throws RecognitionException {
         EObject current = null;
 
@@ -4481,62 +4423,63 @@
         EObject lv_dialog_2_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1523:28: ( ( () otherlv_1= 'openDialog' ( (lv_dialog_2_0= ruleUiDialog ) ) ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1524:1: ( () otherlv_1= 'openDialog' ( (lv_dialog_2_0= ruleUiDialog ) ) )
+            // InternalUIGrammar.g:1500:2: ( ( () otherlv_1= 'openDialog' ( (lv_dialog_2_0= ruleUiDialog ) ) ) )
+            // InternalUIGrammar.g:1501:2: ( () otherlv_1= 'openDialog' ( (lv_dialog_2_0= ruleUiDialog ) ) )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1524:1: ( () otherlv_1= 'openDialog' ( (lv_dialog_2_0= ruleUiDialog ) ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1524:2: () otherlv_1= 'openDialog' ( (lv_dialog_2_0= ruleUiDialog ) )
+            // InternalUIGrammar.g:1501:2: ( () otherlv_1= 'openDialog' ( (lv_dialog_2_0= ruleUiDialog ) ) )
+            // InternalUIGrammar.g:1502:3: () otherlv_1= 'openDialog' ( (lv_dialog_2_0= ruleUiDialog ) )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1524:2: ()
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1525:5: 
+            // InternalUIGrammar.g:1502:3: ()
+            // InternalUIGrammar.g:1503:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getUiOpenDialogCommandAccess().getUiOpenDialogCommandAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiOpenDialogCommandAccess().getUiOpenDialogCommandAction_0(),
+              					current);
+              			
             }
 
             }
 
-            otherlv_1=(Token)match(input,38,FollowSets000.FOLLOW_38_in_ruleUiOpenDialogCommand3362); if (state.failed) return current;
+            otherlv_1=(Token)match(input,37,FOLLOW_30); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getUiOpenDialogCommandAccess().getOpenDialogKeyword_1());
-                  
+              			newLeafNode(otherlv_1, grammarAccess.getUiOpenDialogCommandAccess().getOpenDialogKeyword_1());
+              		
             }
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1534:1: ( (lv_dialog_2_0= ruleUiDialog ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1535:1: (lv_dialog_2_0= ruleUiDialog )
+            // InternalUIGrammar.g:1513:3: ( (lv_dialog_2_0= ruleUiDialog ) )
+            // InternalUIGrammar.g:1514:4: (lv_dialog_2_0= ruleUiDialog )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1535:1: (lv_dialog_2_0= ruleUiDialog )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1536:3: lv_dialog_2_0= ruleUiDialog
+            // InternalUIGrammar.g:1514:4: (lv_dialog_2_0= ruleUiDialog )
+            // InternalUIGrammar.g:1515:5: lv_dialog_2_0= ruleUiDialog
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getUiOpenDialogCommandAccess().getDialogUiDialogParserRuleCall_2_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getUiOpenDialogCommandAccess().getDialogUiDialogParserRuleCall_2_0());
+              				
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiDialog_in_ruleUiOpenDialogCommand3383);
+            pushFollow(FOLLOW_2);
             lv_dialog_2_0=ruleUiDialog();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getUiOpenDialogCommandRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"dialog",
-                      		lv_dialog_2_0, 
-                      		"UiDialog");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getUiOpenDialogCommandRule());
+              					}
+              					set(
+              						current,
+              						"dialog",
+              						lv_dialog_2_0,
+              						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiDialog");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -4551,14 +4494,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -4567,7 +4512,7 @@
 
 
     // $ANTLR start "entryRuleUiSearchWithDialogCommand"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1560:1: entryRuleUiSearchWithDialogCommand returns [EObject current=null] : iv_ruleUiSearchWithDialogCommand= ruleUiSearchWithDialogCommand EOF ;
+    // InternalUIGrammar.g:1536:1: entryRuleUiSearchWithDialogCommand returns [EObject current=null] : iv_ruleUiSearchWithDialogCommand= ruleUiSearchWithDialogCommand EOF ;
     public final EObject entryRuleUiSearchWithDialogCommand() throws RecognitionException {
         EObject current = null;
 
@@ -4575,13 +4520,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1561:2: (iv_ruleUiSearchWithDialogCommand= ruleUiSearchWithDialogCommand EOF )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1562:2: iv_ruleUiSearchWithDialogCommand= ruleUiSearchWithDialogCommand EOF
+            // InternalUIGrammar.g:1536:66: (iv_ruleUiSearchWithDialogCommand= ruleUiSearchWithDialogCommand EOF )
+            // InternalUIGrammar.g:1537:2: iv_ruleUiSearchWithDialogCommand= ruleUiSearchWithDialogCommand EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUiSearchWithDialogCommandRule()); 
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiSearchWithDialogCommand_in_entryRuleUiSearchWithDialogCommand3419);
+            pushFollow(FOLLOW_1);
             iv_ruleUiSearchWithDialogCommand=ruleUiSearchWithDialogCommand();
 
             state._fsp--;
@@ -4589,16 +4534,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUiSearchWithDialogCommand; 
             }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiSearchWithDialogCommand3429); 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;
@@ -4607,7 +4552,7 @@
 
 
     // $ANTLR start "ruleUiSearchWithDialogCommand"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1569:1: ruleUiSearchWithDialogCommand returns [EObject current=null] : ( () otherlv_1= 'searchWith' ( (lv_dialog_2_0= ruleUiSearchDialog ) ) ) ;
+    // InternalUIGrammar.g:1543:1: ruleUiSearchWithDialogCommand returns [EObject current=null] : ( () otherlv_1= 'searchWith' ( (lv_dialog_2_0= ruleUiSearchDialog ) ) ) ;
     public final EObject ruleUiSearchWithDialogCommand() throws RecognitionException {
         EObject current = null;
 
@@ -4615,62 +4560,63 @@
         EObject lv_dialog_2_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1572:28: ( ( () otherlv_1= 'searchWith' ( (lv_dialog_2_0= ruleUiSearchDialog ) ) ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1573:1: ( () otherlv_1= 'searchWith' ( (lv_dialog_2_0= ruleUiSearchDialog ) ) )
+            // InternalUIGrammar.g:1549:2: ( ( () otherlv_1= 'searchWith' ( (lv_dialog_2_0= ruleUiSearchDialog ) ) ) )
+            // InternalUIGrammar.g:1550:2: ( () otherlv_1= 'searchWith' ( (lv_dialog_2_0= ruleUiSearchDialog ) ) )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1573:1: ( () otherlv_1= 'searchWith' ( (lv_dialog_2_0= ruleUiSearchDialog ) ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1573:2: () otherlv_1= 'searchWith' ( (lv_dialog_2_0= ruleUiSearchDialog ) )
+            // InternalUIGrammar.g:1550:2: ( () otherlv_1= 'searchWith' ( (lv_dialog_2_0= ruleUiSearchDialog ) ) )
+            // InternalUIGrammar.g:1551:3: () otherlv_1= 'searchWith' ( (lv_dialog_2_0= ruleUiSearchDialog ) )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1573:2: ()
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1574:5: 
+            // InternalUIGrammar.g:1551:3: ()
+            // InternalUIGrammar.g:1552:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getUiSearchWithDialogCommandAccess().getUiSearchWithDialogCommandAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiSearchWithDialogCommandAccess().getUiSearchWithDialogCommandAction_0(),
+              					current);
+              			
             }
 
             }
 
-            otherlv_1=(Token)match(input,39,FollowSets000.FOLLOW_39_in_ruleUiSearchWithDialogCommand3475); if (state.failed) return current;
+            otherlv_1=(Token)match(input,38,FOLLOW_31); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getUiSearchWithDialogCommandAccess().getSearchWithKeyword_1());
-                  
+              			newLeafNode(otherlv_1, grammarAccess.getUiSearchWithDialogCommandAccess().getSearchWithKeyword_1());
+              		
             }
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1583:1: ( (lv_dialog_2_0= ruleUiSearchDialog ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1584:1: (lv_dialog_2_0= ruleUiSearchDialog )
+            // InternalUIGrammar.g:1562:3: ( (lv_dialog_2_0= ruleUiSearchDialog ) )
+            // InternalUIGrammar.g:1563:4: (lv_dialog_2_0= ruleUiSearchDialog )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1584:1: (lv_dialog_2_0= ruleUiSearchDialog )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1585:3: lv_dialog_2_0= ruleUiSearchDialog
+            // InternalUIGrammar.g:1563:4: (lv_dialog_2_0= ruleUiSearchDialog )
+            // InternalUIGrammar.g:1564:5: lv_dialog_2_0= ruleUiSearchDialog
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getUiSearchWithDialogCommandAccess().getDialogUiSearchDialogParserRuleCall_2_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getUiSearchWithDialogCommandAccess().getDialogUiSearchDialogParserRuleCall_2_0());
+              				
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiSearchDialog_in_ruleUiSearchWithDialogCommand3496);
+            pushFollow(FOLLOW_2);
             lv_dialog_2_0=ruleUiSearchDialog();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getUiSearchWithDialogCommandRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"dialog",
-                      		lv_dialog_2_0, 
-                      		"UiSearchDialog");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getUiSearchWithDialogCommandRule());
+              					}
+              					set(
+              						current,
+              						"dialog",
+              						lv_dialog_2_0,
+              						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiSearchDialog");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -4685,14 +4631,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -4701,7 +4649,7 @@
 
 
     // $ANTLR start "entryRuleUiAddToTableCommand"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1609:1: entryRuleUiAddToTableCommand returns [EObject current=null] : iv_ruleUiAddToTableCommand= ruleUiAddToTableCommand EOF ;
+    // InternalUIGrammar.g:1585:1: entryRuleUiAddToTableCommand returns [EObject current=null] : iv_ruleUiAddToTableCommand= ruleUiAddToTableCommand EOF ;
     public final EObject entryRuleUiAddToTableCommand() throws RecognitionException {
         EObject current = null;
 
@@ -4709,13 +4657,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1610:2: (iv_ruleUiAddToTableCommand= ruleUiAddToTableCommand EOF )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1611:2: iv_ruleUiAddToTableCommand= ruleUiAddToTableCommand EOF
+            // InternalUIGrammar.g:1585:60: (iv_ruleUiAddToTableCommand= ruleUiAddToTableCommand EOF )
+            // InternalUIGrammar.g:1586:2: iv_ruleUiAddToTableCommand= ruleUiAddToTableCommand EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUiAddToTableCommandRule()); 
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiAddToTableCommand_in_entryRuleUiAddToTableCommand3532);
+            pushFollow(FOLLOW_1);
             iv_ruleUiAddToTableCommand=ruleUiAddToTableCommand();
 
             state._fsp--;
@@ -4723,16 +4671,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUiAddToTableCommand; 
             }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiAddToTableCommand3542); 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;
@@ -4741,59 +4689,60 @@
 
 
     // $ANTLR start "ruleUiAddToTableCommand"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1618:1: ruleUiAddToTableCommand returns [EObject current=null] : ( () otherlv_1= 'addToTable' ( (otherlv_2= RULE_ID ) ) ) ;
+    // InternalUIGrammar.g:1592:1: ruleUiAddToTableCommand returns [EObject current=null] : ( () otherlv_1= 'addToTable' ( (otherlv_2= RULE_ID ) ) ) ;
     public final EObject ruleUiAddToTableCommand() throws RecognitionException {
         EObject current = null;
 
         Token otherlv_1=null;
         Token otherlv_2=null;
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1621:28: ( ( () otherlv_1= 'addToTable' ( (otherlv_2= RULE_ID ) ) ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1622:1: ( () otherlv_1= 'addToTable' ( (otherlv_2= RULE_ID ) ) )
+            // InternalUIGrammar.g:1598:2: ( ( () otherlv_1= 'addToTable' ( (otherlv_2= RULE_ID ) ) ) )
+            // InternalUIGrammar.g:1599:2: ( () otherlv_1= 'addToTable' ( (otherlv_2= RULE_ID ) ) )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1622:1: ( () otherlv_1= 'addToTable' ( (otherlv_2= RULE_ID ) ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1622:2: () otherlv_1= 'addToTable' ( (otherlv_2= RULE_ID ) )
+            // InternalUIGrammar.g:1599:2: ( () otherlv_1= 'addToTable' ( (otherlv_2= RULE_ID ) ) )
+            // InternalUIGrammar.g:1600:3: () otherlv_1= 'addToTable' ( (otherlv_2= RULE_ID ) )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1622:2: ()
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1623:5: 
+            // InternalUIGrammar.g:1600:3: ()
+            // InternalUIGrammar.g:1601:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getUiAddToTableCommandAccess().getUiAddToTableCommandAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiAddToTableCommandAccess().getUiAddToTableCommandAction_0(),
+              					current);
+              			
             }
 
             }
 
-            otherlv_1=(Token)match(input,40,FollowSets000.FOLLOW_40_in_ruleUiAddToTableCommand3588); if (state.failed) return current;
+            otherlv_1=(Token)match(input,39,FOLLOW_3); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getUiAddToTableCommandAccess().getAddToTableKeyword_1());
-                  
+              			newLeafNode(otherlv_1, grammarAccess.getUiAddToTableCommandAccess().getAddToTableKeyword_1());
+              		
             }
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1632:1: ( (otherlv_2= RULE_ID ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1633:1: (otherlv_2= RULE_ID )
+            // InternalUIGrammar.g:1611:3: ( (otherlv_2= RULE_ID ) )
+            // InternalUIGrammar.g:1612:4: (otherlv_2= RULE_ID )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1633:1: (otherlv_2= RULE_ID )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1634:3: otherlv_2= RULE_ID
+            // InternalUIGrammar.g:1612:4: (otherlv_2= RULE_ID )
+            // InternalUIGrammar.g:1613:5: otherlv_2= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
-              			if (current==null) {
-              	            current = createModelElement(grammarAccess.getUiAddToTableCommandRule());
-              	        }
-                      
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getUiAddToTableCommandRule());
+              					}
+              				
             }
-            otherlv_2=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_RULE_ID_in_ruleUiAddToTableCommand3608); if (state.failed) return current;
+            otherlv_2=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              		newLeafNode(otherlv_2, grammarAccess.getUiAddToTableCommandAccess().getTableUiTableCrossReference_2_0()); 
-              	
+              					newLeafNode(otherlv_2, grammarAccess.getUiAddToTableCommandAccess().getTableUiTableCrossReference_2_0());
+              				
             }
 
             }
@@ -4808,14 +4757,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -4824,7 +4775,7 @@
 
 
     // $ANTLR start "entryRuleUiRemoveFromTableCommand"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1653:1: entryRuleUiRemoveFromTableCommand returns [EObject current=null] : iv_ruleUiRemoveFromTableCommand= ruleUiRemoveFromTableCommand EOF ;
+    // InternalUIGrammar.g:1628:1: entryRuleUiRemoveFromTableCommand returns [EObject current=null] : iv_ruleUiRemoveFromTableCommand= ruleUiRemoveFromTableCommand EOF ;
     public final EObject entryRuleUiRemoveFromTableCommand() throws RecognitionException {
         EObject current = null;
 
@@ -4832,13 +4783,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1654:2: (iv_ruleUiRemoveFromTableCommand= ruleUiRemoveFromTableCommand EOF )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1655:2: iv_ruleUiRemoveFromTableCommand= ruleUiRemoveFromTableCommand EOF
+            // InternalUIGrammar.g:1628:65: (iv_ruleUiRemoveFromTableCommand= ruleUiRemoveFromTableCommand EOF )
+            // InternalUIGrammar.g:1629:2: iv_ruleUiRemoveFromTableCommand= ruleUiRemoveFromTableCommand EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUiRemoveFromTableCommandRule()); 
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiRemoveFromTableCommand_in_entryRuleUiRemoveFromTableCommand3644);
+            pushFollow(FOLLOW_1);
             iv_ruleUiRemoveFromTableCommand=ruleUiRemoveFromTableCommand();
 
             state._fsp--;
@@ -4846,16 +4797,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUiRemoveFromTableCommand; 
             }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiRemoveFromTableCommand3654); 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;
@@ -4864,59 +4815,60 @@
 
 
     // $ANTLR start "ruleUiRemoveFromTableCommand"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1662:1: ruleUiRemoveFromTableCommand returns [EObject current=null] : ( () otherlv_1= 'removeFromTable' ( (otherlv_2= RULE_ID ) ) ) ;
+    // InternalUIGrammar.g:1635:1: ruleUiRemoveFromTableCommand returns [EObject current=null] : ( () otherlv_1= 'removeFromTable' ( (otherlv_2= RULE_ID ) ) ) ;
     public final EObject ruleUiRemoveFromTableCommand() throws RecognitionException {
         EObject current = null;
 
         Token otherlv_1=null;
         Token otherlv_2=null;
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1665:28: ( ( () otherlv_1= 'removeFromTable' ( (otherlv_2= RULE_ID ) ) ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1666:1: ( () otherlv_1= 'removeFromTable' ( (otherlv_2= RULE_ID ) ) )
+            // InternalUIGrammar.g:1641:2: ( ( () otherlv_1= 'removeFromTable' ( (otherlv_2= RULE_ID ) ) ) )
+            // InternalUIGrammar.g:1642:2: ( () otherlv_1= 'removeFromTable' ( (otherlv_2= RULE_ID ) ) )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1666:1: ( () otherlv_1= 'removeFromTable' ( (otherlv_2= RULE_ID ) ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1666:2: () otherlv_1= 'removeFromTable' ( (otherlv_2= RULE_ID ) )
+            // InternalUIGrammar.g:1642:2: ( () otherlv_1= 'removeFromTable' ( (otherlv_2= RULE_ID ) ) )
+            // InternalUIGrammar.g:1643:3: () otherlv_1= 'removeFromTable' ( (otherlv_2= RULE_ID ) )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1666:2: ()
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1667:5: 
+            // InternalUIGrammar.g:1643:3: ()
+            // InternalUIGrammar.g:1644:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getUiRemoveFromTableCommandAccess().getUiRemoveFromTableCommandAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiRemoveFromTableCommandAccess().getUiRemoveFromTableCommandAction_0(),
+              					current);
+              			
             }
 
             }
 
-            otherlv_1=(Token)match(input,41,FollowSets000.FOLLOW_41_in_ruleUiRemoveFromTableCommand3700); if (state.failed) return current;
+            otherlv_1=(Token)match(input,40,FOLLOW_3); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getUiRemoveFromTableCommandAccess().getRemoveFromTableKeyword_1());
-                  
+              			newLeafNode(otherlv_1, grammarAccess.getUiRemoveFromTableCommandAccess().getRemoveFromTableKeyword_1());
+              		
             }
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1676:1: ( (otherlv_2= RULE_ID ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1677:1: (otherlv_2= RULE_ID )
+            // InternalUIGrammar.g:1654:3: ( (otherlv_2= RULE_ID ) )
+            // InternalUIGrammar.g:1655:4: (otherlv_2= RULE_ID )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1677:1: (otherlv_2= RULE_ID )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1678:3: otherlv_2= RULE_ID
+            // InternalUIGrammar.g:1655:4: (otherlv_2= RULE_ID )
+            // InternalUIGrammar.g:1656:5: otherlv_2= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
-              			if (current==null) {
-              	            current = createModelElement(grammarAccess.getUiRemoveFromTableCommandRule());
-              	        }
-                      
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getUiRemoveFromTableCommandRule());
+              					}
+              				
             }
-            otherlv_2=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_RULE_ID_in_ruleUiRemoveFromTableCommand3720); if (state.failed) return current;
+            otherlv_2=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              		newLeafNode(otherlv_2, grammarAccess.getUiRemoveFromTableCommandAccess().getTableUiTableCrossReference_2_0()); 
-              	
+              					newLeafNode(otherlv_2, grammarAccess.getUiRemoveFromTableCommandAccess().getTableUiTableCrossReference_2_0());
+              				
             }
 
             }
@@ -4931,14 +4883,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -4947,7 +4901,7 @@
 
 
     // $ANTLR start "entryRuleUiSetNewInstanceCommand"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1697:1: entryRuleUiSetNewInstanceCommand returns [EObject current=null] : iv_ruleUiSetNewInstanceCommand= ruleUiSetNewInstanceCommand EOF ;
+    // InternalUIGrammar.g:1671:1: entryRuleUiSetNewInstanceCommand returns [EObject current=null] : iv_ruleUiSetNewInstanceCommand= ruleUiSetNewInstanceCommand EOF ;
     public final EObject entryRuleUiSetNewInstanceCommand() throws RecognitionException {
         EObject current = null;
 
@@ -4955,13 +4909,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1698:2: (iv_ruleUiSetNewInstanceCommand= ruleUiSetNewInstanceCommand EOF )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1699:2: iv_ruleUiSetNewInstanceCommand= ruleUiSetNewInstanceCommand EOF
+            // InternalUIGrammar.g:1671:64: (iv_ruleUiSetNewInstanceCommand= ruleUiSetNewInstanceCommand EOF )
+            // InternalUIGrammar.g:1672:2: iv_ruleUiSetNewInstanceCommand= ruleUiSetNewInstanceCommand EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUiSetNewInstanceCommandRule()); 
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiSetNewInstanceCommand_in_entryRuleUiSetNewInstanceCommand3756);
+            pushFollow(FOLLOW_1);
             iv_ruleUiSetNewInstanceCommand=ruleUiSetNewInstanceCommand();
 
             state._fsp--;
@@ -4969,16 +4923,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUiSetNewInstanceCommand; 
             }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiSetNewInstanceCommand3766); 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;
@@ -4987,7 +4941,7 @@
 
 
     // $ANTLR start "ruleUiSetNewInstanceCommand"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1706:1: ruleUiSetNewInstanceCommand returns [EObject current=null] : ( () otherlv_1= 'newInstance' (otherlv_2= 'for' ( (lv_jvmType_3_0= ruleJvmTypeReference ) ) )? (otherlv_4= 'at' ( (lv_target_5_0= ruleUiBindingEndpointAssignment ) ) ) ) ;
+    // InternalUIGrammar.g:1678:1: ruleUiSetNewInstanceCommand returns [EObject current=null] : ( () otherlv_1= 'newInstance' (otherlv_2= 'for' ( (lv_jvmType_3_0= ruleJvmTypeReference ) ) )? (otherlv_4= 'at' ( (lv_target_5_0= ruleUiBindingEndpointAssignment ) ) ) ) ;
     public final EObject ruleUiSetNewInstanceCommand() throws RecognitionException {
         EObject current = null;
 
@@ -4999,79 +4953,80 @@
         EObject lv_target_5_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1709:28: ( ( () otherlv_1= 'newInstance' (otherlv_2= 'for' ( (lv_jvmType_3_0= ruleJvmTypeReference ) ) )? (otherlv_4= 'at' ( (lv_target_5_0= ruleUiBindingEndpointAssignment ) ) ) ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1710:1: ( () otherlv_1= 'newInstance' (otherlv_2= 'for' ( (lv_jvmType_3_0= ruleJvmTypeReference ) ) )? (otherlv_4= 'at' ( (lv_target_5_0= ruleUiBindingEndpointAssignment ) ) ) )
+            // InternalUIGrammar.g:1684:2: ( ( () otherlv_1= 'newInstance' (otherlv_2= 'for' ( (lv_jvmType_3_0= ruleJvmTypeReference ) ) )? (otherlv_4= 'at' ( (lv_target_5_0= ruleUiBindingEndpointAssignment ) ) ) ) )
+            // InternalUIGrammar.g:1685:2: ( () otherlv_1= 'newInstance' (otherlv_2= 'for' ( (lv_jvmType_3_0= ruleJvmTypeReference ) ) )? (otherlv_4= 'at' ( (lv_target_5_0= ruleUiBindingEndpointAssignment ) ) ) )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1710:1: ( () otherlv_1= 'newInstance' (otherlv_2= 'for' ( (lv_jvmType_3_0= ruleJvmTypeReference ) ) )? (otherlv_4= 'at' ( (lv_target_5_0= ruleUiBindingEndpointAssignment ) ) ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1710:2: () otherlv_1= 'newInstance' (otherlv_2= 'for' ( (lv_jvmType_3_0= ruleJvmTypeReference ) ) )? (otherlv_4= 'at' ( (lv_target_5_0= ruleUiBindingEndpointAssignment ) ) )
+            // InternalUIGrammar.g:1685:2: ( () otherlv_1= 'newInstance' (otherlv_2= 'for' ( (lv_jvmType_3_0= ruleJvmTypeReference ) ) )? (otherlv_4= 'at' ( (lv_target_5_0= ruleUiBindingEndpointAssignment ) ) ) )
+            // InternalUIGrammar.g:1686:3: () otherlv_1= 'newInstance' (otherlv_2= 'for' ( (lv_jvmType_3_0= ruleJvmTypeReference ) ) )? (otherlv_4= 'at' ( (lv_target_5_0= ruleUiBindingEndpointAssignment ) ) )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1710:2: ()
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1711:5: 
+            // InternalUIGrammar.g:1686:3: ()
+            // InternalUIGrammar.g:1687:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getUiSetNewInstanceCommandAccess().getUiSetNewInstanceCommandAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiSetNewInstanceCommandAccess().getUiSetNewInstanceCommandAction_0(),
+              					current);
+              			
             }
 
             }
 
-            otherlv_1=(Token)match(input,42,FollowSets000.FOLLOW_42_in_ruleUiSetNewInstanceCommand3812); if (state.failed) return current;
+            otherlv_1=(Token)match(input,41,FOLLOW_32); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getUiSetNewInstanceCommandAccess().getNewInstanceKeyword_1());
-                  
+              			newLeafNode(otherlv_1, grammarAccess.getUiSetNewInstanceCommandAccess().getNewInstanceKeyword_1());
+              		
             }
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1720:1: (otherlv_2= 'for' ( (lv_jvmType_3_0= ruleJvmTypeReference ) ) )?
-            int alt28=2;
-            int LA28_0 = input.LA(1);
+            // InternalUIGrammar.g:1697:3: (otherlv_2= 'for' ( (lv_jvmType_3_0= ruleJvmTypeReference ) ) )?
+            int alt27=2;
+            int LA27_0 = input.LA(1);
 
-            if ( (LA28_0==43) ) {
-                alt28=1;
+            if ( (LA27_0==42) ) {
+                alt27=1;
             }
-            switch (alt28) {
+            switch (alt27) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1720:3: otherlv_2= 'for' ( (lv_jvmType_3_0= ruleJvmTypeReference ) )
+                    // InternalUIGrammar.g:1698:4: otherlv_2= 'for' ( (lv_jvmType_3_0= ruleJvmTypeReference ) )
                     {
-                    otherlv_2=(Token)match(input,43,FollowSets000.FOLLOW_43_in_ruleUiSetNewInstanceCommand3825); if (state.failed) return current;
+                    otherlv_2=(Token)match(input,42,FOLLOW_16); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_2, grammarAccess.getUiSetNewInstanceCommandAccess().getForKeyword_2_0());
-                          
+                      				newLeafNode(otherlv_2, grammarAccess.getUiSetNewInstanceCommandAccess().getForKeyword_2_0());
+                      			
                     }
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1724:1: ( (lv_jvmType_3_0= ruleJvmTypeReference ) )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1725:1: (lv_jvmType_3_0= ruleJvmTypeReference )
+                    // InternalUIGrammar.g:1702:4: ( (lv_jvmType_3_0= ruleJvmTypeReference ) )
+                    // InternalUIGrammar.g:1703:5: (lv_jvmType_3_0= ruleJvmTypeReference )
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1725:1: (lv_jvmType_3_0= ruleJvmTypeReference )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1726:3: lv_jvmType_3_0= ruleJvmTypeReference
+                    // InternalUIGrammar.g:1703:5: (lv_jvmType_3_0= ruleJvmTypeReference )
+                    // InternalUIGrammar.g:1704:6: lv_jvmType_3_0= ruleJvmTypeReference
                     {
                     if ( state.backtracking==0 ) {
-                       
-                      	        newCompositeNode(grammarAccess.getUiSetNewInstanceCommandAccess().getJvmTypeJvmTypeReferenceParserRuleCall_2_1_0()); 
-                      	    
+
+                      						newCompositeNode(grammarAccess.getUiSetNewInstanceCommandAccess().getJvmTypeJvmTypeReferenceParserRuleCall_2_1_0());
+                      					
                     }
-                    pushFollow(FollowSets000.FOLLOW_ruleJvmTypeReference_in_ruleUiSetNewInstanceCommand3846);
+                    pushFollow(FOLLOW_33);
                     lv_jvmType_3_0=ruleJvmTypeReference();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElementForParent(grammarAccess.getUiSetNewInstanceCommandRule());
-                      	        }
-                             		set(
-                             			current, 
-                             			"jvmType",
-                              		lv_jvmType_3_0, 
-                              		"JvmTypeReference");
-                      	        afterParserOrEnumRuleCall();
-                      	    
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getUiSetNewInstanceCommandRule());
+                      						}
+                      						set(
+                      							current,
+                      							"jvmType",
+                      							lv_jvmType_3_0,
+                      							"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+                      						afterParserOrEnumRuleCall();
+                      					
                     }
 
                     }
@@ -5085,43 +5040,43 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1742:4: (otherlv_4= 'at' ( (lv_target_5_0= ruleUiBindingEndpointAssignment ) ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1742:6: otherlv_4= 'at' ( (lv_target_5_0= ruleUiBindingEndpointAssignment ) )
+            // InternalUIGrammar.g:1722:3: (otherlv_4= 'at' ( (lv_target_5_0= ruleUiBindingEndpointAssignment ) ) )
+            // InternalUIGrammar.g:1723:4: otherlv_4= 'at' ( (lv_target_5_0= ruleUiBindingEndpointAssignment ) )
             {
-            otherlv_4=(Token)match(input,44,FollowSets000.FOLLOW_44_in_ruleUiSetNewInstanceCommand3861); if (state.failed) return current;
+            otherlv_4=(Token)match(input,43,FOLLOW_14); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_4, grammarAccess.getUiSetNewInstanceCommandAccess().getAtKeyword_3_0());
-                  
+              				newLeafNode(otherlv_4, grammarAccess.getUiSetNewInstanceCommandAccess().getAtKeyword_3_0());
+              			
             }
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1746:1: ( (lv_target_5_0= ruleUiBindingEndpointAssignment ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1747:1: (lv_target_5_0= ruleUiBindingEndpointAssignment )
+            // InternalUIGrammar.g:1727:4: ( (lv_target_5_0= ruleUiBindingEndpointAssignment ) )
+            // InternalUIGrammar.g:1728:5: (lv_target_5_0= ruleUiBindingEndpointAssignment )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1747:1: (lv_target_5_0= ruleUiBindingEndpointAssignment )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1748:3: lv_target_5_0= ruleUiBindingEndpointAssignment
+            // InternalUIGrammar.g:1728:5: (lv_target_5_0= ruleUiBindingEndpointAssignment )
+            // InternalUIGrammar.g:1729:6: lv_target_5_0= ruleUiBindingEndpointAssignment
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getUiSetNewInstanceCommandAccess().getTargetUiBindingEndpointAssignmentParserRuleCall_3_1_0()); 
-              	    
+
+              						newCompositeNode(grammarAccess.getUiSetNewInstanceCommandAccess().getTargetUiBindingEndpointAssignmentParserRuleCall_3_1_0());
+              					
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiBindingEndpointAssignment_in_ruleUiSetNewInstanceCommand3882);
+            pushFollow(FOLLOW_2);
             lv_target_5_0=ruleUiBindingEndpointAssignment();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getUiSetNewInstanceCommandRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"target",
-                      		lv_target_5_0, 
-                      		"UiBindingEndpointAssignment");
-              	        afterParserOrEnumRuleCall();
-              	    
+              						if (current==null) {
+              							current = createModelElementForParent(grammarAccess.getUiSetNewInstanceCommandRule());
+              						}
+              						set(
+              							current,
+              							"target",
+              							lv_target_5_0,
+              							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAssignment");
+              						afterParserOrEnumRuleCall();
+              					
             }
 
             }
@@ -5139,14 +5094,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -5155,7 +5112,7 @@
 
 
     // $ANTLR start "entryRuleUiSendEventCommand"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1772:1: entryRuleUiSendEventCommand returns [EObject current=null] : iv_ruleUiSendEventCommand= ruleUiSendEventCommand EOF ;
+    // InternalUIGrammar.g:1751:1: entryRuleUiSendEventCommand returns [EObject current=null] : iv_ruleUiSendEventCommand= ruleUiSendEventCommand EOF ;
     public final EObject entryRuleUiSendEventCommand() throws RecognitionException {
         EObject current = null;
 
@@ -5163,13 +5120,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1773:2: (iv_ruleUiSendEventCommand= ruleUiSendEventCommand EOF )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1774:2: iv_ruleUiSendEventCommand= ruleUiSendEventCommand EOF
+            // InternalUIGrammar.g:1751:59: (iv_ruleUiSendEventCommand= ruleUiSendEventCommand EOF )
+            // InternalUIGrammar.g:1752:2: iv_ruleUiSendEventCommand= ruleUiSendEventCommand EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUiSendEventCommandRule()); 
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiSendEventCommand_in_entryRuleUiSendEventCommand3919);
+            pushFollow(FOLLOW_1);
             iv_ruleUiSendEventCommand=ruleUiSendEventCommand();
 
             state._fsp--;
@@ -5177,16 +5134,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUiSendEventCommand; 
             }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiSendEventCommand3929); 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;
@@ -5195,7 +5152,7 @@
 
 
     // $ANTLR start "ruleUiSendEventCommand"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1781:1: ruleUiSendEventCommand returns [EObject current=null] : ( () otherlv_1= 'sendEvent' otherlv_2= '(' ( (lv_noAutoTrigger_3_0= 'noAutoTrigger' ) )? ( (lv_eventTopic_4_0= RULE_STRING ) ) otherlv_5= ')' ) ;
+    // InternalUIGrammar.g:1758:1: ruleUiSendEventCommand returns [EObject current=null] : ( () otherlv_1= 'sendEvent' otherlv_2= '(' ( (lv_noAutoTrigger_3_0= 'noAutoTrigger' ) )? ( (lv_eventTopic_4_0= RULE_STRING ) ) otherlv_5= ')' ) ;
     public final EObject ruleUiSendEventCommand() throws RecognitionException {
         EObject current = null;
 
@@ -5205,67 +5162,68 @@
         Token lv_eventTopic_4_0=null;
         Token otherlv_5=null;
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1784:28: ( ( () otherlv_1= 'sendEvent' otherlv_2= '(' ( (lv_noAutoTrigger_3_0= 'noAutoTrigger' ) )? ( (lv_eventTopic_4_0= RULE_STRING ) ) otherlv_5= ')' ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1785:1: ( () otherlv_1= 'sendEvent' otherlv_2= '(' ( (lv_noAutoTrigger_3_0= 'noAutoTrigger' ) )? ( (lv_eventTopic_4_0= RULE_STRING ) ) otherlv_5= ')' )
+            // InternalUIGrammar.g:1764:2: ( ( () otherlv_1= 'sendEvent' otherlv_2= '(' ( (lv_noAutoTrigger_3_0= 'noAutoTrigger' ) )? ( (lv_eventTopic_4_0= RULE_STRING ) ) otherlv_5= ')' ) )
+            // InternalUIGrammar.g:1765:2: ( () otherlv_1= 'sendEvent' otherlv_2= '(' ( (lv_noAutoTrigger_3_0= 'noAutoTrigger' ) )? ( (lv_eventTopic_4_0= RULE_STRING ) ) otherlv_5= ')' )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1785:1: ( () otherlv_1= 'sendEvent' otherlv_2= '(' ( (lv_noAutoTrigger_3_0= 'noAutoTrigger' ) )? ( (lv_eventTopic_4_0= RULE_STRING ) ) otherlv_5= ')' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1785:2: () otherlv_1= 'sendEvent' otherlv_2= '(' ( (lv_noAutoTrigger_3_0= 'noAutoTrigger' ) )? ( (lv_eventTopic_4_0= RULE_STRING ) ) otherlv_5= ')'
+            // InternalUIGrammar.g:1765:2: ( () otherlv_1= 'sendEvent' otherlv_2= '(' ( (lv_noAutoTrigger_3_0= 'noAutoTrigger' ) )? ( (lv_eventTopic_4_0= RULE_STRING ) ) otherlv_5= ')' )
+            // InternalUIGrammar.g:1766:3: () otherlv_1= 'sendEvent' otherlv_2= '(' ( (lv_noAutoTrigger_3_0= 'noAutoTrigger' ) )? ( (lv_eventTopic_4_0= RULE_STRING ) ) otherlv_5= ')'
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1785:2: ()
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1786:5: 
+            // InternalUIGrammar.g:1766:3: ()
+            // InternalUIGrammar.g:1767:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getUiSendEventCommandAccess().getUiSendEventCommandAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiSendEventCommandAccess().getUiSendEventCommandAction_0(),
+              					current);
+              			
             }
 
             }
 
-            otherlv_1=(Token)match(input,45,FollowSets000.FOLLOW_45_in_ruleUiSendEventCommand3975); if (state.failed) return current;
+            otherlv_1=(Token)match(input,44,FOLLOW_34); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getUiSendEventCommandAccess().getSendEventKeyword_1());
-                  
+              			newLeafNode(otherlv_1, grammarAccess.getUiSendEventCommandAccess().getSendEventKeyword_1());
+              		
             }
-            otherlv_2=(Token)match(input,46,FollowSets000.FOLLOW_46_in_ruleUiSendEventCommand3987); if (state.failed) return current;
+            otherlv_2=(Token)match(input,45,FOLLOW_35); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_2, grammarAccess.getUiSendEventCommandAccess().getLeftParenthesisKeyword_2());
-                  
+              			newLeafNode(otherlv_2, grammarAccess.getUiSendEventCommandAccess().getLeftParenthesisKeyword_2());
+              		
             }
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1799:1: ( (lv_noAutoTrigger_3_0= 'noAutoTrigger' ) )?
-            int alt29=2;
-            int LA29_0 = input.LA(1);
+            // InternalUIGrammar.g:1781:3: ( (lv_noAutoTrigger_3_0= 'noAutoTrigger' ) )?
+            int alt28=2;
+            int LA28_0 = input.LA(1);
 
-            if ( (LA29_0==47) ) {
-                alt29=1;
+            if ( (LA28_0==46) ) {
+                alt28=1;
             }
-            switch (alt29) {
+            switch (alt28) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1800:1: (lv_noAutoTrigger_3_0= 'noAutoTrigger' )
+                    // InternalUIGrammar.g:1782:4: (lv_noAutoTrigger_3_0= 'noAutoTrigger' )
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1800:1: (lv_noAutoTrigger_3_0= 'noAutoTrigger' )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1801:3: lv_noAutoTrigger_3_0= 'noAutoTrigger'
+                    // InternalUIGrammar.g:1782:4: (lv_noAutoTrigger_3_0= 'noAutoTrigger' )
+                    // InternalUIGrammar.g:1783:5: lv_noAutoTrigger_3_0= 'noAutoTrigger'
                     {
-                    lv_noAutoTrigger_3_0=(Token)match(input,47,FollowSets000.FOLLOW_47_in_ruleUiSendEventCommand4005); if (state.failed) return current;
+                    lv_noAutoTrigger_3_0=(Token)match(input,46,FOLLOW_18); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              newLeafNode(lv_noAutoTrigger_3_0, grammarAccess.getUiSendEventCommandAccess().getNoAutoTriggerNoAutoTriggerKeyword_3_0());
-                          
+                      					newLeafNode(lv_noAutoTrigger_3_0, grammarAccess.getUiSendEventCommandAccess().getNoAutoTriggerNoAutoTriggerKeyword_3_0());
+                      				
                     }
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElement(grammarAccess.getUiSendEventCommandRule());
-                      	        }
-                             		setWithLastConsumed(current, "noAutoTrigger", true, "noAutoTrigger");
-                      	    
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiSendEventCommandRule());
+                      					}
+                      					setWithLastConsumed(current, "noAutoTrigger", true, "noAutoTrigger");
+                      				
                     }
 
                     }
@@ -5276,42 +5234,42 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1814:3: ( (lv_eventTopic_4_0= RULE_STRING ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1815:1: (lv_eventTopic_4_0= RULE_STRING )
+            // InternalUIGrammar.g:1795:3: ( (lv_eventTopic_4_0= RULE_STRING ) )
+            // InternalUIGrammar.g:1796:4: (lv_eventTopic_4_0= RULE_STRING )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1815:1: (lv_eventTopic_4_0= RULE_STRING )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1816:3: lv_eventTopic_4_0= RULE_STRING
+            // InternalUIGrammar.g:1796:4: (lv_eventTopic_4_0= RULE_STRING )
+            // InternalUIGrammar.g:1797:5: lv_eventTopic_4_0= RULE_STRING
             {
-            lv_eventTopic_4_0=(Token)match(input,RULE_STRING,FollowSets000.FOLLOW_RULE_STRING_in_ruleUiSendEventCommand4036); if (state.failed) return current;
+            lv_eventTopic_4_0=(Token)match(input,RULE_STRING,FOLLOW_36); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              			newLeafNode(lv_eventTopic_4_0, grammarAccess.getUiSendEventCommandAccess().getEventTopicSTRINGTerminalRuleCall_4_0()); 
+              					newLeafNode(lv_eventTopic_4_0, grammarAccess.getUiSendEventCommandAccess().getEventTopicSTRINGTerminalRuleCall_4_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getUiSendEventCommandRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"eventTopic",
+              						lv_eventTopic_4_0,
+              						"org.eclipse.xtext.xbase.Xtype.STRING");
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_5=(Token)match(input,47,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_5, grammarAccess.getUiSendEventCommandAccess().getRightParenthesisKeyword_5());
               		
             }
-            if ( state.backtracking==0 ) {
-
-              	        if (current==null) {
-              	            current = createModelElement(grammarAccess.getUiSendEventCommandRule());
-              	        }
-                     		setWithLastConsumed(
-                     			current, 
-                     			"eventTopic",
-                      		lv_eventTopic_4_0, 
-                      		"STRING");
-              	    
-            }
-
-            }
-
-
-            }
-
-            otherlv_5=(Token)match(input,48,FollowSets000.FOLLOW_48_in_ruleUiSendEventCommand4053); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-                  	newLeafNode(otherlv_5, grammarAccess.getUiSendEventCommandAccess().getRightParenthesisKeyword_5());
-                  
-            }
 
             }
 
@@ -5319,14 +5277,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -5335,7 +5295,7 @@
 
 
     // $ANTLR start "entryRuleUiView"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1844:1: entryRuleUiView returns [EObject current=null] : iv_ruleUiView= ruleUiView EOF ;
+    // InternalUIGrammar.g:1821:1: entryRuleUiView returns [EObject current=null] : iv_ruleUiView= ruleUiView EOF ;
     public final EObject entryRuleUiView() throws RecognitionException {
         EObject current = null;
 
@@ -5343,13 +5303,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1845:2: (iv_ruleUiView= ruleUiView EOF )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1846:2: iv_ruleUiView= ruleUiView EOF
+            // InternalUIGrammar.g:1821:47: (iv_ruleUiView= ruleUiView EOF )
+            // InternalUIGrammar.g:1822:2: iv_ruleUiView= ruleUiView EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUiViewRule()); 
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiView_in_entryRuleUiView4089);
+            pushFollow(FOLLOW_1);
             iv_ruleUiView=ruleUiView();
 
             state._fsp--;
@@ -5357,16 +5317,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUiView; 
             }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiView4099); 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;
@@ -5375,47 +5335,50 @@
 
 
     // $ANTLR start "ruleUiView"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1853:1: ruleUiView returns [EObject current=null] : this_UiIDEView_0= ruleUiIDEView ;
+    // InternalUIGrammar.g:1828:1: ruleUiView returns [EObject current=null] : this_UiIDEView_0= ruleUiIDEView ;
     public final EObject ruleUiView() throws RecognitionException {
         EObject current = null;
 
         EObject this_UiIDEView_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1856:28: (this_UiIDEView_0= ruleUiIDEView )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1858:5: this_UiIDEView_0= ruleUiIDEView
+            // InternalUIGrammar.g:1834:2: (this_UiIDEView_0= ruleUiIDEView )
+            // InternalUIGrammar.g:1835:2: this_UiIDEView_0= ruleUiIDEView
             {
             if ( state.backtracking==0 ) {
-               
-                      newCompositeNode(grammarAccess.getUiViewAccess().getUiIDEViewParserRuleCall()); 
-                  
+
+              		newCompositeNode(grammarAccess.getUiViewAccess().getUiIDEViewParserRuleCall());
+              	
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiIDEView_in_ruleUiView4145);
+            pushFollow(FOLLOW_2);
             this_UiIDEView_0=ruleUiIDEView();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
-               
-                      current = this_UiIDEView_0; 
-                      afterParserOrEnumRuleCall();
-                  
+
+              		current = this_UiIDEView_0;
+              		afterParserOrEnumRuleCall();
+              	
             }
 
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -5424,7 +5387,7 @@
 
 
     // $ANTLR start "entryRuleUiIDEView"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1874:1: entryRuleUiIDEView returns [EObject current=null] : iv_ruleUiIDEView= ruleUiIDEView EOF ;
+    // InternalUIGrammar.g:1846:1: entryRuleUiIDEView returns [EObject current=null] : iv_ruleUiIDEView= ruleUiIDEView EOF ;
     public final EObject entryRuleUiIDEView() throws RecognitionException {
         EObject current = null;
 
@@ -5432,13 +5395,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1875:2: (iv_ruleUiIDEView= ruleUiIDEView EOF )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1876:2: iv_ruleUiIDEView= ruleUiIDEView EOF
+            // InternalUIGrammar.g:1846:50: (iv_ruleUiIDEView= ruleUiIDEView EOF )
+            // InternalUIGrammar.g:1847:2: iv_ruleUiIDEView= ruleUiIDEView EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUiIDEViewRule()); 
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiIDEView_in_entryRuleUiIDEView4179);
+            pushFollow(FOLLOW_1);
             iv_ruleUiIDEView=ruleUiIDEView();
 
             state._fsp--;
@@ -5446,16 +5409,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUiIDEView; 
             }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiIDEView4189); 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;
@@ -5464,7 +5427,7 @@
 
 
     // $ANTLR start "ruleUiIDEView"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1883:1: ruleUiIDEView returns [EObject current=null] : (otherlv_0= 'ideview' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}' ) ) ) ) )* ) ) ) ( ( (lv_beanSlots_17_0= ruleUiBeanSlot ) ) | ( (lv_bindingEndpointAlias_18_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_19_0= ruleUiBinding ) ) )* ( (lv_content_20_0= ruleUiEmbeddable ) ) (otherlv_21= 'align' ( (lv_contentAlignment_22_0= ruleUiAlignment ) ) )? ( ( (lv_bindingEndpointAlias_23_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_24_0= ruleUiBinding ) ) | ( (lv_validatorAssignments_25_0= ruleUiValidatorAssignment ) ) | ( (lv_processorAssignments_26_0= ruleUiVisibilityProcessorAssignment ) ) )* otherlv_27= '}' ) ;
+    // InternalUIGrammar.g:1853:1: ruleUiIDEView returns [EObject current=null] : (otherlv_0= 'ideview' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}' ) ) ) ) )* ) ) ) ( ( (lv_beanSlots_17_0= ruleUiBeanSlot ) ) | ( (lv_bindingEndpointAlias_18_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_19_0= ruleUiBinding ) ) )* ( (lv_content_20_0= ruleUiEmbeddable ) ) (otherlv_21= 'align' ( (lv_contentAlignment_22_0= ruleUiAlignment ) ) )? ( ( (lv_bindingEndpointAlias_23_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_24_0= ruleUiBinding ) ) | ( (lv_validatorAssignments_25_0= ruleUiValidatorAssignment ) ) | ( (lv_processorAssignments_26_0= ruleUiVisibilityProcessorAssignment ) ) )* otherlv_27= '}' ) ;
     public final EObject ruleUiIDEView() throws RecognitionException {
         EObject current = null;
 
@@ -5506,141 +5469,142 @@
         EObject lv_processorAssignments_26_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1886:28: ( (otherlv_0= 'ideview' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}' ) ) ) ) )* ) ) ) ( ( (lv_beanSlots_17_0= ruleUiBeanSlot ) ) | ( (lv_bindingEndpointAlias_18_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_19_0= ruleUiBinding ) ) )* ( (lv_content_20_0= ruleUiEmbeddable ) ) (otherlv_21= 'align' ( (lv_contentAlignment_22_0= ruleUiAlignment ) ) )? ( ( (lv_bindingEndpointAlias_23_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_24_0= ruleUiBinding ) ) | ( (lv_validatorAssignments_25_0= ruleUiValidatorAssignment ) ) | ( (lv_processorAssignments_26_0= ruleUiVisibilityProcessorAssignment ) ) )* otherlv_27= '}' ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1887:1: (otherlv_0= 'ideview' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}' ) ) ) ) )* ) ) ) ( ( (lv_beanSlots_17_0= ruleUiBeanSlot ) ) | ( (lv_bindingEndpointAlias_18_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_19_0= ruleUiBinding ) ) )* ( (lv_content_20_0= ruleUiEmbeddable ) ) (otherlv_21= 'align' ( (lv_contentAlignment_22_0= ruleUiAlignment ) ) )? ( ( (lv_bindingEndpointAlias_23_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_24_0= ruleUiBinding ) ) | ( (lv_validatorAssignments_25_0= ruleUiValidatorAssignment ) ) | ( (lv_processorAssignments_26_0= ruleUiVisibilityProcessorAssignment ) ) )* otherlv_27= '}' )
+            // InternalUIGrammar.g:1859:2: ( (otherlv_0= 'ideview' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}' ) ) ) ) )* ) ) ) ( ( (lv_beanSlots_17_0= ruleUiBeanSlot ) ) | ( (lv_bindingEndpointAlias_18_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_19_0= ruleUiBinding ) ) )* ( (lv_content_20_0= ruleUiEmbeddable ) ) (otherlv_21= 'align' ( (lv_contentAlignment_22_0= ruleUiAlignment ) ) )? ( ( (lv_bindingEndpointAlias_23_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_24_0= ruleUiBinding ) ) | ( (lv_validatorAssignments_25_0= ruleUiValidatorAssignment ) ) | ( (lv_processorAssignments_26_0= ruleUiVisibilityProcessorAssignment ) ) )* otherlv_27= '}' ) )
+            // InternalUIGrammar.g:1860:2: (otherlv_0= 'ideview' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}' ) ) ) ) )* ) ) ) ( ( (lv_beanSlots_17_0= ruleUiBeanSlot ) ) | ( (lv_bindingEndpointAlias_18_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_19_0= ruleUiBinding ) ) )* ( (lv_content_20_0= ruleUiEmbeddable ) ) (otherlv_21= 'align' ( (lv_contentAlignment_22_0= ruleUiAlignment ) ) )? ( ( (lv_bindingEndpointAlias_23_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_24_0= ruleUiBinding ) ) | ( (lv_validatorAssignments_25_0= ruleUiValidatorAssignment ) ) | ( (lv_processorAssignments_26_0= ruleUiVisibilityProcessorAssignment ) ) )* otherlv_27= '}' )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1887:1: (otherlv_0= 'ideview' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}' ) ) ) ) )* ) ) ) ( ( (lv_beanSlots_17_0= ruleUiBeanSlot ) ) | ( (lv_bindingEndpointAlias_18_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_19_0= ruleUiBinding ) ) )* ( (lv_content_20_0= ruleUiEmbeddable ) ) (otherlv_21= 'align' ( (lv_contentAlignment_22_0= ruleUiAlignment ) ) )? ( ( (lv_bindingEndpointAlias_23_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_24_0= ruleUiBinding ) ) | ( (lv_validatorAssignments_25_0= ruleUiValidatorAssignment ) ) | ( (lv_processorAssignments_26_0= ruleUiVisibilityProcessorAssignment ) ) )* otherlv_27= '}' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1887:3: otherlv_0= 'ideview' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}' ) ) ) ) )* ) ) ) ( ( (lv_beanSlots_17_0= ruleUiBeanSlot ) ) | ( (lv_bindingEndpointAlias_18_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_19_0= ruleUiBinding ) ) )* ( (lv_content_20_0= ruleUiEmbeddable ) ) (otherlv_21= 'align' ( (lv_contentAlignment_22_0= ruleUiAlignment ) ) )? ( ( (lv_bindingEndpointAlias_23_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_24_0= ruleUiBinding ) ) | ( (lv_validatorAssignments_25_0= ruleUiValidatorAssignment ) ) | ( (lv_processorAssignments_26_0= ruleUiVisibilityProcessorAssignment ) ) )* otherlv_27= '}'
+            // InternalUIGrammar.g:1860:2: (otherlv_0= 'ideview' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}' ) ) ) ) )* ) ) ) ( ( (lv_beanSlots_17_0= ruleUiBeanSlot ) ) | ( (lv_bindingEndpointAlias_18_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_19_0= ruleUiBinding ) ) )* ( (lv_content_20_0= ruleUiEmbeddable ) ) (otherlv_21= 'align' ( (lv_contentAlignment_22_0= ruleUiAlignment ) ) )? ( ( (lv_bindingEndpointAlias_23_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_24_0= ruleUiBinding ) ) | ( (lv_validatorAssignments_25_0= ruleUiValidatorAssignment ) ) | ( (lv_processorAssignments_26_0= ruleUiVisibilityProcessorAssignment ) ) )* otherlv_27= '}' )
+            // InternalUIGrammar.g:1861:3: otherlv_0= 'ideview' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}' ) ) ) ) )* ) ) ) ( ( (lv_beanSlots_17_0= ruleUiBeanSlot ) ) | ( (lv_bindingEndpointAlias_18_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_19_0= ruleUiBinding ) ) )* ( (lv_content_20_0= ruleUiEmbeddable ) ) (otherlv_21= 'align' ( (lv_contentAlignment_22_0= ruleUiAlignment ) ) )? ( ( (lv_bindingEndpointAlias_23_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_24_0= ruleUiBinding ) ) | ( (lv_validatorAssignments_25_0= ruleUiValidatorAssignment ) ) | ( (lv_processorAssignments_26_0= ruleUiVisibilityProcessorAssignment ) ) )* otherlv_27= '}'
             {
-            otherlv_0=(Token)match(input,49,FollowSets000.FOLLOW_49_in_ruleUiIDEView4226); if (state.failed) return current;
+            otherlv_0=(Token)match(input,48,FOLLOW_3); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getUiIDEViewAccess().getIdeviewKeyword_0());
-                  
-            }
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1891:1: ( (lv_name_1_0= RULE_ID ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1892:1: (lv_name_1_0= RULE_ID )
-            {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1892:1: (lv_name_1_0= RULE_ID )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1893:3: lv_name_1_0= RULE_ID
-            {
-            lv_name_1_0=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_RULE_ID_in_ruleUiIDEView4243); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-              			newLeafNode(lv_name_1_0, grammarAccess.getUiIDEViewAccess().getNameIDTerminalRuleCall_1_0()); 
+              			newLeafNode(otherlv_0, grammarAccess.getUiIDEViewAccess().getIdeviewKeyword_0());
               		
             }
-            if ( state.backtracking==0 ) {
-
-              	        if (current==null) {
-              	            current = createModelElement(grammarAccess.getUiIDEViewRule());
-              	        }
-                     		setWithLastConsumed(
-                     			current, 
-                     			"name",
-                      		lv_name_1_0, 
-                      		"ID");
-              	    
-            }
-
-            }
-
-
-            }
-
-            otherlv_2=(Token)match(input,21,FollowSets000.FOLLOW_21_in_ruleUiIDEView4260); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-                  	newLeafNode(otherlv_2, grammarAccess.getUiIDEViewAccess().getLeftCurlyBracketKeyword_2());
-                  
-            }
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1913:1: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}' ) ) ) ) )* ) ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1915:1: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}' ) ) ) ) )* ) )
+            // InternalUIGrammar.g:1865:3: ( (lv_name_1_0= RULE_ID ) )
+            // InternalUIGrammar.g:1866:4: (lv_name_1_0= RULE_ID )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1915:1: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}' ) ) ) ) )* ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1916:2: ( ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}' ) ) ) ) )* )
+            // InternalUIGrammar.g:1866:4: (lv_name_1_0= RULE_ID )
+            // InternalUIGrammar.g:1867:5: lv_name_1_0= RULE_ID
+            {
+            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_11); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_name_1_0, grammarAccess.getUiIDEViewAccess().getNameIDTerminalRuleCall_1_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getUiIDEViewRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"name",
+              						lv_name_1_0,
+              						"org.eclipse.xtext.xbase.Xtype.ID");
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,20,FOLLOW_37); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getUiIDEViewAccess().getLeftCurlyBracketKeyword_2());
+              		
+            }
+            // InternalUIGrammar.g:1887:3: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}' ) ) ) ) )* ) ) )
+            // InternalUIGrammar.g:1888:4: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}' ) ) ) ) )* ) )
+            {
+            // InternalUIGrammar.g:1888:4: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}' ) ) ) ) )* ) )
+            // InternalUIGrammar.g:1889:5: ( ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}' ) ) ) ) )* )
             {
             getUnorderedGroupHelper().enter(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3());
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1919:2: ( ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}' ) ) ) ) )* )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1920:3: ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}' ) ) ) ) )*
+            // InternalUIGrammar.g:1892:5: ( ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}' ) ) ) ) )* )
+            // InternalUIGrammar.g:1893:6: ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}' ) ) ) ) )*
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1920:3: ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}' ) ) ) ) )*
-            loop34:
+            // InternalUIGrammar.g:1893:6: ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}' ) ) ) ) )*
+            loop33:
             do {
-                int alt34=5;
-                int LA34_0 = input.LA(1);
+                int alt33=5;
+                int LA33_0 = input.LA(1);
 
-                if ( LA34_0 ==50 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 0) ) {
-                    alt34=1;
+                if ( LA33_0 == 49 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 0) ) {
+                    alt33=1;
                 }
-                else if ( LA34_0 ==51 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 1) ) {
-                    alt34=2;
+                else if ( LA33_0 == 50 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 1) ) {
+                    alt33=2;
                 }
-                else if ( LA34_0 ==52 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 2) ) {
-                    alt34=3;
+                else if ( LA33_0 == 51 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 2) ) {
+                    alt33=3;
                 }
-                else if ( LA34_0 ==53 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 3) ) {
-                    alt34=4;
+                else if ( LA33_0 == 52 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 3) ) {
+                    alt33=4;
                 }
 
 
-                switch (alt34) {
+                switch (alt33) {
             	case 1 :
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1922:4: ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) )
+            	    // InternalUIGrammar.g:1894:4: ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) )
             	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1922:4: ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1923:5: {...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) )
+            	    // InternalUIGrammar.g:1894:4: ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) )
+            	    // InternalUIGrammar.g:1895:5: {...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) )
             	    {
             	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 0) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "ruleUiIDEView", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 0)");
             	    }
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1923:106: ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1924:6: ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) )
+            	    // InternalUIGrammar.g:1895:106: ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) )
+            	    // InternalUIGrammar.g:1896:6: ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) )
             	    {
             	    getUnorderedGroupHelper().select(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 0);
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1927:6: ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1927:7: {...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? )
+            	    // InternalUIGrammar.g:1899:9: ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) )
+            	    // InternalUIGrammar.g:1899:10: {...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? )
             	    {
             	    if ( !((true)) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "ruleUiIDEView", "true");
             	    }
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1927:16: (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1927:18: otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )?
+            	    // InternalUIGrammar.g:1899:19: (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? )
+            	    // InternalUIGrammar.g:1899:20: otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )?
             	    {
-            	    otherlv_4=(Token)match(input,50,FollowSets000.FOLLOW_50_in_ruleUiIDEView4318); if (state.failed) return current;
+            	    otherlv_4=(Token)match(input,49,FOLLOW_18); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	          	newLeafNode(otherlv_4, grammarAccess.getUiIDEViewAccess().getSharedStateGroupKeyword_3_0_0());
-            	          
+            	      									newLeafNode(otherlv_4, grammarAccess.getUiIDEViewAccess().getSharedStateGroupKeyword_3_0_0());
+            	      								
             	    }
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1931:1: ( (lv_sharedStateGroup_5_0= RULE_STRING ) )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1932:1: (lv_sharedStateGroup_5_0= RULE_STRING )
+            	    // InternalUIGrammar.g:1903:9: ( (lv_sharedStateGroup_5_0= RULE_STRING ) )
+            	    // InternalUIGrammar.g:1904:10: (lv_sharedStateGroup_5_0= RULE_STRING )
             	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1932:1: (lv_sharedStateGroup_5_0= RULE_STRING )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1933:3: lv_sharedStateGroup_5_0= RULE_STRING
+            	    // InternalUIGrammar.g:1904:10: (lv_sharedStateGroup_5_0= RULE_STRING )
+            	    // InternalUIGrammar.g:1905:11: lv_sharedStateGroup_5_0= RULE_STRING
             	    {
-            	    lv_sharedStateGroup_5_0=(Token)match(input,RULE_STRING,FollowSets000.FOLLOW_RULE_STRING_in_ruleUiIDEView4335); if (state.failed) return current;
+            	    lv_sharedStateGroup_5_0=(Token)match(input,RULE_STRING,FOLLOW_38); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      			newLeafNode(lv_sharedStateGroup_5_0, grammarAccess.getUiIDEViewAccess().getSharedStateGroupSTRINGTerminalRuleCall_3_0_1_0()); 
-            	      		
+            	      											newLeafNode(lv_sharedStateGroup_5_0, grammarAccess.getUiIDEViewAccess().getSharedStateGroupSTRINGTerminalRuleCall_3_0_1_0());
+            	      										
             	    }
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElement(grammarAccess.getUiIDEViewRule());
-            	      	        }
-            	             		setWithLastConsumed(
-            	             			current, 
-            	             			"sharedStateGroup",
-            	              		lv_sharedStateGroup_5_0, 
-            	              		"STRING");
-            	      	    
+            	      											if (current==null) {
+            	      												current = createModelElement(grammarAccess.getUiIDEViewRule());
+            	      											}
+            	      											setWithLastConsumed(
+            	      												current,
+            	      												"sharedStateGroup",
+            	      												lv_sharedStateGroup_5_0,
+            	      												"org.eclipse.xtext.xbase.Xtype.STRING");
+            	      										
             	    }
 
             	    }
@@ -5648,22 +5612,22 @@
 
             	    }
 
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1949:2: (otherlv_6= ';' )?
-            	    int alt30=2;
-            	    int LA30_0 = input.LA(1);
+            	    // InternalUIGrammar.g:1921:9: (otherlv_6= ';' )?
+            	    int alt29=2;
+            	    int LA29_0 = input.LA(1);
 
-            	    if ( (LA30_0==15) ) {
-            	        alt30=1;
+            	    if ( (LA29_0==16) ) {
+            	        alt29=1;
             	    }
-            	    switch (alt30) {
+            	    switch (alt29) {
             	        case 1 :
-            	            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1949:4: otherlv_6= ';'
+            	            // InternalUIGrammar.g:1922:10: otherlv_6= ';'
             	            {
-            	            otherlv_6=(Token)match(input,15,FollowSets000.FOLLOW_15_in_ruleUiIDEView4353); if (state.failed) return current;
+            	            otherlv_6=(Token)match(input,16,FOLLOW_37); if (state.failed) return current;
             	            if ( state.backtracking==0 ) {
 
-            	                  	newLeafNode(otherlv_6, grammarAccess.getUiIDEViewAccess().getSemicolonKeyword_3_0_2());
-            	                  
+            	              										newLeafNode(otherlv_6, grammarAccess.getUiIDEViewAccess().getSemicolonKeyword_3_0_2());
+            	              									
             	            }
 
             	            }
@@ -5688,62 +5652,62 @@
             	    }
             	    break;
             	case 2 :
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1960:4: ({...}? => ( ({...}? => (otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )? ) ) ) )
+            	    // InternalUIGrammar.g:1933:4: ({...}? => ( ({...}? => (otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )? ) ) ) )
             	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1960:4: ({...}? => ( ({...}? => (otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )? ) ) ) )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1961:5: {...}? => ( ({...}? => (otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )? ) ) )
+            	    // InternalUIGrammar.g:1933:4: ({...}? => ( ({...}? => (otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )? ) ) ) )
+            	    // InternalUIGrammar.g:1934:5: {...}? => ( ({...}? => (otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )? ) ) )
             	    {
             	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 1) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "ruleUiIDEView", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 1)");
             	    }
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1961:106: ( ({...}? => (otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )? ) ) )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1962:6: ({...}? => (otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )? ) )
+            	    // InternalUIGrammar.g:1934:106: ( ({...}? => (otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )? ) ) )
+            	    // InternalUIGrammar.g:1935:6: ({...}? => (otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )? ) )
             	    {
             	    getUnorderedGroupHelper().select(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 1);
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1965:6: ({...}? => (otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )? ) )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1965:7: {...}? => (otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )? )
+            	    // InternalUIGrammar.g:1938:9: ({...}? => (otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )? ) )
+            	    // InternalUIGrammar.g:1938:10: {...}? => (otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )? )
             	    {
             	    if ( !((true)) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "ruleUiIDEView", "true");
             	    }
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1965:16: (otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )? )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1965:18: otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )?
+            	    // InternalUIGrammar.g:1938:19: (otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )? )
+            	    // InternalUIGrammar.g:1938:20: otherlv_7= 'category' ( ( ruleQualifiedName ) ) (otherlv_9= ';' )?
             	    {
-            	    otherlv_7=(Token)match(input,51,FollowSets000.FOLLOW_51_in_ruleUiIDEView4423); if (state.failed) return current;
+            	    otherlv_7=(Token)match(input,50,FOLLOW_3); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	          	newLeafNode(otherlv_7, grammarAccess.getUiIDEViewAccess().getCategoryKeyword_3_1_0());
-            	          
+            	      									newLeafNode(otherlv_7, grammarAccess.getUiIDEViewAccess().getCategoryKeyword_3_1_0());
+            	      								
             	    }
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1969:1: ( ( ruleQualifiedName ) )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1970:1: ( ruleQualifiedName )
+            	    // InternalUIGrammar.g:1942:9: ( ( ruleQualifiedName ) )
+            	    // InternalUIGrammar.g:1943:10: ( ruleQualifiedName )
             	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1970:1: ( ruleQualifiedName )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1971:3: ruleQualifiedName
+            	    // InternalUIGrammar.g:1943:10: ( ruleQualifiedName )
+            	    // InternalUIGrammar.g:1944:11: ruleQualifiedName
             	    {
             	    if ( state.backtracking==0 ) {
 
-            	      			if (current==null) {
-            	      	            current = createModelElement(grammarAccess.getUiIDEViewRule());
-            	      	        }
-            	              
+            	      											if (current==null) {
+            	      												current = createModelElement(grammarAccess.getUiIDEViewRule());
+            	      											}
+            	      										
             	    }
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getUiIDEViewAccess().getViewCategoryUxViewCategoryCrossReference_3_1_1_0()); 
-            	      	    
+
+            	      											newCompositeNode(grammarAccess.getUiIDEViewAccess().getViewCategoryUxViewCategoryCrossReference_3_1_1_0());
+            	      										
             	    }
-            	    pushFollow(FollowSets000.FOLLOW_ruleQualifiedName_in_ruleUiIDEView4446);
+            	    pushFollow(FOLLOW_38);
             	    ruleQualifiedName();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+
+            	      											afterParserOrEnumRuleCall();
+            	      										
             	    }
 
             	    }
@@ -5751,22 +5715,22 @@
 
             	    }
 
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1984:2: (otherlv_9= ';' )?
-            	    int alt31=2;
-            	    int LA31_0 = input.LA(1);
+            	    // InternalUIGrammar.g:1958:9: (otherlv_9= ';' )?
+            	    int alt30=2;
+            	    int LA30_0 = input.LA(1);
 
-            	    if ( (LA31_0==15) ) {
-            	        alt31=1;
+            	    if ( (LA30_0==16) ) {
+            	        alt30=1;
             	    }
-            	    switch (alt31) {
+            	    switch (alt30) {
             	        case 1 :
-            	            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1984:4: otherlv_9= ';'
+            	            // InternalUIGrammar.g:1959:10: otherlv_9= ';'
             	            {
-            	            otherlv_9=(Token)match(input,15,FollowSets000.FOLLOW_15_in_ruleUiIDEView4459); if (state.failed) return current;
+            	            otherlv_9=(Token)match(input,16,FOLLOW_37); if (state.failed) return current;
             	            if ( state.backtracking==0 ) {
 
-            	                  	newLeafNode(otherlv_9, grammarAccess.getUiIDEViewAccess().getSemicolonKeyword_3_1_2());
-            	                  
+            	              										newLeafNode(otherlv_9, grammarAccess.getUiIDEViewAccess().getSemicolonKeyword_3_1_2());
+            	              									
             	            }
 
             	            }
@@ -5791,63 +5755,63 @@
             	    }
             	    break;
             	case 3 :
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1995:4: ({...}? => ( ({...}? => (otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ) ) ) )
+            	    // InternalUIGrammar.g:1970:4: ({...}? => ( ({...}? => (otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ) ) ) )
             	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1995:4: ({...}? => ( ({...}? => (otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ) ) ) )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1996:5: {...}? => ( ({...}? => (otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ) ) )
+            	    // InternalUIGrammar.g:1970:4: ({...}? => ( ({...}? => (otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ) ) ) )
+            	    // InternalUIGrammar.g:1971:5: {...}? => ( ({...}? => (otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ) ) )
             	    {
             	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 2) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "ruleUiIDEView", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 2)");
             	    }
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1996:106: ( ({...}? => (otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ) ) )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:1997:6: ({...}? => (otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ) )
+            	    // InternalUIGrammar.g:1971:106: ( ({...}? => (otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ) ) )
+            	    // InternalUIGrammar.g:1972:6: ({...}? => (otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ) )
             	    {
             	    getUnorderedGroupHelper().select(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 2);
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2000:6: ({...}? => (otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ) )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2000:7: {...}? => (otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? )
+            	    // InternalUIGrammar.g:1975:9: ({...}? => (otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ) )
+            	    // InternalUIGrammar.g:1975:10: {...}? => (otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? )
             	    {
             	    if ( !((true)) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "ruleUiIDEView", "true");
             	    }
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2000:16: (otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2000:18: otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )?
+            	    // InternalUIGrammar.g:1975:19: (otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? )
+            	    // InternalUIGrammar.g:1975:20: otherlv_10= 'rootType' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )?
             	    {
-            	    otherlv_10=(Token)match(input,52,FollowSets000.FOLLOW_52_in_ruleUiIDEView4529); if (state.failed) return current;
+            	    otherlv_10=(Token)match(input,51,FOLLOW_16); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	          	newLeafNode(otherlv_10, grammarAccess.getUiIDEViewAccess().getRootTypeKeyword_3_2_0());
-            	          
+            	      									newLeafNode(otherlv_10, grammarAccess.getUiIDEViewAccess().getRootTypeKeyword_3_2_0());
+            	      								
             	    }
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2004:1: ( (lv_jvmType_11_0= ruleJvmTypeReference ) )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2005:1: (lv_jvmType_11_0= ruleJvmTypeReference )
+            	    // InternalUIGrammar.g:1979:9: ( (lv_jvmType_11_0= ruleJvmTypeReference ) )
+            	    // InternalUIGrammar.g:1980:10: (lv_jvmType_11_0= ruleJvmTypeReference )
             	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2005:1: (lv_jvmType_11_0= ruleJvmTypeReference )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2006:3: lv_jvmType_11_0= ruleJvmTypeReference
+            	    // InternalUIGrammar.g:1980:10: (lv_jvmType_11_0= ruleJvmTypeReference )
+            	    // InternalUIGrammar.g:1981:11: lv_jvmType_11_0= ruleJvmTypeReference
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getUiIDEViewAccess().getJvmTypeJvmTypeReferenceParserRuleCall_3_2_1_0()); 
-            	      	    
+
+            	      											newCompositeNode(grammarAccess.getUiIDEViewAccess().getJvmTypeJvmTypeReferenceParserRuleCall_3_2_1_0());
+            	      										
             	    }
-            	    pushFollow(FollowSets000.FOLLOW_ruleJvmTypeReference_in_ruleUiIDEView4550);
+            	    pushFollow(FOLLOW_38);
             	    lv_jvmType_11_0=ruleJvmTypeReference();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
-            	      	        }
-            	             		set(
-            	             			current, 
-            	             			"jvmType",
-            	              		lv_jvmType_11_0, 
-            	              		"JvmTypeReference");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      											if (current==null) {
+            	      												current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
+            	      											}
+            	      											set(
+            	      												current,
+            	      												"jvmType",
+            	      												lv_jvmType_11_0,
+            	      												"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+            	      											afterParserOrEnumRuleCall();
+            	      										
             	    }
 
             	    }
@@ -5855,22 +5819,22 @@
 
             	    }
 
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2022:2: (otherlv_12= ';' )?
-            	    int alt32=2;
-            	    int LA32_0 = input.LA(1);
+            	    // InternalUIGrammar.g:1998:9: (otherlv_12= ';' )?
+            	    int alt31=2;
+            	    int LA31_0 = input.LA(1);
 
-            	    if ( (LA32_0==15) ) {
-            	        alt32=1;
+            	    if ( (LA31_0==16) ) {
+            	        alt31=1;
             	    }
-            	    switch (alt32) {
+            	    switch (alt31) {
             	        case 1 :
-            	            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2022:4: otherlv_12= ';'
+            	            // InternalUIGrammar.g:1999:10: otherlv_12= ';'
             	            {
-            	            otherlv_12=(Token)match(input,15,FollowSets000.FOLLOW_15_in_ruleUiIDEView4563); if (state.failed) return current;
+            	            otherlv_12=(Token)match(input,16,FOLLOW_37); if (state.failed) return current;
             	            if ( state.backtracking==0 ) {
 
-            	                  	newLeafNode(otherlv_12, grammarAccess.getUiIDEViewAccess().getSemicolonKeyword_3_2_2());
-            	                  
+            	              										newLeafNode(otherlv_12, grammarAccess.getUiIDEViewAccess().getSemicolonKeyword_3_2_2());
+            	              									
             	            }
 
             	            }
@@ -5895,81 +5859,81 @@
             	    }
             	    break;
             	case 4 :
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2033:4: ({...}? => ( ({...}? => (otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}' ) ) ) )
+            	    // InternalUIGrammar.g:2010:4: ({...}? => ( ({...}? => (otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}' ) ) ) )
             	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2033:4: ({...}? => ( ({...}? => (otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}' ) ) ) )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2034:5: {...}? => ( ({...}? => (otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}' ) ) )
+            	    // InternalUIGrammar.g:2010:4: ({...}? => ( ({...}? => (otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}' ) ) ) )
+            	    // InternalUIGrammar.g:2011:5: {...}? => ( ({...}? => (otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}' ) ) )
             	    {
             	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 3) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "ruleUiIDEView", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 3)");
             	    }
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2034:106: ( ({...}? => (otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}' ) ) )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2035:6: ({...}? => (otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}' ) )
+            	    // InternalUIGrammar.g:2011:106: ( ({...}? => (otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}' ) ) )
+            	    // InternalUIGrammar.g:2012:6: ({...}? => (otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}' ) )
             	    {
             	    getUnorderedGroupHelper().select(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 3);
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2038:6: ({...}? => (otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}' ) )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2038:7: {...}? => (otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}' )
+            	    // InternalUIGrammar.g:2015:9: ({...}? => (otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}' ) )
+            	    // InternalUIGrammar.g:2015:10: {...}? => (otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}' )
             	    {
             	    if ( !((true)) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "ruleUiIDEView", "true");
             	    }
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2038:16: (otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}' )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2038:18: otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}'
+            	    // InternalUIGrammar.g:2015:19: (otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}' )
+            	    // InternalUIGrammar.g:2015:20: otherlv_13= 'exposedActions' otherlv_14= '{' ( (lv_exposedActions_15_0= ruleUiExposedAction ) )* otherlv_16= '}'
             	    {
-            	    otherlv_13=(Token)match(input,53,FollowSets000.FOLLOW_53_in_ruleUiIDEView4633); if (state.failed) return current;
+            	    otherlv_13=(Token)match(input,52,FOLLOW_11); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	          	newLeafNode(otherlv_13, grammarAccess.getUiIDEViewAccess().getExposedActionsKeyword_3_3_0());
-            	          
+            	      									newLeafNode(otherlv_13, grammarAccess.getUiIDEViewAccess().getExposedActionsKeyword_3_3_0());
+            	      								
             	    }
-            	    otherlv_14=(Token)match(input,21,FollowSets000.FOLLOW_21_in_ruleUiIDEView4645); if (state.failed) return current;
+            	    otherlv_14=(Token)match(input,20,FOLLOW_39); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	          	newLeafNode(otherlv_14, grammarAccess.getUiIDEViewAccess().getLeftCurlyBracketKeyword_3_3_1());
-            	          
+            	      									newLeafNode(otherlv_14, grammarAccess.getUiIDEViewAccess().getLeftCurlyBracketKeyword_3_3_1());
+            	      								
             	    }
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2046:1: ( (lv_exposedActions_15_0= ruleUiExposedAction ) )*
-            	    loop33:
+            	    // InternalUIGrammar.g:2023:9: ( (lv_exposedActions_15_0= ruleUiExposedAction ) )*
+            	    loop32:
             	    do {
-            	        int alt33=2;
-            	        int LA33_0 = input.LA(1);
+            	        int alt32=2;
+            	        int LA32_0 = input.LA(1);
 
-            	        if ( (LA33_0==RULE_ID) ) {
-            	            alt33=1;
+            	        if ( (LA32_0==RULE_ID) ) {
+            	            alt32=1;
             	        }
 
 
-            	        switch (alt33) {
+            	        switch (alt32) {
             	    	case 1 :
-            	    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2047:1: (lv_exposedActions_15_0= ruleUiExposedAction )
+            	    	    // InternalUIGrammar.g:2024:10: (lv_exposedActions_15_0= ruleUiExposedAction )
             	    	    {
-            	    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2047:1: (lv_exposedActions_15_0= ruleUiExposedAction )
-            	    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2048:3: lv_exposedActions_15_0= ruleUiExposedAction
+            	    	    // InternalUIGrammar.g:2024:10: (lv_exposedActions_15_0= ruleUiExposedAction )
+            	    	    // InternalUIGrammar.g:2025:11: lv_exposedActions_15_0= ruleUiExposedAction
             	    	    {
             	    	    if ( state.backtracking==0 ) {
-            	    	       
-            	    	      	        newCompositeNode(grammarAccess.getUiIDEViewAccess().getExposedActionsUiExposedActionParserRuleCall_3_3_2_0()); 
-            	    	      	    
+
+            	    	      											newCompositeNode(grammarAccess.getUiIDEViewAccess().getExposedActionsUiExposedActionParserRuleCall_3_3_2_0());
+            	    	      										
             	    	    }
-            	    	    pushFollow(FollowSets000.FOLLOW_ruleUiExposedAction_in_ruleUiIDEView4666);
+            	    	    pushFollow(FOLLOW_39);
             	    	    lv_exposedActions_15_0=ruleUiExposedAction();
 
             	    	    state._fsp--;
             	    	    if (state.failed) return current;
             	    	    if ( state.backtracking==0 ) {
 
-            	    	      	        if (current==null) {
-            	    	      	            current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
-            	    	      	        }
-            	    	             		add(
-            	    	             			current, 
-            	    	             			"exposedActions",
-            	    	              		lv_exposedActions_15_0, 
-            	    	              		"UiExposedAction");
-            	    	      	        afterParserOrEnumRuleCall();
-            	    	      	    
+            	    	      											if (current==null) {
+            	    	      												current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
+            	    	      											}
+            	    	      											add(
+            	    	      												current,
+            	    	      												"exposedActions",
+            	    	      												lv_exposedActions_15_0,
+            	    	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiExposedAction");
+            	    	      											afterParserOrEnumRuleCall();
+            	    	      										
             	    	    }
 
             	    	    }
@@ -5979,15 +5943,15 @@
             	    	    break;
 
             	    	default :
-            	    	    break loop33;
+            	    	    break loop32;
             	        }
             	    } while (true);
 
-            	    otherlv_16=(Token)match(input,22,FollowSets000.FOLLOW_22_in_ruleUiIDEView4679); if (state.failed) return current;
+            	    otherlv_16=(Token)match(input,21,FOLLOW_37); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	          	newLeafNode(otherlv_16, grammarAccess.getUiIDEViewAccess().getRightCurlyBracketKeyword_3_3_3());
-            	          
+            	      									newLeafNode(otherlv_16, grammarAccess.getUiIDEViewAccess().getRightCurlyBracketKeyword_3_3_3());
+            	      								
             	    }
 
             	    }
@@ -6007,75 +5971,326 @@
             	    break;
 
             	default :
+            	    break loop33;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            getUnorderedGroupHelper().leave(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3());
+
+            }
+
+            // InternalUIGrammar.g:2059:3: ( ( (lv_beanSlots_17_0= ruleUiBeanSlot ) ) | ( (lv_bindingEndpointAlias_18_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_19_0= ruleUiBinding ) ) )*
+            loop34:
+            do {
+                int alt34=4;
+                switch ( input.LA(1) ) {
+                case 23:
+                    {
+                    alt34=1;
+                    }
+                    break;
+                case 22:
+                    {
+                    alt34=2;
+                    }
+                    break;
+                case 26:
+                    {
+                    alt34=3;
+                    }
+                    break;
+
+                }
+
+                switch (alt34) {
+            	case 1 :
+            	    // InternalUIGrammar.g:2060:4: ( (lv_beanSlots_17_0= ruleUiBeanSlot ) )
+            	    {
+            	    // InternalUIGrammar.g:2060:4: ( (lv_beanSlots_17_0= ruleUiBeanSlot ) )
+            	    // InternalUIGrammar.g:2061:5: (lv_beanSlots_17_0= ruleUiBeanSlot )
+            	    {
+            	    // InternalUIGrammar.g:2061:5: (lv_beanSlots_17_0= ruleUiBeanSlot )
+            	    // InternalUIGrammar.g:2062:6: lv_beanSlots_17_0= ruleUiBeanSlot
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getUiIDEViewAccess().getBeanSlotsUiBeanSlotParserRuleCall_4_0_0());
+            	      					
+            	    }
+            	    pushFollow(FOLLOW_37);
+            	    lv_beanSlots_17_0=ruleUiBeanSlot();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"beanSlots",
+            	      							lv_beanSlots_17_0,
+            	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBeanSlot");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // InternalUIGrammar.g:2080:4: ( (lv_bindingEndpointAlias_18_0= ruleUiBindingEndpointAlias ) )
+            	    {
+            	    // InternalUIGrammar.g:2080:4: ( (lv_bindingEndpointAlias_18_0= ruleUiBindingEndpointAlias ) )
+            	    // InternalUIGrammar.g:2081:5: (lv_bindingEndpointAlias_18_0= ruleUiBindingEndpointAlias )
+            	    {
+            	    // InternalUIGrammar.g:2081:5: (lv_bindingEndpointAlias_18_0= ruleUiBindingEndpointAlias )
+            	    // InternalUIGrammar.g:2082:6: lv_bindingEndpointAlias_18_0= ruleUiBindingEndpointAlias
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getUiIDEViewAccess().getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_4_1_0());
+            	      					
+            	    }
+            	    pushFollow(FOLLOW_37);
+            	    lv_bindingEndpointAlias_18_0=ruleUiBindingEndpointAlias();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"bindingEndpointAlias",
+            	      							lv_bindingEndpointAlias_18_0,
+            	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAlias");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 3 :
+            	    // InternalUIGrammar.g:2100:4: ( (lv_bindings_19_0= ruleUiBinding ) )
+            	    {
+            	    // InternalUIGrammar.g:2100:4: ( (lv_bindings_19_0= ruleUiBinding ) )
+            	    // InternalUIGrammar.g:2101:5: (lv_bindings_19_0= ruleUiBinding )
+            	    {
+            	    // InternalUIGrammar.g:2101:5: (lv_bindings_19_0= ruleUiBinding )
+            	    // InternalUIGrammar.g:2102:6: lv_bindings_19_0= ruleUiBinding
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getUiIDEViewAccess().getBindingsUiBindingParserRuleCall_4_2_0());
+            	      					
+            	    }
+            	    pushFollow(FOLLOW_37);
+            	    lv_bindings_19_0=ruleUiBinding();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"bindings",
+            	      							lv_bindings_19_0,
+            	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
             	    break loop34;
                 }
             } while (true);
 
+            // InternalUIGrammar.g:2120:3: ( (lv_content_20_0= ruleUiEmbeddable ) )
+            // InternalUIGrammar.g:2121:4: (lv_content_20_0= ruleUiEmbeddable )
+            {
+            // InternalUIGrammar.g:2121:4: (lv_content_20_0= ruleUiEmbeddable )
+            // InternalUIGrammar.g:2122:5: lv_content_20_0= ruleUiEmbeddable
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getUiIDEViewAccess().getContentUiEmbeddableParserRuleCall_5_0());
+              				
+            }
+            pushFollow(FOLLOW_40);
+            lv_content_20_0=ruleUiEmbeddable();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
+              					}
+              					set(
+              						current,
+              						"content",
+              						lv_content_20_0,
+              						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiEmbeddable");
+              					afterParserOrEnumRuleCall();
+              				
+            }
 
             }
 
 
             }
 
-            getUnorderedGroupHelper().leave(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3());
+            // InternalUIGrammar.g:2139:3: (otherlv_21= 'align' ( (lv_contentAlignment_22_0= ruleUiAlignment ) ) )?
+            int alt35=2;
+            int LA35_0 = input.LA(1);
+
+            if ( (LA35_0==53) ) {
+                alt35=1;
+            }
+            switch (alt35) {
+                case 1 :
+                    // InternalUIGrammar.g:2140:4: otherlv_21= 'align' ( (lv_contentAlignment_22_0= ruleUiAlignment ) )
+                    {
+                    otherlv_21=(Token)match(input,53,FOLLOW_41); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_21, grammarAccess.getUiIDEViewAccess().getAlignKeyword_6_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:2144:4: ( (lv_contentAlignment_22_0= ruleUiAlignment ) )
+                    // InternalUIGrammar.g:2145:5: (lv_contentAlignment_22_0= ruleUiAlignment )
+                    {
+                    // InternalUIGrammar.g:2145:5: (lv_contentAlignment_22_0= ruleUiAlignment )
+                    // InternalUIGrammar.g:2146:6: lv_contentAlignment_22_0= ruleUiAlignment
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getUiIDEViewAccess().getContentAlignmentUiAlignmentEnumRuleCall_6_1_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_42);
+                    lv_contentAlignment_22_0=ruleUiAlignment();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
+                      						}
+                      						set(
+                      							current,
+                      							"contentAlignment",
+                      							lv_contentAlignment_22_0,
+                      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiAlignment");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
 
             }
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2082:2: ( ( (lv_beanSlots_17_0= ruleUiBeanSlot ) ) | ( (lv_bindingEndpointAlias_18_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_19_0= ruleUiBinding ) ) )*
-            loop35:
+            // InternalUIGrammar.g:2164:3: ( ( (lv_bindingEndpointAlias_23_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_24_0= ruleUiBinding ) ) | ( (lv_validatorAssignments_25_0= ruleUiValidatorAssignment ) ) | ( (lv_processorAssignments_26_0= ruleUiVisibilityProcessorAssignment ) ) )*
+            loop36:
             do {
-                int alt35=4;
+                int alt36=5;
                 switch ( input.LA(1) ) {
-                case 24:
+                case 22:
                     {
-                    alt35=1;
+                    alt36=1;
                     }
                     break;
-                case 23:
+                case 26:
                     {
-                    alt35=2;
+                    alt36=2;
                     }
                     break;
-                case 27:
+                case 17:
                     {
-                    alt35=3;
+                    alt36=3;
+                    }
+                    break;
+                case 153:
+                    {
+                    alt36=4;
                     }
                     break;
 
                 }
 
-                switch (alt35) {
+                switch (alt36) {
             	case 1 :
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2082:3: ( (lv_beanSlots_17_0= ruleUiBeanSlot ) )
+            	    // InternalUIGrammar.g:2165:4: ( (lv_bindingEndpointAlias_23_0= ruleUiBindingEndpointAlias ) )
             	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2082:3: ( (lv_beanSlots_17_0= ruleUiBeanSlot ) )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2083:1: (lv_beanSlots_17_0= ruleUiBeanSlot )
+            	    // InternalUIGrammar.g:2165:4: ( (lv_bindingEndpointAlias_23_0= ruleUiBindingEndpointAlias ) )
+            	    // InternalUIGrammar.g:2166:5: (lv_bindingEndpointAlias_23_0= ruleUiBindingEndpointAlias )
             	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2083:1: (lv_beanSlots_17_0= ruleUiBeanSlot )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2084:3: lv_beanSlots_17_0= ruleUiBeanSlot
+            	    // InternalUIGrammar.g:2166:5: (lv_bindingEndpointAlias_23_0= ruleUiBindingEndpointAlias )
+            	    // InternalUIGrammar.g:2167:6: lv_bindingEndpointAlias_23_0= ruleUiBindingEndpointAlias
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getUiIDEViewAccess().getBeanSlotsUiBeanSlotParserRuleCall_4_0_0()); 
-            	      	    
+
+            	      						newCompositeNode(grammarAccess.getUiIDEViewAccess().getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_7_0_0());
+            	      					
             	    }
-            	    pushFollow(FollowSets000.FOLLOW_ruleUiBeanSlot_in_ruleUiIDEView4742);
-            	    lv_beanSlots_17_0=ruleUiBeanSlot();
+            	    pushFollow(FOLLOW_42);
+            	    lv_bindingEndpointAlias_23_0=ruleUiBindingEndpointAlias();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"beanSlots",
-            	              		lv_beanSlots_17_0, 
-            	              		"UiBeanSlot");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"bindingEndpointAlias",
+            	      							lv_bindingEndpointAlias_23_0,
+            	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAlias");
+            	      						afterParserOrEnumRuleCall();
+            	      					
             	    }
 
             	    }
@@ -6087,36 +6302,36 @@
             	    }
             	    break;
             	case 2 :
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2101:6: ( (lv_bindingEndpointAlias_18_0= ruleUiBindingEndpointAlias ) )
+            	    // InternalUIGrammar.g:2185:4: ( (lv_bindings_24_0= ruleUiBinding ) )
             	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2101:6: ( (lv_bindingEndpointAlias_18_0= ruleUiBindingEndpointAlias ) )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2102:1: (lv_bindingEndpointAlias_18_0= ruleUiBindingEndpointAlias )
+            	    // InternalUIGrammar.g:2185:4: ( (lv_bindings_24_0= ruleUiBinding ) )
+            	    // InternalUIGrammar.g:2186:5: (lv_bindings_24_0= ruleUiBinding )
             	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2102:1: (lv_bindingEndpointAlias_18_0= ruleUiBindingEndpointAlias )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2103:3: lv_bindingEndpointAlias_18_0= ruleUiBindingEndpointAlias
+            	    // InternalUIGrammar.g:2186:5: (lv_bindings_24_0= ruleUiBinding )
+            	    // InternalUIGrammar.g:2187:6: lv_bindings_24_0= ruleUiBinding
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getUiIDEViewAccess().getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_4_1_0()); 
-            	      	    
+
+            	      						newCompositeNode(grammarAccess.getUiIDEViewAccess().getBindingsUiBindingParserRuleCall_7_1_0());
+            	      					
             	    }
-            	    pushFollow(FollowSets000.FOLLOW_ruleUiBindingEndpointAlias_in_ruleUiIDEView4769);
-            	    lv_bindingEndpointAlias_18_0=ruleUiBindingEndpointAlias();
+            	    pushFollow(FOLLOW_42);
+            	    lv_bindings_24_0=ruleUiBinding();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"bindingEndpointAlias",
-            	              		lv_bindingEndpointAlias_18_0, 
-            	              		"UiBindingEndpointAlias");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"bindings",
+            	      							lv_bindings_24_0,
+            	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+            	      						afterParserOrEnumRuleCall();
+            	      					
             	    }
 
             	    }
@@ -6128,36 +6343,77 @@
             	    }
             	    break;
             	case 3 :
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2120:6: ( (lv_bindings_19_0= ruleUiBinding ) )
+            	    // InternalUIGrammar.g:2205:4: ( (lv_validatorAssignments_25_0= ruleUiValidatorAssignment ) )
             	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2120:6: ( (lv_bindings_19_0= ruleUiBinding ) )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2121:1: (lv_bindings_19_0= ruleUiBinding )
+            	    // InternalUIGrammar.g:2205:4: ( (lv_validatorAssignments_25_0= ruleUiValidatorAssignment ) )
+            	    // InternalUIGrammar.g:2206:5: (lv_validatorAssignments_25_0= ruleUiValidatorAssignment )
             	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2121:1: (lv_bindings_19_0= ruleUiBinding )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2122:3: lv_bindings_19_0= ruleUiBinding
+            	    // InternalUIGrammar.g:2206:5: (lv_validatorAssignments_25_0= ruleUiValidatorAssignment )
+            	    // InternalUIGrammar.g:2207:6: lv_validatorAssignments_25_0= ruleUiValidatorAssignment
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getUiIDEViewAccess().getBindingsUiBindingParserRuleCall_4_2_0()); 
-            	      	    
+
+            	      						newCompositeNode(grammarAccess.getUiIDEViewAccess().getValidatorAssignmentsUiValidatorAssignmentParserRuleCall_7_2_0());
+            	      					
             	    }
-            	    pushFollow(FollowSets000.FOLLOW_ruleUiBinding_in_ruleUiIDEView4796);
-            	    lv_bindings_19_0=ruleUiBinding();
+            	    pushFollow(FOLLOW_42);
+            	    lv_validatorAssignments_25_0=ruleUiValidatorAssignment();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"bindings",
-            	              		lv_bindings_19_0, 
-            	              		"UiBinding");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"validatorAssignments",
+            	      							lv_validatorAssignments_25_0,
+            	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidatorAssignment");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 4 :
+            	    // InternalUIGrammar.g:2225:4: ( (lv_processorAssignments_26_0= ruleUiVisibilityProcessorAssignment ) )
+            	    {
+            	    // InternalUIGrammar.g:2225:4: ( (lv_processorAssignments_26_0= ruleUiVisibilityProcessorAssignment ) )
+            	    // InternalUIGrammar.g:2226:5: (lv_processorAssignments_26_0= ruleUiVisibilityProcessorAssignment )
+            	    {
+            	    // InternalUIGrammar.g:2226:5: (lv_processorAssignments_26_0= ruleUiVisibilityProcessorAssignment )
+            	    // InternalUIGrammar.g:2227:6: lv_processorAssignments_26_0= ruleUiVisibilityProcessorAssignment
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getUiIDEViewAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_3_0());
+            	      					
+            	    }
+            	    pushFollow(FOLLOW_42);
+            	    lv_processorAssignments_26_0=ruleUiVisibilityProcessorAssignment();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"processorAssignments",
+            	      							lv_processorAssignments_26_0,
+            	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+            	      						afterParserOrEnumRuleCall();
+            	      					
             	    }
 
             	    }
@@ -6170,38 +6426,198 @@
             	    break;
 
             	default :
-            	    break loop35;
+            	    break loop36;
                 }
             } while (true);
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2138:4: ( (lv_content_20_0= ruleUiEmbeddable ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2139:1: (lv_content_20_0= ruleUiEmbeddable )
-            {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2139:1: (lv_content_20_0= ruleUiEmbeddable )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2140:3: lv_content_20_0= ruleUiEmbeddable
+            otherlv_27=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_27, grammarAccess.getUiIDEViewAccess().getRightCurlyBracketKeyword_8());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiIDEView"
+
+
+    // $ANTLR start "entryRuleUiDisplayView"
+    // InternalUIGrammar.g:2253:1: entryRuleUiDisplayView returns [EObject current=null] : iv_ruleUiDisplayView= ruleUiDisplayView EOF ;
+    public final EObject entryRuleUiDisplayView() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiDisplayView = null;
+
+
+        try {
+            // InternalUIGrammar.g:2253:54: (iv_ruleUiDisplayView= ruleUiDisplayView EOF )
+            // InternalUIGrammar.g:2254:2: iv_ruleUiDisplayView= ruleUiDisplayView EOF
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getUiIDEViewAccess().getContentUiEmbeddableParserRuleCall_5_0()); 
-              	    
+               newCompositeNode(grammarAccess.getUiDisplayViewRule()); 
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiEmbeddable_in_ruleUiIDEView4819);
-            lv_content_20_0=ruleUiEmbeddable();
+            pushFollow(FOLLOW_1);
+            iv_ruleUiDisplayView=ruleUiDisplayView();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiDisplayView; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiDisplayView"
+
+
+    // $ANTLR start "ruleUiDisplayView"
+    // InternalUIGrammar.g:2260:1: ruleUiDisplayView returns [EObject current=null] : (otherlv_0= 'display' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' otherlv_3= 'rootType' ( (lv_jvmType_4_0= ruleJvmTypeReference ) ) ( ( (lv_beanSlots_5_0= ruleUiBeanSlot ) ) | ( (lv_bindingEndpointAlias_6_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_7_0= ruleUiBinding ) ) )* ( (lv_content_8_0= ruleUiEmbeddable ) ) (otherlv_9= 'align' ( (lv_contentAlignment_10_0= ruleUiAlignment ) ) )? ( ( (lv_bindingEndpointAlias_11_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) | ( (lv_validatorAssignments_13_0= ruleUiValidatorAssignment ) ) | ( (lv_processorAssignments_14_0= ruleUiVisibilityProcessorAssignment ) ) )* otherlv_15= '}' ) ;
+    public final EObject ruleUiDisplayView() 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_9=null;
+        Token otherlv_15=null;
+        EObject lv_jvmType_4_0 = null;
+
+        EObject lv_beanSlots_5_0 = null;
+
+        EObject lv_bindingEndpointAlias_6_0 = null;
+
+        EObject lv_bindings_7_0 = null;
+
+        EObject lv_content_8_0 = null;
+
+        Enumerator lv_contentAlignment_10_0 = null;
+
+        EObject lv_bindingEndpointAlias_11_0 = null;
+
+        EObject lv_bindings_12_0 = null;
+
+        EObject lv_validatorAssignments_13_0 = null;
+
+        EObject lv_processorAssignments_14_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:2266:2: ( (otherlv_0= 'display' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' otherlv_3= 'rootType' ( (lv_jvmType_4_0= ruleJvmTypeReference ) ) ( ( (lv_beanSlots_5_0= ruleUiBeanSlot ) ) | ( (lv_bindingEndpointAlias_6_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_7_0= ruleUiBinding ) ) )* ( (lv_content_8_0= ruleUiEmbeddable ) ) (otherlv_9= 'align' ( (lv_contentAlignment_10_0= ruleUiAlignment ) ) )? ( ( (lv_bindingEndpointAlias_11_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) | ( (lv_validatorAssignments_13_0= ruleUiValidatorAssignment ) ) | ( (lv_processorAssignments_14_0= ruleUiVisibilityProcessorAssignment ) ) )* otherlv_15= '}' ) )
+            // InternalUIGrammar.g:2267:2: (otherlv_0= 'display' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' otherlv_3= 'rootType' ( (lv_jvmType_4_0= ruleJvmTypeReference ) ) ( ( (lv_beanSlots_5_0= ruleUiBeanSlot ) ) | ( (lv_bindingEndpointAlias_6_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_7_0= ruleUiBinding ) ) )* ( (lv_content_8_0= ruleUiEmbeddable ) ) (otherlv_9= 'align' ( (lv_contentAlignment_10_0= ruleUiAlignment ) ) )? ( ( (lv_bindingEndpointAlias_11_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) | ( (lv_validatorAssignments_13_0= ruleUiValidatorAssignment ) ) | ( (lv_processorAssignments_14_0= ruleUiVisibilityProcessorAssignment ) ) )* otherlv_15= '}' )
+            {
+            // InternalUIGrammar.g:2267:2: (otherlv_0= 'display' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' otherlv_3= 'rootType' ( (lv_jvmType_4_0= ruleJvmTypeReference ) ) ( ( (lv_beanSlots_5_0= ruleUiBeanSlot ) ) | ( (lv_bindingEndpointAlias_6_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_7_0= ruleUiBinding ) ) )* ( (lv_content_8_0= ruleUiEmbeddable ) ) (otherlv_9= 'align' ( (lv_contentAlignment_10_0= ruleUiAlignment ) ) )? ( ( (lv_bindingEndpointAlias_11_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) | ( (lv_validatorAssignments_13_0= ruleUiValidatorAssignment ) ) | ( (lv_processorAssignments_14_0= ruleUiVisibilityProcessorAssignment ) ) )* otherlv_15= '}' )
+            // InternalUIGrammar.g:2268:3: otherlv_0= 'display' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' otherlv_3= 'rootType' ( (lv_jvmType_4_0= ruleJvmTypeReference ) ) ( ( (lv_beanSlots_5_0= ruleUiBeanSlot ) ) | ( (lv_bindingEndpointAlias_6_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_7_0= ruleUiBinding ) ) )* ( (lv_content_8_0= ruleUiEmbeddable ) ) (otherlv_9= 'align' ( (lv_contentAlignment_10_0= ruleUiAlignment ) ) )? ( ( (lv_bindingEndpointAlias_11_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) | ( (lv_validatorAssignments_13_0= ruleUiValidatorAssignment ) ) | ( (lv_processorAssignments_14_0= ruleUiVisibilityProcessorAssignment ) ) )* otherlv_15= '}'
+            {
+            otherlv_0=(Token)match(input,54,FOLLOW_3); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getUiDisplayViewAccess().getDisplayKeyword_0());
+              		
+            }
+            // InternalUIGrammar.g:2272:3: ( (lv_name_1_0= RULE_ID ) )
+            // InternalUIGrammar.g:2273:4: (lv_name_1_0= RULE_ID )
+            {
+            // InternalUIGrammar.g:2273:4: (lv_name_1_0= RULE_ID )
+            // InternalUIGrammar.g:2274:5: lv_name_1_0= RULE_ID
+            {
+            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_11); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_name_1_0, grammarAccess.getUiDisplayViewAccess().getNameIDTerminalRuleCall_1_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getUiDisplayViewRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"name",
+              						lv_name_1_0,
+              						"org.eclipse.xtext.xbase.Xtype.ID");
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,20,FOLLOW_43); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getUiDisplayViewAccess().getLeftCurlyBracketKeyword_2());
+              		
+            }
+            otherlv_3=(Token)match(input,51,FOLLOW_16); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_3, grammarAccess.getUiDisplayViewAccess().getRootTypeKeyword_3());
+              		
+            }
+            // InternalUIGrammar.g:2298:3: ( (lv_jvmType_4_0= ruleJvmTypeReference ) )
+            // InternalUIGrammar.g:2299:4: (lv_jvmType_4_0= ruleJvmTypeReference )
+            {
+            // InternalUIGrammar.g:2299:4: (lv_jvmType_4_0= ruleJvmTypeReference )
+            // InternalUIGrammar.g:2300:5: lv_jvmType_4_0= ruleJvmTypeReference
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getUiDisplayViewAccess().getJvmTypeJvmTypeReferenceParserRuleCall_4_0());
+              				
+            }
+            pushFollow(FOLLOW_37);
+            lv_jvmType_4_0=ruleJvmTypeReference();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"content",
-                      		lv_content_20_0, 
-                      		"UiEmbeddable");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getUiDisplayViewRule());
+              					}
+              					set(
+              						current,
+              						"jvmType",
+              						lv_jvmType_4_0,
+              						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -6209,124 +6625,61 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2156:2: (otherlv_21= 'align' ( (lv_contentAlignment_22_0= ruleUiAlignment ) ) )?
-            int alt36=2;
-            int LA36_0 = input.LA(1);
-
-            if ( (LA36_0==54) ) {
-                alt36=1;
-            }
-            switch (alt36) {
-                case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2156:4: otherlv_21= 'align' ( (lv_contentAlignment_22_0= ruleUiAlignment ) )
-                    {
-                    otherlv_21=(Token)match(input,54,FollowSets000.FOLLOW_54_in_ruleUiIDEView4832); if (state.failed) return current;
-                    if ( state.backtracking==0 ) {
-
-                          	newLeafNode(otherlv_21, grammarAccess.getUiIDEViewAccess().getAlignKeyword_6_0());
-                          
-                    }
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2160:1: ( (lv_contentAlignment_22_0= ruleUiAlignment ) )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2161:1: (lv_contentAlignment_22_0= ruleUiAlignment )
-                    {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2161:1: (lv_contentAlignment_22_0= ruleUiAlignment )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2162:3: lv_contentAlignment_22_0= ruleUiAlignment
-                    {
-                    if ( state.backtracking==0 ) {
-                       
-                      	        newCompositeNode(grammarAccess.getUiIDEViewAccess().getContentAlignmentUiAlignmentEnumRuleCall_6_1_0()); 
-                      	    
-                    }
-                    pushFollow(FollowSets000.FOLLOW_ruleUiAlignment_in_ruleUiIDEView4853);
-                    lv_contentAlignment_22_0=ruleUiAlignment();
-
-                    state._fsp--;
-                    if (state.failed) return current;
-                    if ( state.backtracking==0 ) {
-
-                      	        if (current==null) {
-                      	            current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
-                      	        }
-                             		set(
-                             			current, 
-                             			"contentAlignment",
-                              		lv_contentAlignment_22_0, 
-                              		"UiAlignment");
-                      	        afterParserOrEnumRuleCall();
-                      	    
-                    }
-
-                    }
-
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2178:4: ( ( (lv_bindingEndpointAlias_23_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_24_0= ruleUiBinding ) ) | ( (lv_validatorAssignments_25_0= ruleUiValidatorAssignment ) ) | ( (lv_processorAssignments_26_0= ruleUiVisibilityProcessorAssignment ) ) )*
+            // InternalUIGrammar.g:2317:3: ( ( (lv_beanSlots_5_0= ruleUiBeanSlot ) ) | ( (lv_bindingEndpointAlias_6_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_7_0= ruleUiBinding ) ) )*
             loop37:
             do {
-                int alt37=5;
+                int alt37=4;
                 switch ( input.LA(1) ) {
                 case 23:
                     {
                     alt37=1;
                     }
                     break;
-                case 27:
+                case 22:
                     {
                     alt37=2;
                     }
                     break;
-                case 18:
+                case 26:
                     {
                     alt37=3;
                     }
                     break;
-                case 151:
-                    {
-                    alt37=4;
-                    }
-                    break;
 
                 }
 
                 switch (alt37) {
             	case 1 :
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2178:5: ( (lv_bindingEndpointAlias_23_0= ruleUiBindingEndpointAlias ) )
+            	    // InternalUIGrammar.g:2318:4: ( (lv_beanSlots_5_0= ruleUiBeanSlot ) )
             	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2178:5: ( (lv_bindingEndpointAlias_23_0= ruleUiBindingEndpointAlias ) )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2179:1: (lv_bindingEndpointAlias_23_0= ruleUiBindingEndpointAlias )
+            	    // InternalUIGrammar.g:2318:4: ( (lv_beanSlots_5_0= ruleUiBeanSlot ) )
+            	    // InternalUIGrammar.g:2319:5: (lv_beanSlots_5_0= ruleUiBeanSlot )
             	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2179:1: (lv_bindingEndpointAlias_23_0= ruleUiBindingEndpointAlias )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2180:3: lv_bindingEndpointAlias_23_0= ruleUiBindingEndpointAlias
+            	    // InternalUIGrammar.g:2319:5: (lv_beanSlots_5_0= ruleUiBeanSlot )
+            	    // InternalUIGrammar.g:2320:6: lv_beanSlots_5_0= ruleUiBeanSlot
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getUiIDEViewAccess().getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_7_0_0()); 
-            	      	    
+
+            	      						newCompositeNode(grammarAccess.getUiDisplayViewAccess().getBeanSlotsUiBeanSlotParserRuleCall_5_0_0());
+            	      					
             	    }
-            	    pushFollow(FollowSets000.FOLLOW_ruleUiBindingEndpointAlias_in_ruleUiIDEView4877);
-            	    lv_bindingEndpointAlias_23_0=ruleUiBindingEndpointAlias();
+            	    pushFollow(FOLLOW_37);
+            	    lv_beanSlots_5_0=ruleUiBeanSlot();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"bindingEndpointAlias",
-            	              		lv_bindingEndpointAlias_23_0, 
-            	              		"UiBindingEndpointAlias");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getUiDisplayViewRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"beanSlots",
+            	      							lv_beanSlots_5_0,
+            	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBeanSlot");
+            	      						afterParserOrEnumRuleCall();
+            	      					
             	    }
 
             	    }
@@ -6338,36 +6691,36 @@
             	    }
             	    break;
             	case 2 :
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2197:6: ( (lv_bindings_24_0= ruleUiBinding ) )
+            	    // InternalUIGrammar.g:2338:4: ( (lv_bindingEndpointAlias_6_0= ruleUiBindingEndpointAlias ) )
             	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2197:6: ( (lv_bindings_24_0= ruleUiBinding ) )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2198:1: (lv_bindings_24_0= ruleUiBinding )
+            	    // InternalUIGrammar.g:2338:4: ( (lv_bindingEndpointAlias_6_0= ruleUiBindingEndpointAlias ) )
+            	    // InternalUIGrammar.g:2339:5: (lv_bindingEndpointAlias_6_0= ruleUiBindingEndpointAlias )
             	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2198:1: (lv_bindings_24_0= ruleUiBinding )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2199:3: lv_bindings_24_0= ruleUiBinding
+            	    // InternalUIGrammar.g:2339:5: (lv_bindingEndpointAlias_6_0= ruleUiBindingEndpointAlias )
+            	    // InternalUIGrammar.g:2340:6: lv_bindingEndpointAlias_6_0= ruleUiBindingEndpointAlias
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getUiIDEViewAccess().getBindingsUiBindingParserRuleCall_7_1_0()); 
-            	      	    
+
+            	      						newCompositeNode(grammarAccess.getUiDisplayViewAccess().getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_5_1_0());
+            	      					
             	    }
-            	    pushFollow(FollowSets000.FOLLOW_ruleUiBinding_in_ruleUiIDEView4904);
-            	    lv_bindings_24_0=ruleUiBinding();
+            	    pushFollow(FOLLOW_37);
+            	    lv_bindingEndpointAlias_6_0=ruleUiBindingEndpointAlias();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"bindings",
-            	              		lv_bindings_24_0, 
-            	              		"UiBinding");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getUiDisplayViewRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"bindingEndpointAlias",
+            	      							lv_bindingEndpointAlias_6_0,
+            	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAlias");
+            	      						afterParserOrEnumRuleCall();
+            	      					
             	    }
 
             	    }
@@ -6379,77 +6732,36 @@
             	    }
             	    break;
             	case 3 :
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2216:6: ( (lv_validatorAssignments_25_0= ruleUiValidatorAssignment ) )
+            	    // InternalUIGrammar.g:2358:4: ( (lv_bindings_7_0= ruleUiBinding ) )
             	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2216:6: ( (lv_validatorAssignments_25_0= ruleUiValidatorAssignment ) )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2217:1: (lv_validatorAssignments_25_0= ruleUiValidatorAssignment )
+            	    // InternalUIGrammar.g:2358:4: ( (lv_bindings_7_0= ruleUiBinding ) )
+            	    // InternalUIGrammar.g:2359:5: (lv_bindings_7_0= ruleUiBinding )
             	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2217:1: (lv_validatorAssignments_25_0= ruleUiValidatorAssignment )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2218:3: lv_validatorAssignments_25_0= ruleUiValidatorAssignment
+            	    // InternalUIGrammar.g:2359:5: (lv_bindings_7_0= ruleUiBinding )
+            	    // InternalUIGrammar.g:2360:6: lv_bindings_7_0= ruleUiBinding
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getUiIDEViewAccess().getValidatorAssignmentsUiValidatorAssignmentParserRuleCall_7_2_0()); 
-            	      	    
+
+            	      						newCompositeNode(grammarAccess.getUiDisplayViewAccess().getBindingsUiBindingParserRuleCall_5_2_0());
+            	      					
             	    }
-            	    pushFollow(FollowSets000.FOLLOW_ruleUiValidatorAssignment_in_ruleUiIDEView4931);
-            	    lv_validatorAssignments_25_0=ruleUiValidatorAssignment();
+            	    pushFollow(FOLLOW_37);
+            	    lv_bindings_7_0=ruleUiBinding();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"validatorAssignments",
-            	              		lv_validatorAssignments_25_0, 
-            	              		"UiValidatorAssignment");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
-            	    }
-
-            	    }
-
-
-            	    }
-
-
-            	    }
-            	    break;
-            	case 4 :
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2235:6: ( (lv_processorAssignments_26_0= ruleUiVisibilityProcessorAssignment ) )
-            	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2235:6: ( (lv_processorAssignments_26_0= ruleUiVisibilityProcessorAssignment ) )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2236:1: (lv_processorAssignments_26_0= ruleUiVisibilityProcessorAssignment )
-            	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2236:1: (lv_processorAssignments_26_0= ruleUiVisibilityProcessorAssignment )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2237:3: lv_processorAssignments_26_0= ruleUiVisibilityProcessorAssignment
-            	    {
-            	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getUiIDEViewAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_3_0()); 
-            	      	    
-            	    }
-            	    pushFollow(FollowSets000.FOLLOW_ruleUiVisibilityProcessorAssignment_in_ruleUiIDEView4958);
-            	    lv_processorAssignments_26_0=ruleUiVisibilityProcessorAssignment();
-
-            	    state._fsp--;
-            	    if (state.failed) return current;
-            	    if ( state.backtracking==0 ) {
-
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"processorAssignments",
-            	              		lv_processorAssignments_26_0, 
-            	              		"UiVisibilityProcessorAssignment");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getUiDisplayViewRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"bindings",
+            	      							lv_bindings_7_0,
+            	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+            	      						afterParserOrEnumRuleCall();
+            	      					
             	    }
 
             	    }
@@ -6466,11 +6778,303 @@
                 }
             } while (true);
 
-            otherlv_27=(Token)match(input,22,FollowSets000.FOLLOW_22_in_ruleUiIDEView4972); if (state.failed) return current;
+            // InternalUIGrammar.g:2378:3: ( (lv_content_8_0= ruleUiEmbeddable ) )
+            // InternalUIGrammar.g:2379:4: (lv_content_8_0= ruleUiEmbeddable )
+            {
+            // InternalUIGrammar.g:2379:4: (lv_content_8_0= ruleUiEmbeddable )
+            // InternalUIGrammar.g:2380:5: lv_content_8_0= ruleUiEmbeddable
+            {
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_27, grammarAccess.getUiIDEViewAccess().getRightCurlyBracketKeyword_8());
-                  
+              					newCompositeNode(grammarAccess.getUiDisplayViewAccess().getContentUiEmbeddableParserRuleCall_6_0());
+              				
+            }
+            pushFollow(FOLLOW_40);
+            lv_content_8_0=ruleUiEmbeddable();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getUiDisplayViewRule());
+              					}
+              					set(
+              						current,
+              						"content",
+              						lv_content_8_0,
+              						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiEmbeddable");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalUIGrammar.g:2397:3: (otherlv_9= 'align' ( (lv_contentAlignment_10_0= ruleUiAlignment ) ) )?
+            int alt38=2;
+            int LA38_0 = input.LA(1);
+
+            if ( (LA38_0==53) ) {
+                alt38=1;
+            }
+            switch (alt38) {
+                case 1 :
+                    // InternalUIGrammar.g:2398:4: otherlv_9= 'align' ( (lv_contentAlignment_10_0= ruleUiAlignment ) )
+                    {
+                    otherlv_9=(Token)match(input,53,FOLLOW_41); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_9, grammarAccess.getUiDisplayViewAccess().getAlignKeyword_7_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:2402:4: ( (lv_contentAlignment_10_0= ruleUiAlignment ) )
+                    // InternalUIGrammar.g:2403:5: (lv_contentAlignment_10_0= ruleUiAlignment )
+                    {
+                    // InternalUIGrammar.g:2403:5: (lv_contentAlignment_10_0= ruleUiAlignment )
+                    // InternalUIGrammar.g:2404:6: lv_contentAlignment_10_0= ruleUiAlignment
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getUiDisplayViewAccess().getContentAlignmentUiAlignmentEnumRuleCall_7_1_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_42);
+                    lv_contentAlignment_10_0=ruleUiAlignment();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getUiDisplayViewRule());
+                      						}
+                      						set(
+                      							current,
+                      							"contentAlignment",
+                      							lv_contentAlignment_10_0,
+                      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiAlignment");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:2422:3: ( ( (lv_bindingEndpointAlias_11_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) | ( (lv_validatorAssignments_13_0= ruleUiValidatorAssignment ) ) | ( (lv_processorAssignments_14_0= ruleUiVisibilityProcessorAssignment ) ) )*
+            loop39:
+            do {
+                int alt39=5;
+                switch ( input.LA(1) ) {
+                case 22:
+                    {
+                    alt39=1;
+                    }
+                    break;
+                case 26:
+                    {
+                    alt39=2;
+                    }
+                    break;
+                case 17:
+                    {
+                    alt39=3;
+                    }
+                    break;
+                case 153:
+                    {
+                    alt39=4;
+                    }
+                    break;
+
+                }
+
+                switch (alt39) {
+            	case 1 :
+            	    // InternalUIGrammar.g:2423:4: ( (lv_bindingEndpointAlias_11_0= ruleUiBindingEndpointAlias ) )
+            	    {
+            	    // InternalUIGrammar.g:2423:4: ( (lv_bindingEndpointAlias_11_0= ruleUiBindingEndpointAlias ) )
+            	    // InternalUIGrammar.g:2424:5: (lv_bindingEndpointAlias_11_0= ruleUiBindingEndpointAlias )
+            	    {
+            	    // InternalUIGrammar.g:2424:5: (lv_bindingEndpointAlias_11_0= ruleUiBindingEndpointAlias )
+            	    // InternalUIGrammar.g:2425:6: lv_bindingEndpointAlias_11_0= ruleUiBindingEndpointAlias
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getUiDisplayViewAccess().getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_8_0_0());
+            	      					
+            	    }
+            	    pushFollow(FOLLOW_42);
+            	    lv_bindingEndpointAlias_11_0=ruleUiBindingEndpointAlias();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getUiDisplayViewRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"bindingEndpointAlias",
+            	      							lv_bindingEndpointAlias_11_0,
+            	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAlias");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // InternalUIGrammar.g:2443:4: ( (lv_bindings_12_0= ruleUiBinding ) )
+            	    {
+            	    // InternalUIGrammar.g:2443:4: ( (lv_bindings_12_0= ruleUiBinding ) )
+            	    // InternalUIGrammar.g:2444:5: (lv_bindings_12_0= ruleUiBinding )
+            	    {
+            	    // InternalUIGrammar.g:2444:5: (lv_bindings_12_0= ruleUiBinding )
+            	    // InternalUIGrammar.g:2445:6: lv_bindings_12_0= ruleUiBinding
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getUiDisplayViewAccess().getBindingsUiBindingParserRuleCall_8_1_0());
+            	      					
+            	    }
+            	    pushFollow(FOLLOW_42);
+            	    lv_bindings_12_0=ruleUiBinding();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getUiDisplayViewRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"bindings",
+            	      							lv_bindings_12_0,
+            	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 3 :
+            	    // InternalUIGrammar.g:2463:4: ( (lv_validatorAssignments_13_0= ruleUiValidatorAssignment ) )
+            	    {
+            	    // InternalUIGrammar.g:2463:4: ( (lv_validatorAssignments_13_0= ruleUiValidatorAssignment ) )
+            	    // InternalUIGrammar.g:2464:5: (lv_validatorAssignments_13_0= ruleUiValidatorAssignment )
+            	    {
+            	    // InternalUIGrammar.g:2464:5: (lv_validatorAssignments_13_0= ruleUiValidatorAssignment )
+            	    // InternalUIGrammar.g:2465:6: lv_validatorAssignments_13_0= ruleUiValidatorAssignment
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getUiDisplayViewAccess().getValidatorAssignmentsUiValidatorAssignmentParserRuleCall_8_2_0());
+            	      					
+            	    }
+            	    pushFollow(FOLLOW_42);
+            	    lv_validatorAssignments_13_0=ruleUiValidatorAssignment();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getUiDisplayViewRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"validatorAssignments",
+            	      							lv_validatorAssignments_13_0,
+            	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidatorAssignment");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 4 :
+            	    // InternalUIGrammar.g:2483:4: ( (lv_processorAssignments_14_0= ruleUiVisibilityProcessorAssignment ) )
+            	    {
+            	    // InternalUIGrammar.g:2483:4: ( (lv_processorAssignments_14_0= ruleUiVisibilityProcessorAssignment ) )
+            	    // InternalUIGrammar.g:2484:5: (lv_processorAssignments_14_0= ruleUiVisibilityProcessorAssignment )
+            	    {
+            	    // InternalUIGrammar.g:2484:5: (lv_processorAssignments_14_0= ruleUiVisibilityProcessorAssignment )
+            	    // InternalUIGrammar.g:2485:6: lv_processorAssignments_14_0= ruleUiVisibilityProcessorAssignment
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getUiDisplayViewAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_8_3_0());
+            	      					
+            	    }
+            	    pushFollow(FOLLOW_42);
+            	    lv_processorAssignments_14_0=ruleUiVisibilityProcessorAssignment();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getUiDisplayViewRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"processorAssignments",
+            	      							lv_processorAssignments_14_0,
+            	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop39;
+                }
+            } while (true);
+
+            otherlv_15=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_15, grammarAccess.getUiDisplayViewAccess().getRightCurlyBracketKeyword_9());
+              		
             }
 
             }
@@ -6479,23 +7083,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 "ruleUiIDEView"
+    // $ANTLR end "ruleUiDisplayView"
 
 
     // $ANTLR start "entryRuleUiExposedAction"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2265:1: entryRuleUiExposedAction returns [EObject current=null] : iv_ruleUiExposedAction= ruleUiExposedAction EOF ;
+    // InternalUIGrammar.g:2511:1: entryRuleUiExposedAction returns [EObject current=null] : iv_ruleUiExposedAction= ruleUiExposedAction EOF ;
     public final EObject entryRuleUiExposedAction() throws RecognitionException {
         EObject current = null;
 
@@ -6503,13 +7109,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2266:2: (iv_ruleUiExposedAction= ruleUiExposedAction EOF )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2267:2: iv_ruleUiExposedAction= ruleUiExposedAction EOF
+            // InternalUIGrammar.g:2511:56: (iv_ruleUiExposedAction= ruleUiExposedAction EOF )
+            // InternalUIGrammar.g:2512:2: iv_ruleUiExposedAction= ruleUiExposedAction EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUiExposedActionRule()); 
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiExposedAction_in_entryRuleUiExposedAction5008);
+            pushFollow(FOLLOW_1);
             iv_ruleUiExposedAction=ruleUiExposedAction();
 
             state._fsp--;
@@ -6517,16 +7123,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUiExposedAction; 
             }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiExposedAction5018); 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;
@@ -6535,7 +7141,7 @@
 
 
     // $ANTLR start "ruleUiExposedAction"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2274:1: ruleUiExposedAction returns [EObject current=null] : ( ( (lv_name_0_0= RULE_ID ) ) (otherlv_1= 'icon' ( (lv_iconName_2_0= RULE_STRING ) ) )? otherlv_3= 'id' ( ( ( ( ruleQualifiedName ) )=> ( ruleQualifiedName ) ) | ( (lv_actionID_5_0= RULE_STRING ) ) ) ( (lv_checkDirty_6_0= 'checkDirty' ) )? (otherlv_7= 'externalCommand' ( (lv_externalCommandId_8_0= RULE_STRING ) ) )? (otherlv_9= ';' )? ) ;
+    // InternalUIGrammar.g:2518:1: ruleUiExposedAction returns [EObject current=null] : ( ( (lv_name_0_0= RULE_ID ) ) (otherlv_1= 'icon' ( (lv_iconName_2_0= RULE_STRING ) ) )? otherlv_3= 'id' ( ( ( ( ruleQualifiedName ) )=> ( ruleQualifiedName ) ) | ( (lv_actionID_5_0= RULE_STRING ) ) ) ( (lv_checkDirty_6_0= 'checkDirty' ) )? (otherlv_7= 'externalCommand' ( (lv_externalCommandId_8_0= RULE_STRING ) ) )? (otherlv_9= ';' )? ) ;
     public final EObject ruleUiExposedAction() throws RecognitionException {
         EObject current = null;
 
@@ -6549,38 +7155,39 @@
         Token lv_externalCommandId_8_0=null;
         Token otherlv_9=null;
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2277:28: ( ( ( (lv_name_0_0= RULE_ID ) ) (otherlv_1= 'icon' ( (lv_iconName_2_0= RULE_STRING ) ) )? otherlv_3= 'id' ( ( ( ( ruleQualifiedName ) )=> ( ruleQualifiedName ) ) | ( (lv_actionID_5_0= RULE_STRING ) ) ) ( (lv_checkDirty_6_0= 'checkDirty' ) )? (otherlv_7= 'externalCommand' ( (lv_externalCommandId_8_0= RULE_STRING ) ) )? (otherlv_9= ';' )? ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2278:1: ( ( (lv_name_0_0= RULE_ID ) ) (otherlv_1= 'icon' ( (lv_iconName_2_0= RULE_STRING ) ) )? otherlv_3= 'id' ( ( ( ( ruleQualifiedName ) )=> ( ruleQualifiedName ) ) | ( (lv_actionID_5_0= RULE_STRING ) ) ) ( (lv_checkDirty_6_0= 'checkDirty' ) )? (otherlv_7= 'externalCommand' ( (lv_externalCommandId_8_0= RULE_STRING ) ) )? (otherlv_9= ';' )? )
+            // InternalUIGrammar.g:2524:2: ( ( ( (lv_name_0_0= RULE_ID ) ) (otherlv_1= 'icon' ( (lv_iconName_2_0= RULE_STRING ) ) )? otherlv_3= 'id' ( ( ( ( ruleQualifiedName ) )=> ( ruleQualifiedName ) ) | ( (lv_actionID_5_0= RULE_STRING ) ) ) ( (lv_checkDirty_6_0= 'checkDirty' ) )? (otherlv_7= 'externalCommand' ( (lv_externalCommandId_8_0= RULE_STRING ) ) )? (otherlv_9= ';' )? ) )
+            // InternalUIGrammar.g:2525:2: ( ( (lv_name_0_0= RULE_ID ) ) (otherlv_1= 'icon' ( (lv_iconName_2_0= RULE_STRING ) ) )? otherlv_3= 'id' ( ( ( ( ruleQualifiedName ) )=> ( ruleQualifiedName ) ) | ( (lv_actionID_5_0= RULE_STRING ) ) ) ( (lv_checkDirty_6_0= 'checkDirty' ) )? (otherlv_7= 'externalCommand' ( (lv_externalCommandId_8_0= RULE_STRING ) ) )? (otherlv_9= ';' )? )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2278:1: ( ( (lv_name_0_0= RULE_ID ) ) (otherlv_1= 'icon' ( (lv_iconName_2_0= RULE_STRING ) ) )? otherlv_3= 'id' ( ( ( ( ruleQualifiedName ) )=> ( ruleQualifiedName ) ) | ( (lv_actionID_5_0= RULE_STRING ) ) ) ( (lv_checkDirty_6_0= 'checkDirty' ) )? (otherlv_7= 'externalCommand' ( (lv_externalCommandId_8_0= RULE_STRING ) ) )? (otherlv_9= ';' )? )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2278:2: ( (lv_name_0_0= RULE_ID ) ) (otherlv_1= 'icon' ( (lv_iconName_2_0= RULE_STRING ) ) )? otherlv_3= 'id' ( ( ( ( ruleQualifiedName ) )=> ( ruleQualifiedName ) ) | ( (lv_actionID_5_0= RULE_STRING ) ) ) ( (lv_checkDirty_6_0= 'checkDirty' ) )? (otherlv_7= 'externalCommand' ( (lv_externalCommandId_8_0= RULE_STRING ) ) )? (otherlv_9= ';' )?
+            // InternalUIGrammar.g:2525:2: ( ( (lv_name_0_0= RULE_ID ) ) (otherlv_1= 'icon' ( (lv_iconName_2_0= RULE_STRING ) ) )? otherlv_3= 'id' ( ( ( ( ruleQualifiedName ) )=> ( ruleQualifiedName ) ) | ( (lv_actionID_5_0= RULE_STRING ) ) ) ( (lv_checkDirty_6_0= 'checkDirty' ) )? (otherlv_7= 'externalCommand' ( (lv_externalCommandId_8_0= RULE_STRING ) ) )? (otherlv_9= ';' )? )
+            // InternalUIGrammar.g:2526:3: ( (lv_name_0_0= RULE_ID ) ) (otherlv_1= 'icon' ( (lv_iconName_2_0= RULE_STRING ) ) )? otherlv_3= 'id' ( ( ( ( ruleQualifiedName ) )=> ( ruleQualifiedName ) ) | ( (lv_actionID_5_0= RULE_STRING ) ) ) ( (lv_checkDirty_6_0= 'checkDirty' ) )? (otherlv_7= 'externalCommand' ( (lv_externalCommandId_8_0= RULE_STRING ) ) )? (otherlv_9= ';' )?
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2278:2: ( (lv_name_0_0= RULE_ID ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2279:1: (lv_name_0_0= RULE_ID )
+            // InternalUIGrammar.g:2526:3: ( (lv_name_0_0= RULE_ID ) )
+            // InternalUIGrammar.g:2527:4: (lv_name_0_0= RULE_ID )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2279:1: (lv_name_0_0= RULE_ID )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2280:3: lv_name_0_0= RULE_ID
+            // InternalUIGrammar.g:2527:4: (lv_name_0_0= RULE_ID )
+            // InternalUIGrammar.g:2528:5: lv_name_0_0= RULE_ID
             {
-            lv_name_0_0=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_RULE_ID_in_ruleUiExposedAction5060); if (state.failed) return current;
+            lv_name_0_0=(Token)match(input,RULE_ID,FOLLOW_44); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              			newLeafNode(lv_name_0_0, grammarAccess.getUiExposedActionAccess().getNameIDTerminalRuleCall_0_0()); 
-              		
+              					newLeafNode(lv_name_0_0, grammarAccess.getUiExposedActionAccess().getNameIDTerminalRuleCall_0_0());
+              				
             }
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElement(grammarAccess.getUiExposedActionRule());
-              	        }
-                     		setWithLastConsumed(
-                     			current, 
-                     			"name",
-                      		lv_name_0_0, 
-                      		"ID");
-              	    
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getUiExposedActionRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"name",
+              						lv_name_0_0,
+              						"org.eclipse.xtext.xbase.Xtype.ID");
+              				
             }
 
             }
@@ -6588,46 +7195,46 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2296:2: (otherlv_1= 'icon' ( (lv_iconName_2_0= RULE_STRING ) ) )?
-            int alt38=2;
-            int LA38_0 = input.LA(1);
+            // InternalUIGrammar.g:2544:3: (otherlv_1= 'icon' ( (lv_iconName_2_0= RULE_STRING ) ) )?
+            int alt40=2;
+            int LA40_0 = input.LA(1);
 
-            if ( (LA38_0==55) ) {
-                alt38=1;
+            if ( (LA40_0==55) ) {
+                alt40=1;
             }
-            switch (alt38) {
+            switch (alt40) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2296:4: otherlv_1= 'icon' ( (lv_iconName_2_0= RULE_STRING ) )
+                    // InternalUIGrammar.g:2545:4: otherlv_1= 'icon' ( (lv_iconName_2_0= RULE_STRING ) )
                     {
-                    otherlv_1=(Token)match(input,55,FollowSets000.FOLLOW_55_in_ruleUiExposedAction5078); if (state.failed) return current;
+                    otherlv_1=(Token)match(input,55,FOLLOW_18); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_1, grammarAccess.getUiExposedActionAccess().getIconKeyword_1_0());
-                          
+                      				newLeafNode(otherlv_1, grammarAccess.getUiExposedActionAccess().getIconKeyword_1_0());
+                      			
                     }
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2300:1: ( (lv_iconName_2_0= RULE_STRING ) )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2301:1: (lv_iconName_2_0= RULE_STRING )
+                    // InternalUIGrammar.g:2549:4: ( (lv_iconName_2_0= RULE_STRING ) )
+                    // InternalUIGrammar.g:2550:5: (lv_iconName_2_0= RULE_STRING )
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2301:1: (lv_iconName_2_0= RULE_STRING )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2302:3: lv_iconName_2_0= RULE_STRING
+                    // InternalUIGrammar.g:2550:5: (lv_iconName_2_0= RULE_STRING )
+                    // InternalUIGrammar.g:2551:6: lv_iconName_2_0= RULE_STRING
                     {
-                    lv_iconName_2_0=(Token)match(input,RULE_STRING,FollowSets000.FOLLOW_RULE_STRING_in_ruleUiExposedAction5095); if (state.failed) return current;
+                    lv_iconName_2_0=(Token)match(input,RULE_STRING,FOLLOW_45); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      			newLeafNode(lv_iconName_2_0, grammarAccess.getUiExposedActionAccess().getIconNameSTRINGTerminalRuleCall_1_1_0()); 
-                      		
+                      						newLeafNode(lv_iconName_2_0, grammarAccess.getUiExposedActionAccess().getIconNameSTRINGTerminalRuleCall_1_1_0());
+                      					
                     }
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElement(grammarAccess.getUiExposedActionRule());
-                      	        }
-                             		setWithLastConsumed(
-                             			current, 
-                             			"iconName",
-                              		lv_iconName_2_0, 
-                              		"STRING");
-                      	    
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getUiExposedActionRule());
+                      						}
+                      						setWithLastConsumed(
+                      							current,
+                      							"iconName",
+                      							lv_iconName_2_0,
+                      							"org.eclipse.xtext.xbase.Xtype.STRING");
+                      					
                     }
 
                     }
@@ -6641,60 +7248,60 @@
 
             }
 
-            otherlv_3=(Token)match(input,56,FollowSets000.FOLLOW_56_in_ruleUiExposedAction5114); if (state.failed) return current;
+            otherlv_3=(Token)match(input,56,FOLLOW_46); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_3, grammarAccess.getUiExposedActionAccess().getIdKeyword_2());
-                  
+              			newLeafNode(otherlv_3, grammarAccess.getUiExposedActionAccess().getIdKeyword_2());
+              		
             }
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2322:1: ( ( ( ( ruleQualifiedName ) )=> ( ruleQualifiedName ) ) | ( (lv_actionID_5_0= RULE_STRING ) ) )
-            int alt39=2;
-            int LA39_0 = input.LA(1);
+            // InternalUIGrammar.g:2572:3: ( ( ( ( ruleQualifiedName ) )=> ( ruleQualifiedName ) ) | ( (lv_actionID_5_0= RULE_STRING ) ) )
+            int alt41=2;
+            int LA41_0 = input.LA(1);
 
-            if ( (LA39_0==RULE_ID) && (synpred1_InternalUIGrammar())) {
-                alt39=1;
+            if ( (LA41_0==RULE_ID) && (synpred1_InternalUIGrammar())) {
+                alt41=1;
             }
-            else if ( (LA39_0==RULE_STRING) ) {
-                alt39=2;
+            else if ( (LA41_0==RULE_STRING) ) {
+                alt41=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 39, 0, input);
+                    new NoViableAltException("", 41, 0, input);
 
                 throw nvae;
             }
-            switch (alt39) {
+            switch (alt41) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2322:2: ( ( ( ruleQualifiedName ) )=> ( ruleQualifiedName ) )
+                    // InternalUIGrammar.g:2573:4: ( ( ( ruleQualifiedName ) )=> ( ruleQualifiedName ) )
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2322:2: ( ( ( ruleQualifiedName ) )=> ( ruleQualifiedName ) )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2322:3: ( ( ruleQualifiedName ) )=> ( ruleQualifiedName )
+                    // InternalUIGrammar.g:2573:4: ( ( ( ruleQualifiedName ) )=> ( ruleQualifiedName ) )
+                    // InternalUIGrammar.g:2574:5: ( ( ruleQualifiedName ) )=> ( ruleQualifiedName )
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2327:1: ( ruleQualifiedName )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2328:3: ruleQualifiedName
+                    // InternalUIGrammar.g:2578:5: ( ruleQualifiedName )
+                    // InternalUIGrammar.g:2579:6: ruleQualifiedName
                     {
                     if ( state.backtracking==0 ) {
 
-                      			if (current==null) {
-                      	            current = createModelElement(grammarAccess.getUiExposedActionRule());
-                      	        }
-                              
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getUiExposedActionRule());
+                      						}
+                      					
                     }
                     if ( state.backtracking==0 ) {
-                       
-                      	        newCompositeNode(grammarAccess.getUiExposedActionAccess().getActionReferenceUxActionCrossReference_3_0_0()); 
-                      	    
+
+                      						newCompositeNode(grammarAccess.getUiExposedActionAccess().getActionReferenceUxActionCrossReference_3_0_0());
+                      					
                     }
-                    pushFollow(FollowSets000.FOLLOW_ruleQualifiedName_in_ruleUiExposedAction5150);
+                    pushFollow(FOLLOW_47);
                     ruleQualifiedName();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                      	        afterParserOrEnumRuleCall();
-                      	    
+
+                      						afterParserOrEnumRuleCall();
+                      					
                     }
 
                     }
@@ -6706,31 +7313,31 @@
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2342:6: ( (lv_actionID_5_0= RULE_STRING ) )
+                    // InternalUIGrammar.g:2594:4: ( (lv_actionID_5_0= RULE_STRING ) )
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2342:6: ( (lv_actionID_5_0= RULE_STRING ) )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2343:1: (lv_actionID_5_0= RULE_STRING )
+                    // InternalUIGrammar.g:2594:4: ( (lv_actionID_5_0= RULE_STRING ) )
+                    // InternalUIGrammar.g:2595:5: (lv_actionID_5_0= RULE_STRING )
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2343:1: (lv_actionID_5_0= RULE_STRING )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2344:3: lv_actionID_5_0= RULE_STRING
+                    // InternalUIGrammar.g:2595:5: (lv_actionID_5_0= RULE_STRING )
+                    // InternalUIGrammar.g:2596:6: lv_actionID_5_0= RULE_STRING
                     {
-                    lv_actionID_5_0=(Token)match(input,RULE_STRING,FollowSets000.FOLLOW_RULE_STRING_in_ruleUiExposedAction5173); if (state.failed) return current;
+                    lv_actionID_5_0=(Token)match(input,RULE_STRING,FOLLOW_47); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      			newLeafNode(lv_actionID_5_0, grammarAccess.getUiExposedActionAccess().getActionIDSTRINGTerminalRuleCall_3_1_0()); 
-                      		
+                      						newLeafNode(lv_actionID_5_0, grammarAccess.getUiExposedActionAccess().getActionIDSTRINGTerminalRuleCall_3_1_0());
+                      					
                     }
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElement(grammarAccess.getUiExposedActionRule());
-                      	        }
-                             		setWithLastConsumed(
-                             			current, 
-                             			"actionID",
-                              		lv_actionID_5_0, 
-                              		"STRING");
-                      	    
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getUiExposedActionRule());
+                      						}
+                      						setWithLastConsumed(
+                      							current,
+                      							"actionID",
+                      							lv_actionID_5_0,
+                      							"org.eclipse.xtext.xbase.Xtype.STRING");
+                      					
                     }
 
                     }
@@ -6744,112 +7351,112 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2360:3: ( (lv_checkDirty_6_0= 'checkDirty' ) )?
-            int alt40=2;
-            int LA40_0 = input.LA(1);
-
-            if ( (LA40_0==57) ) {
-                alt40=1;
-            }
-            switch (alt40) {
-                case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2361:1: (lv_checkDirty_6_0= 'checkDirty' )
-                    {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2361:1: (lv_checkDirty_6_0= 'checkDirty' )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2362:3: lv_checkDirty_6_0= 'checkDirty'
-                    {
-                    lv_checkDirty_6_0=(Token)match(input,57,FollowSets000.FOLLOW_57_in_ruleUiExposedAction5197); if (state.failed) return current;
-                    if ( state.backtracking==0 ) {
-
-                              newLeafNode(lv_checkDirty_6_0, grammarAccess.getUiExposedActionAccess().getCheckDirtyCheckDirtyKeyword_4_0());
-                          
-                    }
-                    if ( state.backtracking==0 ) {
-
-                      	        if (current==null) {
-                      	            current = createModelElement(grammarAccess.getUiExposedActionRule());
-                      	        }
-                             		setWithLastConsumed(current, "checkDirty", true, "checkDirty");
-                      	    
-                    }
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2375:3: (otherlv_7= 'externalCommand' ( (lv_externalCommandId_8_0= RULE_STRING ) ) )?
-            int alt41=2;
-            int LA41_0 = input.LA(1);
-
-            if ( (LA41_0==58) ) {
-                alt41=1;
-            }
-            switch (alt41) {
-                case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2375:5: otherlv_7= 'externalCommand' ( (lv_externalCommandId_8_0= RULE_STRING ) )
-                    {
-                    otherlv_7=(Token)match(input,58,FollowSets000.FOLLOW_58_in_ruleUiExposedAction5224); if (state.failed) return current;
-                    if ( state.backtracking==0 ) {
-
-                          	newLeafNode(otherlv_7, grammarAccess.getUiExposedActionAccess().getExternalCommandKeyword_5_0());
-                          
-                    }
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2379:1: ( (lv_externalCommandId_8_0= RULE_STRING ) )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2380:1: (lv_externalCommandId_8_0= RULE_STRING )
-                    {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2380:1: (lv_externalCommandId_8_0= RULE_STRING )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2381:3: lv_externalCommandId_8_0= RULE_STRING
-                    {
-                    lv_externalCommandId_8_0=(Token)match(input,RULE_STRING,FollowSets000.FOLLOW_RULE_STRING_in_ruleUiExposedAction5241); if (state.failed) return current;
-                    if ( state.backtracking==0 ) {
-
-                      			newLeafNode(lv_externalCommandId_8_0, grammarAccess.getUiExposedActionAccess().getExternalCommandIdSTRINGTerminalRuleCall_5_1_0()); 
-                      		
-                    }
-                    if ( state.backtracking==0 ) {
-
-                      	        if (current==null) {
-                      	            current = createModelElement(grammarAccess.getUiExposedActionRule());
-                      	        }
-                             		setWithLastConsumed(
-                             			current, 
-                             			"externalCommandId",
-                              		lv_externalCommandId_8_0, 
-                              		"STRING");
-                      	    
-                    }
-
-                    }
-
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2397:4: (otherlv_9= ';' )?
+            // InternalUIGrammar.g:2613:3: ( (lv_checkDirty_6_0= 'checkDirty' ) )?
             int alt42=2;
             int LA42_0 = input.LA(1);
 
-            if ( (LA42_0==15) ) {
+            if ( (LA42_0==57) ) {
                 alt42=1;
             }
             switch (alt42) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2397:6: otherlv_9= ';'
+                    // InternalUIGrammar.g:2614:4: (lv_checkDirty_6_0= 'checkDirty' )
                     {
-                    otherlv_9=(Token)match(input,15,FollowSets000.FOLLOW_15_in_ruleUiExposedAction5261); if (state.failed) return current;
+                    // InternalUIGrammar.g:2614:4: (lv_checkDirty_6_0= 'checkDirty' )
+                    // InternalUIGrammar.g:2615:5: lv_checkDirty_6_0= 'checkDirty'
+                    {
+                    lv_checkDirty_6_0=(Token)match(input,57,FOLLOW_48); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_9, grammarAccess.getUiExposedActionAccess().getSemicolonKeyword_6());
-                          
+                      					newLeafNode(lv_checkDirty_6_0, grammarAccess.getUiExposedActionAccess().getCheckDirtyCheckDirtyKeyword_4_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiExposedActionRule());
+                      					}
+                      					setWithLastConsumed(current, "checkDirty", true, "checkDirty");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:2627:3: (otherlv_7= 'externalCommand' ( (lv_externalCommandId_8_0= RULE_STRING ) ) )?
+            int alt43=2;
+            int LA43_0 = input.LA(1);
+
+            if ( (LA43_0==58) ) {
+                alt43=1;
+            }
+            switch (alt43) {
+                case 1 :
+                    // InternalUIGrammar.g:2628:4: otherlv_7= 'externalCommand' ( (lv_externalCommandId_8_0= RULE_STRING ) )
+                    {
+                    otherlv_7=(Token)match(input,58,FOLLOW_18); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_7, grammarAccess.getUiExposedActionAccess().getExternalCommandKeyword_5_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:2632:4: ( (lv_externalCommandId_8_0= RULE_STRING ) )
+                    // InternalUIGrammar.g:2633:5: (lv_externalCommandId_8_0= RULE_STRING )
+                    {
+                    // InternalUIGrammar.g:2633:5: (lv_externalCommandId_8_0= RULE_STRING )
+                    // InternalUIGrammar.g:2634:6: lv_externalCommandId_8_0= RULE_STRING
+                    {
+                    lv_externalCommandId_8_0=(Token)match(input,RULE_STRING,FOLLOW_8); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_externalCommandId_8_0, grammarAccess.getUiExposedActionAccess().getExternalCommandIdSTRINGTerminalRuleCall_5_1_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getUiExposedActionRule());
+                      						}
+                      						setWithLastConsumed(
+                      							current,
+                      							"externalCommandId",
+                      							lv_externalCommandId_8_0,
+                      							"org.eclipse.xtext.xbase.Xtype.STRING");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:2651:3: (otherlv_9= ';' )?
+            int alt44=2;
+            int LA44_0 = input.LA(1);
+
+            if ( (LA44_0==16) ) {
+                alt44=1;
+            }
+            switch (alt44) {
+                case 1 :
+                    // InternalUIGrammar.g:2652:4: otherlv_9= ';'
+                    {
+                    otherlv_9=(Token)match(input,16,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_9, grammarAccess.getUiExposedActionAccess().getSemicolonKeyword_6());
+                      			
                     }
 
                     }
@@ -6864,14 +7471,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -6880,7 +7489,7 @@
 
 
     // $ANTLR start "entryRuleUiMobileNavBarAction"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2409:1: entryRuleUiMobileNavBarAction returns [EObject current=null] : iv_ruleUiMobileNavBarAction= ruleUiMobileNavBarAction EOF ;
+    // InternalUIGrammar.g:2661:1: entryRuleUiMobileNavBarAction returns [EObject current=null] : iv_ruleUiMobileNavBarAction= ruleUiMobileNavBarAction EOF ;
     public final EObject entryRuleUiMobileNavBarAction() throws RecognitionException {
         EObject current = null;
 
@@ -6888,13 +7497,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2410:2: (iv_ruleUiMobileNavBarAction= ruleUiMobileNavBarAction EOF )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2411:2: iv_ruleUiMobileNavBarAction= ruleUiMobileNavBarAction EOF
+            // InternalUIGrammar.g:2661:61: (iv_ruleUiMobileNavBarAction= ruleUiMobileNavBarAction EOF )
+            // InternalUIGrammar.g:2662:2: iv_ruleUiMobileNavBarAction= ruleUiMobileNavBarAction EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUiMobileNavBarActionRule()); 
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiMobileNavBarAction_in_entryRuleUiMobileNavBarAction5299);
+            pushFollow(FOLLOW_1);
             iv_ruleUiMobileNavBarAction=ruleUiMobileNavBarAction();
 
             state._fsp--;
@@ -6902,16 +7511,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUiMobileNavBarAction; 
             }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiMobileNavBarAction5309); 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;
@@ -6920,7 +7529,7 @@
 
 
     // $ANTLR start "ruleUiMobileNavBarAction"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2418:1: ruleUiMobileNavBarAction returns [EObject current=null] : ( ( (lv_name_0_0= RULE_ID ) ) (otherlv_1= 'icon' ( (lv_iconName_2_0= RULE_STRING ) ) )? otherlv_3= 'id' ( ( ( ( ruleQualifiedName ) )=> ( ruleQualifiedName ) ) | ( (lv_actionID_5_0= RULE_STRING ) ) ) (otherlv_6= ';' )? ) ;
+    // InternalUIGrammar.g:2668:1: ruleUiMobileNavBarAction returns [EObject current=null] : ( ( (lv_name_0_0= RULE_ID ) ) (otherlv_1= 'icon' ( (lv_iconName_2_0= RULE_STRING ) ) )? otherlv_3= 'id' ( ( ( ( ruleQualifiedName ) )=> ( ruleQualifiedName ) ) | ( (lv_actionID_5_0= RULE_STRING ) ) ) (otherlv_6= ';' )? ) ;
     public final EObject ruleUiMobileNavBarAction() throws RecognitionException {
         EObject current = null;
 
@@ -6931,38 +7540,39 @@
         Token lv_actionID_5_0=null;
         Token otherlv_6=null;
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2421:28: ( ( ( (lv_name_0_0= RULE_ID ) ) (otherlv_1= 'icon' ( (lv_iconName_2_0= RULE_STRING ) ) )? otherlv_3= 'id' ( ( ( ( ruleQualifiedName ) )=> ( ruleQualifiedName ) ) | ( (lv_actionID_5_0= RULE_STRING ) ) ) (otherlv_6= ';' )? ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2422:1: ( ( (lv_name_0_0= RULE_ID ) ) (otherlv_1= 'icon' ( (lv_iconName_2_0= RULE_STRING ) ) )? otherlv_3= 'id' ( ( ( ( ruleQualifiedName ) )=> ( ruleQualifiedName ) ) | ( (lv_actionID_5_0= RULE_STRING ) ) ) (otherlv_6= ';' )? )
+            // InternalUIGrammar.g:2674:2: ( ( ( (lv_name_0_0= RULE_ID ) ) (otherlv_1= 'icon' ( (lv_iconName_2_0= RULE_STRING ) ) )? otherlv_3= 'id' ( ( ( ( ruleQualifiedName ) )=> ( ruleQualifiedName ) ) | ( (lv_actionID_5_0= RULE_STRING ) ) ) (otherlv_6= ';' )? ) )
+            // InternalUIGrammar.g:2675:2: ( ( (lv_name_0_0= RULE_ID ) ) (otherlv_1= 'icon' ( (lv_iconName_2_0= RULE_STRING ) ) )? otherlv_3= 'id' ( ( ( ( ruleQualifiedName ) )=> ( ruleQualifiedName ) ) | ( (lv_actionID_5_0= RULE_STRING ) ) ) (otherlv_6= ';' )? )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2422:1: ( ( (lv_name_0_0= RULE_ID ) ) (otherlv_1= 'icon' ( (lv_iconName_2_0= RULE_STRING ) ) )? otherlv_3= 'id' ( ( ( ( ruleQualifiedName ) )=> ( ruleQualifiedName ) ) | ( (lv_actionID_5_0= RULE_STRING ) ) ) (otherlv_6= ';' )? )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2422:2: ( (lv_name_0_0= RULE_ID ) ) (otherlv_1= 'icon' ( (lv_iconName_2_0= RULE_STRING ) ) )? otherlv_3= 'id' ( ( ( ( ruleQualifiedName ) )=> ( ruleQualifiedName ) ) | ( (lv_actionID_5_0= RULE_STRING ) ) ) (otherlv_6= ';' )?
+            // InternalUIGrammar.g:2675:2: ( ( (lv_name_0_0= RULE_ID ) ) (otherlv_1= 'icon' ( (lv_iconName_2_0= RULE_STRING ) ) )? otherlv_3= 'id' ( ( ( ( ruleQualifiedName ) )=> ( ruleQualifiedName ) ) | ( (lv_actionID_5_0= RULE_STRING ) ) ) (otherlv_6= ';' )? )
+            // InternalUIGrammar.g:2676:3: ( (lv_name_0_0= RULE_ID ) ) (otherlv_1= 'icon' ( (lv_iconName_2_0= RULE_STRING ) ) )? otherlv_3= 'id' ( ( ( ( ruleQualifiedName ) )=> ( ruleQualifiedName ) ) | ( (lv_actionID_5_0= RULE_STRING ) ) ) (otherlv_6= ';' )?
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2422:2: ( (lv_name_0_0= RULE_ID ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2423:1: (lv_name_0_0= RULE_ID )
+            // InternalUIGrammar.g:2676:3: ( (lv_name_0_0= RULE_ID ) )
+            // InternalUIGrammar.g:2677:4: (lv_name_0_0= RULE_ID )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2423:1: (lv_name_0_0= RULE_ID )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2424:3: lv_name_0_0= RULE_ID
+            // InternalUIGrammar.g:2677:4: (lv_name_0_0= RULE_ID )
+            // InternalUIGrammar.g:2678:5: lv_name_0_0= RULE_ID
             {
-            lv_name_0_0=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_RULE_ID_in_ruleUiMobileNavBarAction5351); if (state.failed) return current;
+            lv_name_0_0=(Token)match(input,RULE_ID,FOLLOW_44); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              			newLeafNode(lv_name_0_0, grammarAccess.getUiMobileNavBarActionAccess().getNameIDTerminalRuleCall_0_0()); 
-              		
+              					newLeafNode(lv_name_0_0, grammarAccess.getUiMobileNavBarActionAccess().getNameIDTerminalRuleCall_0_0());
+              				
             }
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElement(grammarAccess.getUiMobileNavBarActionRule());
-              	        }
-                     		setWithLastConsumed(
-                     			current, 
-                     			"name",
-                      		lv_name_0_0, 
-                      		"ID");
-              	    
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getUiMobileNavBarActionRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"name",
+              						lv_name_0_0,
+              						"org.eclipse.xtext.xbase.Xtype.ID");
+              				
             }
 
             }
@@ -6970,46 +7580,46 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2440:2: (otherlv_1= 'icon' ( (lv_iconName_2_0= RULE_STRING ) ) )?
-            int alt43=2;
-            int LA43_0 = input.LA(1);
+            // InternalUIGrammar.g:2694:3: (otherlv_1= 'icon' ( (lv_iconName_2_0= RULE_STRING ) ) )?
+            int alt45=2;
+            int LA45_0 = input.LA(1);
 
-            if ( (LA43_0==55) ) {
-                alt43=1;
+            if ( (LA45_0==55) ) {
+                alt45=1;
             }
-            switch (alt43) {
+            switch (alt45) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2440:4: otherlv_1= 'icon' ( (lv_iconName_2_0= RULE_STRING ) )
+                    // InternalUIGrammar.g:2695:4: otherlv_1= 'icon' ( (lv_iconName_2_0= RULE_STRING ) )
                     {
-                    otherlv_1=(Token)match(input,55,FollowSets000.FOLLOW_55_in_ruleUiMobileNavBarAction5369); if (state.failed) return current;
+                    otherlv_1=(Token)match(input,55,FOLLOW_18); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_1, grammarAccess.getUiMobileNavBarActionAccess().getIconKeyword_1_0());
-                          
+                      				newLeafNode(otherlv_1, grammarAccess.getUiMobileNavBarActionAccess().getIconKeyword_1_0());
+                      			
                     }
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2444:1: ( (lv_iconName_2_0= RULE_STRING ) )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2445:1: (lv_iconName_2_0= RULE_STRING )
+                    // InternalUIGrammar.g:2699:4: ( (lv_iconName_2_0= RULE_STRING ) )
+                    // InternalUIGrammar.g:2700:5: (lv_iconName_2_0= RULE_STRING )
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2445:1: (lv_iconName_2_0= RULE_STRING )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2446:3: lv_iconName_2_0= RULE_STRING
+                    // InternalUIGrammar.g:2700:5: (lv_iconName_2_0= RULE_STRING )
+                    // InternalUIGrammar.g:2701:6: lv_iconName_2_0= RULE_STRING
                     {
-                    lv_iconName_2_0=(Token)match(input,RULE_STRING,FollowSets000.FOLLOW_RULE_STRING_in_ruleUiMobileNavBarAction5386); if (state.failed) return current;
+                    lv_iconName_2_0=(Token)match(input,RULE_STRING,FOLLOW_45); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      			newLeafNode(lv_iconName_2_0, grammarAccess.getUiMobileNavBarActionAccess().getIconNameSTRINGTerminalRuleCall_1_1_0()); 
-                      		
+                      						newLeafNode(lv_iconName_2_0, grammarAccess.getUiMobileNavBarActionAccess().getIconNameSTRINGTerminalRuleCall_1_1_0());
+                      					
                     }
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElement(grammarAccess.getUiMobileNavBarActionRule());
-                      	        }
-                             		setWithLastConsumed(
-                             			current, 
-                             			"iconName",
-                              		lv_iconName_2_0, 
-                              		"STRING");
-                      	    
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getUiMobileNavBarActionRule());
+                      						}
+                      						setWithLastConsumed(
+                      							current,
+                      							"iconName",
+                      							lv_iconName_2_0,
+                      							"org.eclipse.xtext.xbase.Xtype.STRING");
+                      					
                     }
 
                     }
@@ -7023,60 +7633,60 @@
 
             }
 
-            otherlv_3=(Token)match(input,56,FollowSets000.FOLLOW_56_in_ruleUiMobileNavBarAction5405); if (state.failed) return current;
+            otherlv_3=(Token)match(input,56,FOLLOW_46); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_3, grammarAccess.getUiMobileNavBarActionAccess().getIdKeyword_2());
-                  
+              			newLeafNode(otherlv_3, grammarAccess.getUiMobileNavBarActionAccess().getIdKeyword_2());
+              		
             }
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2466:1: ( ( ( ( ruleQualifiedName ) )=> ( ruleQualifiedName ) ) | ( (lv_actionID_5_0= RULE_STRING ) ) )
-            int alt44=2;
-            int LA44_0 = input.LA(1);
+            // InternalUIGrammar.g:2722:3: ( ( ( ( ruleQualifiedName ) )=> ( ruleQualifiedName ) ) | ( (lv_actionID_5_0= RULE_STRING ) ) )
+            int alt46=2;
+            int LA46_0 = input.LA(1);
 
-            if ( (LA44_0==RULE_ID) && (synpred2_InternalUIGrammar())) {
-                alt44=1;
+            if ( (LA46_0==RULE_ID) && (synpred2_InternalUIGrammar())) {
+                alt46=1;
             }
-            else if ( (LA44_0==RULE_STRING) ) {
-                alt44=2;
+            else if ( (LA46_0==RULE_STRING) ) {
+                alt46=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 44, 0, input);
+                    new NoViableAltException("", 46, 0, input);
 
                 throw nvae;
             }
-            switch (alt44) {
+            switch (alt46) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2466:2: ( ( ( ruleQualifiedName ) )=> ( ruleQualifiedName ) )
+                    // InternalUIGrammar.g:2723:4: ( ( ( ruleQualifiedName ) )=> ( ruleQualifiedName ) )
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2466:2: ( ( ( ruleQualifiedName ) )=> ( ruleQualifiedName ) )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2466:3: ( ( ruleQualifiedName ) )=> ( ruleQualifiedName )
+                    // InternalUIGrammar.g:2723:4: ( ( ( ruleQualifiedName ) )=> ( ruleQualifiedName ) )
+                    // InternalUIGrammar.g:2724:5: ( ( ruleQualifiedName ) )=> ( ruleQualifiedName )
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2471:1: ( ruleQualifiedName )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2472:3: ruleQualifiedName
+                    // InternalUIGrammar.g:2728:5: ( ruleQualifiedName )
+                    // InternalUIGrammar.g:2729:6: ruleQualifiedName
                     {
                     if ( state.backtracking==0 ) {
 
-                      			if (current==null) {
-                      	            current = createModelElement(grammarAccess.getUiMobileNavBarActionRule());
-                      	        }
-                              
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getUiMobileNavBarActionRule());
+                      						}
+                      					
                     }
                     if ( state.backtracking==0 ) {
-                       
-                      	        newCompositeNode(grammarAccess.getUiMobileNavBarActionAccess().getActionReferenceUxActionCrossReference_3_0_0()); 
-                      	    
+
+                      						newCompositeNode(grammarAccess.getUiMobileNavBarActionAccess().getActionReferenceUxActionCrossReference_3_0_0());
+                      					
                     }
-                    pushFollow(FollowSets000.FOLLOW_ruleQualifiedName_in_ruleUiMobileNavBarAction5441);
+                    pushFollow(FOLLOW_8);
                     ruleQualifiedName();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                      	        afterParserOrEnumRuleCall();
-                      	    
+
+                      						afterParserOrEnumRuleCall();
+                      					
                     }
 
                     }
@@ -7088,31 +7698,31 @@
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2486:6: ( (lv_actionID_5_0= RULE_STRING ) )
+                    // InternalUIGrammar.g:2744:4: ( (lv_actionID_5_0= RULE_STRING ) )
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2486:6: ( (lv_actionID_5_0= RULE_STRING ) )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2487:1: (lv_actionID_5_0= RULE_STRING )
+                    // InternalUIGrammar.g:2744:4: ( (lv_actionID_5_0= RULE_STRING ) )
+                    // InternalUIGrammar.g:2745:5: (lv_actionID_5_0= RULE_STRING )
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2487:1: (lv_actionID_5_0= RULE_STRING )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2488:3: lv_actionID_5_0= RULE_STRING
+                    // InternalUIGrammar.g:2745:5: (lv_actionID_5_0= RULE_STRING )
+                    // InternalUIGrammar.g:2746:6: lv_actionID_5_0= RULE_STRING
                     {
-                    lv_actionID_5_0=(Token)match(input,RULE_STRING,FollowSets000.FOLLOW_RULE_STRING_in_ruleUiMobileNavBarAction5464); if (state.failed) return current;
+                    lv_actionID_5_0=(Token)match(input,RULE_STRING,FOLLOW_8); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      			newLeafNode(lv_actionID_5_0, grammarAccess.getUiMobileNavBarActionAccess().getActionIDSTRINGTerminalRuleCall_3_1_0()); 
-                      		
+                      						newLeafNode(lv_actionID_5_0, grammarAccess.getUiMobileNavBarActionAccess().getActionIDSTRINGTerminalRuleCall_3_1_0());
+                      					
                     }
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElement(grammarAccess.getUiMobileNavBarActionRule());
-                      	        }
-                             		setWithLastConsumed(
-                             			current, 
-                             			"actionID",
-                              		lv_actionID_5_0, 
-                              		"STRING");
-                      	    
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getUiMobileNavBarActionRule());
+                      						}
+                      						setWithLastConsumed(
+                      							current,
+                      							"actionID",
+                      							lv_actionID_5_0,
+                      							"org.eclipse.xtext.xbase.Xtype.STRING");
+                      					
                     }
 
                     }
@@ -7126,22 +7736,22 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2504:3: (otherlv_6= ';' )?
-            int alt45=2;
-            int LA45_0 = input.LA(1);
+            // InternalUIGrammar.g:2763:3: (otherlv_6= ';' )?
+            int alt47=2;
+            int LA47_0 = input.LA(1);
 
-            if ( (LA45_0==15) ) {
-                alt45=1;
+            if ( (LA47_0==16) ) {
+                alt47=1;
             }
-            switch (alt45) {
+            switch (alt47) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2504:5: otherlv_6= ';'
+                    // InternalUIGrammar.g:2764:4: otherlv_6= ';'
                     {
-                    otherlv_6=(Token)match(input,15,FollowSets000.FOLLOW_15_in_ruleUiMobileNavBarAction5483); if (state.failed) return current;
+                    otherlv_6=(Token)match(input,16,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_6, grammarAccess.getUiMobileNavBarActionAccess().getSemicolonKeyword_4());
-                          
+                      				newLeafNode(otherlv_6, grammarAccess.getUiMobileNavBarActionAccess().getSemicolonKeyword_4());
+                      			
                     }
 
                     }
@@ -7156,14 +7766,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -7172,7 +7784,7 @@
 
 
     // $ANTLR start "entryRuleUiMobileView"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2516:1: entryRuleUiMobileView returns [EObject current=null] : iv_ruleUiMobileView= ruleUiMobileView EOF ;
+    // InternalUIGrammar.g:2773:1: entryRuleUiMobileView returns [EObject current=null] : iv_ruleUiMobileView= ruleUiMobileView EOF ;
     public final EObject entryRuleUiMobileView() throws RecognitionException {
         EObject current = null;
 
@@ -7180,13 +7792,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2517:2: (iv_ruleUiMobileView= ruleUiMobileView EOF )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2518:2: iv_ruleUiMobileView= ruleUiMobileView EOF
+            // InternalUIGrammar.g:2773:53: (iv_ruleUiMobileView= ruleUiMobileView EOF )
+            // InternalUIGrammar.g:2774:2: iv_ruleUiMobileView= ruleUiMobileView EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUiMobileViewRule()); 
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiMobileView_in_entryRuleUiMobileView5521);
+            pushFollow(FOLLOW_1);
             iv_ruleUiMobileView=ruleUiMobileView();
 
             state._fsp--;
@@ -7194,16 +7806,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUiMobileView; 
             }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiMobileView5531); 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;
@@ -7212,7 +7824,7 @@
 
 
     // $ANTLR start "ruleUiMobileView"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2525:1: ruleUiMobileView returns [EObject current=null] : (otherlv_0= 'mobile' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )? ) ) ) ) )* ) ) ) ( ( (lv_beanSlots_10_0= ruleUiBeanSlot ) ) | ( (lv_bindingEndpointAlias_11_0= ruleUiBindingEndpointAlias ) ) )* ( (lv_content_12_0= ruleUiMobileEmbeddable ) ) (otherlv_13= 'align' ( (lv_contentAlignment_14_0= ruleUiAlignment ) ) )? ( ( (lv_bindingEndpointAlias_15_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_16_0= ruleUiBinding ) ) | ( (lv_validatorAssignments_17_0= ruleUiValidatorAssignment ) ) | ( (lv_processorAssignments_18_0= ruleUiVisibilityProcessorAssignment ) ) )* otherlv_19= '}' ) ;
+    // InternalUIGrammar.g:2780:1: ruleUiMobileView returns [EObject current=null] : (otherlv_0= 'mobile' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )? ) ) ) ) )* ) ) ) ( ( (lv_beanSlots_10_0= ruleUiBeanSlot ) ) | ( (lv_bindingEndpointAlias_11_0= ruleUiBindingEndpointAlias ) ) )* ( (lv_content_12_0= ruleUiMobileEmbeddable ) ) (otherlv_13= 'align' ( (lv_contentAlignment_14_0= ruleUiAlignment ) ) )? ( ( (lv_bindingEndpointAlias_15_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_16_0= ruleUiBinding ) ) | ( (lv_validatorAssignments_17_0= ruleUiValidatorAssignment ) ) | ( (lv_processorAssignments_18_0= ruleUiVisibilityProcessorAssignment ) ) )* otherlv_19= '}' ) ;
     public final EObject ruleUiMobileView() throws RecognitionException {
         EObject current = null;
 
@@ -7245,135 +7857,136 @@
         EObject lv_processorAssignments_18_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2528:28: ( (otherlv_0= 'mobile' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )? ) ) ) ) )* ) ) ) ( ( (lv_beanSlots_10_0= ruleUiBeanSlot ) ) | ( (lv_bindingEndpointAlias_11_0= ruleUiBindingEndpointAlias ) ) )* ( (lv_content_12_0= ruleUiMobileEmbeddable ) ) (otherlv_13= 'align' ( (lv_contentAlignment_14_0= ruleUiAlignment ) ) )? ( ( (lv_bindingEndpointAlias_15_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_16_0= ruleUiBinding ) ) | ( (lv_validatorAssignments_17_0= ruleUiValidatorAssignment ) ) | ( (lv_processorAssignments_18_0= ruleUiVisibilityProcessorAssignment ) ) )* otherlv_19= '}' ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2529:1: (otherlv_0= 'mobile' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )? ) ) ) ) )* ) ) ) ( ( (lv_beanSlots_10_0= ruleUiBeanSlot ) ) | ( (lv_bindingEndpointAlias_11_0= ruleUiBindingEndpointAlias ) ) )* ( (lv_content_12_0= ruleUiMobileEmbeddable ) ) (otherlv_13= 'align' ( (lv_contentAlignment_14_0= ruleUiAlignment ) ) )? ( ( (lv_bindingEndpointAlias_15_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_16_0= ruleUiBinding ) ) | ( (lv_validatorAssignments_17_0= ruleUiValidatorAssignment ) ) | ( (lv_processorAssignments_18_0= ruleUiVisibilityProcessorAssignment ) ) )* otherlv_19= '}' )
+            // InternalUIGrammar.g:2786:2: ( (otherlv_0= 'mobile' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )? ) ) ) ) )* ) ) ) ( ( (lv_beanSlots_10_0= ruleUiBeanSlot ) ) | ( (lv_bindingEndpointAlias_11_0= ruleUiBindingEndpointAlias ) ) )* ( (lv_content_12_0= ruleUiMobileEmbeddable ) ) (otherlv_13= 'align' ( (lv_contentAlignment_14_0= ruleUiAlignment ) ) )? ( ( (lv_bindingEndpointAlias_15_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_16_0= ruleUiBinding ) ) | ( (lv_validatorAssignments_17_0= ruleUiValidatorAssignment ) ) | ( (lv_processorAssignments_18_0= ruleUiVisibilityProcessorAssignment ) ) )* otherlv_19= '}' ) )
+            // InternalUIGrammar.g:2787:2: (otherlv_0= 'mobile' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )? ) ) ) ) )* ) ) ) ( ( (lv_beanSlots_10_0= ruleUiBeanSlot ) ) | ( (lv_bindingEndpointAlias_11_0= ruleUiBindingEndpointAlias ) ) )* ( (lv_content_12_0= ruleUiMobileEmbeddable ) ) (otherlv_13= 'align' ( (lv_contentAlignment_14_0= ruleUiAlignment ) ) )? ( ( (lv_bindingEndpointAlias_15_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_16_0= ruleUiBinding ) ) | ( (lv_validatorAssignments_17_0= ruleUiValidatorAssignment ) ) | ( (lv_processorAssignments_18_0= ruleUiVisibilityProcessorAssignment ) ) )* otherlv_19= '}' )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2529:1: (otherlv_0= 'mobile' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )? ) ) ) ) )* ) ) ) ( ( (lv_beanSlots_10_0= ruleUiBeanSlot ) ) | ( (lv_bindingEndpointAlias_11_0= ruleUiBindingEndpointAlias ) ) )* ( (lv_content_12_0= ruleUiMobileEmbeddable ) ) (otherlv_13= 'align' ( (lv_contentAlignment_14_0= ruleUiAlignment ) ) )? ( ( (lv_bindingEndpointAlias_15_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_16_0= ruleUiBinding ) ) | ( (lv_validatorAssignments_17_0= ruleUiValidatorAssignment ) ) | ( (lv_processorAssignments_18_0= ruleUiVisibilityProcessorAssignment ) ) )* otherlv_19= '}' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2529:3: otherlv_0= 'mobile' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )? ) ) ) ) )* ) ) ) ( ( (lv_beanSlots_10_0= ruleUiBeanSlot ) ) | ( (lv_bindingEndpointAlias_11_0= ruleUiBindingEndpointAlias ) ) )* ( (lv_content_12_0= ruleUiMobileEmbeddable ) ) (otherlv_13= 'align' ( (lv_contentAlignment_14_0= ruleUiAlignment ) ) )? ( ( (lv_bindingEndpointAlias_15_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_16_0= ruleUiBinding ) ) | ( (lv_validatorAssignments_17_0= ruleUiValidatorAssignment ) ) | ( (lv_processorAssignments_18_0= ruleUiVisibilityProcessorAssignment ) ) )* otherlv_19= '}'
+            // InternalUIGrammar.g:2787:2: (otherlv_0= 'mobile' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )? ) ) ) ) )* ) ) ) ( ( (lv_beanSlots_10_0= ruleUiBeanSlot ) ) | ( (lv_bindingEndpointAlias_11_0= ruleUiBindingEndpointAlias ) ) )* ( (lv_content_12_0= ruleUiMobileEmbeddable ) ) (otherlv_13= 'align' ( (lv_contentAlignment_14_0= ruleUiAlignment ) ) )? ( ( (lv_bindingEndpointAlias_15_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_16_0= ruleUiBinding ) ) | ( (lv_validatorAssignments_17_0= ruleUiValidatorAssignment ) ) | ( (lv_processorAssignments_18_0= ruleUiVisibilityProcessorAssignment ) ) )* otherlv_19= '}' )
+            // InternalUIGrammar.g:2788:3: otherlv_0= 'mobile' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )? ) ) ) ) )* ) ) ) ( ( (lv_beanSlots_10_0= ruleUiBeanSlot ) ) | ( (lv_bindingEndpointAlias_11_0= ruleUiBindingEndpointAlias ) ) )* ( (lv_content_12_0= ruleUiMobileEmbeddable ) ) (otherlv_13= 'align' ( (lv_contentAlignment_14_0= ruleUiAlignment ) ) )? ( ( (lv_bindingEndpointAlias_15_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_16_0= ruleUiBinding ) ) | ( (lv_validatorAssignments_17_0= ruleUiValidatorAssignment ) ) | ( (lv_processorAssignments_18_0= ruleUiVisibilityProcessorAssignment ) ) )* otherlv_19= '}'
             {
-            otherlv_0=(Token)match(input,59,FollowSets000.FOLLOW_59_in_ruleUiMobileView5568); if (state.failed) return current;
+            otherlv_0=(Token)match(input,59,FOLLOW_3); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getUiMobileViewAccess().getMobileKeyword_0());
-                  
-            }
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2533:1: ( (lv_name_1_0= RULE_ID ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2534:1: (lv_name_1_0= RULE_ID )
-            {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2534:1: (lv_name_1_0= RULE_ID )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2535:3: lv_name_1_0= RULE_ID
-            {
-            lv_name_1_0=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_RULE_ID_in_ruleUiMobileView5585); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-              			newLeafNode(lv_name_1_0, grammarAccess.getUiMobileViewAccess().getNameIDTerminalRuleCall_1_0()); 
+              			newLeafNode(otherlv_0, grammarAccess.getUiMobileViewAccess().getMobileKeyword_0());
               		
             }
-            if ( state.backtracking==0 ) {
-
-              	        if (current==null) {
-              	            current = createModelElement(grammarAccess.getUiMobileViewRule());
-              	        }
-                     		setWithLastConsumed(
-                     			current, 
-                     			"name",
-                      		lv_name_1_0, 
-                      		"ID");
-              	    
-            }
-
-            }
-
-
-            }
-
-            otherlv_2=(Token)match(input,21,FollowSets000.FOLLOW_21_in_ruleUiMobileView5602); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-                  	newLeafNode(otherlv_2, grammarAccess.getUiMobileViewAccess().getLeftCurlyBracketKeyword_2());
-                  
-            }
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2555:1: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )? ) ) ) ) )* ) ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2557:1: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )? ) ) ) ) )* ) )
+            // InternalUIGrammar.g:2792:3: ( (lv_name_1_0= RULE_ID ) )
+            // InternalUIGrammar.g:2793:4: (lv_name_1_0= RULE_ID )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2557:1: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )? ) ) ) ) )* ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2558:2: ( ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )? ) ) ) ) )* )
+            // InternalUIGrammar.g:2793:4: (lv_name_1_0= RULE_ID )
+            // InternalUIGrammar.g:2794:5: lv_name_1_0= RULE_ID
+            {
+            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_11); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_name_1_0, grammarAccess.getUiMobileViewAccess().getNameIDTerminalRuleCall_1_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getUiMobileViewRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"name",
+              						lv_name_1_0,
+              						"org.eclipse.xtext.xbase.Xtype.ID");
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,20,FOLLOW_49); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getUiMobileViewAccess().getLeftCurlyBracketKeyword_2());
+              		
+            }
+            // InternalUIGrammar.g:2814:3: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )? ) ) ) ) )* ) ) )
+            // InternalUIGrammar.g:2815:4: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )? ) ) ) ) )* ) )
+            {
+            // InternalUIGrammar.g:2815:4: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )? ) ) ) ) )* ) )
+            // InternalUIGrammar.g:2816:5: ( ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )? ) ) ) ) )* )
             {
             getUnorderedGroupHelper().enter(grammarAccess.getUiMobileViewAccess().getUnorderedGroup_3());
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2561:2: ( ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )? ) ) ) ) )* )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2562:3: ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )? ) ) ) ) )*
+            // InternalUIGrammar.g:2819:5: ( ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )? ) ) ) ) )* )
+            // InternalUIGrammar.g:2820:6: ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )? ) ) ) ) )*
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2562:3: ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )? ) ) ) ) )*
-            loop48:
+            // InternalUIGrammar.g:2820:6: ( ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )? ) ) ) ) )*
+            loop50:
             do {
-                int alt48=3;
-                int LA48_0 = input.LA(1);
+                int alt50=3;
+                int LA50_0 = input.LA(1);
 
-                if ( LA48_0 ==50 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileViewAccess().getUnorderedGroup_3(), 0) ) {
-                    alt48=1;
+                if ( LA50_0 == 49 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileViewAccess().getUnorderedGroup_3(), 0) ) {
+                    alt50=1;
                 }
-                else if ( LA48_0 ==52 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileViewAccess().getUnorderedGroup_3(), 1) ) {
-                    alt48=2;
+                else if ( LA50_0 == 51 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileViewAccess().getUnorderedGroup_3(), 1) ) {
+                    alt50=2;
                 }
 
 
-                switch (alt48) {
+                switch (alt50) {
             	case 1 :
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2564:4: ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) )
+            	    // InternalUIGrammar.g:2821:4: ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) )
             	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2564:4: ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2565:5: {...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) )
+            	    // InternalUIGrammar.g:2821:4: ({...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) ) )
+            	    // InternalUIGrammar.g:2822:5: {...}? => ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) )
             	    {
             	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileViewAccess().getUnorderedGroup_3(), 0) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "ruleUiMobileView", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileViewAccess().getUnorderedGroup_3(), 0)");
             	    }
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2565:109: ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2566:6: ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) )
+            	    // InternalUIGrammar.g:2822:109: ( ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) ) )
+            	    // InternalUIGrammar.g:2823:6: ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) )
             	    {
             	    getUnorderedGroupHelper().select(grammarAccess.getUiMobileViewAccess().getUnorderedGroup_3(), 0);
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2569:6: ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2569:7: {...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? )
+            	    // InternalUIGrammar.g:2826:9: ({...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? ) )
+            	    // InternalUIGrammar.g:2826:10: {...}? => (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? )
             	    {
             	    if ( !((true)) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "ruleUiMobileView", "true");
             	    }
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2569:16: (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2569:18: otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )?
+            	    // InternalUIGrammar.g:2826:19: (otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )? )
+            	    // InternalUIGrammar.g:2826:20: otherlv_4= 'sharedStateGroup' ( (lv_sharedStateGroup_5_0= RULE_STRING ) ) (otherlv_6= ';' )?
             	    {
-            	    otherlv_4=(Token)match(input,50,FollowSets000.FOLLOW_50_in_ruleUiMobileView5660); if (state.failed) return current;
+            	    otherlv_4=(Token)match(input,49,FOLLOW_18); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	          	newLeafNode(otherlv_4, grammarAccess.getUiMobileViewAccess().getSharedStateGroupKeyword_3_0_0());
-            	          
+            	      									newLeafNode(otherlv_4, grammarAccess.getUiMobileViewAccess().getSharedStateGroupKeyword_3_0_0());
+            	      								
             	    }
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2573:1: ( (lv_sharedStateGroup_5_0= RULE_STRING ) )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2574:1: (lv_sharedStateGroup_5_0= RULE_STRING )
+            	    // InternalUIGrammar.g:2830:9: ( (lv_sharedStateGroup_5_0= RULE_STRING ) )
+            	    // InternalUIGrammar.g:2831:10: (lv_sharedStateGroup_5_0= RULE_STRING )
             	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2574:1: (lv_sharedStateGroup_5_0= RULE_STRING )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2575:3: lv_sharedStateGroup_5_0= RULE_STRING
+            	    // InternalUIGrammar.g:2831:10: (lv_sharedStateGroup_5_0= RULE_STRING )
+            	    // InternalUIGrammar.g:2832:11: lv_sharedStateGroup_5_0= RULE_STRING
             	    {
-            	    lv_sharedStateGroup_5_0=(Token)match(input,RULE_STRING,FollowSets000.FOLLOW_RULE_STRING_in_ruleUiMobileView5677); if (state.failed) return current;
+            	    lv_sharedStateGroup_5_0=(Token)match(input,RULE_STRING,FOLLOW_50); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      			newLeafNode(lv_sharedStateGroup_5_0, grammarAccess.getUiMobileViewAccess().getSharedStateGroupSTRINGTerminalRuleCall_3_0_1_0()); 
-            	      		
+            	      											newLeafNode(lv_sharedStateGroup_5_0, grammarAccess.getUiMobileViewAccess().getSharedStateGroupSTRINGTerminalRuleCall_3_0_1_0());
+            	      										
             	    }
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElement(grammarAccess.getUiMobileViewRule());
-            	      	        }
-            	             		setWithLastConsumed(
-            	             			current, 
-            	             			"sharedStateGroup",
-            	              		lv_sharedStateGroup_5_0, 
-            	              		"STRING");
-            	      	    
+            	      											if (current==null) {
+            	      												current = createModelElement(grammarAccess.getUiMobileViewRule());
+            	      											}
+            	      											setWithLastConsumed(
+            	      												current,
+            	      												"sharedStateGroup",
+            	      												lv_sharedStateGroup_5_0,
+            	      												"org.eclipse.xtext.xbase.Xtype.STRING");
+            	      										
             	    }
 
             	    }
@@ -7381,22 +7994,22 @@
 
             	    }
 
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2591:2: (otherlv_6= ';' )?
-            	    int alt46=2;
-            	    int LA46_0 = input.LA(1);
+            	    // InternalUIGrammar.g:2848:9: (otherlv_6= ';' )?
+            	    int alt48=2;
+            	    int LA48_0 = input.LA(1);
 
-            	    if ( (LA46_0==15) ) {
-            	        alt46=1;
+            	    if ( (LA48_0==16) ) {
+            	        alt48=1;
             	    }
-            	    switch (alt46) {
+            	    switch (alt48) {
             	        case 1 :
-            	            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2591:4: otherlv_6= ';'
+            	            // InternalUIGrammar.g:2849:10: otherlv_6= ';'
             	            {
-            	            otherlv_6=(Token)match(input,15,FollowSets000.FOLLOW_15_in_ruleUiMobileView5695); if (state.failed) return current;
+            	            otherlv_6=(Token)match(input,16,FOLLOW_49); if (state.failed) return current;
             	            if ( state.backtracking==0 ) {
 
-            	                  	newLeafNode(otherlv_6, grammarAccess.getUiMobileViewAccess().getSemicolonKeyword_3_0_2());
-            	                  
+            	              										newLeafNode(otherlv_6, grammarAccess.getUiMobileViewAccess().getSemicolonKeyword_3_0_2());
+            	              									
             	            }
 
             	            }
@@ -7421,63 +8034,63 @@
             	    }
             	    break;
             	case 2 :
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2602:4: ({...}? => ( ({...}? => (otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )? ) ) ) )
+            	    // InternalUIGrammar.g:2860:4: ({...}? => ( ({...}? => (otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )? ) ) ) )
             	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2602:4: ({...}? => ( ({...}? => (otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )? ) ) ) )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2603:5: {...}? => ( ({...}? => (otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )? ) ) )
+            	    // InternalUIGrammar.g:2860:4: ({...}? => ( ({...}? => (otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )? ) ) ) )
+            	    // InternalUIGrammar.g:2861:5: {...}? => ( ({...}? => (otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )? ) ) )
             	    {
             	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileViewAccess().getUnorderedGroup_3(), 1) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "ruleUiMobileView", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileViewAccess().getUnorderedGroup_3(), 1)");
             	    }
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2603:109: ( ({...}? => (otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )? ) ) )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2604:6: ({...}? => (otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )? ) )
+            	    // InternalUIGrammar.g:2861:109: ( ({...}? => (otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )? ) ) )
+            	    // InternalUIGrammar.g:2862:6: ({...}? => (otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )? ) )
             	    {
             	    getUnorderedGroupHelper().select(grammarAccess.getUiMobileViewAccess().getUnorderedGroup_3(), 1);
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2607:6: ({...}? => (otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )? ) )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2607:7: {...}? => (otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )? )
+            	    // InternalUIGrammar.g:2865:9: ({...}? => (otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )? ) )
+            	    // InternalUIGrammar.g:2865:10: {...}? => (otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )? )
             	    {
             	    if ( !((true)) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "ruleUiMobileView", "true");
             	    }
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2607:16: (otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )? )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2607:18: otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )?
+            	    // InternalUIGrammar.g:2865:19: (otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )? )
+            	    // InternalUIGrammar.g:2865:20: otherlv_7= 'rootType' ( (lv_jvmType_8_0= ruleJvmTypeReference ) ) (otherlv_9= ';' )?
             	    {
-            	    otherlv_7=(Token)match(input,52,FollowSets000.FOLLOW_52_in_ruleUiMobileView5765); if (state.failed) return current;
+            	    otherlv_7=(Token)match(input,51,FOLLOW_16); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	          	newLeafNode(otherlv_7, grammarAccess.getUiMobileViewAccess().getRootTypeKeyword_3_1_0());
-            	          
+            	      									newLeafNode(otherlv_7, grammarAccess.getUiMobileViewAccess().getRootTypeKeyword_3_1_0());
+            	      								
             	    }
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2611:1: ( (lv_jvmType_8_0= ruleJvmTypeReference ) )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2612:1: (lv_jvmType_8_0= ruleJvmTypeReference )
+            	    // InternalUIGrammar.g:2869:9: ( (lv_jvmType_8_0= ruleJvmTypeReference ) )
+            	    // InternalUIGrammar.g:2870:10: (lv_jvmType_8_0= ruleJvmTypeReference )
             	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2612:1: (lv_jvmType_8_0= ruleJvmTypeReference )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2613:3: lv_jvmType_8_0= ruleJvmTypeReference
+            	    // InternalUIGrammar.g:2870:10: (lv_jvmType_8_0= ruleJvmTypeReference )
+            	    // InternalUIGrammar.g:2871:11: lv_jvmType_8_0= ruleJvmTypeReference
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getUiMobileViewAccess().getJvmTypeJvmTypeReferenceParserRuleCall_3_1_1_0()); 
-            	      	    
+
+            	      											newCompositeNode(grammarAccess.getUiMobileViewAccess().getJvmTypeJvmTypeReferenceParserRuleCall_3_1_1_0());
+            	      										
             	    }
-            	    pushFollow(FollowSets000.FOLLOW_ruleJvmTypeReference_in_ruleUiMobileView5786);
+            	    pushFollow(FOLLOW_50);
             	    lv_jvmType_8_0=ruleJvmTypeReference();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
-            	      	        }
-            	             		set(
-            	             			current, 
-            	             			"jvmType",
-            	              		lv_jvmType_8_0, 
-            	              		"JvmTypeReference");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      											if (current==null) {
+            	      												current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
+            	      											}
+            	      											set(
+            	      												current,
+            	      												"jvmType",
+            	      												lv_jvmType_8_0,
+            	      												"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+            	      											afterParserOrEnumRuleCall();
+            	      										
             	    }
 
             	    }
@@ -7485,22 +8098,22 @@
 
             	    }
 
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2629:2: (otherlv_9= ';' )?
-            	    int alt47=2;
-            	    int LA47_0 = input.LA(1);
+            	    // InternalUIGrammar.g:2888:9: (otherlv_9= ';' )?
+            	    int alt49=2;
+            	    int LA49_0 = input.LA(1);
 
-            	    if ( (LA47_0==15) ) {
-            	        alt47=1;
+            	    if ( (LA49_0==16) ) {
+            	        alt49=1;
             	    }
-            	    switch (alt47) {
+            	    switch (alt49) {
             	        case 1 :
-            	            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2629:4: otherlv_9= ';'
+            	            // InternalUIGrammar.g:2889:10: otherlv_9= ';'
             	            {
-            	            otherlv_9=(Token)match(input,15,FollowSets000.FOLLOW_15_in_ruleUiMobileView5799); if (state.failed) return current;
+            	            otherlv_9=(Token)match(input,16,FOLLOW_49); if (state.failed) return current;
             	            if ( state.backtracking==0 ) {
 
-            	                  	newLeafNode(otherlv_9, grammarAccess.getUiMobileViewAccess().getSemicolonKeyword_3_1_2());
-            	                  
+            	              										newLeafNode(otherlv_9, grammarAccess.getUiMobileViewAccess().getSemicolonKeyword_3_1_2());
+            	              									
             	            }
 
             	            }
@@ -7526,7 +8139,7 @@
             	    break;
 
             	default :
-            	    break loop48;
+            	    break loop50;
                 }
             } while (true);
 
@@ -7540,52 +8153,52 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2647:2: ( ( (lv_beanSlots_10_0= ruleUiBeanSlot ) ) | ( (lv_bindingEndpointAlias_11_0= ruleUiBindingEndpointAlias ) ) )*
-            loop49:
+            // InternalUIGrammar.g:2907:3: ( ( (lv_beanSlots_10_0= ruleUiBeanSlot ) ) | ( (lv_bindingEndpointAlias_11_0= ruleUiBindingEndpointAlias ) ) )*
+            loop51:
             do {
-                int alt49=3;
-                int LA49_0 = input.LA(1);
+                int alt51=3;
+                int LA51_0 = input.LA(1);
 
-                if ( (LA49_0==24) ) {
-                    alt49=1;
+                if ( (LA51_0==23) ) {
+                    alt51=1;
                 }
-                else if ( (LA49_0==23) ) {
-                    alt49=2;
+                else if ( (LA51_0==22) ) {
+                    alt51=2;
                 }
 
 
-                switch (alt49) {
+                switch (alt51) {
             	case 1 :
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2647:3: ( (lv_beanSlots_10_0= ruleUiBeanSlot ) )
+            	    // InternalUIGrammar.g:2908:4: ( (lv_beanSlots_10_0= ruleUiBeanSlot ) )
             	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2647:3: ( (lv_beanSlots_10_0= ruleUiBeanSlot ) )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2648:1: (lv_beanSlots_10_0= ruleUiBeanSlot )
+            	    // InternalUIGrammar.g:2908:4: ( (lv_beanSlots_10_0= ruleUiBeanSlot ) )
+            	    // InternalUIGrammar.g:2909:5: (lv_beanSlots_10_0= ruleUiBeanSlot )
             	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2648:1: (lv_beanSlots_10_0= ruleUiBeanSlot )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2649:3: lv_beanSlots_10_0= ruleUiBeanSlot
+            	    // InternalUIGrammar.g:2909:5: (lv_beanSlots_10_0= ruleUiBeanSlot )
+            	    // InternalUIGrammar.g:2910:6: lv_beanSlots_10_0= ruleUiBeanSlot
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getUiMobileViewAccess().getBeanSlotsUiBeanSlotParserRuleCall_4_0_0()); 
-            	      	    
+
+            	      						newCompositeNode(grammarAccess.getUiMobileViewAccess().getBeanSlotsUiBeanSlotParserRuleCall_4_0_0());
+            	      					
             	    }
-            	    pushFollow(FollowSets000.FOLLOW_ruleUiBeanSlot_in_ruleUiMobileView5864);
+            	    pushFollow(FOLLOW_49);
             	    lv_beanSlots_10_0=ruleUiBeanSlot();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"beanSlots",
-            	              		lv_beanSlots_10_0, 
-            	              		"UiBeanSlot");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"beanSlots",
+            	      							lv_beanSlots_10_0,
+            	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBeanSlot");
+            	      						afterParserOrEnumRuleCall();
+            	      					
             	    }
 
             	    }
@@ -7597,328 +8210,36 @@
             	    }
             	    break;
             	case 2 :
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2666:6: ( (lv_bindingEndpointAlias_11_0= ruleUiBindingEndpointAlias ) )
+            	    // InternalUIGrammar.g:2928:4: ( (lv_bindingEndpointAlias_11_0= ruleUiBindingEndpointAlias ) )
             	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2666:6: ( (lv_bindingEndpointAlias_11_0= ruleUiBindingEndpointAlias ) )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2667:1: (lv_bindingEndpointAlias_11_0= ruleUiBindingEndpointAlias )
+            	    // InternalUIGrammar.g:2928:4: ( (lv_bindingEndpointAlias_11_0= ruleUiBindingEndpointAlias ) )
+            	    // InternalUIGrammar.g:2929:5: (lv_bindingEndpointAlias_11_0= ruleUiBindingEndpointAlias )
             	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2667:1: (lv_bindingEndpointAlias_11_0= ruleUiBindingEndpointAlias )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2668:3: lv_bindingEndpointAlias_11_0= ruleUiBindingEndpointAlias
+            	    // InternalUIGrammar.g:2929:5: (lv_bindingEndpointAlias_11_0= ruleUiBindingEndpointAlias )
+            	    // InternalUIGrammar.g:2930:6: lv_bindingEndpointAlias_11_0= ruleUiBindingEndpointAlias
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getUiMobileViewAccess().getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_4_1_0()); 
-            	      	    
+
+            	      						newCompositeNode(grammarAccess.getUiMobileViewAccess().getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_4_1_0());
+            	      					
             	    }
-            	    pushFollow(FollowSets000.FOLLOW_ruleUiBindingEndpointAlias_in_ruleUiMobileView5891);
+            	    pushFollow(FOLLOW_49);
             	    lv_bindingEndpointAlias_11_0=ruleUiBindingEndpointAlias();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"bindingEndpointAlias",
-            	              		lv_bindingEndpointAlias_11_0, 
-            	              		"UiBindingEndpointAlias");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
-            	    }
-
-            	    }
-
-
-            	    }
-
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop49;
-                }
-            } while (true);
-
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2684:4: ( (lv_content_12_0= ruleUiMobileEmbeddable ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2685:1: (lv_content_12_0= ruleUiMobileEmbeddable )
-            {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2685:1: (lv_content_12_0= ruleUiMobileEmbeddable )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2686:3: lv_content_12_0= ruleUiMobileEmbeddable
-            {
-            if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getUiMobileViewAccess().getContentUiMobileEmbeddableParserRuleCall_5_0()); 
-              	    
-            }
-            pushFollow(FollowSets000.FOLLOW_ruleUiMobileEmbeddable_in_ruleUiMobileView5914);
-            lv_content_12_0=ruleUiMobileEmbeddable();
-
-            state._fsp--;
-            if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"content",
-                      		lv_content_12_0, 
-                      		"UiMobileEmbeddable");
-              	        afterParserOrEnumRuleCall();
-              	    
-            }
-
-            }
-
-
-            }
-
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2702:2: (otherlv_13= 'align' ( (lv_contentAlignment_14_0= ruleUiAlignment ) ) )?
-            int alt50=2;
-            int LA50_0 = input.LA(1);
-
-            if ( (LA50_0==54) ) {
-                alt50=1;
-            }
-            switch (alt50) {
-                case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2702:4: otherlv_13= 'align' ( (lv_contentAlignment_14_0= ruleUiAlignment ) )
-                    {
-                    otherlv_13=(Token)match(input,54,FollowSets000.FOLLOW_54_in_ruleUiMobileView5927); if (state.failed) return current;
-                    if ( state.backtracking==0 ) {
-
-                          	newLeafNode(otherlv_13, grammarAccess.getUiMobileViewAccess().getAlignKeyword_6_0());
-                          
-                    }
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2706:1: ( (lv_contentAlignment_14_0= ruleUiAlignment ) )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2707:1: (lv_contentAlignment_14_0= ruleUiAlignment )
-                    {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2707:1: (lv_contentAlignment_14_0= ruleUiAlignment )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2708:3: lv_contentAlignment_14_0= ruleUiAlignment
-                    {
-                    if ( state.backtracking==0 ) {
-                       
-                      	        newCompositeNode(grammarAccess.getUiMobileViewAccess().getContentAlignmentUiAlignmentEnumRuleCall_6_1_0()); 
-                      	    
-                    }
-                    pushFollow(FollowSets000.FOLLOW_ruleUiAlignment_in_ruleUiMobileView5948);
-                    lv_contentAlignment_14_0=ruleUiAlignment();
-
-                    state._fsp--;
-                    if (state.failed) return current;
-                    if ( state.backtracking==0 ) {
-
-                      	        if (current==null) {
-                      	            current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
-                      	        }
-                             		set(
-                             			current, 
-                             			"contentAlignment",
-                              		lv_contentAlignment_14_0, 
-                              		"UiAlignment");
-                      	        afterParserOrEnumRuleCall();
-                      	    
-                    }
-
-                    }
-
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2724:4: ( ( (lv_bindingEndpointAlias_15_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_16_0= ruleUiBinding ) ) | ( (lv_validatorAssignments_17_0= ruleUiValidatorAssignment ) ) | ( (lv_processorAssignments_18_0= ruleUiVisibilityProcessorAssignment ) ) )*
-            loop51:
-            do {
-                int alt51=5;
-                switch ( input.LA(1) ) {
-                case 23:
-                    {
-                    alt51=1;
-                    }
-                    break;
-                case 27:
-                    {
-                    alt51=2;
-                    }
-                    break;
-                case 18:
-                    {
-                    alt51=3;
-                    }
-                    break;
-                case 151:
-                    {
-                    alt51=4;
-                    }
-                    break;
-
-                }
-
-                switch (alt51) {
-            	case 1 :
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2724:5: ( (lv_bindingEndpointAlias_15_0= ruleUiBindingEndpointAlias ) )
-            	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2724:5: ( (lv_bindingEndpointAlias_15_0= ruleUiBindingEndpointAlias ) )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2725:1: (lv_bindingEndpointAlias_15_0= ruleUiBindingEndpointAlias )
-            	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2725:1: (lv_bindingEndpointAlias_15_0= ruleUiBindingEndpointAlias )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2726:3: lv_bindingEndpointAlias_15_0= ruleUiBindingEndpointAlias
-            	    {
-            	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getUiMobileViewAccess().getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_7_0_0()); 
-            	      	    
-            	    }
-            	    pushFollow(FollowSets000.FOLLOW_ruleUiBindingEndpointAlias_in_ruleUiMobileView5972);
-            	    lv_bindingEndpointAlias_15_0=ruleUiBindingEndpointAlias();
-
-            	    state._fsp--;
-            	    if (state.failed) return current;
-            	    if ( state.backtracking==0 ) {
-
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"bindingEndpointAlias",
-            	              		lv_bindingEndpointAlias_15_0, 
-            	              		"UiBindingEndpointAlias");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
-            	    }
-
-            	    }
-
-
-            	    }
-
-
-            	    }
-            	    break;
-            	case 2 :
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2743:6: ( (lv_bindings_16_0= ruleUiBinding ) )
-            	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2743:6: ( (lv_bindings_16_0= ruleUiBinding ) )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2744:1: (lv_bindings_16_0= ruleUiBinding )
-            	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2744:1: (lv_bindings_16_0= ruleUiBinding )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2745:3: lv_bindings_16_0= ruleUiBinding
-            	    {
-            	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getUiMobileViewAccess().getBindingsUiBindingParserRuleCall_7_1_0()); 
-            	      	    
-            	    }
-            	    pushFollow(FollowSets000.FOLLOW_ruleUiBinding_in_ruleUiMobileView5999);
-            	    lv_bindings_16_0=ruleUiBinding();
-
-            	    state._fsp--;
-            	    if (state.failed) return current;
-            	    if ( state.backtracking==0 ) {
-
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"bindings",
-            	              		lv_bindings_16_0, 
-            	              		"UiBinding");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
-            	    }
-
-            	    }
-
-
-            	    }
-
-
-            	    }
-            	    break;
-            	case 3 :
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2762:6: ( (lv_validatorAssignments_17_0= ruleUiValidatorAssignment ) )
-            	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2762:6: ( (lv_validatorAssignments_17_0= ruleUiValidatorAssignment ) )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2763:1: (lv_validatorAssignments_17_0= ruleUiValidatorAssignment )
-            	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2763:1: (lv_validatorAssignments_17_0= ruleUiValidatorAssignment )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2764:3: lv_validatorAssignments_17_0= ruleUiValidatorAssignment
-            	    {
-            	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getUiMobileViewAccess().getValidatorAssignmentsUiValidatorAssignmentParserRuleCall_7_2_0()); 
-            	      	    
-            	    }
-            	    pushFollow(FollowSets000.FOLLOW_ruleUiValidatorAssignment_in_ruleUiMobileView6026);
-            	    lv_validatorAssignments_17_0=ruleUiValidatorAssignment();
-
-            	    state._fsp--;
-            	    if (state.failed) return current;
-            	    if ( state.backtracking==0 ) {
-
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"validatorAssignments",
-            	              		lv_validatorAssignments_17_0, 
-            	              		"UiValidatorAssignment");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
-            	    }
-
-            	    }
-
-
-            	    }
-
-
-            	    }
-            	    break;
-            	case 4 :
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2781:6: ( (lv_processorAssignments_18_0= ruleUiVisibilityProcessorAssignment ) )
-            	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2781:6: ( (lv_processorAssignments_18_0= ruleUiVisibilityProcessorAssignment ) )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2782:1: (lv_processorAssignments_18_0= ruleUiVisibilityProcessorAssignment )
-            	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2782:1: (lv_processorAssignments_18_0= ruleUiVisibilityProcessorAssignment )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2783:3: lv_processorAssignments_18_0= ruleUiVisibilityProcessorAssignment
-            	    {
-            	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getUiMobileViewAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_3_0()); 
-            	      	    
-            	    }
-            	    pushFollow(FollowSets000.FOLLOW_ruleUiVisibilityProcessorAssignment_in_ruleUiMobileView6053);
-            	    lv_processorAssignments_18_0=ruleUiVisibilityProcessorAssignment();
-
-            	    state._fsp--;
-            	    if (state.failed) return current;
-            	    if ( state.backtracking==0 ) {
-
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"processorAssignments",
-            	              		lv_processorAssignments_18_0, 
-            	              		"UiVisibilityProcessorAssignment");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"bindingEndpointAlias",
+            	      							lv_bindingEndpointAlias_11_0,
+            	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAlias");
+            	      						afterParserOrEnumRuleCall();
+            	      					
             	    }
 
             	    }
@@ -7935,11 +8256,303 @@
                 }
             } while (true);
 
-            otherlv_19=(Token)match(input,22,FollowSets000.FOLLOW_22_in_ruleUiMobileView6067); if (state.failed) return current;
+            // InternalUIGrammar.g:2948:3: ( (lv_content_12_0= ruleUiMobileEmbeddable ) )
+            // InternalUIGrammar.g:2949:4: (lv_content_12_0= ruleUiMobileEmbeddable )
+            {
+            // InternalUIGrammar.g:2949:4: (lv_content_12_0= ruleUiMobileEmbeddable )
+            // InternalUIGrammar.g:2950:5: lv_content_12_0= ruleUiMobileEmbeddable
+            {
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_19, grammarAccess.getUiMobileViewAccess().getRightCurlyBracketKeyword_8());
-                  
+              					newCompositeNode(grammarAccess.getUiMobileViewAccess().getContentUiMobileEmbeddableParserRuleCall_5_0());
+              				
+            }
+            pushFollow(FOLLOW_40);
+            lv_content_12_0=ruleUiMobileEmbeddable();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
+              					}
+              					set(
+              						current,
+              						"content",
+              						lv_content_12_0,
+              						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileEmbeddable");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalUIGrammar.g:2967:3: (otherlv_13= 'align' ( (lv_contentAlignment_14_0= ruleUiAlignment ) ) )?
+            int alt52=2;
+            int LA52_0 = input.LA(1);
+
+            if ( (LA52_0==53) ) {
+                alt52=1;
+            }
+            switch (alt52) {
+                case 1 :
+                    // InternalUIGrammar.g:2968:4: otherlv_13= 'align' ( (lv_contentAlignment_14_0= ruleUiAlignment ) )
+                    {
+                    otherlv_13=(Token)match(input,53,FOLLOW_41); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_13, grammarAccess.getUiMobileViewAccess().getAlignKeyword_6_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:2972:4: ( (lv_contentAlignment_14_0= ruleUiAlignment ) )
+                    // InternalUIGrammar.g:2973:5: (lv_contentAlignment_14_0= ruleUiAlignment )
+                    {
+                    // InternalUIGrammar.g:2973:5: (lv_contentAlignment_14_0= ruleUiAlignment )
+                    // InternalUIGrammar.g:2974:6: lv_contentAlignment_14_0= ruleUiAlignment
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getUiMobileViewAccess().getContentAlignmentUiAlignmentEnumRuleCall_6_1_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_42);
+                    lv_contentAlignment_14_0=ruleUiAlignment();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
+                      						}
+                      						set(
+                      							current,
+                      							"contentAlignment",
+                      							lv_contentAlignment_14_0,
+                      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiAlignment");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:2992:3: ( ( (lv_bindingEndpointAlias_15_0= ruleUiBindingEndpointAlias ) ) | ( (lv_bindings_16_0= ruleUiBinding ) ) | ( (lv_validatorAssignments_17_0= ruleUiValidatorAssignment ) ) | ( (lv_processorAssignments_18_0= ruleUiVisibilityProcessorAssignment ) ) )*
+            loop53:
+            do {
+                int alt53=5;
+                switch ( input.LA(1) ) {
+                case 22:
+                    {
+                    alt53=1;
+                    }
+                    break;
+                case 26:
+                    {
+                    alt53=2;
+                    }
+                    break;
+                case 17:
+                    {
+                    alt53=3;
+                    }
+                    break;
+                case 153:
+                    {
+                    alt53=4;
+                    }
+                    break;
+
+                }
+
+                switch (alt53) {
+            	case 1 :
+            	    // InternalUIGrammar.g:2993:4: ( (lv_bindingEndpointAlias_15_0= ruleUiBindingEndpointAlias ) )
+            	    {
+            	    // InternalUIGrammar.g:2993:4: ( (lv_bindingEndpointAlias_15_0= ruleUiBindingEndpointAlias ) )
+            	    // InternalUIGrammar.g:2994:5: (lv_bindingEndpointAlias_15_0= ruleUiBindingEndpointAlias )
+            	    {
+            	    // InternalUIGrammar.g:2994:5: (lv_bindingEndpointAlias_15_0= ruleUiBindingEndpointAlias )
+            	    // InternalUIGrammar.g:2995:6: lv_bindingEndpointAlias_15_0= ruleUiBindingEndpointAlias
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getUiMobileViewAccess().getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_7_0_0());
+            	      					
+            	    }
+            	    pushFollow(FOLLOW_42);
+            	    lv_bindingEndpointAlias_15_0=ruleUiBindingEndpointAlias();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"bindingEndpointAlias",
+            	      							lv_bindingEndpointAlias_15_0,
+            	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAlias");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // InternalUIGrammar.g:3013:4: ( (lv_bindings_16_0= ruleUiBinding ) )
+            	    {
+            	    // InternalUIGrammar.g:3013:4: ( (lv_bindings_16_0= ruleUiBinding ) )
+            	    // InternalUIGrammar.g:3014:5: (lv_bindings_16_0= ruleUiBinding )
+            	    {
+            	    // InternalUIGrammar.g:3014:5: (lv_bindings_16_0= ruleUiBinding )
+            	    // InternalUIGrammar.g:3015:6: lv_bindings_16_0= ruleUiBinding
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getUiMobileViewAccess().getBindingsUiBindingParserRuleCall_7_1_0());
+            	      					
+            	    }
+            	    pushFollow(FOLLOW_42);
+            	    lv_bindings_16_0=ruleUiBinding();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"bindings",
+            	      							lv_bindings_16_0,
+            	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 3 :
+            	    // InternalUIGrammar.g:3033:4: ( (lv_validatorAssignments_17_0= ruleUiValidatorAssignment ) )
+            	    {
+            	    // InternalUIGrammar.g:3033:4: ( (lv_validatorAssignments_17_0= ruleUiValidatorAssignment ) )
+            	    // InternalUIGrammar.g:3034:5: (lv_validatorAssignments_17_0= ruleUiValidatorAssignment )
+            	    {
+            	    // InternalUIGrammar.g:3034:5: (lv_validatorAssignments_17_0= ruleUiValidatorAssignment )
+            	    // InternalUIGrammar.g:3035:6: lv_validatorAssignments_17_0= ruleUiValidatorAssignment
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getUiMobileViewAccess().getValidatorAssignmentsUiValidatorAssignmentParserRuleCall_7_2_0());
+            	      					
+            	    }
+            	    pushFollow(FOLLOW_42);
+            	    lv_validatorAssignments_17_0=ruleUiValidatorAssignment();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"validatorAssignments",
+            	      							lv_validatorAssignments_17_0,
+            	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidatorAssignment");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 4 :
+            	    // InternalUIGrammar.g:3053:4: ( (lv_processorAssignments_18_0= ruleUiVisibilityProcessorAssignment ) )
+            	    {
+            	    // InternalUIGrammar.g:3053:4: ( (lv_processorAssignments_18_0= ruleUiVisibilityProcessorAssignment ) )
+            	    // InternalUIGrammar.g:3054:5: (lv_processorAssignments_18_0= ruleUiVisibilityProcessorAssignment )
+            	    {
+            	    // InternalUIGrammar.g:3054:5: (lv_processorAssignments_18_0= ruleUiVisibilityProcessorAssignment )
+            	    // InternalUIGrammar.g:3055:6: lv_processorAssignments_18_0= ruleUiVisibilityProcessorAssignment
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getUiMobileViewAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_3_0());
+            	      					
+            	    }
+            	    pushFollow(FOLLOW_42);
+            	    lv_processorAssignments_18_0=ruleUiVisibilityProcessorAssignment();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"processorAssignments",
+            	      							lv_processorAssignments_18_0,
+            	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop53;
+                }
+            } while (true);
+
+            otherlv_19=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_19, grammarAccess.getUiMobileViewAccess().getRightCurlyBracketKeyword_8());
+              		
             }
 
             }
@@ -7948,14 +8561,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -7964,7 +8579,7 @@
 
 
     // $ANTLR start "entryRuleUiI18nInfo"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2811:1: entryRuleUiI18nInfo returns [EObject current=null] : iv_ruleUiI18nInfo= ruleUiI18nInfo EOF ;
+    // InternalUIGrammar.g:3081:1: entryRuleUiI18nInfo returns [EObject current=null] : iv_ruleUiI18nInfo= ruleUiI18nInfo EOF ;
     public final EObject entryRuleUiI18nInfo() throws RecognitionException {
         EObject current = null;
 
@@ -7972,13 +8587,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2812:2: (iv_ruleUiI18nInfo= ruleUiI18nInfo EOF )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2813:2: iv_ruleUiI18nInfo= ruleUiI18nInfo EOF
+            // InternalUIGrammar.g:3081:51: (iv_ruleUiI18nInfo= ruleUiI18nInfo EOF )
+            // InternalUIGrammar.g:3082:2: iv_ruleUiI18nInfo= ruleUiI18nInfo EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUiI18nInfoRule()); 
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiI18nInfo_in_entryRuleUiI18nInfo6103);
+            pushFollow(FOLLOW_1);
             iv_ruleUiI18nInfo=ruleUiI18nInfo();
 
             state._fsp--;
@@ -7986,16 +8601,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUiI18nInfo; 
             }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiI18nInfo6113); 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;
@@ -8004,55 +8619,116 @@
 
 
     // $ANTLR start "ruleUiI18nInfo"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2820:1: ruleUiI18nInfo returns [EObject current=null] : (otherlv_0= 'i18n' ( (lv_key_1_0= RULE_STRING ) ) ) ;
+    // InternalUIGrammar.g:3088:1: ruleUiI18nInfo returns [EObject current=null] : (otherlv_0= 'i18n' ( ( (lv_noCaption_1_0= 'noCaption' ) ) | ( (lv_key_2_0= RULE_STRING ) ) ) ) ;
     public final EObject ruleUiI18nInfo() throws RecognitionException {
         EObject current = null;
 
         Token otherlv_0=null;
-        Token lv_key_1_0=null;
+        Token lv_noCaption_1_0=null;
+        Token lv_key_2_0=null;
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2823:28: ( (otherlv_0= 'i18n' ( (lv_key_1_0= RULE_STRING ) ) ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2824:1: (otherlv_0= 'i18n' ( (lv_key_1_0= RULE_STRING ) ) )
+            // InternalUIGrammar.g:3094:2: ( (otherlv_0= 'i18n' ( ( (lv_noCaption_1_0= 'noCaption' ) ) | ( (lv_key_2_0= RULE_STRING ) ) ) ) )
+            // InternalUIGrammar.g:3095:2: (otherlv_0= 'i18n' ( ( (lv_noCaption_1_0= 'noCaption' ) ) | ( (lv_key_2_0= RULE_STRING ) ) ) )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2824:1: (otherlv_0= 'i18n' ( (lv_key_1_0= RULE_STRING ) ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2824:3: otherlv_0= 'i18n' ( (lv_key_1_0= RULE_STRING ) )
+            // InternalUIGrammar.g:3095:2: (otherlv_0= 'i18n' ( ( (lv_noCaption_1_0= 'noCaption' ) ) | ( (lv_key_2_0= RULE_STRING ) ) ) )
+            // InternalUIGrammar.g:3096:3: otherlv_0= 'i18n' ( ( (lv_noCaption_1_0= 'noCaption' ) ) | ( (lv_key_2_0= RULE_STRING ) ) )
             {
-            otherlv_0=(Token)match(input,60,FollowSets000.FOLLOW_60_in_ruleUiI18nInfo6150); if (state.failed) return current;
+            otherlv_0=(Token)match(input,60,FOLLOW_51); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getUiI18nInfoAccess().getI18nKeyword_0());
-                  
-            }
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2828:1: ( (lv_key_1_0= RULE_STRING ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2829:1: (lv_key_1_0= RULE_STRING )
-            {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2829:1: (lv_key_1_0= RULE_STRING )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2830:3: lv_key_1_0= RULE_STRING
-            {
-            lv_key_1_0=(Token)match(input,RULE_STRING,FollowSets000.FOLLOW_RULE_STRING_in_ruleUiI18nInfo6167); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-              			newLeafNode(lv_key_1_0, grammarAccess.getUiI18nInfoAccess().getKeySTRINGTerminalRuleCall_1_0()); 
+              			newLeafNode(otherlv_0, grammarAccess.getUiI18nInfoAccess().getI18nKeyword_0());
               		
             }
-            if ( state.backtracking==0 ) {
+            // InternalUIGrammar.g:3100:3: ( ( (lv_noCaption_1_0= 'noCaption' ) ) | ( (lv_key_2_0= RULE_STRING ) ) )
+            int alt54=2;
+            int LA54_0 = input.LA(1);
 
-              	        if (current==null) {
-              	            current = createModelElement(grammarAccess.getUiI18nInfoRule());
-              	        }
-                     		setWithLastConsumed(
-                     			current, 
-                     			"key",
-                      		lv_key_1_0, 
-                      		"STRING");
-              	    
+            if ( (LA54_0==61) ) {
+                alt54=1;
             }
-
+            else if ( (LA54_0==RULE_STRING) ) {
+                alt54=2;
             }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 54, 0, input);
 
+                throw nvae;
+            }
+            switch (alt54) {
+                case 1 :
+                    // InternalUIGrammar.g:3101:4: ( (lv_noCaption_1_0= 'noCaption' ) )
+                    {
+                    // InternalUIGrammar.g:3101:4: ( (lv_noCaption_1_0= 'noCaption' ) )
+                    // InternalUIGrammar.g:3102:5: (lv_noCaption_1_0= 'noCaption' )
+                    {
+                    // InternalUIGrammar.g:3102:5: (lv_noCaption_1_0= 'noCaption' )
+                    // InternalUIGrammar.g:3103:6: lv_noCaption_1_0= 'noCaption'
+                    {
+                    lv_noCaption_1_0=(Token)match(input,61,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_noCaption_1_0, grammarAccess.getUiI18nInfoAccess().getNoCaptionNoCaptionKeyword_1_0_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getUiI18nInfoRule());
+                      						}
+                      						setWithLastConsumed(current, "noCaption", true, "noCaption");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalUIGrammar.g:3116:4: ( (lv_key_2_0= RULE_STRING ) )
+                    {
+                    // InternalUIGrammar.g:3116:4: ( (lv_key_2_0= RULE_STRING ) )
+                    // InternalUIGrammar.g:3117:5: (lv_key_2_0= RULE_STRING )
+                    {
+                    // InternalUIGrammar.g:3117:5: (lv_key_2_0= RULE_STRING )
+                    // InternalUIGrammar.g:3118:6: lv_key_2_0= RULE_STRING
+                    {
+                    lv_key_2_0=(Token)match(input,RULE_STRING,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_key_2_0, grammarAccess.getUiI18nInfoAccess().getKeySTRINGTerminalRuleCall_1_1_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getUiI18nInfoRule());
+                      						}
+                      						setWithLastConsumed(
+                      							current,
+                      							"key",
+                      							lv_key_2_0,
+                      							"org.eclipse.xtext.xbase.Xtype.STRING");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
 
             }
 
@@ -8063,14 +8739,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -8079,7 +8757,7 @@
 
 
     // $ANTLR start "entryRuleUiGridLayout"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2854:1: entryRuleUiGridLayout returns [EObject current=null] : iv_ruleUiGridLayout= ruleUiGridLayout EOF ;
+    // InternalUIGrammar.g:3139:1: entryRuleUiGridLayout returns [EObject current=null] : iv_ruleUiGridLayout= ruleUiGridLayout EOF ;
     public final EObject entryRuleUiGridLayout() throws RecognitionException {
         EObject current = null;
 
@@ -8087,13 +8765,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2855:2: (iv_ruleUiGridLayout= ruleUiGridLayout EOF )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2856:2: iv_ruleUiGridLayout= ruleUiGridLayout EOF
+            // InternalUIGrammar.g:3139:53: (iv_ruleUiGridLayout= ruleUiGridLayout EOF )
+            // InternalUIGrammar.g:3140:2: iv_ruleUiGridLayout= ruleUiGridLayout EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUiGridLayoutRule()); 
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiGridLayout_in_entryRuleUiGridLayout6208);
+            pushFollow(FOLLOW_1);
             iv_ruleUiGridLayout=ruleUiGridLayout();
 
             state._fsp--;
@@ -8101,16 +8779,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUiGridLayout; 
             }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiGridLayout6218); 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;
@@ -8119,7 +8797,7 @@
 
 
     // $ANTLR start "ruleUiGridLayout"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2863:1: ruleUiGridLayout returns [EObject current=null] : ( () otherlv_1= 'gridlayout' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')' )? ( (lv_name_11_0= RULE_ID ) )? otherlv_12= '{' ( (lv_contents_13_0= ruleUiGridLayoutAssigment ) )* ( (lv_bindings_14_0= ruleUiBinding ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}' ) ;
+    // InternalUIGrammar.g:3146:1: ruleUiGridLayout returns [EObject current=null] : ( () otherlv_1= 'gridlayout' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')' )? ( (lv_name_11_0= RULE_ID ) )? otherlv_12= '{' ( (lv_contents_13_0= ruleUiGridLayoutAssigment ) )* ( (lv_bindings_14_0= ruleUiBinding ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}' ) ;
     public final EObject ruleUiGridLayout() throws RecognitionException {
         EObject current = null;
 
@@ -8143,135 +8821,136 @@
         EObject lv_processorAssignments_15_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2866:28: ( ( () otherlv_1= 'gridlayout' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')' )? ( (lv_name_11_0= RULE_ID ) )? otherlv_12= '{' ( (lv_contents_13_0= ruleUiGridLayoutAssigment ) )* ( (lv_bindings_14_0= ruleUiBinding ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}' ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2867:1: ( () otherlv_1= 'gridlayout' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')' )? ( (lv_name_11_0= RULE_ID ) )? otherlv_12= '{' ( (lv_contents_13_0= ruleUiGridLayoutAssigment ) )* ( (lv_bindings_14_0= ruleUiBinding ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}' )
+            // InternalUIGrammar.g:3152:2: ( ( () otherlv_1= 'gridlayout' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')' )? ( (lv_name_11_0= RULE_ID ) )? otherlv_12= '{' ( (lv_contents_13_0= ruleUiGridLayoutAssigment ) )* ( (lv_bindings_14_0= ruleUiBinding ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}' ) )
+            // InternalUIGrammar.g:3153:2: ( () otherlv_1= 'gridlayout' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')' )? ( (lv_name_11_0= RULE_ID ) )? otherlv_12= '{' ( (lv_contents_13_0= ruleUiGridLayoutAssigment ) )* ( (lv_bindings_14_0= ruleUiBinding ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}' )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2867:1: ( () otherlv_1= 'gridlayout' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')' )? ( (lv_name_11_0= RULE_ID ) )? otherlv_12= '{' ( (lv_contents_13_0= ruleUiGridLayoutAssigment ) )* ( (lv_bindings_14_0= ruleUiBinding ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2867:2: () otherlv_1= 'gridlayout' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')' )? ( (lv_name_11_0= RULE_ID ) )? otherlv_12= '{' ( (lv_contents_13_0= ruleUiGridLayoutAssigment ) )* ( (lv_bindings_14_0= ruleUiBinding ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}'
+            // InternalUIGrammar.g:3153:2: ( () otherlv_1= 'gridlayout' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')' )? ( (lv_name_11_0= RULE_ID ) )? otherlv_12= '{' ( (lv_contents_13_0= ruleUiGridLayoutAssigment ) )* ( (lv_bindings_14_0= ruleUiBinding ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}' )
+            // InternalUIGrammar.g:3154:3: () otherlv_1= 'gridlayout' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')' )? ( (lv_name_11_0= RULE_ID ) )? otherlv_12= '{' ( (lv_contents_13_0= ruleUiGridLayoutAssigment ) )* ( (lv_bindings_14_0= ruleUiBinding ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}'
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2867:2: ()
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2868:5: 
+            // InternalUIGrammar.g:3154:3: ()
+            // InternalUIGrammar.g:3155:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getUiGridLayoutAccess().getUiGridLayoutAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiGridLayoutAccess().getUiGridLayoutAction_0(),
+              					current);
+              			
             }
 
             }
 
-            otherlv_1=(Token)match(input,61,FollowSets000.FOLLOW_61_in_ruleUiGridLayout6264); if (state.failed) return current;
+            otherlv_1=(Token)match(input,62,FOLLOW_52); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getUiGridLayoutAccess().getGridlayoutKeyword_1());
-                  
+              			newLeafNode(otherlv_1, grammarAccess.getUiGridLayoutAccess().getGridlayoutKeyword_1());
+              		
             }
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2877:1: (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')' )?
-            int alt53=2;
-            int LA53_0 = input.LA(1);
+            // InternalUIGrammar.g:3165:3: (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')' )?
+            int alt56=2;
+            int LA56_0 = input.LA(1);
 
-            if ( (LA53_0==46) ) {
-                alt53=1;
+            if ( (LA56_0==45) ) {
+                alt56=1;
             }
-            switch (alt53) {
+            switch (alt56) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2877:3: otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')'
+                    // InternalUIGrammar.g:3166:4: otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')'
                     {
-                    otherlv_2=(Token)match(input,46,FollowSets000.FOLLOW_46_in_ruleUiGridLayout6277); if (state.failed) return current;
+                    otherlv_2=(Token)match(input,45,FOLLOW_53); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_2, grammarAccess.getUiGridLayoutAccess().getLeftParenthesisKeyword_2_0());
-                          
+                      				newLeafNode(otherlv_2, grammarAccess.getUiGridLayoutAccess().getLeftParenthesisKeyword_2_0());
+                      			
                     }
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2881:1: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2883:1: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:3170:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:3171:5: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) )
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2883:1: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2884:2: ( ( ({...}? => ( ({...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:3171:5: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:3172:6: ( ( ({...}? => ( ({...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* )
                     {
                     getUnorderedGroupHelper().enter(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1());
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2887:2: ( ( ({...}? => ( ({...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2888:3: ( ({...}? => ( ({...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )*
+                    // InternalUIGrammar.g:3175:6: ( ( ({...}? => ( ({...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:3176:7: ( ({...}? => ( ({...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )*
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2888:3: ( ({...}? => ( ({...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )*
-                    loop52:
+                    // InternalUIGrammar.g:3176:7: ( ({...}? => ( ({...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )*
+                    loop55:
                     do {
-                        int alt52=5;
-                        int LA52_0 = input.LA(1);
+                        int alt55=5;
+                        int LA55_0 = input.LA(1);
 
-                        if ( LA52_0 ==62 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 0) ) {
-                            alt52=1;
+                        if ( LA55_0 == 63 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 0) ) {
+                            alt55=1;
                         }
-                        else if ( LA52_0 ==60 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 1) ) {
-                            alt52=2;
+                        else if ( LA55_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 1) ) {
+                            alt55=2;
                         }
-                        else if ( LA52_0 ==63 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 2) ) {
-                            alt52=3;
+                        else if ( LA55_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 2) ) {
+                            alt55=3;
                         }
-                        else if ( LA52_0 ==64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 3) ) {
-                            alt52=4;
+                        else if ( LA55_0 == 65 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 3) ) {
+                            alt55=4;
                         }
 
 
-                        switch (alt52) {
+                        switch (alt55) {
                     	case 1 :
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2890:4: ({...}? => ( ({...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:3177:5: ({...}? => ( ({...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) ) ) ) )
                     	    {
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2890:4: ({...}? => ( ({...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) ) ) ) )
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2891:5: {...}? => ( ({...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) ) ) )
+                    	    // InternalUIGrammar.g:3177:5: ({...}? => ( ({...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:3178:6: {...}? => ( ({...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) ) ) )
                     	    {
                     	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 0) ) {
                     	        if (state.backtracking>0) {state.failed=true; return current;}
                     	        throw new FailedPredicateException(input, "ruleUiGridLayout", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 0)");
                     	    }
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2891:111: ( ({...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) ) ) )
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2892:6: ({...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) ) )
+                    	    // InternalUIGrammar.g:3178:112: ( ({...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) ) ) )
+                    	    // InternalUIGrammar.g:3179:7: ({...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) ) )
                     	    {
                     	    getUnorderedGroupHelper().select(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 0);
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2895:6: ({...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) ) )
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2895:7: {...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) )
+                    	    // InternalUIGrammar.g:3182:10: ({...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) ) )
+                    	    // InternalUIGrammar.g:3182:11: {...}? => (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) )
                     	    {
                     	    if ( !((true)) ) {
                     	        if (state.backtracking>0) {state.failed=true; return current;}
                     	        throw new FailedPredicateException(input, "ruleUiGridLayout", "true");
                     	    }
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2895:16: (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) )
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2895:18: otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) )
+                    	    // InternalUIGrammar.g:3182:20: (otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) ) )
+                    	    // InternalUIGrammar.g:3182:21: otherlv_4= 'columns=' ( (lv_columns_5_0= RULE_INT ) )
                     	    {
-                    	    otherlv_4=(Token)match(input,62,FollowSets000.FOLLOW_62_in_ruleUiGridLayout6335); if (state.failed) return current;
+                    	    otherlv_4=(Token)match(input,63,FOLLOW_54); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
-                    	          	newLeafNode(otherlv_4, grammarAccess.getUiGridLayoutAccess().getColumnsKeyword_2_1_0_0());
-                    	          
+                    	      										newLeafNode(otherlv_4, grammarAccess.getUiGridLayoutAccess().getColumnsKeyword_2_1_0_0());
+                    	      									
                     	    }
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2899:1: ( (lv_columns_5_0= RULE_INT ) )
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2900:1: (lv_columns_5_0= RULE_INT )
+                    	    // InternalUIGrammar.g:3186:10: ( (lv_columns_5_0= RULE_INT ) )
+                    	    // InternalUIGrammar.g:3187:11: (lv_columns_5_0= RULE_INT )
                     	    {
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2900:1: (lv_columns_5_0= RULE_INT )
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2901:3: lv_columns_5_0= RULE_INT
+                    	    // InternalUIGrammar.g:3187:11: (lv_columns_5_0= RULE_INT )
+                    	    // InternalUIGrammar.g:3188:12: lv_columns_5_0= RULE_INT
                     	    {
-                    	    lv_columns_5_0=(Token)match(input,RULE_INT,FollowSets000.FOLLOW_RULE_INT_in_ruleUiGridLayout6352); if (state.failed) return current;
+                    	    lv_columns_5_0=(Token)match(input,RULE_INT,FOLLOW_53); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
-                    	      			newLeafNode(lv_columns_5_0, grammarAccess.getUiGridLayoutAccess().getColumnsINTTerminalRuleCall_2_1_0_1_0()); 
-                    	      		
+                    	      												newLeafNode(lv_columns_5_0, grammarAccess.getUiGridLayoutAccess().getColumnsINTTerminalRuleCall_2_1_0_1_0());
+                    	      											
                     	    }
                     	    if ( state.backtracking==0 ) {
 
-                    	      	        if (current==null) {
-                    	      	            current = createModelElement(grammarAccess.getUiGridLayoutRule());
-                    	      	        }
-                    	             		setWithLastConsumed(
-                    	             			current, 
-                    	             			"columns",
-                    	              		lv_columns_5_0, 
-                    	              		"INT");
-                    	      	    
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiGridLayoutRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"columns",
+                    	      													lv_columns_5_0,
+                    	      													"org.eclipse.xtext.xbase.Xbase.INT");
+                    	      											
                     	    }
 
                     	    }
@@ -8296,54 +8975,54 @@
                     	    }
                     	    break;
                     	case 2 :
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2924:4: ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) )
+                    	    // InternalUIGrammar.g:3210:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) )
                     	    {
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2924:4: ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) )
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2925:5: {...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) )
+                    	    // InternalUIGrammar.g:3210:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) )
+                    	    // InternalUIGrammar.g:3211:6: {...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) )
                     	    {
                     	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 1) ) {
                     	        if (state.backtracking>0) {state.failed=true; return current;}
                     	        throw new FailedPredicateException(input, "ruleUiGridLayout", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 1)");
                     	    }
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2925:111: ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) )
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2926:6: ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) )
+                    	    // InternalUIGrammar.g:3211:112: ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) )
+                    	    // InternalUIGrammar.g:3212:7: ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) )
                     	    {
                     	    getUnorderedGroupHelper().select(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 1);
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2929:6: ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) )
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2929:7: {...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) )
+                    	    // InternalUIGrammar.g:3215:10: ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) )
+                    	    // InternalUIGrammar.g:3215:11: {...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) )
                     	    {
                     	    if ( !((true)) ) {
                     	        if (state.backtracking>0) {state.failed=true; return current;}
                     	        throw new FailedPredicateException(input, "ruleUiGridLayout", "true");
                     	    }
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2929:16: ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) )
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2930:1: (lv_i18nInfo_6_0= ruleUiI18nInfo )
+                    	    // InternalUIGrammar.g:3215:20: ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) )
+                    	    // InternalUIGrammar.g:3215:21: (lv_i18nInfo_6_0= ruleUiI18nInfo )
                     	    {
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2930:1: (lv_i18nInfo_6_0= ruleUiI18nInfo )
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2931:3: lv_i18nInfo_6_0= ruleUiI18nInfo
+                    	    // InternalUIGrammar.g:3215:21: (lv_i18nInfo_6_0= ruleUiI18nInfo )
+                    	    // InternalUIGrammar.g:3216:11: lv_i18nInfo_6_0= ruleUiI18nInfo
                     	    {
                     	    if ( state.backtracking==0 ) {
-                    	       
-                    	      	        newCompositeNode(grammarAccess.getUiGridLayoutAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_1_0()); 
-                    	      	    
+
+                    	      											newCompositeNode(grammarAccess.getUiGridLayoutAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_1_0());
+                    	      										
                     	    }
-                    	    pushFollow(FollowSets000.FOLLOW_ruleUiI18nInfo_in_ruleUiGridLayout6433);
+                    	    pushFollow(FOLLOW_53);
                     	    lv_i18nInfo_6_0=ruleUiI18nInfo();
 
                     	    state._fsp--;
                     	    if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
-                    	      	        if (current==null) {
-                    	      	            current = createModelElementForParent(grammarAccess.getUiGridLayoutRule());
-                    	      	        }
-                    	             		set(
-                    	             			current, 
-                    	             			"i18nInfo",
-                    	              		lv_i18nInfo_6_0, 
-                    	              		"UiI18nInfo");
-                    	      	        afterParserOrEnumRuleCall();
-                    	      	    
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getUiGridLayoutRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"i18nInfo",
+                    	      												lv_i18nInfo_6_0,
+                    	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
                     	    }
 
                     	    }
@@ -8365,58 +9044,58 @@
                     	    }
                     	    break;
                     	case 3 :
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2954:4: ({...}? => ( ({...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:3238:5: ({...}? => ( ({...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) ) ) ) )
                     	    {
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2954:4: ({...}? => ( ({...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) ) ) ) )
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2955:5: {...}? => ( ({...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:3238:5: ({...}? => ( ({...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:3239:6: {...}? => ( ({...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) ) ) )
                     	    {
                     	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 2) ) {
                     	        if (state.backtracking>0) {state.failed=true; return current;}
                     	        throw new FailedPredicateException(input, "ruleUiGridLayout", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 2)");
                     	    }
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2955:111: ( ({...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) ) ) )
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2956:6: ({...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:3239:112: ( ({...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:3240:7: ({...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) ) )
                     	    {
                     	    getUnorderedGroupHelper().select(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 2);
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2959:6: ({...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) ) )
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2959:7: {...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:3243:10: ({...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:3243:11: {...}? => (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) )
                     	    {
                     	    if ( !((true)) ) {
                     	        if (state.backtracking>0) {state.failed=true; return current;}
                     	        throw new FailedPredicateException(input, "ruleUiGridLayout", "true");
                     	    }
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2959:16: (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) )
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2959:18: otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:3243:20: (otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:3243:21: otherlv_7= 'styles' ( (lv_styles_8_0= RULE_STRING ) )
                     	    {
-                    	    otherlv_7=(Token)match(input,63,FollowSets000.FOLLOW_63_in_ruleUiGridLayout6500); if (state.failed) return current;
+                    	    otherlv_7=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
-                    	          	newLeafNode(otherlv_7, grammarAccess.getUiGridLayoutAccess().getStylesKeyword_2_1_2_0());
-                    	          
+                    	      										newLeafNode(otherlv_7, grammarAccess.getUiGridLayoutAccess().getStylesKeyword_2_1_2_0());
+                    	      									
                     	    }
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2963:1: ( (lv_styles_8_0= RULE_STRING ) )
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2964:1: (lv_styles_8_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:3247:10: ( (lv_styles_8_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:3248:11: (lv_styles_8_0= RULE_STRING )
                     	    {
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2964:1: (lv_styles_8_0= RULE_STRING )
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2965:3: lv_styles_8_0= RULE_STRING
+                    	    // InternalUIGrammar.g:3248:11: (lv_styles_8_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:3249:12: lv_styles_8_0= RULE_STRING
                     	    {
-                    	    lv_styles_8_0=(Token)match(input,RULE_STRING,FollowSets000.FOLLOW_RULE_STRING_in_ruleUiGridLayout6517); if (state.failed) return current;
+                    	    lv_styles_8_0=(Token)match(input,RULE_STRING,FOLLOW_53); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
-                    	      			newLeafNode(lv_styles_8_0, grammarAccess.getUiGridLayoutAccess().getStylesSTRINGTerminalRuleCall_2_1_2_1_0()); 
-                    	      		
+                    	      												newLeafNode(lv_styles_8_0, grammarAccess.getUiGridLayoutAccess().getStylesSTRINGTerminalRuleCall_2_1_2_1_0());
+                    	      											
                     	    }
                     	    if ( state.backtracking==0 ) {
 
-                    	      	        if (current==null) {
-                    	      	            current = createModelElement(grammarAccess.getUiGridLayoutRule());
-                    	      	        }
-                    	             		setWithLastConsumed(
-                    	             			current, 
-                    	             			"styles",
-                    	              		lv_styles_8_0, 
-                    	              		"STRING");
-                    	      	    
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiGridLayoutRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"styles",
+                    	      													lv_styles_8_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
                     	    }
 
                     	    }
@@ -8441,45 +9120,45 @@
                     	    }
                     	    break;
                     	case 4 :
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2988:4: ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) )
+                    	    // InternalUIGrammar.g:3271:5: ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) )
                     	    {
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2988:4: ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) )
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2989:5: {...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) )
+                    	    // InternalUIGrammar.g:3271:5: ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) )
+                    	    // InternalUIGrammar.g:3272:6: {...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) )
                     	    {
                     	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 3) ) {
                     	        if (state.backtracking>0) {state.failed=true; return current;}
                     	        throw new FailedPredicateException(input, "ruleUiGridLayout", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 3)");
                     	    }
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2989:111: ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) )
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2990:6: ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) )
+                    	    // InternalUIGrammar.g:3272:112: ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) )
+                    	    // InternalUIGrammar.g:3273:7: ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) )
                     	    {
                     	    getUnorderedGroupHelper().select(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 3);
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2993:6: ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) )
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2993:7: {...}? => ( (lv_readonly_9_0= 'readonly' ) )
+                    	    // InternalUIGrammar.g:3276:10: ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) )
+                    	    // InternalUIGrammar.g:3276:11: {...}? => ( (lv_readonly_9_0= 'readonly' ) )
                     	    {
                     	    if ( !((true)) ) {
                     	        if (state.backtracking>0) {state.failed=true; return current;}
                     	        throw new FailedPredicateException(input, "ruleUiGridLayout", "true");
                     	    }
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2993:16: ( (lv_readonly_9_0= 'readonly' ) )
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2994:1: (lv_readonly_9_0= 'readonly' )
+                    	    // InternalUIGrammar.g:3276:20: ( (lv_readonly_9_0= 'readonly' ) )
+                    	    // InternalUIGrammar.g:3276:21: (lv_readonly_9_0= 'readonly' )
                     	    {
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2994:1: (lv_readonly_9_0= 'readonly' )
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:2995:3: lv_readonly_9_0= 'readonly'
+                    	    // InternalUIGrammar.g:3276:21: (lv_readonly_9_0= 'readonly' )
+                    	    // InternalUIGrammar.g:3277:11: lv_readonly_9_0= 'readonly'
                     	    {
-                    	    lv_readonly_9_0=(Token)match(input,64,FollowSets000.FOLLOW_64_in_ruleUiGridLayout6595); if (state.failed) return current;
+                    	    lv_readonly_9_0=(Token)match(input,65,FOLLOW_53); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
-                    	              newLeafNode(lv_readonly_9_0, grammarAccess.getUiGridLayoutAccess().getReadonlyReadonlyKeyword_2_1_3_0());
-                    	          
+                    	      											newLeafNode(lv_readonly_9_0, grammarAccess.getUiGridLayoutAccess().getReadonlyReadonlyKeyword_2_1_3_0());
+                    	      										
                     	    }
                     	    if ( state.backtracking==0 ) {
 
-                    	      	        if (current==null) {
-                    	      	            current = createModelElement(grammarAccess.getUiGridLayoutRule());
-                    	      	        }
-                    	             		setWithLastConsumed(current, "readonly", true, "readonly");
-                    	      	    
+                    	      											if (current==null) {
+                    	      												current = createModelElement(grammarAccess.getUiGridLayoutRule());
+                    	      											}
+                    	      											setWithLastConsumed(current, "readonly", true, "readonly");
+                    	      										
                     	    }
 
                     	    }
@@ -8502,7 +9181,7 @@
                     	    break;
 
                     	default :
-                    	    break loop52;
+                    	    break loop55;
                         }
                     } while (true);
 
@@ -8516,11 +9195,11 @@
 
                     }
 
-                    otherlv_10=(Token)match(input,48,FollowSets000.FOLLOW_48_in_ruleUiGridLayout6660); if (state.failed) return current;
+                    otherlv_10=(Token)match(input,47,FOLLOW_55); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_10, grammarAccess.getUiGridLayoutAccess().getRightParenthesisKeyword_2_2());
-                          
+                      				newLeafNode(otherlv_10, grammarAccess.getUiGridLayoutAccess().getRightParenthesisKeyword_2_2());
+                      			
                     }
 
                     }
@@ -8528,37 +9207,37 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3026:3: ( (lv_name_11_0= RULE_ID ) )?
-            int alt54=2;
-            int LA54_0 = input.LA(1);
+            // InternalUIGrammar.g:3306:3: ( (lv_name_11_0= RULE_ID ) )?
+            int alt57=2;
+            int LA57_0 = input.LA(1);
 
-            if ( (LA54_0==RULE_ID) ) {
-                alt54=1;
+            if ( (LA57_0==RULE_ID) ) {
+                alt57=1;
             }
-            switch (alt54) {
+            switch (alt57) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3027:1: (lv_name_11_0= RULE_ID )
+                    // InternalUIGrammar.g:3307:4: (lv_name_11_0= RULE_ID )
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3027:1: (lv_name_11_0= RULE_ID )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3028:3: lv_name_11_0= RULE_ID
+                    // InternalUIGrammar.g:3307:4: (lv_name_11_0= RULE_ID )
+                    // InternalUIGrammar.g:3308:5: lv_name_11_0= RULE_ID
                     {
-                    lv_name_11_0=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_RULE_ID_in_ruleUiGridLayout6679); if (state.failed) return current;
+                    lv_name_11_0=(Token)match(input,RULE_ID,FOLLOW_11); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      			newLeafNode(lv_name_11_0, grammarAccess.getUiGridLayoutAccess().getNameIDTerminalRuleCall_3_0()); 
-                      		
+                      					newLeafNode(lv_name_11_0, grammarAccess.getUiGridLayoutAccess().getNameIDTerminalRuleCall_3_0());
+                      				
                     }
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElement(grammarAccess.getUiGridLayoutRule());
-                      	        }
-                             		setWithLastConsumed(
-                             			current, 
-                             			"name",
-                              		lv_name_11_0, 
-                              		"ID");
-                      	    
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiGridLayoutRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_11_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
                     }
 
                     }
@@ -8569,52 +9248,52 @@
 
             }
 
-            otherlv_12=(Token)match(input,21,FollowSets000.FOLLOW_21_in_ruleUiGridLayout6697); if (state.failed) return current;
+            otherlv_12=(Token)match(input,20,FOLLOW_56); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_12, grammarAccess.getUiGridLayoutAccess().getLeftCurlyBracketKeyword_4());
-                  
+              			newLeafNode(otherlv_12, grammarAccess.getUiGridLayoutAccess().getLeftCurlyBracketKeyword_4());
+              		
             }
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3048:1: ( (lv_contents_13_0= ruleUiGridLayoutAssigment ) )*
-            loop55:
+            // InternalUIGrammar.g:3328:3: ( (lv_contents_13_0= ruleUiGridLayoutAssigment ) )*
+            loop58:
             do {
-                int alt55=2;
-                int LA55_0 = input.LA(1);
+                int alt58=2;
+                int LA58_0 = input.LA(1);
 
-                if ( (LA55_0==61||(LA55_0>=65 && LA55_0<=66)||LA55_0==69||LA55_0==73||(LA55_0>=78 && LA55_0<=79)||LA55_0==83||LA55_0==90||(LA55_0>=94 && LA55_0<=95)||(LA55_0>=97 && LA55_0<=99)||LA55_0==104||LA55_0==106||LA55_0==111||(LA55_0>=116 && LA55_0<=121)||LA55_0==123||(LA55_0>=126 && LA55_0<=127)||(LA55_0>=131 && LA55_0<=132)||(LA55_0>=136 && LA55_0<=137)||(LA55_0>=143 && LA55_0<=144)) ) {
-                    alt55=1;
+                if ( (LA58_0==62||(LA58_0>=66 && LA58_0<=67)||LA58_0==70||LA58_0==74||(LA58_0>=79 && LA58_0<=80)||LA58_0==84||LA58_0==91||(LA58_0>=95 && LA58_0<=96)||(LA58_0>=98 && LA58_0<=100)||LA58_0==105||LA58_0==107||LA58_0==112||(LA58_0>=117 && LA58_0<=122)||LA58_0==124||(LA58_0>=128 && LA58_0<=129)||(LA58_0>=133 && LA58_0<=134)||(LA58_0>=138 && LA58_0<=139)||(LA58_0>=145 && LA58_0<=146)) ) {
+                    alt58=1;
                 }
 
 
-                switch (alt55) {
+                switch (alt58) {
             	case 1 :
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3049:1: (lv_contents_13_0= ruleUiGridLayoutAssigment )
+            	    // InternalUIGrammar.g:3329:4: (lv_contents_13_0= ruleUiGridLayoutAssigment )
             	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3049:1: (lv_contents_13_0= ruleUiGridLayoutAssigment )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3050:3: lv_contents_13_0= ruleUiGridLayoutAssigment
+            	    // InternalUIGrammar.g:3329:4: (lv_contents_13_0= ruleUiGridLayoutAssigment )
+            	    // InternalUIGrammar.g:3330:5: lv_contents_13_0= ruleUiGridLayoutAssigment
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getUiGridLayoutAccess().getContentsUiGridLayoutAssigmentParserRuleCall_5_0()); 
-            	      	    
+
+            	      					newCompositeNode(grammarAccess.getUiGridLayoutAccess().getContentsUiGridLayoutAssigmentParserRuleCall_5_0());
+            	      				
             	    }
-            	    pushFollow(FollowSets000.FOLLOW_ruleUiGridLayoutAssigment_in_ruleUiGridLayout6718);
+            	    pushFollow(FOLLOW_56);
             	    lv_contents_13_0=ruleUiGridLayoutAssigment();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getUiGridLayoutRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"contents",
-            	              		lv_contents_13_0, 
-            	              		"UiGridLayoutAssigment");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiGridLayoutRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"contents",
+            	      						lv_contents_13_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiGridLayoutAssigment");
+            	      					afterParserOrEnumRuleCall();
+            	      				
             	    }
 
             	    }
@@ -8624,50 +9303,50 @@
             	    break;
 
             	default :
-            	    break loop55;
+            	    break loop58;
                 }
             } while (true);
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3066:3: ( (lv_bindings_14_0= ruleUiBinding ) )*
-            loop56:
+            // InternalUIGrammar.g:3347:3: ( (lv_bindings_14_0= ruleUiBinding ) )*
+            loop59:
             do {
-                int alt56=2;
-                int LA56_0 = input.LA(1);
+                int alt59=2;
+                int LA59_0 = input.LA(1);
 
-                if ( (LA56_0==27) ) {
-                    alt56=1;
+                if ( (LA59_0==26) ) {
+                    alt59=1;
                 }
 
 
-                switch (alt56) {
+                switch (alt59) {
             	case 1 :
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3067:1: (lv_bindings_14_0= ruleUiBinding )
+            	    // InternalUIGrammar.g:3348:4: (lv_bindings_14_0= ruleUiBinding )
             	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3067:1: (lv_bindings_14_0= ruleUiBinding )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3068:3: lv_bindings_14_0= ruleUiBinding
+            	    // InternalUIGrammar.g:3348:4: (lv_bindings_14_0= ruleUiBinding )
+            	    // InternalUIGrammar.g:3349:5: lv_bindings_14_0= ruleUiBinding
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getUiGridLayoutAccess().getBindingsUiBindingParserRuleCall_6_0()); 
-            	      	    
+
+            	      					newCompositeNode(grammarAccess.getUiGridLayoutAccess().getBindingsUiBindingParserRuleCall_6_0());
+            	      				
             	    }
-            	    pushFollow(FollowSets000.FOLLOW_ruleUiBinding_in_ruleUiGridLayout6740);
+            	    pushFollow(FOLLOW_42);
             	    lv_bindings_14_0=ruleUiBinding();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getUiGridLayoutRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"bindings",
-            	              		lv_bindings_14_0, 
-            	              		"UiBinding");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiGridLayoutRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"bindings",
+            	      						lv_bindings_14_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+            	      					afterParserOrEnumRuleCall();
+            	      				
             	    }
 
             	    }
@@ -8677,50 +9356,50 @@
             	    break;
 
             	default :
-            	    break loop56;
+            	    break loop59;
                 }
             } while (true);
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3084:3: ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )*
-            loop57:
+            // InternalUIGrammar.g:3366:3: ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )*
+            loop60:
             do {
-                int alt57=2;
-                int LA57_0 = input.LA(1);
+                int alt60=2;
+                int LA60_0 = input.LA(1);
 
-                if ( (LA57_0==151) ) {
-                    alt57=1;
+                if ( (LA60_0==153) ) {
+                    alt60=1;
                 }
 
 
-                switch (alt57) {
+                switch (alt60) {
             	case 1 :
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3085:1: (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment )
+            	    // InternalUIGrammar.g:3367:4: (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment )
             	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3085:1: (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3086:3: lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment
+            	    // InternalUIGrammar.g:3367:4: (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment )
+            	    // InternalUIGrammar.g:3368:5: lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getUiGridLayoutAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0()); 
-            	      	    
+
+            	      					newCompositeNode(grammarAccess.getUiGridLayoutAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0());
+            	      				
             	    }
-            	    pushFollow(FollowSets000.FOLLOW_ruleUiVisibilityProcessorAssignment_in_ruleUiGridLayout6762);
+            	    pushFollow(FOLLOW_42);
             	    lv_processorAssignments_15_0=ruleUiVisibilityProcessorAssignment();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getUiGridLayoutRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"processorAssignments",
-            	              		lv_processorAssignments_15_0, 
-            	              		"UiVisibilityProcessorAssignment");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiGridLayoutRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"processorAssignments",
+            	      						lv_processorAssignments_15_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+            	      					afterParserOrEnumRuleCall();
+            	      				
             	    }
 
             	    }
@@ -8730,15 +9409,15 @@
             	    break;
 
             	default :
-            	    break loop57;
+            	    break loop60;
                 }
             } while (true);
 
-            otherlv_16=(Token)match(input,22,FollowSets000.FOLLOW_22_in_ruleUiGridLayout6775); if (state.failed) return current;
+            otherlv_16=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_16, grammarAccess.getUiGridLayoutAccess().getRightCurlyBracketKeyword_8());
-                  
+              			newLeafNode(otherlv_16, grammarAccess.getUiGridLayoutAccess().getRightCurlyBracketKeyword_8());
+              		
             }
 
             }
@@ -8747,14 +9426,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -8763,7 +9444,7 @@
 
 
     // $ANTLR start "entryRuleUiVisibilityProcessorAssignment"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3114:1: entryRuleUiVisibilityProcessorAssignment returns [EObject current=null] : iv_ruleUiVisibilityProcessorAssignment= ruleUiVisibilityProcessorAssignment EOF ;
+    // InternalUIGrammar.g:3393:1: entryRuleUiVisibilityProcessorAssignment returns [EObject current=null] : iv_ruleUiVisibilityProcessorAssignment= ruleUiVisibilityProcessorAssignment EOF ;
     public final EObject entryRuleUiVisibilityProcessorAssignment() throws RecognitionException {
         EObject current = null;
 
@@ -8771,13 +9452,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3115:2: (iv_ruleUiVisibilityProcessorAssignment= ruleUiVisibilityProcessorAssignment EOF )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3116:2: iv_ruleUiVisibilityProcessorAssignment= ruleUiVisibilityProcessorAssignment EOF
+            // InternalUIGrammar.g:3393:72: (iv_ruleUiVisibilityProcessorAssignment= ruleUiVisibilityProcessorAssignment EOF )
+            // InternalUIGrammar.g:3394:2: iv_ruleUiVisibilityProcessorAssignment= ruleUiVisibilityProcessorAssignment EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUiVisibilityProcessorAssignmentRule()); 
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiVisibilityProcessorAssignment_in_entryRuleUiVisibilityProcessorAssignment6811);
+            pushFollow(FOLLOW_1);
             iv_ruleUiVisibilityProcessorAssignment=ruleUiVisibilityProcessorAssignment();
 
             state._fsp--;
@@ -8785,16 +9466,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUiVisibilityProcessorAssignment; 
             }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiVisibilityProcessorAssignment6821); 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;
@@ -8803,63 +9484,64 @@
 
 
     // $ANTLR start "ruleUiVisibilityProcessorAssignment"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3123:1: ruleUiVisibilityProcessorAssignment returns [EObject current=null] : ( () ( (lv_processor_1_0= ruleUiVisibilityProcessor ) ) ) ;
+    // InternalUIGrammar.g:3400:1: ruleUiVisibilityProcessorAssignment returns [EObject current=null] : ( () ( (lv_processor_1_0= ruleUiVisibilityProcessor ) ) ) ;
     public final EObject ruleUiVisibilityProcessorAssignment() throws RecognitionException {
         EObject current = null;
 
         EObject lv_processor_1_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3126:28: ( ( () ( (lv_processor_1_0= ruleUiVisibilityProcessor ) ) ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3127:1: ( () ( (lv_processor_1_0= ruleUiVisibilityProcessor ) ) )
+            // InternalUIGrammar.g:3406:2: ( ( () ( (lv_processor_1_0= ruleUiVisibilityProcessor ) ) ) )
+            // InternalUIGrammar.g:3407:2: ( () ( (lv_processor_1_0= ruleUiVisibilityProcessor ) ) )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3127:1: ( () ( (lv_processor_1_0= ruleUiVisibilityProcessor ) ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3127:2: () ( (lv_processor_1_0= ruleUiVisibilityProcessor ) )
+            // InternalUIGrammar.g:3407:2: ( () ( (lv_processor_1_0= ruleUiVisibilityProcessor ) ) )
+            // InternalUIGrammar.g:3408:3: () ( (lv_processor_1_0= ruleUiVisibilityProcessor ) )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3127:2: ()
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3128:5: 
+            // InternalUIGrammar.g:3408:3: ()
+            // InternalUIGrammar.g:3409:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getUiVisibilityProcessorAssignmentAccess().getUiVisibilityProcessorAssignmentAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiVisibilityProcessorAssignmentAccess().getUiVisibilityProcessorAssignmentAction_0(),
+              					current);
+              			
             }
 
             }
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3133:2: ( (lv_processor_1_0= ruleUiVisibilityProcessor ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3134:1: (lv_processor_1_0= ruleUiVisibilityProcessor )
+            // InternalUIGrammar.g:3415:3: ( (lv_processor_1_0= ruleUiVisibilityProcessor ) )
+            // InternalUIGrammar.g:3416:4: (lv_processor_1_0= ruleUiVisibilityProcessor )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3134:1: (lv_processor_1_0= ruleUiVisibilityProcessor )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3135:3: lv_processor_1_0= ruleUiVisibilityProcessor
+            // InternalUIGrammar.g:3416:4: (lv_processor_1_0= ruleUiVisibilityProcessor )
+            // InternalUIGrammar.g:3417:5: lv_processor_1_0= ruleUiVisibilityProcessor
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getUiVisibilityProcessorAssignmentAccess().getProcessorUiVisibilityProcessorParserRuleCall_1_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getUiVisibilityProcessorAssignmentAccess().getProcessorUiVisibilityProcessorParserRuleCall_1_0());
+              				
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiVisibilityProcessor_in_ruleUiVisibilityProcessorAssignment6876);
+            pushFollow(FOLLOW_2);
             lv_processor_1_0=ruleUiVisibilityProcessor();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getUiVisibilityProcessorAssignmentRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"processor",
-                      		lv_processor_1_0, 
-                      		"UiVisibilityProcessor");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getUiVisibilityProcessorAssignmentRule());
+              					}
+              					set(
+              						current,
+              						"processor",
+              						lv_processor_1_0,
+              						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessor");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -8874,14 +9556,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -8890,7 +9574,7 @@
 
 
     // $ANTLR start "entryRuleUiGridLayoutAssigment"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3159:1: entryRuleUiGridLayoutAssigment returns [EObject current=null] : iv_ruleUiGridLayoutAssigment= ruleUiGridLayoutAssigment EOF ;
+    // InternalUIGrammar.g:3438:1: entryRuleUiGridLayoutAssigment returns [EObject current=null] : iv_ruleUiGridLayoutAssigment= ruleUiGridLayoutAssigment EOF ;
     public final EObject entryRuleUiGridLayoutAssigment() throws RecognitionException {
         EObject current = null;
 
@@ -8898,13 +9582,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3160:2: (iv_ruleUiGridLayoutAssigment= ruleUiGridLayoutAssigment EOF )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3161:2: iv_ruleUiGridLayoutAssigment= ruleUiGridLayoutAssigment EOF
+            // InternalUIGrammar.g:3438:62: (iv_ruleUiGridLayoutAssigment= ruleUiGridLayoutAssigment EOF )
+            // InternalUIGrammar.g:3439:2: iv_ruleUiGridLayoutAssigment= ruleUiGridLayoutAssigment EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUiGridLayoutAssigmentRule()); 
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiGridLayoutAssigment_in_entryRuleUiGridLayoutAssigment6912);
+            pushFollow(FOLLOW_1);
             iv_ruleUiGridLayoutAssigment=ruleUiGridLayoutAssigment();
 
             state._fsp--;
@@ -8912,16 +9596,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUiGridLayoutAssigment; 
             }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiGridLayoutAssigment6922); 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;
@@ -8930,7 +9614,7 @@
 
 
     // $ANTLR start "ruleUiGridLayoutAssigment"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3168:1: ruleUiGridLayoutAssigment returns [EObject current=null] : ( ( (lv_element_0_0= ruleUiEmbeddable ) ) (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )? ) ;
+    // InternalUIGrammar.g:3445:1: ruleUiGridLayoutAssigment returns [EObject current=null] : ( ( (lv_element_0_0= ruleUiEmbeddable ) ) (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )? ) ;
     public final EObject ruleUiGridLayoutAssigment() throws RecognitionException {
         EObject current = null;
 
@@ -8940,43 +9624,44 @@
         Enumerator lv_alignment_2_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3171:28: ( ( ( (lv_element_0_0= ruleUiEmbeddable ) ) (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )? ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3172:1: ( ( (lv_element_0_0= ruleUiEmbeddable ) ) (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )? )
+            // InternalUIGrammar.g:3451:2: ( ( ( (lv_element_0_0= ruleUiEmbeddable ) ) (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )? ) )
+            // InternalUIGrammar.g:3452:2: ( ( (lv_element_0_0= ruleUiEmbeddable ) ) (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )? )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3172:1: ( ( (lv_element_0_0= ruleUiEmbeddable ) ) (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )? )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3172:2: ( (lv_element_0_0= ruleUiEmbeddable ) ) (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )?
+            // InternalUIGrammar.g:3452:2: ( ( (lv_element_0_0= ruleUiEmbeddable ) ) (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )? )
+            // InternalUIGrammar.g:3453:3: ( (lv_element_0_0= ruleUiEmbeddable ) ) (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )?
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3172:2: ( (lv_element_0_0= ruleUiEmbeddable ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3173:1: (lv_element_0_0= ruleUiEmbeddable )
+            // InternalUIGrammar.g:3453:3: ( (lv_element_0_0= ruleUiEmbeddable ) )
+            // InternalUIGrammar.g:3454:4: (lv_element_0_0= ruleUiEmbeddable )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3173:1: (lv_element_0_0= ruleUiEmbeddable )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3174:3: lv_element_0_0= ruleUiEmbeddable
+            // InternalUIGrammar.g:3454:4: (lv_element_0_0= ruleUiEmbeddable )
+            // InternalUIGrammar.g:3455:5: lv_element_0_0= ruleUiEmbeddable
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getUiGridLayoutAssigmentAccess().getElementUiEmbeddableParserRuleCall_0_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getUiGridLayoutAssigmentAccess().getElementUiEmbeddableParserRuleCall_0_0());
+              				
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiEmbeddable_in_ruleUiGridLayoutAssigment6968);
+            pushFollow(FOLLOW_57);
             lv_element_0_0=ruleUiEmbeddable();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getUiGridLayoutAssigmentRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"element",
-                      		lv_element_0_0, 
-                      		"UiEmbeddable");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getUiGridLayoutAssigmentRule());
+              					}
+              					set(
+              						current,
+              						"element",
+              						lv_element_0_0,
+              						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiEmbeddable");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -8984,51 +9669,51 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3190:2: (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )?
-            int alt58=2;
-            int LA58_0 = input.LA(1);
+            // InternalUIGrammar.g:3472:3: (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )?
+            int alt61=2;
+            int LA61_0 = input.LA(1);
 
-            if ( (LA58_0==54) ) {
-                alt58=1;
+            if ( (LA61_0==53) ) {
+                alt61=1;
             }
-            switch (alt58) {
+            switch (alt61) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3190:4: otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) )
+                    // InternalUIGrammar.g:3473:4: otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) )
                     {
-                    otherlv_1=(Token)match(input,54,FollowSets000.FOLLOW_54_in_ruleUiGridLayoutAssigment6981); if (state.failed) return current;
+                    otherlv_1=(Token)match(input,53,FOLLOW_41); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_1, grammarAccess.getUiGridLayoutAssigmentAccess().getAlignKeyword_1_0());
-                          
+                      				newLeafNode(otherlv_1, grammarAccess.getUiGridLayoutAssigmentAccess().getAlignKeyword_1_0());
+                      			
                     }
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3194:1: ( (lv_alignment_2_0= ruleUiAlignment ) )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3195:1: (lv_alignment_2_0= ruleUiAlignment )
+                    // InternalUIGrammar.g:3477:4: ( (lv_alignment_2_0= ruleUiAlignment ) )
+                    // InternalUIGrammar.g:3478:5: (lv_alignment_2_0= ruleUiAlignment )
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3195:1: (lv_alignment_2_0= ruleUiAlignment )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3196:3: lv_alignment_2_0= ruleUiAlignment
+                    // InternalUIGrammar.g:3478:5: (lv_alignment_2_0= ruleUiAlignment )
+                    // InternalUIGrammar.g:3479:6: lv_alignment_2_0= ruleUiAlignment
                     {
                     if ( state.backtracking==0 ) {
-                       
-                      	        newCompositeNode(grammarAccess.getUiGridLayoutAssigmentAccess().getAlignmentUiAlignmentEnumRuleCall_1_1_0()); 
-                      	    
+
+                      						newCompositeNode(grammarAccess.getUiGridLayoutAssigmentAccess().getAlignmentUiAlignmentEnumRuleCall_1_1_0());
+                      					
                     }
-                    pushFollow(FollowSets000.FOLLOW_ruleUiAlignment_in_ruleUiGridLayoutAssigment7002);
+                    pushFollow(FOLLOW_2);
                     lv_alignment_2_0=ruleUiAlignment();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElementForParent(grammarAccess.getUiGridLayoutAssigmentRule());
-                      	        }
-                             		set(
-                             			current, 
-                             			"alignment",
-                              		lv_alignment_2_0, 
-                              		"UiAlignment");
-                      	        afterParserOrEnumRuleCall();
-                      	    
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getUiGridLayoutAssigmentRule());
+                      						}
+                      						set(
+                      							current,
+                      							"alignment",
+                      							lv_alignment_2_0,
+                      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiAlignment");
+                      						afterParserOrEnumRuleCall();
+                      					
                     }
 
                     }
@@ -9049,14 +9734,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -9065,7 +9752,7 @@
 
 
     // $ANTLR start "entryRuleUiFormLayout"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3220:1: entryRuleUiFormLayout returns [EObject current=null] : iv_ruleUiFormLayout= ruleUiFormLayout EOF ;
+    // InternalUIGrammar.g:3501:1: entryRuleUiFormLayout returns [EObject current=null] : iv_ruleUiFormLayout= ruleUiFormLayout EOF ;
     public final EObject entryRuleUiFormLayout() throws RecognitionException {
         EObject current = null;
 
@@ -9073,13 +9760,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3221:2: (iv_ruleUiFormLayout= ruleUiFormLayout EOF )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3222:2: iv_ruleUiFormLayout= ruleUiFormLayout EOF
+            // InternalUIGrammar.g:3501:53: (iv_ruleUiFormLayout= ruleUiFormLayout EOF )
+            // InternalUIGrammar.g:3502:2: iv_ruleUiFormLayout= ruleUiFormLayout EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUiFormLayoutRule()); 
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiFormLayout_in_entryRuleUiFormLayout7040);
+            pushFollow(FOLLOW_1);
             iv_ruleUiFormLayout=ruleUiFormLayout();
 
             state._fsp--;
@@ -9087,16 +9774,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUiFormLayout; 
             }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiFormLayout7050); 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;
@@ -9105,7 +9792,7 @@
 
 
     // $ANTLR start "ruleUiFormLayout"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3229:1: ruleUiFormLayout returns [EObject current=null] : ( () otherlv_1= 'form' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiFormLayoutAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' ) ;
+    // InternalUIGrammar.g:3508:1: ruleUiFormLayout returns [EObject current=null] : ( () otherlv_1= 'form' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiFormLayoutAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' ) ;
     public final EObject ruleUiFormLayout() throws RecognitionException {
         EObject current = null;
 
@@ -9127,137 +9814,138 @@
         EObject lv_processorAssignments_13_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3232:28: ( ( () otherlv_1= 'form' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiFormLayoutAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3233:1: ( () otherlv_1= 'form' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiFormLayoutAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )
+            // InternalUIGrammar.g:3514:2: ( ( () otherlv_1= 'form' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiFormLayoutAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' ) )
+            // InternalUIGrammar.g:3515:2: ( () otherlv_1= 'form' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiFormLayoutAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3233:1: ( () otherlv_1= 'form' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiFormLayoutAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3233:2: () otherlv_1= 'form' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiFormLayoutAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}'
+            // InternalUIGrammar.g:3515:2: ( () otherlv_1= 'form' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiFormLayoutAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )
+            // InternalUIGrammar.g:3516:3: () otherlv_1= 'form' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiFormLayoutAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}'
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3233:2: ()
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3234:5: 
+            // InternalUIGrammar.g:3516:3: ()
+            // InternalUIGrammar.g:3517:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getUiFormLayoutAccess().getUiFormLayoutAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiFormLayoutAccess().getUiFormLayoutAction_0(),
+              					current);
+              			
             }
 
             }
 
-            otherlv_1=(Token)match(input,65,FollowSets000.FOLLOW_65_in_ruleUiFormLayout7096); if (state.failed) return current;
+            otherlv_1=(Token)match(input,66,FOLLOW_58); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getUiFormLayoutAccess().getFormKeyword_1());
-                  
+              			newLeafNode(otherlv_1, grammarAccess.getUiFormLayoutAccess().getFormKeyword_1());
+              		
             }
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3243:1: ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )?
-            int alt62=2;
-            int LA62_0 = input.LA(1);
+            // InternalUIGrammar.g:3527:3: ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )?
+            int alt65=2;
+            int LA65_0 = input.LA(1);
 
-            if ( (LA62_0==46||LA62_0==48||(LA62_0>=63 && LA62_0<=64)) ) {
-                alt62=1;
+            if ( (LA65_0==45||LA65_0==47||(LA65_0>=64 && LA65_0<=65)) ) {
+                alt65=1;
             }
-            switch (alt62) {
+            switch (alt65) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3245:1: ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) )
+                    // InternalUIGrammar.g:3528:4: ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) )
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3245:1: ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3246:2: ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?)
+                    // InternalUIGrammar.g:3528:4: ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) )
+                    // InternalUIGrammar.g:3529:5: ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?)
                     {
                     getUnorderedGroupHelper().enter(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2());
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3249:2: ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?)
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3250:3: ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?
+                    // InternalUIGrammar.g:3532:5: ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?)
+                    // InternalUIGrammar.g:3533:6: ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3250:3: ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+
-                    int cnt61=0;
-                    loop61:
+                    // InternalUIGrammar.g:3533:6: ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+
+                    int cnt64=0;
+                    loop64:
                     do {
-                        int alt61=4;
-                        int LA61_0 = input.LA(1);
+                        int alt64=4;
+                        int LA64_0 = input.LA(1);
 
-                        if ( LA61_0 ==46 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2(), 0) ) {
-                            alt61=1;
+                        if ( LA64_0 == 45 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2(), 0) ) {
+                            alt64=1;
                         }
-                        else if ( LA61_0 ==63 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2(), 1) ) {
-                            alt61=2;
+                        else if ( LA64_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2(), 1) ) {
+                            alt64=2;
                         }
-                        else if ( (LA61_0==48||LA61_0==64) && getUnorderedGroupHelper().canSelect(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2(), 2) ) {
-                            alt61=3;
+                        else if ( ( LA64_0 == 47 || LA64_0 == 65 ) && getUnorderedGroupHelper().canSelect(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2(), 2) ) {
+                            alt64=3;
                         }
 
 
-                        switch (alt61) {
+                        switch (alt64) {
                     	case 1 :
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3252:4: ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) )
+                    	    // InternalUIGrammar.g:3534:4: ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) )
                     	    {
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3252:4: ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) )
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3253:5: {...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) )
+                    	    // InternalUIGrammar.g:3534:4: ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) )
+                    	    // InternalUIGrammar.g:3535:5: {...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) )
                     	    {
                     	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2(), 0) ) {
                     	        if (state.backtracking>0) {state.failed=true; return current;}
                     	        throw new FailedPredicateException(input, "ruleUiFormLayout", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2(), 0)");
                     	    }
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3253:109: ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) )
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3254:6: ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) )
+                    	    // InternalUIGrammar.g:3535:109: ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) )
+                    	    // InternalUIGrammar.g:3536:6: ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) )
                     	    {
                     	    getUnorderedGroupHelper().select(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2(), 0);
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3257:6: ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) )
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3257:7: {...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? )
+                    	    // InternalUIGrammar.g:3539:9: ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) )
+                    	    // InternalUIGrammar.g:3539:10: {...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? )
                     	    {
                     	    if ( !((true)) ) {
                     	        if (state.backtracking>0) {state.failed=true; return current;}
                     	        throw new FailedPredicateException(input, "ruleUiFormLayout", "true");
                     	    }
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3257:16: (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? )
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3257:18: otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )?
+                    	    // InternalUIGrammar.g:3539:19: (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? )
+                    	    // InternalUIGrammar.g:3539:20: otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )?
                     	    {
-                    	    otherlv_3=(Token)match(input,46,FollowSets000.FOLLOW_46_in_ruleUiFormLayout7154); if (state.failed) return current;
+                    	    otherlv_3=(Token)match(input,45,FOLLOW_59); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
-                    	          	newLeafNode(otherlv_3, grammarAccess.getUiFormLayoutAccess().getLeftParenthesisKeyword_2_0_0());
-                    	          
+                    	      									newLeafNode(otherlv_3, grammarAccess.getUiFormLayoutAccess().getLeftParenthesisKeyword_2_0_0());
+                    	      								
                     	    }
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3261:1: ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )?
-                    	    int alt59=2;
-                    	    int LA59_0 = input.LA(1);
+                    	    // InternalUIGrammar.g:3543:9: ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )?
+                    	    int alt62=2;
+                    	    int LA62_0 = input.LA(1);
 
-                    	    if ( (LA59_0==60) ) {
-                    	        alt59=1;
+                    	    if ( (LA62_0==60) ) {
+                    	        alt62=1;
                     	    }
-                    	    switch (alt59) {
+                    	    switch (alt62) {
                     	        case 1 :
-                    	            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3262:1: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	            // InternalUIGrammar.g:3544:10: (lv_i18nInfo_4_0= ruleUiI18nInfo )
                     	            {
-                    	            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3262:1: (lv_i18nInfo_4_0= ruleUiI18nInfo )
-                    	            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3263:3: lv_i18nInfo_4_0= ruleUiI18nInfo
+                    	            // InternalUIGrammar.g:3544:10: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	            // InternalUIGrammar.g:3545:11: lv_i18nInfo_4_0= ruleUiI18nInfo
                     	            {
                     	            if ( state.backtracking==0 ) {
-                    	               
-                    	              	        newCompositeNode(grammarAccess.getUiFormLayoutAccess().getI18nInfoUiI18nInfoParserRuleCall_2_0_1_0()); 
-                    	              	    
+
+                    	              											newCompositeNode(grammarAccess.getUiFormLayoutAccess().getI18nInfoUiI18nInfoParserRuleCall_2_0_1_0());
+                    	              										
                     	            }
-                    	            pushFollow(FollowSets000.FOLLOW_ruleUiI18nInfo_in_ruleUiFormLayout7175);
+                    	            pushFollow(FOLLOW_58);
                     	            lv_i18nInfo_4_0=ruleUiI18nInfo();
 
                     	            state._fsp--;
                     	            if (state.failed) return current;
                     	            if ( state.backtracking==0 ) {
 
-                    	              	        if (current==null) {
-                    	              	            current = createModelElementForParent(grammarAccess.getUiFormLayoutRule());
-                    	              	        }
-                    	                     		set(
-                    	                     			current, 
-                    	                     			"i18nInfo",
-                    	                      		lv_i18nInfo_4_0, 
-                    	                      		"UiI18nInfo");
-                    	              	        afterParserOrEnumRuleCall();
-                    	              	    
+                    	              											if (current==null) {
+                    	              												current = createModelElementForParent(grammarAccess.getUiFormLayoutRule());
+                    	              											}
+                    	              											set(
+                    	              												current,
+                    	              												"i18nInfo",
+                    	              												lv_i18nInfo_4_0,
+                    	              												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	              											afterParserOrEnumRuleCall();
+                    	              										
                     	            }
 
                     	            }
@@ -9285,58 +9973,58 @@
                     	    }
                     	    break;
                     	case 2 :
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3286:4: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:3568:4: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
                     	    {
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3286:4: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3287:5: {...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:3568:4: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:3569:5: {...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
                     	    {
                     	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2(), 1) ) {
                     	        if (state.backtracking>0) {state.failed=true; return current;}
                     	        throw new FailedPredicateException(input, "ruleUiFormLayout", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2(), 1)");
                     	    }
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3287:109: ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3288:6: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:3569:109: ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:3570:6: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
                     	    {
                     	    getUnorderedGroupHelper().select(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2(), 1);
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3291:6: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3291:7: {...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:3573:9: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:3573:10: {...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
                     	    {
                     	    if ( !((true)) ) {
                     	        if (state.backtracking>0) {state.failed=true; return current;}
                     	        throw new FailedPredicateException(input, "ruleUiFormLayout", "true");
                     	    }
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3291:16: (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3291:18: otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:3573:19: (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:3573:20: otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) )
                     	    {
-                    	    otherlv_5=(Token)match(input,63,FollowSets000.FOLLOW_63_in_ruleUiFormLayout7244); if (state.failed) return current;
+                    	    otherlv_5=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
-                    	          	newLeafNode(otherlv_5, grammarAccess.getUiFormLayoutAccess().getStylesKeyword_2_1_0());
-                    	          
+                    	      									newLeafNode(otherlv_5, grammarAccess.getUiFormLayoutAccess().getStylesKeyword_2_1_0());
+                    	      								
                     	    }
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3295:1: ( (lv_styles_6_0= RULE_STRING ) )
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3296:1: (lv_styles_6_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:3577:9: ( (lv_styles_6_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:3578:10: (lv_styles_6_0= RULE_STRING )
                     	    {
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3296:1: (lv_styles_6_0= RULE_STRING )
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3297:3: lv_styles_6_0= RULE_STRING
+                    	    // InternalUIGrammar.g:3578:10: (lv_styles_6_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:3579:11: lv_styles_6_0= RULE_STRING
                     	    {
-                    	    lv_styles_6_0=(Token)match(input,RULE_STRING,FollowSets000.FOLLOW_RULE_STRING_in_ruleUiFormLayout7261); if (state.failed) return current;
+                    	    lv_styles_6_0=(Token)match(input,RULE_STRING,FOLLOW_58); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
-                    	      			newLeafNode(lv_styles_6_0, grammarAccess.getUiFormLayoutAccess().getStylesSTRINGTerminalRuleCall_2_1_1_0()); 
-                    	      		
+                    	      											newLeafNode(lv_styles_6_0, grammarAccess.getUiFormLayoutAccess().getStylesSTRINGTerminalRuleCall_2_1_1_0());
+                    	      										
                     	    }
                     	    if ( state.backtracking==0 ) {
 
-                    	      	        if (current==null) {
-                    	      	            current = createModelElement(grammarAccess.getUiFormLayoutRule());
-                    	      	        }
-                    	             		setWithLastConsumed(
-                    	             			current, 
-                    	             			"styles",
-                    	              		lv_styles_6_0, 
-                    	              		"STRING");
-                    	      	    
+                    	      											if (current==null) {
+                    	      												current = createModelElement(grammarAccess.getUiFormLayoutRule());
+                    	      											}
+                    	      											setWithLastConsumed(
+                    	      												current,
+                    	      												"styles",
+                    	      												lv_styles_6_0,
+                    	      												"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      										
                     	    }
 
                     	    }
@@ -9361,56 +10049,56 @@
                     	    }
                     	    break;
                     	case 3 :
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3320:4: ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) )
+                    	    // InternalUIGrammar.g:3601:4: ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) )
                     	    {
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3320:4: ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) )
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3321:5: {...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) )
+                    	    // InternalUIGrammar.g:3601:4: ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) )
+                    	    // InternalUIGrammar.g:3602:5: {...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) )
                     	    {
                     	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2(), 2) ) {
                     	        if (state.backtracking>0) {state.failed=true; return current;}
                     	        throw new FailedPredicateException(input, "ruleUiFormLayout", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2(), 2)");
                     	    }
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3321:109: ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) )
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3322:6: ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) )
+                    	    // InternalUIGrammar.g:3602:109: ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) )
+                    	    // InternalUIGrammar.g:3603:6: ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) )
                     	    {
                     	    getUnorderedGroupHelper().select(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2(), 2);
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3325:6: ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) )
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3325:7: {...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' )
+                    	    // InternalUIGrammar.g:3606:9: ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) )
+                    	    // InternalUIGrammar.g:3606:10: {...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' )
                     	    {
                     	    if ( !((true)) ) {
                     	        if (state.backtracking>0) {state.failed=true; return current;}
                     	        throw new FailedPredicateException(input, "ruleUiFormLayout", "true");
                     	    }
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3325:16: ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' )
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3325:17: ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')'
+                    	    // InternalUIGrammar.g:3606:19: ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' )
+                    	    // InternalUIGrammar.g:3606:20: ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')'
                     	    {
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3325:17: ( (lv_readonly_7_0= 'readonly' ) )?
-                    	    int alt60=2;
-                    	    int LA60_0 = input.LA(1);
+                    	    // InternalUIGrammar.g:3606:20: ( (lv_readonly_7_0= 'readonly' ) )?
+                    	    int alt63=2;
+                    	    int LA63_0 = input.LA(1);
 
-                    	    if ( (LA60_0==64) ) {
-                    	        alt60=1;
+                    	    if ( (LA63_0==65) ) {
+                    	        alt63=1;
                     	    }
-                    	    switch (alt60) {
+                    	    switch (alt63) {
                     	        case 1 :
-                    	            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3326:1: (lv_readonly_7_0= 'readonly' )
+                    	            // InternalUIGrammar.g:3607:10: (lv_readonly_7_0= 'readonly' )
                     	            {
-                    	            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3326:1: (lv_readonly_7_0= 'readonly' )
-                    	            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3327:3: lv_readonly_7_0= 'readonly'
+                    	            // InternalUIGrammar.g:3607:10: (lv_readonly_7_0= 'readonly' )
+                    	            // InternalUIGrammar.g:3608:11: lv_readonly_7_0= 'readonly'
                     	            {
-                    	            lv_readonly_7_0=(Token)match(input,64,FollowSets000.FOLLOW_64_in_ruleUiFormLayout7340); if (state.failed) return current;
+                    	            lv_readonly_7_0=(Token)match(input,65,FOLLOW_36); if (state.failed) return current;
                     	            if ( state.backtracking==0 ) {
 
-                    	                      newLeafNode(lv_readonly_7_0, grammarAccess.getUiFormLayoutAccess().getReadonlyReadonlyKeyword_2_2_0_0());
-                    	                  
+                    	              											newLeafNode(lv_readonly_7_0, grammarAccess.getUiFormLayoutAccess().getReadonlyReadonlyKeyword_2_2_0_0());
+                    	              										
                     	            }
                     	            if ( state.backtracking==0 ) {
 
-                    	              	        if (current==null) {
-                    	              	            current = createModelElement(grammarAccess.getUiFormLayoutRule());
-                    	              	        }
-                    	                     		setWithLastConsumed(current, "readonly", true, "readonly");
-                    	              	    
+                    	              											if (current==null) {
+                    	              												current = createModelElement(grammarAccess.getUiFormLayoutRule());
+                    	              											}
+                    	              											setWithLastConsumed(current, "readonly", true, "readonly");
+                    	              										
                     	            }
 
                     	            }
@@ -9421,11 +10109,11 @@
 
                     	    }
 
-                    	    otherlv_8=(Token)match(input,48,FollowSets000.FOLLOW_48_in_ruleUiFormLayout7366); if (state.failed) return current;
+                    	    otherlv_8=(Token)match(input,47,FOLLOW_58); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
-                    	          	newLeafNode(otherlv_8, grammarAccess.getUiFormLayoutAccess().getRightParenthesisKeyword_2_2_1());
-                    	          
+                    	      									newLeafNode(otherlv_8, grammarAccess.getUiFormLayoutAccess().getRightParenthesisKeyword_2_2_1());
+                    	      								
                     	    }
 
                     	    }
@@ -9445,13 +10133,13 @@
                     	    break;
 
                     	default :
-                    	    if ( cnt61 >= 1 ) break loop61;
+                    	    if ( cnt64 >= 1 ) break loop64;
                     	    if (state.backtracking>0) {state.failed=true; return current;}
                                 EarlyExitException eee =
-                                    new EarlyExitException(61, input);
+                                    new EarlyExitException(64, input);
                                 throw eee;
                         }
-                        cnt61++;
+                        cnt64++;
                     } while (true);
 
                     if ( ! getUnorderedGroupHelper().canLeave(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2()) ) {
@@ -9471,37 +10159,37 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3359:3: ( (lv_name_9_0= RULE_ID ) )?
-            int alt63=2;
-            int LA63_0 = input.LA(1);
+            // InternalUIGrammar.g:3638:3: ( (lv_name_9_0= RULE_ID ) )?
+            int alt66=2;
+            int LA66_0 = input.LA(1);
 
-            if ( (LA63_0==RULE_ID) ) {
-                alt63=1;
+            if ( (LA66_0==RULE_ID) ) {
+                alt66=1;
             }
-            switch (alt63) {
+            switch (alt66) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3360:1: (lv_name_9_0= RULE_ID )
+                    // InternalUIGrammar.g:3639:4: (lv_name_9_0= RULE_ID )
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3360:1: (lv_name_9_0= RULE_ID )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3361:3: lv_name_9_0= RULE_ID
+                    // InternalUIGrammar.g:3639:4: (lv_name_9_0= RULE_ID )
+                    // InternalUIGrammar.g:3640:5: lv_name_9_0= RULE_ID
                     {
-                    lv_name_9_0=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_RULE_ID_in_ruleUiFormLayout7431); if (state.failed) return current;
+                    lv_name_9_0=(Token)match(input,RULE_ID,FOLLOW_11); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      			newLeafNode(lv_name_9_0, grammarAccess.getUiFormLayoutAccess().getNameIDTerminalRuleCall_3_0()); 
-                      		
+                      					newLeafNode(lv_name_9_0, grammarAccess.getUiFormLayoutAccess().getNameIDTerminalRuleCall_3_0());
+                      				
                     }
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElement(grammarAccess.getUiFormLayoutRule());
-                      	        }
-                             		setWithLastConsumed(
-                             			current, 
-                             			"name",
-                              		lv_name_9_0, 
-                              		"ID");
-                      	    
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiFormLayoutRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_9_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
                     }
 
                     }
@@ -9512,52 +10200,52 @@
 
             }
 
-            otherlv_10=(Token)match(input,21,FollowSets000.FOLLOW_21_in_ruleUiFormLayout7449); if (state.failed) return current;
+            otherlv_10=(Token)match(input,20,FOLLOW_56); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_10, grammarAccess.getUiFormLayoutAccess().getLeftCurlyBracketKeyword_4());
-                  
+              			newLeafNode(otherlv_10, grammarAccess.getUiFormLayoutAccess().getLeftCurlyBracketKeyword_4());
+              		
             }
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3381:1: ( (lv_contents_11_0= ruleUiFormLayoutAssigment ) )*
-            loop64:
+            // InternalUIGrammar.g:3660:3: ( (lv_contents_11_0= ruleUiFormLayoutAssigment ) )*
+            loop67:
             do {
-                int alt64=2;
-                int LA64_0 = input.LA(1);
+                int alt67=2;
+                int LA67_0 = input.LA(1);
 
-                if ( (LA64_0==61||(LA64_0>=65 && LA64_0<=66)||LA64_0==69||LA64_0==73||(LA64_0>=78 && LA64_0<=79)||LA64_0==83||LA64_0==90||(LA64_0>=94 && LA64_0<=95)||(LA64_0>=97 && LA64_0<=99)||LA64_0==104||LA64_0==106||LA64_0==111||(LA64_0>=116 && LA64_0<=121)||LA64_0==123||(LA64_0>=126 && LA64_0<=127)||(LA64_0>=131 && LA64_0<=132)||(LA64_0>=136 && LA64_0<=137)||(LA64_0>=143 && LA64_0<=144)) ) {
-                    alt64=1;
+                if ( (LA67_0==62||(LA67_0>=66 && LA67_0<=67)||LA67_0==70||LA67_0==74||(LA67_0>=79 && LA67_0<=80)||LA67_0==84||LA67_0==91||(LA67_0>=95 && LA67_0<=96)||(LA67_0>=98 && LA67_0<=100)||LA67_0==105||LA67_0==107||LA67_0==112||(LA67_0>=117 && LA67_0<=122)||LA67_0==124||(LA67_0>=128 && LA67_0<=129)||(LA67_0>=133 && LA67_0<=134)||(LA67_0>=138 && LA67_0<=139)||(LA67_0>=145 && LA67_0<=146)) ) {
+                    alt67=1;
                 }
 
 
-                switch (alt64) {
+                switch (alt67) {
             	case 1 :
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3382:1: (lv_contents_11_0= ruleUiFormLayoutAssigment )
+            	    // InternalUIGrammar.g:3661:4: (lv_contents_11_0= ruleUiFormLayoutAssigment )
             	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3382:1: (lv_contents_11_0= ruleUiFormLayoutAssigment )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3383:3: lv_contents_11_0= ruleUiFormLayoutAssigment
+            	    // InternalUIGrammar.g:3661:4: (lv_contents_11_0= ruleUiFormLayoutAssigment )
+            	    // InternalUIGrammar.g:3662:5: lv_contents_11_0= ruleUiFormLayoutAssigment
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getUiFormLayoutAccess().getContentsUiFormLayoutAssigmentParserRuleCall_5_0()); 
-            	      	    
+
+            	      					newCompositeNode(grammarAccess.getUiFormLayoutAccess().getContentsUiFormLayoutAssigmentParserRuleCall_5_0());
+            	      				
             	    }
-            	    pushFollow(FollowSets000.FOLLOW_ruleUiFormLayoutAssigment_in_ruleUiFormLayout7470);
+            	    pushFollow(FOLLOW_56);
             	    lv_contents_11_0=ruleUiFormLayoutAssigment();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getUiFormLayoutRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"contents",
-            	              		lv_contents_11_0, 
-            	              		"UiFormLayoutAssigment");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiFormLayoutRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"contents",
+            	      						lv_contents_11_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiFormLayoutAssigment");
+            	      					afterParserOrEnumRuleCall();
+            	      				
             	    }
 
             	    }
@@ -9567,50 +10255,50 @@
             	    break;
 
             	default :
-            	    break loop64;
+            	    break loop67;
                 }
             } while (true);
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3399:3: ( (lv_bindings_12_0= ruleUiBinding ) )*
-            loop65:
+            // InternalUIGrammar.g:3679:3: ( (lv_bindings_12_0= ruleUiBinding ) )*
+            loop68:
             do {
-                int alt65=2;
-                int LA65_0 = input.LA(1);
+                int alt68=2;
+                int LA68_0 = input.LA(1);
 
-                if ( (LA65_0==27) ) {
-                    alt65=1;
+                if ( (LA68_0==26) ) {
+                    alt68=1;
                 }
 
 
-                switch (alt65) {
+                switch (alt68) {
             	case 1 :
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3400:1: (lv_bindings_12_0= ruleUiBinding )
+            	    // InternalUIGrammar.g:3680:4: (lv_bindings_12_0= ruleUiBinding )
             	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3400:1: (lv_bindings_12_0= ruleUiBinding )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3401:3: lv_bindings_12_0= ruleUiBinding
+            	    // InternalUIGrammar.g:3680:4: (lv_bindings_12_0= ruleUiBinding )
+            	    // InternalUIGrammar.g:3681:5: lv_bindings_12_0= ruleUiBinding
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getUiFormLayoutAccess().getBindingsUiBindingParserRuleCall_6_0()); 
-            	      	    
+
+            	      					newCompositeNode(grammarAccess.getUiFormLayoutAccess().getBindingsUiBindingParserRuleCall_6_0());
+            	      				
             	    }
-            	    pushFollow(FollowSets000.FOLLOW_ruleUiBinding_in_ruleUiFormLayout7492);
+            	    pushFollow(FOLLOW_42);
             	    lv_bindings_12_0=ruleUiBinding();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getUiFormLayoutRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"bindings",
-            	              		lv_bindings_12_0, 
-            	              		"UiBinding");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiFormLayoutRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"bindings",
+            	      						lv_bindings_12_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+            	      					afterParserOrEnumRuleCall();
+            	      				
             	    }
 
             	    }
@@ -9620,50 +10308,50 @@
             	    break;
 
             	default :
-            	    break loop65;
+            	    break loop68;
                 }
             } while (true);
 
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3417:3: ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )*
-            loop66:
+            // InternalUIGrammar.g:3698:3: ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )*
+            loop69:
             do {
-                int alt66=2;
-                int LA66_0 = input.LA(1);
+                int alt69=2;
+                int LA69_0 = input.LA(1);
 
-                if ( (LA66_0==151) ) {
-                    alt66=1;
+                if ( (LA69_0==153) ) {
+                    alt69=1;
                 }
 
 
-                switch (alt66) {
+                switch (alt69) {
             	case 1 :
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3418:1: (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment )
+            	    // InternalUIGrammar.g:3699:4: (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment )
             	    {
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3418:1: (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment )
-            	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3419:3: lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment
+            	    // InternalUIGrammar.g:3699:4: (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment )
+            	    // InternalUIGrammar.g:3700:5: lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getUiFormLayoutAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0()); 
-            	      	    
+
+            	      					newCompositeNode(grammarAccess.getUiFormLayoutAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0());
+            	      				
             	    }
-            	    pushFollow(FollowSets000.FOLLOW_ruleUiVisibilityProcessorAssignment_in_ruleUiFormLayout7514);
+            	    pushFollow(FOLLOW_42);
             	    lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getUiFormLayoutRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"processorAssignments",
-            	              		lv_processorAssignments_13_0, 
-            	              		"UiVisibilityProcessorAssignment");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiFormLayoutRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"processorAssignments",
+            	      						lv_processorAssignments_13_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+            	      					afterParserOrEnumRuleCall();
+            	      				
             	    }
 
             	    }
@@ -9673,15 +10361,15 @@
             	    break;
 
             	default :
-            	    break loop66;
+            	    break loop69;
                 }
             } while (true);
 
-            otherlv_14=(Token)match(input,22,FollowSets000.FOLLOW_22_in_ruleUiFormLayout7527); if (state.failed) return current;
+            otherlv_14=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_14, grammarAccess.getUiFormLayoutAccess().getRightCurlyBracketKeyword_8());
-                  
+              			newLeafNode(otherlv_14, grammarAccess.getUiFormLayoutAccess().getRightCurlyBracketKeyword_8());
+              		
             }
 
             }
@@ -9690,14 +10378,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -9706,7 +10396,7 @@
 
 
     // $ANTLR start "entryRuleUiFormLayoutAssigment"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3447:1: entryRuleUiFormLayoutAssigment returns [EObject current=null] : iv_ruleUiFormLayoutAssigment= ruleUiFormLayoutAssigment EOF ;
+    // InternalUIGrammar.g:3725:1: entryRuleUiFormLayoutAssigment returns [EObject current=null] : iv_ruleUiFormLayoutAssigment= ruleUiFormLayoutAssigment EOF ;
     public final EObject entryRuleUiFormLayoutAssigment() throws RecognitionException {
         EObject current = null;
 
@@ -9714,13 +10404,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3448:2: (iv_ruleUiFormLayoutAssigment= ruleUiFormLayoutAssigment EOF )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3449:2: iv_ruleUiFormLayoutAssigment= ruleUiFormLayoutAssigment EOF
+            // InternalUIGrammar.g:3725:62: (iv_ruleUiFormLayoutAssigment= ruleUiFormLayoutAssigment EOF )
+            // InternalUIGrammar.g:3726:2: iv_ruleUiFormLayoutAssigment= ruleUiFormLayoutAssigment EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUiFormLayoutAssigmentRule()); 
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiFormLayoutAssigment_in_entryRuleUiFormLayoutAssigment7563);
+            pushFollow(FOLLOW_1);
             iv_ruleUiFormLayoutAssigment=ruleUiFormLayoutAssigment();
 
             state._fsp--;
@@ -9728,16 +10418,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUiFormLayoutAssigment; 
             }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiFormLayoutAssigment7573); 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;
@@ -9746,47 +10436,48 @@
 
 
     // $ANTLR start "ruleUiFormLayoutAssigment"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3456:1: ruleUiFormLayoutAssigment returns [EObject current=null] : ( (lv_element_0_0= ruleUiEmbeddable ) ) ;
+    // InternalUIGrammar.g:3732:1: ruleUiFormLayoutAssigment returns [EObject current=null] : ( (lv_element_0_0= ruleUiEmbeddable ) ) ;
     public final EObject ruleUiFormLayoutAssigment() throws RecognitionException {
         EObject current = null;
 
         EObject lv_element_0_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3459:28: ( ( (lv_element_0_0= ruleUiEmbeddable ) ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3460:1: ( (lv_element_0_0= ruleUiEmbeddable ) )
+            // InternalUIGrammar.g:3738:2: ( ( (lv_element_0_0= ruleUiEmbeddable ) ) )
+            // InternalUIGrammar.g:3739:2: ( (lv_element_0_0= ruleUiEmbeddable ) )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3460:1: ( (lv_element_0_0= ruleUiEmbeddable ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3461:1: (lv_element_0_0= ruleUiEmbeddable )
+            // InternalUIGrammar.g:3739:2: ( (lv_element_0_0= ruleUiEmbeddable ) )
+            // InternalUIGrammar.g:3740:3: (lv_element_0_0= ruleUiEmbeddable )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3461:1: (lv_element_0_0= ruleUiEmbeddable )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3462:3: lv_element_0_0= ruleUiEmbeddable
+            // InternalUIGrammar.g:3740:3: (lv_element_0_0= ruleUiEmbeddable )
+            // InternalUIGrammar.g:3741:4: lv_element_0_0= ruleUiEmbeddable
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getUiFormLayoutAssigmentAccess().getElementUiEmbeddableParserRuleCall_0()); 
-              	    
+
+              				newCompositeNode(grammarAccess.getUiFormLayoutAssigmentAccess().getElementUiEmbeddableParserRuleCall_0());
+              			
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiEmbeddable_in_ruleUiFormLayoutAssigment7618);
+            pushFollow(FOLLOW_2);
             lv_element_0_0=ruleUiEmbeddable();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getUiFormLayoutAssigmentRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"element",
-                      		lv_element_0_0, 
-                      		"UiEmbeddable");
-              	        afterParserOrEnumRuleCall();
-              	    
+              				if (current==null) {
+              					current = createModelElementForParent(grammarAccess.getUiFormLayoutAssigmentRule());
+              				}
+              				set(
+              					current,
+              					"element",
+              					lv_element_0_0,
+              					"org.eclipse.osbp.ecview.dsl.UIGrammar.UiEmbeddable");
+              				afterParserOrEnumRuleCall();
+              			
             }
 
             }
@@ -9798,14 +10489,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -9814,7 +10507,7 @@
 
 
     // $ANTLR start "entryRuleUiVerticalLayout"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3486:1: entryRuleUiVerticalLayout returns [EObject current=null] : iv_ruleUiVerticalLayout= ruleUiVerticalLayout EOF ;
+    // InternalUIGrammar.g:3761:1: entryRuleUiVerticalLayout returns [EObject current=null] : iv_ruleUiVerticalLayout= ruleUiVerticalLayout EOF ;
     public final EObject entryRuleUiVerticalLayout() throws RecognitionException {
         EObject current = null;
 
@@ -9822,13 +10515,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3487:2: (iv_ruleUiVerticalLayout= ruleUiVerticalLayout EOF )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3488:2: iv_ruleUiVerticalLayout= ruleUiVerticalLayout EOF
+            // InternalUIGrammar.g:3761:57: (iv_ruleUiVerticalLayout= ruleUiVerticalLayout EOF )
+            // InternalUIGrammar.g:3762:2: iv_ruleUiVerticalLayout= ruleUiVerticalLayout EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUiVerticalLayoutRule()); 
             }
-            pushFollow(FollowSets000.FOLLOW_ruleUiVerticalLayout_in_entryRuleUiVerticalLayout7653);
+            pushFollow(FOLLOW_1);
             iv_ruleUiVerticalLayout=ruleUiVerticalLayout();
 
             state._fsp--;
@@ -9836,16 +10529,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUiVerticalLayout; 
             }
-            match(input,EOF,FollowSets000.FOLLOW_EOF_in_entryRuleUiVerticalLayout7663); 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;
@@ -9854,7 +10547,7 @@
 
 
     // $ANTLR start "ruleUiVerticalLayout"
-    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3495:1: ruleUiVerticalLayout returns [EObject current=null] : ( () otherlv_1= 'verticalLayout' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiVerticalLayoutAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' ) ;
+    // InternalUIGrammar.g:3768:1: ruleUiVerticalLayout returns [EObject current=null] : ( () otherlv_1= 'verticalLayout' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiVerticalLayoutAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' ) ;
     public final EObject ruleUiVerticalLayout() throws RecognitionException {
         EObject current = null;
 
@@ -9876,137 +10569,62871 @@
         EObject lv_processorAssignments_13_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3498:28: ( ( () otherlv_1= 'verticalLayout' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiVerticalLayoutAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' ) )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3499:1: ( () otherlv_1= 'verticalLayout' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiVerticalLayoutAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )
+            // InternalUIGrammar.g:3774:2: ( ( () otherlv_1= 'verticalLayout' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiVerticalLayoutAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' ) )
+            // InternalUIGrammar.g:3775:2: ( () otherlv_1= 'verticalLayout' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiVerticalLayoutAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3499:1: ( () otherlv_1= 'verticalLayout' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiVerticalLayoutAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3499:2: () otherlv_1= 'verticalLayout' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiVerticalLayoutAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}'
+            // InternalUIGrammar.g:3775:2: ( () otherlv_1= 'verticalLayout' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiVerticalLayoutAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )
+            // InternalUIGrammar.g:3776:3: () otherlv_1= 'verticalLayout' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiVerticalLayoutAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}'
             {
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3499:2: ()
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3500:5: 
+            // InternalUIGrammar.g:3776:3: ()
+            // InternalUIGrammar.g:3777:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getUiVerticalLayoutAccess().getUiVerticalLayoutAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiVerticalLayoutAccess().getUiVerticalLayoutAction_0(),
+              					current);
+              			
             }
 
             }
 
-            otherlv_1=(Token)match(input,66,FollowSets000.FOLLOW_66_in_ruleUiVerticalLayout7709); if (state.failed) return current;
+            otherlv_1=(Token)match(input,67,FOLLOW_58); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getUiVerticalLayoutAccess().getVerticalLayoutKeyword_1());
-                  
+              			newLeafNode(otherlv_1, grammarAccess.getUiVerticalLayoutAccess().getVerticalLayoutKeyword_1());
+              		
             }
-            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3509:1: ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )?
-            int alt70=2;
-            int LA70_0 = input.LA(1);
+            // InternalUIGrammar.g:3787:3: ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )?
+            int alt73=2;
+            int LA73_0 = input.LA(1);
 
-            if ( (LA70_0==46||LA70_0==48||(LA70_0>=63 && LA70_0<=64)) ) {
-                alt70=1;
+            if ( (LA73_0==45||LA73_0==47||(LA73_0>=64 && LA73_0<=65)) ) {
+                alt73=1;
             }
-            switch (alt70) {
+            switch (alt73) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3511:1: ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) )
+                    // InternalUIGrammar.g:3788:4: ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) )
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3511:1: ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) )
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3512:2: ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?)
+                    // InternalUIGrammar.g:3788:4: ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) )
+                    // InternalUIGrammar.g:3789:5: ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?)
                     {
                     getUnorderedGroupHelper().enter(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2());
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3515:2: ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?)
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3516:3: ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?
+                    // InternalUIGrammar.g:3792:5: ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?)
+                    // InternalUIGrammar.g:3793:6: ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?
                     {
-                    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3516:3: ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+
-                    int cnt69=0;
-                    loop69:
+                    // InternalUIGrammar.g:3793:6: ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+
+                    int cnt72=0;
+                    loop72:
                     do {
-                        int alt69=4;
-                        int LA69_0 = input.LA(1);
+                        int alt72=4;
+                        int LA72_0 = input.LA(1);
 
-                        if ( LA69_0 ==46 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2(), 0) ) {
-                            alt69=1;
+                        if ( LA72_0 == 45 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2(), 0) ) {
+                            alt72=1;
                         }
-                        else if ( LA69_0 ==63 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2(), 1) ) {
-                            alt69=2;
+                        else if ( LA72_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2(), 1) ) {
+                            alt72=2;
                         }
-                        else if ( (LA69_0==48||LA69_0==64) && getUnorderedGroupHelper().canSelect(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2(), 2) ) {
-                            alt69=3;
+                        else if ( ( LA72_0 == 47 || LA72_0 == 65 ) && getUnorderedGroupHelper().canSelect(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2(), 2) ) {
+                            alt72=3;
                         }
 
 
-                        switch (alt69) {
+                        switch (alt72) {
                     	case 1 :
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3518:4: ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) )
+                    	    // InternalUIGrammar.g:3794:4: ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) )
                     	    {
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3518:4: ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) )
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3519:5: {...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) )
+                    	    // InternalUIGrammar.g:3794:4: ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) )
+                    	    // InternalUIGrammar.g:3795:5: {...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) )
                     	    {
                     	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2(), 0) ) {
                     	        if (state.backtracking>0) {state.failed=true; return current;}
                     	        throw new FailedPredicateException(input, "ruleUiVerticalLayout", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2(), 0)");
                     	    }
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3519:113: ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) )
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3520:6: ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) )
+                    	    // InternalUIGrammar.g:3795:113: ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) )
+                    	    // InternalUIGrammar.g:3796:6: ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) )
                     	    {
                     	    getUnorderedGroupHelper().select(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2(), 0);
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3523:6: ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) )
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3523:7: {...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? )
+                    	    // InternalUIGrammar.g:3799:9: ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) )
+                    	    // InternalUIGrammar.g:3799:10: {...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? )
                     	    {
                     	    if ( !((true)) ) {
                     	        if (state.backtracking>0) {state.failed=true; return current;}
                     	        throw new FailedPredicateException(input, "ruleUiVerticalLayout", "true");
                     	    }
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3523:16: (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? )
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3523:18: otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )?
+                    	    // InternalUIGrammar.g:3799:19: (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? )
+                    	    // InternalUIGrammar.g:3799:20: otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )?
                     	    {
-                    	    otherlv_3=(Token)match(input,46,FollowSets000.FOLLOW_46_in_ruleUiVerticalLayout7767); if (state.failed) return current;
+                    	    otherlv_3=(Token)match(input,45,FOLLOW_59); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
-                    	          	newLeafNode(otherlv_3, grammarAccess.getUiVerticalLayoutAccess().getLeftParenthesisKeyword_2_0_0());
-                    	          
+                    	      									newLeafNode(otherlv_3, grammarAccess.getUiVerticalLayoutAccess().getLeftParenthesisKeyword_2_0_0());
+                    	      								
                     	    }
-                    	    // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3527:1: ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )?
-                    	    int alt67=2;
-                    	    int LA67_0 = input.LA(1);
+                    	    // InternalUIGrammar.g:3803:9: ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )?
+                    	    int alt70=2;
+                    	    int LA70_0 = input.LA(1);
 
-                    	    if ( (LA67_0==60) ) {
-                    	        alt67=1;
+                    	    if ( (LA70_0==60) ) {
+                    	        alt70=1;
                     	    }
-                    	    switch (alt67) {
+                    	    switch (alt70) {
                     	        case 1 :
-                    	            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3528:1: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	            // InternalUIGrammar.g:3804:10: (lv_i18nInfo_4_0= ruleUiI18nInfo )
                     	            {
-                    	            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3528:1: (lv_i18nInfo_4_0= ruleUiI18nInfo )
-                    	            // ../org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/parser/antlr/internal/InternalUIGrammar.g:3529:3: lv_i18nInfo_4_0= ruleUiI18nInfo
+                    	            // InternalUIGrammar.g:3804:10: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	            // InternalUIGrammar.g:3805:11: lv_i18nInfo_4_0= ruleUiI18nInfo
                     	            {
                     	            if ( state.backtracking==0 ) {
-                    	               
-                    	              	        newCompositeNode(grammarAccess.getUiVerticalLayoutAccess().getI18nInfoUiI18nInfoParserRuleCall_2_0_1_0()); 
-                    	              	    
+
+                    	              											newCompositeNode(grammarAccess.getUiVerticalLayoutAccess().getI18nInfoUiI18nInfoParserRuleCall_2_0_1_0());
+                    	              										
                     	            }
-                    	            pushFollow(FollowSets000.FOLLOW_ruleUiI18nInfo_in_ruleUiVerticalLayout7788);
+                    	            pushFollow(FOLLOW_58);
                     	            lv_i18nInfo_4_0=ruleUiI18nInfo();
 
                     	            state._fsp--;
                     	            if (state.failed) return current;
                     	            if ( state.backtracking==0 ) {
 
-                    	              	        if (current==null) {
-                    	              	            current = createModelElementForParent(grammarAccess.getUiVerticalLayoutRule());
-                    	              	        }
-                    	                     		set(
-                    	                     			current, 
-                    	                     			"i18nInfo",
-                    	                      		lv_i18nInfo_4_0, 
-                    	                      		"UiI18nInfo");
-                    	              	        afterParserOrEnumRuleCall();
-                    	              	    
+                    	              											if (current==null) {
+                    	              												current = createModelElementForParent(grammarAccess.getUiVerticalLayoutRule());
+                    	              											}
+                    	              											set(
+                    	              												current,
+                    	              												"i18nInfo",
+                    	              												lv_i18nInfo_4_0,
+                    	              												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	              											afterParserOrEnumRuleCall();
+                    	              										
                     	            }
 
                     	            }
+
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:3828:4: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:3828:4: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:3829:5: {...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiVerticalLayout", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:3829:113: ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:3830:6: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2(), 1);
+                    	    // InternalUIGrammar.g:3833:9: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:3833:10: {...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiVerticalLayout", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:3833:19: (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:3833:20: otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_5=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      									newLeafNode(otherlv_5, grammarAccess.getUiVerticalLayoutAccess().getStylesKeyword_2_1_0());
+                    	      								
+                    	    }
+                    	    // InternalUIGrammar.g:3837:9: ( (lv_styles_6_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:3838:10: (lv_styles_6_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:3838:10: (lv_styles_6_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:3839:11: lv_styles_6_0= RULE_STRING
+                    	    {
+                    	    lv_styles_6_0=(Token)match(input,RULE_STRING,FOLLOW_58); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newLeafNode(lv_styles_6_0, grammarAccess.getUiVerticalLayoutAccess().getStylesSTRINGTerminalRuleCall_2_1_1_0());
+                    	      										
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElement(grammarAccess.getUiVerticalLayoutRule());
+                    	      											}
+                    	      											setWithLastConsumed(
+                    	      												current,
+                    	      												"styles",
+                    	      												lv_styles_6_0,
+                    	      												"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 3 :
+                    	    // InternalUIGrammar.g:3861:4: ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:3861:4: ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) )
+                    	    // InternalUIGrammar.g:3862:5: {...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2(), 2) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiVerticalLayout", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2(), 2)");
+                    	    }
+                    	    // InternalUIGrammar.g:3862:113: ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) )
+                    	    // InternalUIGrammar.g:3863:6: ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2(), 2);
+                    	    // InternalUIGrammar.g:3866:9: ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) )
+                    	    // InternalUIGrammar.g:3866:10: {...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiVerticalLayout", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:3866:19: ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' )
+                    	    // InternalUIGrammar.g:3866:20: ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')'
+                    	    {
+                    	    // InternalUIGrammar.g:3866:20: ( (lv_readonly_7_0= 'readonly' ) )?
+                    	    int alt71=2;
+                    	    int LA71_0 = input.LA(1);
+
+                    	    if ( (LA71_0==65) ) {
+                    	        alt71=1;
+                    	    }
+                    	    switch (alt71) {
+                    	        case 1 :
+                    	            // InternalUIGrammar.g:3867:10: (lv_readonly_7_0= 'readonly' )
+                    	            {
+                    	            // InternalUIGrammar.g:3867:10: (lv_readonly_7_0= 'readonly' )
+                    	            // InternalUIGrammar.g:3868:11: lv_readonly_7_0= 'readonly'
+                    	            {
+                    	            lv_readonly_7_0=(Token)match(input,65,FOLLOW_36); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											newLeafNode(lv_readonly_7_0, grammarAccess.getUiVerticalLayoutAccess().getReadonlyReadonlyKeyword_2_2_0_0());
+                    	              										
+                    	            }
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											if (current==null) {
+                    	              												current = createModelElement(grammarAccess.getUiVerticalLayoutRule());
+                    	              											}
+                    	              											setWithLastConsumed(current, "readonly", true, "readonly");
+                    	              										
+                    	            }
+
+                    	            }
+
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+                    	    otherlv_8=(Token)match(input,47,FOLLOW_58); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      									newLeafNode(otherlv_8, grammarAccess.getUiVerticalLayoutAccess().getRightParenthesisKeyword_2_2_1());
+                    	      								
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    if ( cnt72 >= 1 ) break loop72;
+                    	    if (state.backtracking>0) {state.failed=true; return current;}
+                                EarlyExitException eee =
+                                    new EarlyExitException(72, input);
+                                throw eee;
+                        }
+                        cnt72++;
+                    } while (true);
+
+                    if ( ! getUnorderedGroupHelper().canLeave(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2()) ) {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        throw new FailedPredicateException(input, "ruleUiVerticalLayout", "getUnorderedGroupHelper().canLeave(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2())");
+                    }
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2());
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:3898:3: ( (lv_name_9_0= RULE_ID ) )?
+            int alt74=2;
+            int LA74_0 = input.LA(1);
+
+            if ( (LA74_0==RULE_ID) ) {
+                alt74=1;
+            }
+            switch (alt74) {
+                case 1 :
+                    // InternalUIGrammar.g:3899:4: (lv_name_9_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:3899:4: (lv_name_9_0= RULE_ID )
+                    // InternalUIGrammar.g:3900:5: lv_name_9_0= RULE_ID
+                    {
+                    lv_name_9_0=(Token)match(input,RULE_ID,FOLLOW_11); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_9_0, grammarAccess.getUiVerticalLayoutAccess().getNameIDTerminalRuleCall_3_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiVerticalLayoutRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_9_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_10=(Token)match(input,20,FOLLOW_56); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_10, grammarAccess.getUiVerticalLayoutAccess().getLeftCurlyBracketKeyword_4());
+              		
+            }
+            // InternalUIGrammar.g:3920:3: ( (lv_contents_11_0= ruleUiVerticalLayoutAssigment ) )*
+            loop75:
+            do {
+                int alt75=2;
+                int LA75_0 = input.LA(1);
+
+                if ( (LA75_0==62||(LA75_0>=66 && LA75_0<=67)||LA75_0==70||LA75_0==74||(LA75_0>=79 && LA75_0<=80)||LA75_0==84||LA75_0==91||(LA75_0>=95 && LA75_0<=96)||(LA75_0>=98 && LA75_0<=100)||LA75_0==105||LA75_0==107||LA75_0==112||(LA75_0>=117 && LA75_0<=122)||LA75_0==124||(LA75_0>=128 && LA75_0<=129)||(LA75_0>=133 && LA75_0<=134)||(LA75_0>=138 && LA75_0<=139)||(LA75_0>=145 && LA75_0<=146)) ) {
+                    alt75=1;
+                }
+
+
+                switch (alt75) {
+            	case 1 :
+            	    // InternalUIGrammar.g:3921:4: (lv_contents_11_0= ruleUiVerticalLayoutAssigment )
+            	    {
+            	    // InternalUIGrammar.g:3921:4: (lv_contents_11_0= ruleUiVerticalLayoutAssigment )
+            	    // InternalUIGrammar.g:3922:5: lv_contents_11_0= ruleUiVerticalLayoutAssigment
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiVerticalLayoutAccess().getContentsUiVerticalLayoutAssigmentParserRuleCall_5_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_56);
+            	    lv_contents_11_0=ruleUiVerticalLayoutAssigment();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiVerticalLayoutRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"contents",
+            	      						lv_contents_11_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVerticalLayoutAssigment");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop75;
+                }
+            } while (true);
+
+            // InternalUIGrammar.g:3939:3: ( (lv_bindings_12_0= ruleUiBinding ) )*
+            loop76:
+            do {
+                int alt76=2;
+                int LA76_0 = input.LA(1);
+
+                if ( (LA76_0==26) ) {
+                    alt76=1;
+                }
+
+
+                switch (alt76) {
+            	case 1 :
+            	    // InternalUIGrammar.g:3940:4: (lv_bindings_12_0= ruleUiBinding )
+            	    {
+            	    // InternalUIGrammar.g:3940:4: (lv_bindings_12_0= ruleUiBinding )
+            	    // InternalUIGrammar.g:3941:5: lv_bindings_12_0= ruleUiBinding
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiVerticalLayoutAccess().getBindingsUiBindingParserRuleCall_6_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_42);
+            	    lv_bindings_12_0=ruleUiBinding();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiVerticalLayoutRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"bindings",
+            	      						lv_bindings_12_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop76;
+                }
+            } while (true);
+
+            // InternalUIGrammar.g:3958:3: ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )*
+            loop77:
+            do {
+                int alt77=2;
+                int LA77_0 = input.LA(1);
+
+                if ( (LA77_0==153) ) {
+                    alt77=1;
+                }
+
+
+                switch (alt77) {
+            	case 1 :
+            	    // InternalUIGrammar.g:3959:4: (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment )
+            	    {
+            	    // InternalUIGrammar.g:3959:4: (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment )
+            	    // InternalUIGrammar.g:3960:5: lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiVerticalLayoutAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_42);
+            	    lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiVerticalLayoutRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"processorAssignments",
+            	      						lv_processorAssignments_13_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop77;
+                }
+            } while (true);
+
+            otherlv_14=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_14, grammarAccess.getUiVerticalLayoutAccess().getRightCurlyBracketKeyword_8());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiVerticalLayout"
+
+
+    // $ANTLR start "entryRuleUiVerticalLayoutAssigment"
+    // InternalUIGrammar.g:3985:1: entryRuleUiVerticalLayoutAssigment returns [EObject current=null] : iv_ruleUiVerticalLayoutAssigment= ruleUiVerticalLayoutAssigment EOF ;
+    public final EObject entryRuleUiVerticalLayoutAssigment() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiVerticalLayoutAssigment = null;
+
+
+        try {
+            // InternalUIGrammar.g:3985:66: (iv_ruleUiVerticalLayoutAssigment= ruleUiVerticalLayoutAssigment EOF )
+            // InternalUIGrammar.g:3986:2: iv_ruleUiVerticalLayoutAssigment= ruleUiVerticalLayoutAssigment EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiVerticalLayoutAssigmentRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiVerticalLayoutAssigment=ruleUiVerticalLayoutAssigment();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiVerticalLayoutAssigment; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiVerticalLayoutAssigment"
+
+
+    // $ANTLR start "ruleUiVerticalLayoutAssigment"
+    // InternalUIGrammar.g:3992:1: ruleUiVerticalLayoutAssigment returns [EObject current=null] : ( ( (lv_element_0_0= ruleUiEmbeddable ) ) (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )? ) ;
+    public final EObject ruleUiVerticalLayoutAssigment() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        EObject lv_element_0_0 = null;
+
+        Enumerator lv_alignment_2_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:3998:2: ( ( ( (lv_element_0_0= ruleUiEmbeddable ) ) (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )? ) )
+            // InternalUIGrammar.g:3999:2: ( ( (lv_element_0_0= ruleUiEmbeddable ) ) (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )? )
+            {
+            // InternalUIGrammar.g:3999:2: ( ( (lv_element_0_0= ruleUiEmbeddable ) ) (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )? )
+            // InternalUIGrammar.g:4000:3: ( (lv_element_0_0= ruleUiEmbeddable ) ) (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )?
+            {
+            // InternalUIGrammar.g:4000:3: ( (lv_element_0_0= ruleUiEmbeddable ) )
+            // InternalUIGrammar.g:4001:4: (lv_element_0_0= ruleUiEmbeddable )
+            {
+            // InternalUIGrammar.g:4001:4: (lv_element_0_0= ruleUiEmbeddable )
+            // InternalUIGrammar.g:4002:5: lv_element_0_0= ruleUiEmbeddable
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getUiVerticalLayoutAssigmentAccess().getElementUiEmbeddableParserRuleCall_0_0());
+              				
+            }
+            pushFollow(FOLLOW_57);
+            lv_element_0_0=ruleUiEmbeddable();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getUiVerticalLayoutAssigmentRule());
+              					}
+              					set(
+              						current,
+              						"element",
+              						lv_element_0_0,
+              						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiEmbeddable");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalUIGrammar.g:4019:3: (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )?
+            int alt78=2;
+            int LA78_0 = input.LA(1);
+
+            if ( (LA78_0==53) ) {
+                alt78=1;
+            }
+            switch (alt78) {
+                case 1 :
+                    // InternalUIGrammar.g:4020:4: otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) )
+                    {
+                    otherlv_1=(Token)match(input,53,FOLLOW_41); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_1, grammarAccess.getUiVerticalLayoutAssigmentAccess().getAlignKeyword_1_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:4024:4: ( (lv_alignment_2_0= ruleUiAlignment ) )
+                    // InternalUIGrammar.g:4025:5: (lv_alignment_2_0= ruleUiAlignment )
+                    {
+                    // InternalUIGrammar.g:4025:5: (lv_alignment_2_0= ruleUiAlignment )
+                    // InternalUIGrammar.g:4026:6: lv_alignment_2_0= ruleUiAlignment
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getUiVerticalLayoutAssigmentAccess().getAlignmentUiAlignmentEnumRuleCall_1_1_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_2);
+                    lv_alignment_2_0=ruleUiAlignment();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getUiVerticalLayoutAssigmentRule());
+                      						}
+                      						set(
+                      							current,
+                      							"alignment",
+                      							lv_alignment_2_0,
+                      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiAlignment");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiVerticalLayoutAssigment"
+
+
+    // $ANTLR start "entryRuleUiMobileVerticalLayout"
+    // InternalUIGrammar.g:4048:1: entryRuleUiMobileVerticalLayout returns [EObject current=null] : iv_ruleUiMobileVerticalLayout= ruleUiMobileVerticalLayout EOF ;
+    public final EObject entryRuleUiMobileVerticalLayout() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiMobileVerticalLayout = null;
+
+
+        try {
+            // InternalUIGrammar.g:4048:63: (iv_ruleUiMobileVerticalLayout= ruleUiMobileVerticalLayout EOF )
+            // InternalUIGrammar.g:4049:2: iv_ruleUiMobileVerticalLayout= ruleUiMobileVerticalLayout EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiMobileVerticalLayoutRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiMobileVerticalLayout=ruleUiMobileVerticalLayout();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiMobileVerticalLayout; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiMobileVerticalLayout"
+
+
+    // $ANTLR start "ruleUiMobileVerticalLayout"
+    // InternalUIGrammar.g:4055:1: ruleUiMobileVerticalLayout returns [EObject current=null] : ( () otherlv_1= 'mobileVerticalLayout' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiMobileVerticalLayoutAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' ) ;
+    public final EObject ruleUiMobileVerticalLayout() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        Token otherlv_5=null;
+        Token lv_styles_6_0=null;
+        Token lv_readonly_7_0=null;
+        Token otherlv_8=null;
+        Token lv_name_9_0=null;
+        Token otherlv_10=null;
+        Token otherlv_14=null;
+        EObject lv_i18nInfo_4_0 = null;
+
+        EObject lv_contents_11_0 = null;
+
+        EObject lv_bindings_12_0 = null;
+
+        EObject lv_processorAssignments_13_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:4061:2: ( ( () otherlv_1= 'mobileVerticalLayout' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiMobileVerticalLayoutAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' ) )
+            // InternalUIGrammar.g:4062:2: ( () otherlv_1= 'mobileVerticalLayout' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiMobileVerticalLayoutAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )
+            {
+            // InternalUIGrammar.g:4062:2: ( () otherlv_1= 'mobileVerticalLayout' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiMobileVerticalLayoutAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )
+            // InternalUIGrammar.g:4063:3: () otherlv_1= 'mobileVerticalLayout' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiMobileVerticalLayoutAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}'
+            {
+            // InternalUIGrammar.g:4063:3: ()
+            // InternalUIGrammar.g:4064:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiMobileVerticalLayoutAccess().getUiVerticalLayoutAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,68,FOLLOW_58); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiMobileVerticalLayoutAccess().getMobileVerticalLayoutKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:4074:3: ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )?
+            int alt82=2;
+            int LA82_0 = input.LA(1);
+
+            if ( (LA82_0==45||LA82_0==47||(LA82_0>=64 && LA82_0<=65)) ) {
+                alt82=1;
+            }
+            switch (alt82) {
+                case 1 :
+                    // InternalUIGrammar.g:4075:4: ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) )
+                    {
+                    // InternalUIGrammar.g:4075:4: ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) )
+                    // InternalUIGrammar.g:4076:5: ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?)
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2());
+                    // InternalUIGrammar.g:4079:5: ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?)
+                    // InternalUIGrammar.g:4080:6: ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?
+                    {
+                    // InternalUIGrammar.g:4080:6: ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+
+                    int cnt81=0;
+                    loop81:
+                    do {
+                        int alt81=4;
+                        int LA81_0 = input.LA(1);
+
+                        if ( LA81_0 == 45 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2(), 0) ) {
+                            alt81=1;
+                        }
+                        else if ( LA81_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2(), 1) ) {
+                            alt81=2;
+                        }
+                        else if ( ( LA81_0 == 47 || LA81_0 == 65 ) && getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2(), 2) ) {
+                            alt81=3;
+                        }
+
+
+                        switch (alt81) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:4081:4: ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:4081:4: ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) )
+                    	    // InternalUIGrammar.g:4082:5: {...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileVerticalLayout", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:4082:119: ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) )
+                    	    // InternalUIGrammar.g:4083:6: ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2(), 0);
+                    	    // InternalUIGrammar.g:4086:9: ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) )
+                    	    // InternalUIGrammar.g:4086:10: {...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileVerticalLayout", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:4086:19: (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? )
+                    	    // InternalUIGrammar.g:4086:20: otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )?
+                    	    {
+                    	    otherlv_3=(Token)match(input,45,FOLLOW_59); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      									newLeafNode(otherlv_3, grammarAccess.getUiMobileVerticalLayoutAccess().getLeftParenthesisKeyword_2_0_0());
+                    	      								
+                    	    }
+                    	    // InternalUIGrammar.g:4090:9: ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )?
+                    	    int alt79=2;
+                    	    int LA79_0 = input.LA(1);
+
+                    	    if ( (LA79_0==60) ) {
+                    	        alt79=1;
+                    	    }
+                    	    switch (alt79) {
+                    	        case 1 :
+                    	            // InternalUIGrammar.g:4091:10: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	            {
+                    	            // InternalUIGrammar.g:4091:10: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	            // InternalUIGrammar.g:4092:11: lv_i18nInfo_4_0= ruleUiI18nInfo
+                    	            {
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											newCompositeNode(grammarAccess.getUiMobileVerticalLayoutAccess().getI18nInfoUiI18nInfoParserRuleCall_2_0_1_0());
+                    	              										
+                    	            }
+                    	            pushFollow(FOLLOW_58);
+                    	            lv_i18nInfo_4_0=ruleUiI18nInfo();
+
+                    	            state._fsp--;
+                    	            if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											if (current==null) {
+                    	              												current = createModelElementForParent(grammarAccess.getUiMobileVerticalLayoutRule());
+                    	              											}
+                    	              											set(
+                    	              												current,
+                    	              												"i18nInfo",
+                    	              												lv_i18nInfo_4_0,
+                    	              												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	              											afterParserOrEnumRuleCall();
+                    	              										
+                    	            }
+
+                    	            }
+
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:4115:4: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:4115:4: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:4116:5: {...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileVerticalLayout", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:4116:119: ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:4117:6: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2(), 1);
+                    	    // InternalUIGrammar.g:4120:9: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:4120:10: {...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileVerticalLayout", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:4120:19: (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:4120:20: otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_5=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      									newLeafNode(otherlv_5, grammarAccess.getUiMobileVerticalLayoutAccess().getStylesKeyword_2_1_0());
+                    	      								
+                    	    }
+                    	    // InternalUIGrammar.g:4124:9: ( (lv_styles_6_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:4125:10: (lv_styles_6_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:4125:10: (lv_styles_6_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:4126:11: lv_styles_6_0= RULE_STRING
+                    	    {
+                    	    lv_styles_6_0=(Token)match(input,RULE_STRING,FOLLOW_58); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newLeafNode(lv_styles_6_0, grammarAccess.getUiMobileVerticalLayoutAccess().getStylesSTRINGTerminalRuleCall_2_1_1_0());
+                    	      										
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElement(grammarAccess.getUiMobileVerticalLayoutRule());
+                    	      											}
+                    	      											setWithLastConsumed(
+                    	      												current,
+                    	      												"styles",
+                    	      												lv_styles_6_0,
+                    	      												"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 3 :
+                    	    // InternalUIGrammar.g:4148:4: ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:4148:4: ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) )
+                    	    // InternalUIGrammar.g:4149:5: {...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2(), 2) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileVerticalLayout", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2(), 2)");
+                    	    }
+                    	    // InternalUIGrammar.g:4149:119: ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) )
+                    	    // InternalUIGrammar.g:4150:6: ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2(), 2);
+                    	    // InternalUIGrammar.g:4153:9: ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) )
+                    	    // InternalUIGrammar.g:4153:10: {...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileVerticalLayout", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:4153:19: ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' )
+                    	    // InternalUIGrammar.g:4153:20: ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')'
+                    	    {
+                    	    // InternalUIGrammar.g:4153:20: ( (lv_readonly_7_0= 'readonly' ) )?
+                    	    int alt80=2;
+                    	    int LA80_0 = input.LA(1);
+
+                    	    if ( (LA80_0==65) ) {
+                    	        alt80=1;
+                    	    }
+                    	    switch (alt80) {
+                    	        case 1 :
+                    	            // InternalUIGrammar.g:4154:10: (lv_readonly_7_0= 'readonly' )
+                    	            {
+                    	            // InternalUIGrammar.g:4154:10: (lv_readonly_7_0= 'readonly' )
+                    	            // InternalUIGrammar.g:4155:11: lv_readonly_7_0= 'readonly'
+                    	            {
+                    	            lv_readonly_7_0=(Token)match(input,65,FOLLOW_36); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											newLeafNode(lv_readonly_7_0, grammarAccess.getUiMobileVerticalLayoutAccess().getReadonlyReadonlyKeyword_2_2_0_0());
+                    	              										
+                    	            }
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											if (current==null) {
+                    	              												current = createModelElement(grammarAccess.getUiMobileVerticalLayoutRule());
+                    	              											}
+                    	              											setWithLastConsumed(current, "readonly", true, "readonly");
+                    	              										
+                    	            }
+
+                    	            }
+
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+                    	    otherlv_8=(Token)match(input,47,FOLLOW_58); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      									newLeafNode(otherlv_8, grammarAccess.getUiMobileVerticalLayoutAccess().getRightParenthesisKeyword_2_2_1());
+                    	      								
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    if ( cnt81 >= 1 ) break loop81;
+                    	    if (state.backtracking>0) {state.failed=true; return current;}
+                                EarlyExitException eee =
+                                    new EarlyExitException(81, input);
+                                throw eee;
+                        }
+                        cnt81++;
+                    } while (true);
+
+                    if ( ! getUnorderedGroupHelper().canLeave(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2()) ) {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        throw new FailedPredicateException(input, "ruleUiMobileVerticalLayout", "getUnorderedGroupHelper().canLeave(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2())");
+                    }
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2());
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:4185:3: ( (lv_name_9_0= RULE_ID ) )?
+            int alt83=2;
+            int LA83_0 = input.LA(1);
+
+            if ( (LA83_0==RULE_ID) ) {
+                alt83=1;
+            }
+            switch (alt83) {
+                case 1 :
+                    // InternalUIGrammar.g:4186:4: (lv_name_9_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:4186:4: (lv_name_9_0= RULE_ID )
+                    // InternalUIGrammar.g:4187:5: lv_name_9_0= RULE_ID
+                    {
+                    lv_name_9_0=(Token)match(input,RULE_ID,FOLLOW_11); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_9_0, grammarAccess.getUiMobileVerticalLayoutAccess().getNameIDTerminalRuleCall_3_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiMobileVerticalLayoutRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_9_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_10=(Token)match(input,20,FOLLOW_60); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_10, grammarAccess.getUiMobileVerticalLayoutAccess().getLeftCurlyBracketKeyword_4());
+              		
+            }
+            // InternalUIGrammar.g:4207:3: ( (lv_contents_11_0= ruleUiMobileVerticalLayoutAssigment ) )*
+            loop84:
+            do {
+                int alt84=2;
+                int LA84_0 = input.LA(1);
+
+                if ( ((LA84_0>=68 && LA84_0<=69)||(LA84_0>=71 && LA84_0<=73)||(LA84_0>=76 && LA84_0<=77)||LA84_0==89||LA84_0==91||(LA84_0>=95 && LA84_0<=96)||(LA84_0>=98 && LA84_0<=100)||LA84_0==105||LA84_0==107||(LA84_0>=117 && LA84_0<=122)||LA84_0==124||(LA84_0>=128 && LA84_0<=130)||(LA84_0>=132 && LA84_0<=134)||LA84_0==138||LA84_0==145) ) {
+                    alt84=1;
+                }
+
+
+                switch (alt84) {
+            	case 1 :
+            	    // InternalUIGrammar.g:4208:4: (lv_contents_11_0= ruleUiMobileVerticalLayoutAssigment )
+            	    {
+            	    // InternalUIGrammar.g:4208:4: (lv_contents_11_0= ruleUiMobileVerticalLayoutAssigment )
+            	    // InternalUIGrammar.g:4209:5: lv_contents_11_0= ruleUiMobileVerticalLayoutAssigment
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiMobileVerticalLayoutAccess().getContentsUiMobileVerticalLayoutAssigmentParserRuleCall_5_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_60);
+            	    lv_contents_11_0=ruleUiMobileVerticalLayoutAssigment();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiMobileVerticalLayoutRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"contents",
+            	      						lv_contents_11_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileVerticalLayoutAssigment");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop84;
+                }
+            } while (true);
+
+            // InternalUIGrammar.g:4226:3: ( (lv_bindings_12_0= ruleUiBinding ) )*
+            loop85:
+            do {
+                int alt85=2;
+                int LA85_0 = input.LA(1);
+
+                if ( (LA85_0==26) ) {
+                    alt85=1;
+                }
+
+
+                switch (alt85) {
+            	case 1 :
+            	    // InternalUIGrammar.g:4227:4: (lv_bindings_12_0= ruleUiBinding )
+            	    {
+            	    // InternalUIGrammar.g:4227:4: (lv_bindings_12_0= ruleUiBinding )
+            	    // InternalUIGrammar.g:4228:5: lv_bindings_12_0= ruleUiBinding
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiMobileVerticalLayoutAccess().getBindingsUiBindingParserRuleCall_6_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_42);
+            	    lv_bindings_12_0=ruleUiBinding();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiMobileVerticalLayoutRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"bindings",
+            	      						lv_bindings_12_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop85;
+                }
+            } while (true);
+
+            // InternalUIGrammar.g:4245:3: ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )*
+            loop86:
+            do {
+                int alt86=2;
+                int LA86_0 = input.LA(1);
+
+                if ( (LA86_0==153) ) {
+                    alt86=1;
+                }
+
+
+                switch (alt86) {
+            	case 1 :
+            	    // InternalUIGrammar.g:4246:4: (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment )
+            	    {
+            	    // InternalUIGrammar.g:4246:4: (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment )
+            	    // InternalUIGrammar.g:4247:5: lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiMobileVerticalLayoutAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_42);
+            	    lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiMobileVerticalLayoutRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"processorAssignments",
+            	      						lv_processorAssignments_13_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop86;
+                }
+            } while (true);
+
+            otherlv_14=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_14, grammarAccess.getUiMobileVerticalLayoutAccess().getRightCurlyBracketKeyword_8());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiMobileVerticalLayout"
+
+
+    // $ANTLR start "entryRuleUiMobileVerticalLayoutAssigment"
+    // InternalUIGrammar.g:4272:1: entryRuleUiMobileVerticalLayoutAssigment returns [EObject current=null] : iv_ruleUiMobileVerticalLayoutAssigment= ruleUiMobileVerticalLayoutAssigment EOF ;
+    public final EObject entryRuleUiMobileVerticalLayoutAssigment() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiMobileVerticalLayoutAssigment = null;
+
+
+        try {
+            // InternalUIGrammar.g:4272:72: (iv_ruleUiMobileVerticalLayoutAssigment= ruleUiMobileVerticalLayoutAssigment EOF )
+            // InternalUIGrammar.g:4273:2: iv_ruleUiMobileVerticalLayoutAssigment= ruleUiMobileVerticalLayoutAssigment EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiMobileVerticalLayoutAssigmentRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiMobileVerticalLayoutAssigment=ruleUiMobileVerticalLayoutAssigment();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiMobileVerticalLayoutAssigment; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiMobileVerticalLayoutAssigment"
+
+
+    // $ANTLR start "ruleUiMobileVerticalLayoutAssigment"
+    // InternalUIGrammar.g:4279:1: ruleUiMobileVerticalLayoutAssigment returns [EObject current=null] : ( ( (lv_element_0_0= ruleUiMobileEmbeddable ) ) (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )? ) ;
+    public final EObject ruleUiMobileVerticalLayoutAssigment() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        EObject lv_element_0_0 = null;
+
+        Enumerator lv_alignment_2_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:4285:2: ( ( ( (lv_element_0_0= ruleUiMobileEmbeddable ) ) (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )? ) )
+            // InternalUIGrammar.g:4286:2: ( ( (lv_element_0_0= ruleUiMobileEmbeddable ) ) (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )? )
+            {
+            // InternalUIGrammar.g:4286:2: ( ( (lv_element_0_0= ruleUiMobileEmbeddable ) ) (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )? )
+            // InternalUIGrammar.g:4287:3: ( (lv_element_0_0= ruleUiMobileEmbeddable ) ) (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )?
+            {
+            // InternalUIGrammar.g:4287:3: ( (lv_element_0_0= ruleUiMobileEmbeddable ) )
+            // InternalUIGrammar.g:4288:4: (lv_element_0_0= ruleUiMobileEmbeddable )
+            {
+            // InternalUIGrammar.g:4288:4: (lv_element_0_0= ruleUiMobileEmbeddable )
+            // InternalUIGrammar.g:4289:5: lv_element_0_0= ruleUiMobileEmbeddable
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getUiMobileVerticalLayoutAssigmentAccess().getElementUiMobileEmbeddableParserRuleCall_0_0());
+              				
+            }
+            pushFollow(FOLLOW_57);
+            lv_element_0_0=ruleUiMobileEmbeddable();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getUiMobileVerticalLayoutAssigmentRule());
+              					}
+              					set(
+              						current,
+              						"element",
+              						lv_element_0_0,
+              						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileEmbeddable");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalUIGrammar.g:4306:3: (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )?
+            int alt87=2;
+            int LA87_0 = input.LA(1);
+
+            if ( (LA87_0==53) ) {
+                alt87=1;
+            }
+            switch (alt87) {
+                case 1 :
+                    // InternalUIGrammar.g:4307:4: otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) )
+                    {
+                    otherlv_1=(Token)match(input,53,FOLLOW_41); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_1, grammarAccess.getUiMobileVerticalLayoutAssigmentAccess().getAlignKeyword_1_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:4311:4: ( (lv_alignment_2_0= ruleUiAlignment ) )
+                    // InternalUIGrammar.g:4312:5: (lv_alignment_2_0= ruleUiAlignment )
+                    {
+                    // InternalUIGrammar.g:4312:5: (lv_alignment_2_0= ruleUiAlignment )
+                    // InternalUIGrammar.g:4313:6: lv_alignment_2_0= ruleUiAlignment
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getUiMobileVerticalLayoutAssigmentAccess().getAlignmentUiAlignmentEnumRuleCall_1_1_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_2);
+                    lv_alignment_2_0=ruleUiAlignment();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getUiMobileVerticalLayoutAssigmentRule());
+                      						}
+                      						set(
+                      							current,
+                      							"alignment",
+                      							lv_alignment_2_0,
+                      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiAlignment");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiMobileVerticalLayoutAssigment"
+
+
+    // $ANTLR start "entryRuleUiMobileNavigationRoot"
+    // InternalUIGrammar.g:4335:1: entryRuleUiMobileNavigationRoot returns [EObject current=null] : iv_ruleUiMobileNavigationRoot= ruleUiMobileNavigationRoot EOF ;
+    public final EObject entryRuleUiMobileNavigationRoot() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiMobileNavigationRoot = null;
+
+
+        try {
+            // InternalUIGrammar.g:4335:63: (iv_ruleUiMobileNavigationRoot= ruleUiMobileNavigationRoot EOF )
+            // InternalUIGrammar.g:4336:2: iv_ruleUiMobileNavigationRoot= ruleUiMobileNavigationRoot EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiMobileNavigationRootRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiMobileNavigationRoot=ruleUiMobileNavigationRoot();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiMobileNavigationRoot; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiMobileNavigationRoot"
+
+
+    // $ANTLR start "ruleUiMobileNavigationRoot"
+    // InternalUIGrammar.g:4342:1: ruleUiMobileNavigationRoot returns [EObject current=null] : ( () otherlv_1= 'navRoot' ( (lv_name_2_0= RULE_ID ) )? otherlv_3= '{' ( (lv_contents_4_0= ruleUiMobileNavigationRootAssigment ) ) otherlv_5= '}' ) ;
+    public final EObject ruleUiMobileNavigationRoot() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token lv_name_2_0=null;
+        Token otherlv_3=null;
+        Token otherlv_5=null;
+        EObject lv_contents_4_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:4348:2: ( ( () otherlv_1= 'navRoot' ( (lv_name_2_0= RULE_ID ) )? otherlv_3= '{' ( (lv_contents_4_0= ruleUiMobileNavigationRootAssigment ) ) otherlv_5= '}' ) )
+            // InternalUIGrammar.g:4349:2: ( () otherlv_1= 'navRoot' ( (lv_name_2_0= RULE_ID ) )? otherlv_3= '{' ( (lv_contents_4_0= ruleUiMobileNavigationRootAssigment ) ) otherlv_5= '}' )
+            {
+            // InternalUIGrammar.g:4349:2: ( () otherlv_1= 'navRoot' ( (lv_name_2_0= RULE_ID ) )? otherlv_3= '{' ( (lv_contents_4_0= ruleUiMobileNavigationRootAssigment ) ) otherlv_5= '}' )
+            // InternalUIGrammar.g:4350:3: () otherlv_1= 'navRoot' ( (lv_name_2_0= RULE_ID ) )? otherlv_3= '{' ( (lv_contents_4_0= ruleUiMobileNavigationRootAssigment ) ) otherlv_5= '}'
+            {
+            // InternalUIGrammar.g:4350:3: ()
+            // InternalUIGrammar.g:4351:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiMobileNavigationRootAccess().getUiMobileNavigationRootAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,69,FOLLOW_55); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiMobileNavigationRootAccess().getNavRootKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:4361:3: ( (lv_name_2_0= RULE_ID ) )?
+            int alt88=2;
+            int LA88_0 = input.LA(1);
+
+            if ( (LA88_0==RULE_ID) ) {
+                alt88=1;
+            }
+            switch (alt88) {
+                case 1 :
+                    // InternalUIGrammar.g:4362:4: (lv_name_2_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:4362:4: (lv_name_2_0= RULE_ID )
+                    // InternalUIGrammar.g:4363:5: lv_name_2_0= RULE_ID
+                    {
+                    lv_name_2_0=(Token)match(input,RULE_ID,FOLLOW_11); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_2_0, grammarAccess.getUiMobileNavigationRootAccess().getNameIDTerminalRuleCall_2_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiMobileNavigationRootRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_2_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_3=(Token)match(input,20,FOLLOW_29); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_3, grammarAccess.getUiMobileNavigationRootAccess().getLeftCurlyBracketKeyword_3());
+              		
+            }
+            // InternalUIGrammar.g:4383:3: ( (lv_contents_4_0= ruleUiMobileNavigationRootAssigment ) )
+            // InternalUIGrammar.g:4384:4: (lv_contents_4_0= ruleUiMobileNavigationRootAssigment )
+            {
+            // InternalUIGrammar.g:4384:4: (lv_contents_4_0= ruleUiMobileNavigationRootAssigment )
+            // InternalUIGrammar.g:4385:5: lv_contents_4_0= ruleUiMobileNavigationRootAssigment
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getUiMobileNavigationRootAccess().getContentsUiMobileNavigationRootAssigmentParserRuleCall_4_0());
+              				
+            }
+            pushFollow(FOLLOW_61);
+            lv_contents_4_0=ruleUiMobileNavigationRootAssigment();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getUiMobileNavigationRootRule());
+              					}
+              					add(
+              						current,
+              						"contents",
+              						lv_contents_4_0,
+              						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileNavigationRootAssigment");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_5=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_5, grammarAccess.getUiMobileNavigationRootAccess().getRightCurlyBracketKeyword_5());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiMobileNavigationRoot"
+
+
+    // $ANTLR start "entryRuleUiMobileNavigationRootAssigment"
+    // InternalUIGrammar.g:4410:1: entryRuleUiMobileNavigationRootAssigment returns [EObject current=null] : iv_ruleUiMobileNavigationRootAssigment= ruleUiMobileNavigationRootAssigment EOF ;
+    public final EObject entryRuleUiMobileNavigationRootAssigment() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiMobileNavigationRootAssigment = null;
+
+
+        try {
+            // InternalUIGrammar.g:4410:72: (iv_ruleUiMobileNavigationRootAssigment= ruleUiMobileNavigationRootAssigment EOF )
+            // InternalUIGrammar.g:4411:2: iv_ruleUiMobileNavigationRootAssigment= ruleUiMobileNavigationRootAssigment EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiMobileNavigationRootAssigmentRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiMobileNavigationRootAssigment=ruleUiMobileNavigationRootAssigment();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiMobileNavigationRootAssigment; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiMobileNavigationRootAssigment"
+
+
+    // $ANTLR start "ruleUiMobileNavigationRootAssigment"
+    // InternalUIGrammar.g:4417:1: ruleUiMobileNavigationRootAssigment returns [EObject current=null] : ( (lv_element_0_0= ruleUiMobileNavigationPage ) ) ;
+    public final EObject ruleUiMobileNavigationRootAssigment() throws RecognitionException {
+        EObject current = null;
+
+        EObject lv_element_0_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:4423:2: ( ( (lv_element_0_0= ruleUiMobileNavigationPage ) ) )
+            // InternalUIGrammar.g:4424:2: ( (lv_element_0_0= ruleUiMobileNavigationPage ) )
+            {
+            // InternalUIGrammar.g:4424:2: ( (lv_element_0_0= ruleUiMobileNavigationPage ) )
+            // InternalUIGrammar.g:4425:3: (lv_element_0_0= ruleUiMobileNavigationPage )
+            {
+            // InternalUIGrammar.g:4425:3: (lv_element_0_0= ruleUiMobileNavigationPage )
+            // InternalUIGrammar.g:4426:4: lv_element_0_0= ruleUiMobileNavigationPage
+            {
+            if ( state.backtracking==0 ) {
+
+              				newCompositeNode(grammarAccess.getUiMobileNavigationRootAssigmentAccess().getElementUiMobileNavigationPageParserRuleCall_0());
+              			
+            }
+            pushFollow(FOLLOW_2);
+            lv_element_0_0=ruleUiMobileNavigationPage();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              				if (current==null) {
+              					current = createModelElementForParent(grammarAccess.getUiMobileNavigationRootAssigmentRule());
+              				}
+              				set(
+              					current,
+              					"element",
+              					lv_element_0_0,
+              					"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileNavigationPage");
+              				afterParserOrEnumRuleCall();
+              			
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiMobileNavigationRootAssigment"
+
+
+    // $ANTLR start "entryRuleUiHorizontalLayout"
+    // InternalUIGrammar.g:4446:1: entryRuleUiHorizontalLayout returns [EObject current=null] : iv_ruleUiHorizontalLayout= ruleUiHorizontalLayout EOF ;
+    public final EObject entryRuleUiHorizontalLayout() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiHorizontalLayout = null;
+
+
+        try {
+            // InternalUIGrammar.g:4446:59: (iv_ruleUiHorizontalLayout= ruleUiHorizontalLayout EOF )
+            // InternalUIGrammar.g:4447:2: iv_ruleUiHorizontalLayout= ruleUiHorizontalLayout EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiHorizontalLayoutRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiHorizontalLayout=ruleUiHorizontalLayout();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiHorizontalLayout; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiHorizontalLayout"
+
+
+    // $ANTLR start "ruleUiHorizontalLayout"
+    // InternalUIGrammar.g:4453:1: ruleUiHorizontalLayout returns [EObject current=null] : ( () otherlv_1= 'horizontalLayout' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiHorizontalLayoutAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' ) ;
+    public final EObject ruleUiHorizontalLayout() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        Token lv_readonly_5_0=null;
+        Token otherlv_6=null;
+        Token lv_styles_7_0=null;
+        Token otherlv_8=null;
+        Token lv_name_9_0=null;
+        Token otherlv_10=null;
+        Token otherlv_14=null;
+        EObject lv_i18nInfo_4_0 = null;
+
+        EObject lv_contents_11_0 = null;
+
+        EObject lv_bindings_12_0 = null;
+
+        EObject lv_processorAssignments_13_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:4459:2: ( ( () otherlv_1= 'horizontalLayout' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiHorizontalLayoutAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' ) )
+            // InternalUIGrammar.g:4460:2: ( () otherlv_1= 'horizontalLayout' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiHorizontalLayoutAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )
+            {
+            // InternalUIGrammar.g:4460:2: ( () otherlv_1= 'horizontalLayout' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiHorizontalLayoutAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )
+            // InternalUIGrammar.g:4461:3: () otherlv_1= 'horizontalLayout' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiHorizontalLayoutAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}'
+            {
+            // InternalUIGrammar.g:4461:3: ()
+            // InternalUIGrammar.g:4462:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiHorizontalLayoutAccess().getUiHorizontalLayoutAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,70,FOLLOW_58); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiHorizontalLayoutAccess().getHorizontalLayoutKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:4472:3: ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )?
+            int alt92=2;
+            int LA92_0 = input.LA(1);
+
+            if ( (LA92_0==45||LA92_0==47||(LA92_0>=64 && LA92_0<=65)) ) {
+                alt92=1;
+            }
+            switch (alt92) {
+                case 1 :
+                    // InternalUIGrammar.g:4473:4: ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) )
+                    {
+                    // InternalUIGrammar.g:4473:4: ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) )
+                    // InternalUIGrammar.g:4474:5: ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) )? otherlv_8= ')' ) ) ) ) )+ {...}?)
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2());
+                    // InternalUIGrammar.g:4477:5: ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) )? otherlv_8= ')' ) ) ) ) )+ {...}?)
+                    // InternalUIGrammar.g:4478:6: ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) )? otherlv_8= ')' ) ) ) ) )+ {...}?
+                    {
+                    // InternalUIGrammar.g:4478:6: ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) )? otherlv_8= ')' ) ) ) ) )+
+                    int cnt91=0;
+                    loop91:
+                    do {
+                        int alt91=4;
+                        int LA91_0 = input.LA(1);
+
+                        if ( LA91_0 == 45 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2(), 0) ) {
+                            alt91=1;
+                        }
+                        else if ( LA91_0 == 65 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2(), 1) ) {
+                            alt91=2;
+                        }
+                        else if ( ( LA91_0 == 47 || LA91_0 == 64 ) && getUnorderedGroupHelper().canSelect(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2(), 2) ) {
+                            alt91=3;
+                        }
+
+
+                        switch (alt91) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:4479:4: ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:4479:4: ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) )
+                    	    // InternalUIGrammar.g:4480:5: {...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiHorizontalLayout", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:4480:115: ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) )
+                    	    // InternalUIGrammar.g:4481:6: ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2(), 0);
+                    	    // InternalUIGrammar.g:4484:9: ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) )
+                    	    // InternalUIGrammar.g:4484:10: {...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiHorizontalLayout", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:4484:19: (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? )
+                    	    // InternalUIGrammar.g:4484:20: otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )?
+                    	    {
+                    	    otherlv_3=(Token)match(input,45,FOLLOW_59); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      									newLeafNode(otherlv_3, grammarAccess.getUiHorizontalLayoutAccess().getLeftParenthesisKeyword_2_0_0());
+                    	      								
+                    	    }
+                    	    // InternalUIGrammar.g:4488:9: ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )?
+                    	    int alt89=2;
+                    	    int LA89_0 = input.LA(1);
+
+                    	    if ( (LA89_0==60) ) {
+                    	        alt89=1;
+                    	    }
+                    	    switch (alt89) {
+                    	        case 1 :
+                    	            // InternalUIGrammar.g:4489:10: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	            {
+                    	            // InternalUIGrammar.g:4489:10: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	            // InternalUIGrammar.g:4490:11: lv_i18nInfo_4_0= ruleUiI18nInfo
+                    	            {
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											newCompositeNode(grammarAccess.getUiHorizontalLayoutAccess().getI18nInfoUiI18nInfoParserRuleCall_2_0_1_0());
+                    	              										
+                    	            }
+                    	            pushFollow(FOLLOW_58);
+                    	            lv_i18nInfo_4_0=ruleUiI18nInfo();
+
+                    	            state._fsp--;
+                    	            if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											if (current==null) {
+                    	              												current = createModelElementForParent(grammarAccess.getUiHorizontalLayoutRule());
+                    	              											}
+                    	              											set(
+                    	              												current,
+                    	              												"i18nInfo",
+                    	              												lv_i18nInfo_4_0,
+                    	              												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	              											afterParserOrEnumRuleCall();
+                    	              										
+                    	            }
+
+                    	            }
+
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:4513:4: ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:4513:4: ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) )
+                    	    // InternalUIGrammar.g:4514:5: {...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiHorizontalLayout", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:4514:115: ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) )
+                    	    // InternalUIGrammar.g:4515:6: ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2(), 1);
+                    	    // InternalUIGrammar.g:4518:9: ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) )
+                    	    // InternalUIGrammar.g:4518:10: {...}? => ( (lv_readonly_5_0= 'readonly' ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiHorizontalLayout", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:4518:19: ( (lv_readonly_5_0= 'readonly' ) )
+                    	    // InternalUIGrammar.g:4518:20: (lv_readonly_5_0= 'readonly' )
+                    	    {
+                    	    // InternalUIGrammar.g:4518:20: (lv_readonly_5_0= 'readonly' )
+                    	    // InternalUIGrammar.g:4519:10: lv_readonly_5_0= 'readonly'
+                    	    {
+                    	    lv_readonly_5_0=(Token)match(input,65,FOLLOW_58); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(lv_readonly_5_0, grammarAccess.getUiHorizontalLayoutAccess().getReadonlyReadonlyKeyword_2_1_0());
+                    	      									
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										if (current==null) {
+                    	      											current = createModelElement(grammarAccess.getUiHorizontalLayoutRule());
+                    	      										}
+                    	      										setWithLastConsumed(current, "readonly", true, "readonly");
+                    	      									
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 3 :
+                    	    // InternalUIGrammar.g:4536:4: ({...}? => ( ({...}? => ( (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) )? otherlv_8= ')' ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:4536:4: ({...}? => ( ({...}? => ( (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) )? otherlv_8= ')' ) ) ) )
+                    	    // InternalUIGrammar.g:4537:5: {...}? => ( ({...}? => ( (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) )? otherlv_8= ')' ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2(), 2) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiHorizontalLayout", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2(), 2)");
+                    	    }
+                    	    // InternalUIGrammar.g:4537:115: ( ({...}? => ( (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) )? otherlv_8= ')' ) ) )
+                    	    // InternalUIGrammar.g:4538:6: ({...}? => ( (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) )? otherlv_8= ')' ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2(), 2);
+                    	    // InternalUIGrammar.g:4541:9: ({...}? => ( (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) )? otherlv_8= ')' ) )
+                    	    // InternalUIGrammar.g:4541:10: {...}? => ( (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) )? otherlv_8= ')' )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiHorizontalLayout", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:4541:19: ( (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) )? otherlv_8= ')' )
+                    	    // InternalUIGrammar.g:4541:20: (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) )? otherlv_8= ')'
+                    	    {
+                    	    // InternalUIGrammar.g:4541:20: (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) )?
+                    	    int alt90=2;
+                    	    int LA90_0 = input.LA(1);
+
+                    	    if ( (LA90_0==64) ) {
+                    	        alt90=1;
+                    	    }
+                    	    switch (alt90) {
+                    	        case 1 :
+                    	            // InternalUIGrammar.g:4542:10: otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) )
+                    	            {
+                    	            otherlv_6=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              										newLeafNode(otherlv_6, grammarAccess.getUiHorizontalLayoutAccess().getStylesKeyword_2_2_0_0());
+                    	              									
+                    	            }
+                    	            // InternalUIGrammar.g:4546:10: ( (lv_styles_7_0= RULE_STRING ) )
+                    	            // InternalUIGrammar.g:4547:11: (lv_styles_7_0= RULE_STRING )
+                    	            {
+                    	            // InternalUIGrammar.g:4547:11: (lv_styles_7_0= RULE_STRING )
+                    	            // InternalUIGrammar.g:4548:12: lv_styles_7_0= RULE_STRING
+                    	            {
+                    	            lv_styles_7_0=(Token)match(input,RULE_STRING,FOLLOW_36); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              												newLeafNode(lv_styles_7_0, grammarAccess.getUiHorizontalLayoutAccess().getStylesSTRINGTerminalRuleCall_2_2_0_1_0());
+                    	              											
+                    	            }
+                    	            if ( state.backtracking==0 ) {
+
+                    	              												if (current==null) {
+                    	              													current = createModelElement(grammarAccess.getUiHorizontalLayoutRule());
+                    	              												}
+                    	              												setWithLastConsumed(
+                    	              													current,
+                    	              													"styles",
+                    	              													lv_styles_7_0,
+                    	              													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	              											
+                    	            }
+
+                    	            }
+
+
+                    	            }
+
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+                    	    otherlv_8=(Token)match(input,47,FOLLOW_58); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      									newLeafNode(otherlv_8, grammarAccess.getUiHorizontalLayoutAccess().getRightParenthesisKeyword_2_2_1());
+                    	      								
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    if ( cnt91 >= 1 ) break loop91;
+                    	    if (state.backtracking>0) {state.failed=true; return current;}
+                                EarlyExitException eee =
+                                    new EarlyExitException(91, input);
+                                throw eee;
+                        }
+                        cnt91++;
+                    } while (true);
+
+                    if ( ! getUnorderedGroupHelper().canLeave(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2()) ) {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        throw new FailedPredicateException(input, "ruleUiHorizontalLayout", "getUnorderedGroupHelper().canLeave(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2())");
+                    }
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2());
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:4583:3: ( (lv_name_9_0= RULE_ID ) )?
+            int alt93=2;
+            int LA93_0 = input.LA(1);
+
+            if ( (LA93_0==RULE_ID) ) {
+                alt93=1;
+            }
+            switch (alt93) {
+                case 1 :
+                    // InternalUIGrammar.g:4584:4: (lv_name_9_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:4584:4: (lv_name_9_0= RULE_ID )
+                    // InternalUIGrammar.g:4585:5: lv_name_9_0= RULE_ID
+                    {
+                    lv_name_9_0=(Token)match(input,RULE_ID,FOLLOW_11); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_9_0, grammarAccess.getUiHorizontalLayoutAccess().getNameIDTerminalRuleCall_3_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiHorizontalLayoutRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_9_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_10=(Token)match(input,20,FOLLOW_56); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_10, grammarAccess.getUiHorizontalLayoutAccess().getLeftCurlyBracketKeyword_4());
+              		
+            }
+            // InternalUIGrammar.g:4605:3: ( (lv_contents_11_0= ruleUiHorizontalLayoutAssigment ) )*
+            loop94:
+            do {
+                int alt94=2;
+                int LA94_0 = input.LA(1);
+
+                if ( (LA94_0==62||(LA94_0>=66 && LA94_0<=67)||LA94_0==70||LA94_0==74||(LA94_0>=79 && LA94_0<=80)||LA94_0==84||LA94_0==91||(LA94_0>=95 && LA94_0<=96)||(LA94_0>=98 && LA94_0<=100)||LA94_0==105||LA94_0==107||LA94_0==112||(LA94_0>=117 && LA94_0<=122)||LA94_0==124||(LA94_0>=128 && LA94_0<=129)||(LA94_0>=133 && LA94_0<=134)||(LA94_0>=138 && LA94_0<=139)||(LA94_0>=145 && LA94_0<=146)) ) {
+                    alt94=1;
+                }
+
+
+                switch (alt94) {
+            	case 1 :
+            	    // InternalUIGrammar.g:4606:4: (lv_contents_11_0= ruleUiHorizontalLayoutAssigment )
+            	    {
+            	    // InternalUIGrammar.g:4606:4: (lv_contents_11_0= ruleUiHorizontalLayoutAssigment )
+            	    // InternalUIGrammar.g:4607:5: lv_contents_11_0= ruleUiHorizontalLayoutAssigment
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiHorizontalLayoutAccess().getContentsUiHorizontalLayoutAssigmentParserRuleCall_5_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_56);
+            	    lv_contents_11_0=ruleUiHorizontalLayoutAssigment();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiHorizontalLayoutRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"contents",
+            	      						lv_contents_11_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiHorizontalLayoutAssigment");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop94;
+                }
+            } while (true);
+
+            // InternalUIGrammar.g:4624:3: ( (lv_bindings_12_0= ruleUiBinding ) )*
+            loop95:
+            do {
+                int alt95=2;
+                int LA95_0 = input.LA(1);
+
+                if ( (LA95_0==26) ) {
+                    alt95=1;
+                }
+
+
+                switch (alt95) {
+            	case 1 :
+            	    // InternalUIGrammar.g:4625:4: (lv_bindings_12_0= ruleUiBinding )
+            	    {
+            	    // InternalUIGrammar.g:4625:4: (lv_bindings_12_0= ruleUiBinding )
+            	    // InternalUIGrammar.g:4626:5: lv_bindings_12_0= ruleUiBinding
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiHorizontalLayoutAccess().getBindingsUiBindingParserRuleCall_6_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_42);
+            	    lv_bindings_12_0=ruleUiBinding();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiHorizontalLayoutRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"bindings",
+            	      						lv_bindings_12_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop95;
+                }
+            } while (true);
+
+            // InternalUIGrammar.g:4643:3: ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )*
+            loop96:
+            do {
+                int alt96=2;
+                int LA96_0 = input.LA(1);
+
+                if ( (LA96_0==153) ) {
+                    alt96=1;
+                }
+
+
+                switch (alt96) {
+            	case 1 :
+            	    // InternalUIGrammar.g:4644:4: (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment )
+            	    {
+            	    // InternalUIGrammar.g:4644:4: (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment )
+            	    // InternalUIGrammar.g:4645:5: lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiHorizontalLayoutAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_42);
+            	    lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiHorizontalLayoutRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"processorAssignments",
+            	      						lv_processorAssignments_13_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop96;
+                }
+            } while (true);
+
+            otherlv_14=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_14, grammarAccess.getUiHorizontalLayoutAccess().getRightCurlyBracketKeyword_8());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiHorizontalLayout"
+
+
+    // $ANTLR start "entryRuleUiHorizontalLayoutAssigment"
+    // InternalUIGrammar.g:4670:1: entryRuleUiHorizontalLayoutAssigment returns [EObject current=null] : iv_ruleUiHorizontalLayoutAssigment= ruleUiHorizontalLayoutAssigment EOF ;
+    public final EObject entryRuleUiHorizontalLayoutAssigment() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiHorizontalLayoutAssigment = null;
+
+
+        try {
+            // InternalUIGrammar.g:4670:68: (iv_ruleUiHorizontalLayoutAssigment= ruleUiHorizontalLayoutAssigment EOF )
+            // InternalUIGrammar.g:4671:2: iv_ruleUiHorizontalLayoutAssigment= ruleUiHorizontalLayoutAssigment EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiHorizontalLayoutAssigmentRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiHorizontalLayoutAssigment=ruleUiHorizontalLayoutAssigment();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiHorizontalLayoutAssigment; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiHorizontalLayoutAssigment"
+
+
+    // $ANTLR start "ruleUiHorizontalLayoutAssigment"
+    // InternalUIGrammar.g:4677:1: ruleUiHorizontalLayoutAssigment returns [EObject current=null] : ( ( (lv_element_0_0= ruleUiEmbeddable ) ) (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )? ) ;
+    public final EObject ruleUiHorizontalLayoutAssigment() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        EObject lv_element_0_0 = null;
+
+        Enumerator lv_alignment_2_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:4683:2: ( ( ( (lv_element_0_0= ruleUiEmbeddable ) ) (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )? ) )
+            // InternalUIGrammar.g:4684:2: ( ( (lv_element_0_0= ruleUiEmbeddable ) ) (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )? )
+            {
+            // InternalUIGrammar.g:4684:2: ( ( (lv_element_0_0= ruleUiEmbeddable ) ) (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )? )
+            // InternalUIGrammar.g:4685:3: ( (lv_element_0_0= ruleUiEmbeddable ) ) (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )?
+            {
+            // InternalUIGrammar.g:4685:3: ( (lv_element_0_0= ruleUiEmbeddable ) )
+            // InternalUIGrammar.g:4686:4: (lv_element_0_0= ruleUiEmbeddable )
+            {
+            // InternalUIGrammar.g:4686:4: (lv_element_0_0= ruleUiEmbeddable )
+            // InternalUIGrammar.g:4687:5: lv_element_0_0= ruleUiEmbeddable
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getUiHorizontalLayoutAssigmentAccess().getElementUiEmbeddableParserRuleCall_0_0());
+              				
+            }
+            pushFollow(FOLLOW_57);
+            lv_element_0_0=ruleUiEmbeddable();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getUiHorizontalLayoutAssigmentRule());
+              					}
+              					set(
+              						current,
+              						"element",
+              						lv_element_0_0,
+              						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiEmbeddable");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalUIGrammar.g:4704:3: (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )?
+            int alt97=2;
+            int LA97_0 = input.LA(1);
+
+            if ( (LA97_0==53) ) {
+                alt97=1;
+            }
+            switch (alt97) {
+                case 1 :
+                    // InternalUIGrammar.g:4705:4: otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) )
+                    {
+                    otherlv_1=(Token)match(input,53,FOLLOW_41); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_1, grammarAccess.getUiHorizontalLayoutAssigmentAccess().getAlignKeyword_1_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:4709:4: ( (lv_alignment_2_0= ruleUiAlignment ) )
+                    // InternalUIGrammar.g:4710:5: (lv_alignment_2_0= ruleUiAlignment )
+                    {
+                    // InternalUIGrammar.g:4710:5: (lv_alignment_2_0= ruleUiAlignment )
+                    // InternalUIGrammar.g:4711:6: lv_alignment_2_0= ruleUiAlignment
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getUiHorizontalLayoutAssigmentAccess().getAlignmentUiAlignmentEnumRuleCall_1_1_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_2);
+                    lv_alignment_2_0=ruleUiAlignment();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getUiHorizontalLayoutAssigmentRule());
+                      						}
+                      						set(
+                      							current,
+                      							"alignment",
+                      							lv_alignment_2_0,
+                      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiAlignment");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiHorizontalLayoutAssigment"
+
+
+    // $ANTLR start "entryRuleUiMobileHorizontalLayout"
+    // InternalUIGrammar.g:4733:1: entryRuleUiMobileHorizontalLayout returns [EObject current=null] : iv_ruleUiMobileHorizontalLayout= ruleUiMobileHorizontalLayout EOF ;
+    public final EObject entryRuleUiMobileHorizontalLayout() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiMobileHorizontalLayout = null;
+
+
+        try {
+            // InternalUIGrammar.g:4733:65: (iv_ruleUiMobileHorizontalLayout= ruleUiMobileHorizontalLayout EOF )
+            // InternalUIGrammar.g:4734:2: iv_ruleUiMobileHorizontalLayout= ruleUiMobileHorizontalLayout EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiMobileHorizontalLayoutRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiMobileHorizontalLayout=ruleUiMobileHorizontalLayout();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiMobileHorizontalLayout; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiMobileHorizontalLayout"
+
+
+    // $ANTLR start "ruleUiMobileHorizontalLayout"
+    // InternalUIGrammar.g:4740:1: ruleUiMobileHorizontalLayout returns [EObject current=null] : ( () otherlv_1= 'mobileHorizontalLayout' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiMobileHorizontalLayoutAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' ) ;
+    public final EObject ruleUiMobileHorizontalLayout() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        Token otherlv_5=null;
+        Token lv_styles_6_0=null;
+        Token lv_readonly_7_0=null;
+        Token otherlv_8=null;
+        Token lv_name_9_0=null;
+        Token otherlv_10=null;
+        Token otherlv_14=null;
+        EObject lv_i18nInfo_4_0 = null;
+
+        EObject lv_contents_11_0 = null;
+
+        EObject lv_bindings_12_0 = null;
+
+        EObject lv_processorAssignments_13_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:4746:2: ( ( () otherlv_1= 'mobileHorizontalLayout' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiMobileHorizontalLayoutAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' ) )
+            // InternalUIGrammar.g:4747:2: ( () otherlv_1= 'mobileHorizontalLayout' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiMobileHorizontalLayoutAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )
+            {
+            // InternalUIGrammar.g:4747:2: ( () otherlv_1= 'mobileHorizontalLayout' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiMobileHorizontalLayoutAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )
+            // InternalUIGrammar.g:4748:3: () otherlv_1= 'mobileHorizontalLayout' ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiMobileHorizontalLayoutAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}'
+            {
+            // InternalUIGrammar.g:4748:3: ()
+            // InternalUIGrammar.g:4749:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiMobileHorizontalLayoutAccess().getUiHorizontalLayoutAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,71,FOLLOW_58); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiMobileHorizontalLayoutAccess().getMobileHorizontalLayoutKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:4759:3: ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) ) )?
+            int alt101=2;
+            int LA101_0 = input.LA(1);
+
+            if ( (LA101_0==45||LA101_0==47||(LA101_0>=64 && LA101_0<=65)) ) {
+                alt101=1;
+            }
+            switch (alt101) {
+                case 1 :
+                    // InternalUIGrammar.g:4760:4: ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) )
+                    {
+                    // InternalUIGrammar.g:4760:4: ( ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?) )
+                    // InternalUIGrammar.g:4761:5: ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?)
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2());
+                    // InternalUIGrammar.g:4764:5: ( ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?)
+                    // InternalUIGrammar.g:4765:6: ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+ {...}?
+                    {
+                    // InternalUIGrammar.g:4765:6: ( ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) ) )+
+                    int cnt100=0;
+                    loop100:
+                    do {
+                        int alt100=4;
+                        int LA100_0 = input.LA(1);
+
+                        if ( LA100_0 == 45 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2(), 0) ) {
+                            alt100=1;
+                        }
+                        else if ( LA100_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2(), 1) ) {
+                            alt100=2;
+                        }
+                        else if ( ( LA100_0 == 47 || LA100_0 == 65 ) && getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2(), 2) ) {
+                            alt100=3;
+                        }
+
+
+                        switch (alt100) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:4766:4: ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:4766:4: ({...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) ) )
+                    	    // InternalUIGrammar.g:4767:5: {...}? => ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileHorizontalLayout", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:4767:121: ( ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) ) )
+                    	    // InternalUIGrammar.g:4768:6: ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2(), 0);
+                    	    // InternalUIGrammar.g:4771:9: ({...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? ) )
+                    	    // InternalUIGrammar.g:4771:10: {...}? => (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileHorizontalLayout", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:4771:19: (otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )? )
+                    	    // InternalUIGrammar.g:4771:20: otherlv_3= '(' ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )?
+                    	    {
+                    	    otherlv_3=(Token)match(input,45,FOLLOW_59); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      									newLeafNode(otherlv_3, grammarAccess.getUiMobileHorizontalLayoutAccess().getLeftParenthesisKeyword_2_0_0());
+                    	      								
+                    	    }
+                    	    // InternalUIGrammar.g:4775:9: ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )?
+                    	    int alt98=2;
+                    	    int LA98_0 = input.LA(1);
+
+                    	    if ( (LA98_0==60) ) {
+                    	        alt98=1;
+                    	    }
+                    	    switch (alt98) {
+                    	        case 1 :
+                    	            // InternalUIGrammar.g:4776:10: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	            {
+                    	            // InternalUIGrammar.g:4776:10: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	            // InternalUIGrammar.g:4777:11: lv_i18nInfo_4_0= ruleUiI18nInfo
+                    	            {
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											newCompositeNode(grammarAccess.getUiMobileHorizontalLayoutAccess().getI18nInfoUiI18nInfoParserRuleCall_2_0_1_0());
+                    	              										
+                    	            }
+                    	            pushFollow(FOLLOW_58);
+                    	            lv_i18nInfo_4_0=ruleUiI18nInfo();
+
+                    	            state._fsp--;
+                    	            if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											if (current==null) {
+                    	              												current = createModelElementForParent(grammarAccess.getUiMobileHorizontalLayoutRule());
+                    	              											}
+                    	              											set(
+                    	              												current,
+                    	              												"i18nInfo",
+                    	              												lv_i18nInfo_4_0,
+                    	              												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	              											afterParserOrEnumRuleCall();
+                    	              										
+                    	            }
+
+                    	            }
+
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:4800:4: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:4800:4: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:4801:5: {...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileHorizontalLayout", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:4801:121: ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:4802:6: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2(), 1);
+                    	    // InternalUIGrammar.g:4805:9: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:4805:10: {...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileHorizontalLayout", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:4805:19: (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:4805:20: otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_5=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      									newLeafNode(otherlv_5, grammarAccess.getUiMobileHorizontalLayoutAccess().getStylesKeyword_2_1_0());
+                    	      								
+                    	    }
+                    	    // InternalUIGrammar.g:4809:9: ( (lv_styles_6_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:4810:10: (lv_styles_6_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:4810:10: (lv_styles_6_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:4811:11: lv_styles_6_0= RULE_STRING
+                    	    {
+                    	    lv_styles_6_0=(Token)match(input,RULE_STRING,FOLLOW_58); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newLeafNode(lv_styles_6_0, grammarAccess.getUiMobileHorizontalLayoutAccess().getStylesSTRINGTerminalRuleCall_2_1_1_0());
+                    	      										
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElement(grammarAccess.getUiMobileHorizontalLayoutRule());
+                    	      											}
+                    	      											setWithLastConsumed(
+                    	      												current,
+                    	      												"styles",
+                    	      												lv_styles_6_0,
+                    	      												"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 3 :
+                    	    // InternalUIGrammar.g:4833:4: ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:4833:4: ({...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) ) )
+                    	    // InternalUIGrammar.g:4834:5: {...}? => ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2(), 2) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileHorizontalLayout", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2(), 2)");
+                    	    }
+                    	    // InternalUIGrammar.g:4834:121: ( ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) ) )
+                    	    // InternalUIGrammar.g:4835:6: ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2(), 2);
+                    	    // InternalUIGrammar.g:4838:9: ({...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' ) )
+                    	    // InternalUIGrammar.g:4838:10: {...}? => ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileHorizontalLayout", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:4838:19: ( ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')' )
+                    	    // InternalUIGrammar.g:4838:20: ( (lv_readonly_7_0= 'readonly' ) )? otherlv_8= ')'
+                    	    {
+                    	    // InternalUIGrammar.g:4838:20: ( (lv_readonly_7_0= 'readonly' ) )?
+                    	    int alt99=2;
+                    	    int LA99_0 = input.LA(1);
+
+                    	    if ( (LA99_0==65) ) {
+                    	        alt99=1;
+                    	    }
+                    	    switch (alt99) {
+                    	        case 1 :
+                    	            // InternalUIGrammar.g:4839:10: (lv_readonly_7_0= 'readonly' )
+                    	            {
+                    	            // InternalUIGrammar.g:4839:10: (lv_readonly_7_0= 'readonly' )
+                    	            // InternalUIGrammar.g:4840:11: lv_readonly_7_0= 'readonly'
+                    	            {
+                    	            lv_readonly_7_0=(Token)match(input,65,FOLLOW_36); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											newLeafNode(lv_readonly_7_0, grammarAccess.getUiMobileHorizontalLayoutAccess().getReadonlyReadonlyKeyword_2_2_0_0());
+                    	              										
+                    	            }
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											if (current==null) {
+                    	              												current = createModelElement(grammarAccess.getUiMobileHorizontalLayoutRule());
+                    	              											}
+                    	              											setWithLastConsumed(current, "readonly", true, "readonly");
+                    	              										
+                    	            }
+
+                    	            }
+
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+                    	    otherlv_8=(Token)match(input,47,FOLLOW_58); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      									newLeafNode(otherlv_8, grammarAccess.getUiMobileHorizontalLayoutAccess().getRightParenthesisKeyword_2_2_1());
+                    	      								
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    if ( cnt100 >= 1 ) break loop100;
+                    	    if (state.backtracking>0) {state.failed=true; return current;}
+                                EarlyExitException eee =
+                                    new EarlyExitException(100, input);
+                                throw eee;
+                        }
+                        cnt100++;
+                    } while (true);
+
+                    if ( ! getUnorderedGroupHelper().canLeave(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2()) ) {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        throw new FailedPredicateException(input, "ruleUiMobileHorizontalLayout", "getUnorderedGroupHelper().canLeave(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2())");
+                    }
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2());
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:4870:3: ( (lv_name_9_0= RULE_ID ) )?
+            int alt102=2;
+            int LA102_0 = input.LA(1);
+
+            if ( (LA102_0==RULE_ID) ) {
+                alt102=1;
+            }
+            switch (alt102) {
+                case 1 :
+                    // InternalUIGrammar.g:4871:4: (lv_name_9_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:4871:4: (lv_name_9_0= RULE_ID )
+                    // InternalUIGrammar.g:4872:5: lv_name_9_0= RULE_ID
+                    {
+                    lv_name_9_0=(Token)match(input,RULE_ID,FOLLOW_11); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_9_0, grammarAccess.getUiMobileHorizontalLayoutAccess().getNameIDTerminalRuleCall_3_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiMobileHorizontalLayoutRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_9_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_10=(Token)match(input,20,FOLLOW_60); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_10, grammarAccess.getUiMobileHorizontalLayoutAccess().getLeftCurlyBracketKeyword_4());
+              		
+            }
+            // InternalUIGrammar.g:4892:3: ( (lv_contents_11_0= ruleUiMobileHorizontalLayoutAssigment ) )*
+            loop103:
+            do {
+                int alt103=2;
+                int LA103_0 = input.LA(1);
+
+                if ( ((LA103_0>=68 && LA103_0<=69)||(LA103_0>=71 && LA103_0<=73)||(LA103_0>=76 && LA103_0<=77)||LA103_0==89||LA103_0==91||(LA103_0>=95 && LA103_0<=96)||(LA103_0>=98 && LA103_0<=100)||LA103_0==105||LA103_0==107||(LA103_0>=117 && LA103_0<=122)||LA103_0==124||(LA103_0>=128 && LA103_0<=130)||(LA103_0>=132 && LA103_0<=134)||LA103_0==138||LA103_0==145) ) {
+                    alt103=1;
+                }
+
+
+                switch (alt103) {
+            	case 1 :
+            	    // InternalUIGrammar.g:4893:4: (lv_contents_11_0= ruleUiMobileHorizontalLayoutAssigment )
+            	    {
+            	    // InternalUIGrammar.g:4893:4: (lv_contents_11_0= ruleUiMobileHorizontalLayoutAssigment )
+            	    // InternalUIGrammar.g:4894:5: lv_contents_11_0= ruleUiMobileHorizontalLayoutAssigment
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiMobileHorizontalLayoutAccess().getContentsUiMobileHorizontalLayoutAssigmentParserRuleCall_5_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_60);
+            	    lv_contents_11_0=ruleUiMobileHorizontalLayoutAssigment();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiMobileHorizontalLayoutRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"contents",
+            	      						lv_contents_11_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileHorizontalLayoutAssigment");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop103;
+                }
+            } while (true);
+
+            // InternalUIGrammar.g:4911:3: ( (lv_bindings_12_0= ruleUiBinding ) )*
+            loop104:
+            do {
+                int alt104=2;
+                int LA104_0 = input.LA(1);
+
+                if ( (LA104_0==26) ) {
+                    alt104=1;
+                }
+
+
+                switch (alt104) {
+            	case 1 :
+            	    // InternalUIGrammar.g:4912:4: (lv_bindings_12_0= ruleUiBinding )
+            	    {
+            	    // InternalUIGrammar.g:4912:4: (lv_bindings_12_0= ruleUiBinding )
+            	    // InternalUIGrammar.g:4913:5: lv_bindings_12_0= ruleUiBinding
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiMobileHorizontalLayoutAccess().getBindingsUiBindingParserRuleCall_6_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_42);
+            	    lv_bindings_12_0=ruleUiBinding();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiMobileHorizontalLayoutRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"bindings",
+            	      						lv_bindings_12_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop104;
+                }
+            } while (true);
+
+            // InternalUIGrammar.g:4930:3: ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )*
+            loop105:
+            do {
+                int alt105=2;
+                int LA105_0 = input.LA(1);
+
+                if ( (LA105_0==153) ) {
+                    alt105=1;
+                }
+
+
+                switch (alt105) {
+            	case 1 :
+            	    // InternalUIGrammar.g:4931:4: (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment )
+            	    {
+            	    // InternalUIGrammar.g:4931:4: (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment )
+            	    // InternalUIGrammar.g:4932:5: lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiMobileHorizontalLayoutAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_42);
+            	    lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiMobileHorizontalLayoutRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"processorAssignments",
+            	      						lv_processorAssignments_13_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop105;
+                }
+            } while (true);
+
+            otherlv_14=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_14, grammarAccess.getUiMobileHorizontalLayoutAccess().getRightCurlyBracketKeyword_8());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiMobileHorizontalLayout"
+
+
+    // $ANTLR start "entryRuleUiMobileHorizontalLayoutAssigment"
+    // InternalUIGrammar.g:4957:1: entryRuleUiMobileHorizontalLayoutAssigment returns [EObject current=null] : iv_ruleUiMobileHorizontalLayoutAssigment= ruleUiMobileHorizontalLayoutAssigment EOF ;
+    public final EObject entryRuleUiMobileHorizontalLayoutAssigment() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiMobileHorizontalLayoutAssigment = null;
+
+
+        try {
+            // InternalUIGrammar.g:4957:74: (iv_ruleUiMobileHorizontalLayoutAssigment= ruleUiMobileHorizontalLayoutAssigment EOF )
+            // InternalUIGrammar.g:4958:2: iv_ruleUiMobileHorizontalLayoutAssigment= ruleUiMobileHorizontalLayoutAssigment EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiMobileHorizontalLayoutAssigmentRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiMobileHorizontalLayoutAssigment=ruleUiMobileHorizontalLayoutAssigment();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiMobileHorizontalLayoutAssigment; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiMobileHorizontalLayoutAssigment"
+
+
+    // $ANTLR start "ruleUiMobileHorizontalLayoutAssigment"
+    // InternalUIGrammar.g:4964:1: ruleUiMobileHorizontalLayoutAssigment returns [EObject current=null] : ( ( (lv_element_0_0= ruleUiMobileEmbeddable ) ) (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )? ) ;
+    public final EObject ruleUiMobileHorizontalLayoutAssigment() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        EObject lv_element_0_0 = null;
+
+        Enumerator lv_alignment_2_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:4970:2: ( ( ( (lv_element_0_0= ruleUiMobileEmbeddable ) ) (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )? ) )
+            // InternalUIGrammar.g:4971:2: ( ( (lv_element_0_0= ruleUiMobileEmbeddable ) ) (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )? )
+            {
+            // InternalUIGrammar.g:4971:2: ( ( (lv_element_0_0= ruleUiMobileEmbeddable ) ) (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )? )
+            // InternalUIGrammar.g:4972:3: ( (lv_element_0_0= ruleUiMobileEmbeddable ) ) (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )?
+            {
+            // InternalUIGrammar.g:4972:3: ( (lv_element_0_0= ruleUiMobileEmbeddable ) )
+            // InternalUIGrammar.g:4973:4: (lv_element_0_0= ruleUiMobileEmbeddable )
+            {
+            // InternalUIGrammar.g:4973:4: (lv_element_0_0= ruleUiMobileEmbeddable )
+            // InternalUIGrammar.g:4974:5: lv_element_0_0= ruleUiMobileEmbeddable
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getUiMobileHorizontalLayoutAssigmentAccess().getElementUiMobileEmbeddableParserRuleCall_0_0());
+              				
+            }
+            pushFollow(FOLLOW_57);
+            lv_element_0_0=ruleUiMobileEmbeddable();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getUiMobileHorizontalLayoutAssigmentRule());
+              					}
+              					set(
+              						current,
+              						"element",
+              						lv_element_0_0,
+              						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileEmbeddable");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalUIGrammar.g:4991:3: (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )?
+            int alt106=2;
+            int LA106_0 = input.LA(1);
+
+            if ( (LA106_0==53) ) {
+                alt106=1;
+            }
+            switch (alt106) {
+                case 1 :
+                    // InternalUIGrammar.g:4992:4: otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) )
+                    {
+                    otherlv_1=(Token)match(input,53,FOLLOW_41); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_1, grammarAccess.getUiMobileHorizontalLayoutAssigmentAccess().getAlignKeyword_1_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:4996:4: ( (lv_alignment_2_0= ruleUiAlignment ) )
+                    // InternalUIGrammar.g:4997:5: (lv_alignment_2_0= ruleUiAlignment )
+                    {
+                    // InternalUIGrammar.g:4997:5: (lv_alignment_2_0= ruleUiAlignment )
+                    // InternalUIGrammar.g:4998:6: lv_alignment_2_0= ruleUiAlignment
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getUiMobileHorizontalLayoutAssigmentAccess().getAlignmentUiAlignmentEnumRuleCall_1_1_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_2);
+                    lv_alignment_2_0=ruleUiAlignment();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getUiMobileHorizontalLayoutAssigmentRule());
+                      						}
+                      						set(
+                      							current,
+                      							"alignment",
+                      							lv_alignment_2_0,
+                      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiAlignment");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiMobileHorizontalLayoutAssigment"
+
+
+    // $ANTLR start "entryRuleUiMobileHorizontalButtonGroup"
+    // InternalUIGrammar.g:5020:1: entryRuleUiMobileHorizontalButtonGroup returns [EObject current=null] : iv_ruleUiMobileHorizontalButtonGroup= ruleUiMobileHorizontalButtonGroup EOF ;
+    public final EObject entryRuleUiMobileHorizontalButtonGroup() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiMobileHorizontalButtonGroup = null;
+
+
+        try {
+            // InternalUIGrammar.g:5020:70: (iv_ruleUiMobileHorizontalButtonGroup= ruleUiMobileHorizontalButtonGroup EOF )
+            // InternalUIGrammar.g:5021:2: iv_ruleUiMobileHorizontalButtonGroup= ruleUiMobileHorizontalButtonGroup EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiMobileHorizontalButtonGroupRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiMobileHorizontalButtonGroup=ruleUiMobileHorizontalButtonGroup();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiMobileHorizontalButtonGroup; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiMobileHorizontalButtonGroup"
+
+
+    // $ANTLR start "ruleUiMobileHorizontalButtonGroup"
+    // InternalUIGrammar.g:5027:1: ruleUiMobileHorizontalButtonGroup returns [EObject current=null] : ( () otherlv_1= 'horizontalButtonGroup' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiMobileHorizontalButtonGroupAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' ) ;
+    public final EObject ruleUiMobileHorizontalButtonGroup() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_5=null;
+        Token lv_styles_6_0=null;
+        Token lv_readonly_7_0=null;
+        Token otherlv_8=null;
+        Token lv_name_9_0=null;
+        Token otherlv_10=null;
+        Token otherlv_14=null;
+        EObject lv_i18nInfo_4_0 = null;
+
+        EObject lv_contents_11_0 = null;
+
+        EObject lv_bindings_12_0 = null;
+
+        EObject lv_processorAssignments_13_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:5033:2: ( ( () otherlv_1= 'horizontalButtonGroup' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiMobileHorizontalButtonGroupAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' ) )
+            // InternalUIGrammar.g:5034:2: ( () otherlv_1= 'horizontalButtonGroup' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiMobileHorizontalButtonGroupAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )
+            {
+            // InternalUIGrammar.g:5034:2: ( () otherlv_1= 'horizontalButtonGroup' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiMobileHorizontalButtonGroupAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )
+            // InternalUIGrammar.g:5035:3: () otherlv_1= 'horizontalButtonGroup' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiMobileHorizontalButtonGroupAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}'
+            {
+            // InternalUIGrammar.g:5035:3: ()
+            // InternalUIGrammar.g:5036:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUiHorizontalButtonGroupAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,72,FOLLOW_52); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiMobileHorizontalButtonGroupAccess().getHorizontalButtonGroupKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:5046:3: (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_8= ')' )?
+            int alt108=2;
+            int LA108_0 = input.LA(1);
+
+            if ( (LA108_0==45) ) {
+                alt108=1;
+            }
+            switch (alt108) {
+                case 1 :
+                    // InternalUIGrammar.g:5047:4: otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_8= ')'
+                    {
+                    otherlv_2=(Token)match(input,45,FOLLOW_62); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getUiMobileHorizontalButtonGroupAccess().getLeftParenthesisKeyword_2_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:5051:4: ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:5052:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:5052:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:5053:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1());
+                    // InternalUIGrammar.g:5056:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:5057:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:5057:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )*
+                    loop107:
+                    do {
+                        int alt107=4;
+                        int LA107_0 = input.LA(1);
+
+                        if ( LA107_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1(), 0) ) {
+                            alt107=1;
+                        }
+                        else if ( LA107_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1(), 1) ) {
+                            alt107=2;
+                        }
+                        else if ( LA107_0 == 65 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1(), 2) ) {
+                            alt107=3;
+                        }
+
+
+                        switch (alt107) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:5058:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:5058:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    // InternalUIGrammar.g:5059:6: {...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileHorizontalButtonGroup", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:5059:129: ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    // InternalUIGrammar.g:5060:7: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1(), 0);
+                    	    // InternalUIGrammar.g:5063:10: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    // InternalUIGrammar.g:5063:11: {...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileHorizontalButtonGroup", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:5063:20: ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    // InternalUIGrammar.g:5063:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    {
+                    	    // InternalUIGrammar.g:5063:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    // InternalUIGrammar.g:5064:11: lv_i18nInfo_4_0= ruleUiI18nInfo
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_62);
+                    	    lv_i18nInfo_4_0=ruleUiI18nInfo();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getUiMobileHorizontalButtonGroupRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"i18nInfo",
+                    	      												lv_i18nInfo_4_0,
+                    	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:5086:5: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:5086:5: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:5087:6: {...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileHorizontalButtonGroup", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:5087:129: ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:5088:7: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1(), 1);
+                    	    // InternalUIGrammar.g:5091:10: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:5091:11: {...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileHorizontalButtonGroup", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:5091:20: (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:5091:21: otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_5=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_5, grammarAccess.getUiMobileHorizontalButtonGroupAccess().getStylesKeyword_2_1_1_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:5095:10: ( (lv_styles_6_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:5096:11: (lv_styles_6_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:5096:11: (lv_styles_6_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:5097:12: lv_styles_6_0= RULE_STRING
+                    	    {
+                    	    lv_styles_6_0=(Token)match(input,RULE_STRING,FOLLOW_62); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_styles_6_0, grammarAccess.getUiMobileHorizontalButtonGroupAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiMobileHorizontalButtonGroupRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"styles",
+                    	      													lv_styles_6_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 3 :
+                    	    // InternalUIGrammar.g:5119:5: ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:5119:5: ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) )
+                    	    // InternalUIGrammar.g:5120:6: {...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1(), 2) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileHorizontalButtonGroup", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1(), 2)");
+                    	    }
+                    	    // InternalUIGrammar.g:5120:129: ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) )
+                    	    // InternalUIGrammar.g:5121:7: ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1(), 2);
+                    	    // InternalUIGrammar.g:5124:10: ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) )
+                    	    // InternalUIGrammar.g:5124:11: {...}? => ( (lv_readonly_7_0= 'readonly' ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileHorizontalButtonGroup", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:5124:20: ( (lv_readonly_7_0= 'readonly' ) )
+                    	    // InternalUIGrammar.g:5124:21: (lv_readonly_7_0= 'readonly' )
+                    	    {
+                    	    // InternalUIGrammar.g:5124:21: (lv_readonly_7_0= 'readonly' )
+                    	    // InternalUIGrammar.g:5125:11: lv_readonly_7_0= 'readonly'
+                    	    {
+                    	    lv_readonly_7_0=(Token)match(input,65,FOLLOW_62); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newLeafNode(lv_readonly_7_0, grammarAccess.getUiMobileHorizontalButtonGroupAccess().getReadonlyReadonlyKeyword_2_1_2_0());
+                    	      										
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElement(grammarAccess.getUiMobileHorizontalButtonGroupRule());
+                    	      											}
+                    	      											setWithLastConsumed(current, "readonly", true, "readonly");
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop107;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1());
+
+                    }
+
+                    otherlv_8=(Token)match(input,47,FOLLOW_55); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_8, grammarAccess.getUiMobileHorizontalButtonGroupAccess().getRightParenthesisKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:5154:3: ( (lv_name_9_0= RULE_ID ) )?
+            int alt109=2;
+            int LA109_0 = input.LA(1);
+
+            if ( (LA109_0==RULE_ID) ) {
+                alt109=1;
+            }
+            switch (alt109) {
+                case 1 :
+                    // InternalUIGrammar.g:5155:4: (lv_name_9_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:5155:4: (lv_name_9_0= RULE_ID )
+                    // InternalUIGrammar.g:5156:5: lv_name_9_0= RULE_ID
+                    {
+                    lv_name_9_0=(Token)match(input,RULE_ID,FOLLOW_11); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_9_0, grammarAccess.getUiMobileHorizontalButtonGroupAccess().getNameIDTerminalRuleCall_3_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiMobileHorizontalButtonGroupRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_9_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_10=(Token)match(input,20,FOLLOW_60); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_10, grammarAccess.getUiMobileHorizontalButtonGroupAccess().getLeftCurlyBracketKeyword_4());
+              		
+            }
+            // InternalUIGrammar.g:5176:3: ( (lv_contents_11_0= ruleUiMobileHorizontalButtonGroupAssigment ) )*
+            loop110:
+            do {
+                int alt110=2;
+                int LA110_0 = input.LA(1);
+
+                if ( ((LA110_0>=68 && LA110_0<=69)||(LA110_0>=71 && LA110_0<=73)||(LA110_0>=76 && LA110_0<=77)||LA110_0==89||LA110_0==91||(LA110_0>=95 && LA110_0<=96)||(LA110_0>=98 && LA110_0<=100)||LA110_0==105||LA110_0==107||(LA110_0>=117 && LA110_0<=122)||LA110_0==124||(LA110_0>=128 && LA110_0<=130)||(LA110_0>=132 && LA110_0<=134)||LA110_0==138||LA110_0==145) ) {
+                    alt110=1;
+                }
+
+
+                switch (alt110) {
+            	case 1 :
+            	    // InternalUIGrammar.g:5177:4: (lv_contents_11_0= ruleUiMobileHorizontalButtonGroupAssigment )
+            	    {
+            	    // InternalUIGrammar.g:5177:4: (lv_contents_11_0= ruleUiMobileHorizontalButtonGroupAssigment )
+            	    // InternalUIGrammar.g:5178:5: lv_contents_11_0= ruleUiMobileHorizontalButtonGroupAssigment
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getContentsUiMobileHorizontalButtonGroupAssigmentParserRuleCall_5_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_60);
+            	    lv_contents_11_0=ruleUiMobileHorizontalButtonGroupAssigment();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiMobileHorizontalButtonGroupRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"contents",
+            	      						lv_contents_11_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileHorizontalButtonGroupAssigment");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop110;
+                }
+            } while (true);
+
+            // InternalUIGrammar.g:5195:3: ( (lv_bindings_12_0= ruleUiBinding ) )*
+            loop111:
+            do {
+                int alt111=2;
+                int LA111_0 = input.LA(1);
+
+                if ( (LA111_0==26) ) {
+                    alt111=1;
+                }
+
+
+                switch (alt111) {
+            	case 1 :
+            	    // InternalUIGrammar.g:5196:4: (lv_bindings_12_0= ruleUiBinding )
+            	    {
+            	    // InternalUIGrammar.g:5196:4: (lv_bindings_12_0= ruleUiBinding )
+            	    // InternalUIGrammar.g:5197:5: lv_bindings_12_0= ruleUiBinding
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getBindingsUiBindingParserRuleCall_6_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_42);
+            	    lv_bindings_12_0=ruleUiBinding();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiMobileHorizontalButtonGroupRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"bindings",
+            	      						lv_bindings_12_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop111;
+                }
+            } while (true);
+
+            // InternalUIGrammar.g:5214:3: ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )*
+            loop112:
+            do {
+                int alt112=2;
+                int LA112_0 = input.LA(1);
+
+                if ( (LA112_0==153) ) {
+                    alt112=1;
+                }
+
+
+                switch (alt112) {
+            	case 1 :
+            	    // InternalUIGrammar.g:5215:4: (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment )
+            	    {
+            	    // InternalUIGrammar.g:5215:4: (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment )
+            	    // InternalUIGrammar.g:5216:5: lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_42);
+            	    lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiMobileHorizontalButtonGroupRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"processorAssignments",
+            	      						lv_processorAssignments_13_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop112;
+                }
+            } while (true);
+
+            otherlv_14=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_14, grammarAccess.getUiMobileHorizontalButtonGroupAccess().getRightCurlyBracketKeyword_8());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiMobileHorizontalButtonGroup"
+
+
+    // $ANTLR start "entryRuleUiMobileHorizontalButtonGroupAssigment"
+    // InternalUIGrammar.g:5241:1: entryRuleUiMobileHorizontalButtonGroupAssigment returns [EObject current=null] : iv_ruleUiMobileHorizontalButtonGroupAssigment= ruleUiMobileHorizontalButtonGroupAssigment EOF ;
+    public final EObject entryRuleUiMobileHorizontalButtonGroupAssigment() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiMobileHorizontalButtonGroupAssigment = null;
+
+
+        try {
+            // InternalUIGrammar.g:5241:79: (iv_ruleUiMobileHorizontalButtonGroupAssigment= ruleUiMobileHorizontalButtonGroupAssigment EOF )
+            // InternalUIGrammar.g:5242:2: iv_ruleUiMobileHorizontalButtonGroupAssigment= ruleUiMobileHorizontalButtonGroupAssigment EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiMobileHorizontalButtonGroupAssigmentRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiMobileHorizontalButtonGroupAssigment=ruleUiMobileHorizontalButtonGroupAssigment();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiMobileHorizontalButtonGroupAssigment; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiMobileHorizontalButtonGroupAssigment"
+
+
+    // $ANTLR start "ruleUiMobileHorizontalButtonGroupAssigment"
+    // InternalUIGrammar.g:5248:1: ruleUiMobileHorizontalButtonGroupAssigment returns [EObject current=null] : ( (lv_element_0_0= ruleUiMobileEmbeddable ) ) ;
+    public final EObject ruleUiMobileHorizontalButtonGroupAssigment() throws RecognitionException {
+        EObject current = null;
+
+        EObject lv_element_0_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:5254:2: ( ( (lv_element_0_0= ruleUiMobileEmbeddable ) ) )
+            // InternalUIGrammar.g:5255:2: ( (lv_element_0_0= ruleUiMobileEmbeddable ) )
+            {
+            // InternalUIGrammar.g:5255:2: ( (lv_element_0_0= ruleUiMobileEmbeddable ) )
+            // InternalUIGrammar.g:5256:3: (lv_element_0_0= ruleUiMobileEmbeddable )
+            {
+            // InternalUIGrammar.g:5256:3: (lv_element_0_0= ruleUiMobileEmbeddable )
+            // InternalUIGrammar.g:5257:4: lv_element_0_0= ruleUiMobileEmbeddable
+            {
+            if ( state.backtracking==0 ) {
+
+              				newCompositeNode(grammarAccess.getUiMobileHorizontalButtonGroupAssigmentAccess().getElementUiMobileEmbeddableParserRuleCall_0());
+              			
+            }
+            pushFollow(FOLLOW_2);
+            lv_element_0_0=ruleUiMobileEmbeddable();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              				if (current==null) {
+              					current = createModelElementForParent(grammarAccess.getUiMobileHorizontalButtonGroupAssigmentRule());
+              				}
+              				set(
+              					current,
+              					"element",
+              					lv_element_0_0,
+              					"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileEmbeddable");
+              				afterParserOrEnumRuleCall();
+              			
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiMobileHorizontalButtonGroupAssigment"
+
+
+    // $ANTLR start "entryRuleUiMobileVerticalComponentGroup"
+    // InternalUIGrammar.g:5277:1: entryRuleUiMobileVerticalComponentGroup returns [EObject current=null] : iv_ruleUiMobileVerticalComponentGroup= ruleUiMobileVerticalComponentGroup EOF ;
+    public final EObject entryRuleUiMobileVerticalComponentGroup() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiMobileVerticalComponentGroup = null;
+
+
+        try {
+            // InternalUIGrammar.g:5277:71: (iv_ruleUiMobileVerticalComponentGroup= ruleUiMobileVerticalComponentGroup EOF )
+            // InternalUIGrammar.g:5278:2: iv_ruleUiMobileVerticalComponentGroup= ruleUiMobileVerticalComponentGroup EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiMobileVerticalComponentGroupRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiMobileVerticalComponentGroup=ruleUiMobileVerticalComponentGroup();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiMobileVerticalComponentGroup; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiMobileVerticalComponentGroup"
+
+
+    // $ANTLR start "ruleUiMobileVerticalComponentGroup"
+    // InternalUIGrammar.g:5284:1: ruleUiMobileVerticalComponentGroup returns [EObject current=null] : ( () otherlv_1= 'verticalGroup' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiMobileVerticalComponentGroupAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' ) ;
+    public final EObject ruleUiMobileVerticalComponentGroup() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token lv_readonly_5_0=null;
+        Token otherlv_6=null;
+        Token lv_styles_7_0=null;
+        Token otherlv_8=null;
+        Token lv_name_9_0=null;
+        Token otherlv_10=null;
+        Token otherlv_14=null;
+        EObject lv_i18nInfo_4_0 = null;
+
+        EObject lv_contents_11_0 = null;
+
+        EObject lv_bindings_12_0 = null;
+
+        EObject lv_processorAssignments_13_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:5290:2: ( ( () otherlv_1= 'verticalGroup' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiMobileVerticalComponentGroupAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' ) )
+            // InternalUIGrammar.g:5291:2: ( () otherlv_1= 'verticalGroup' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiMobileVerticalComponentGroupAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )
+            {
+            // InternalUIGrammar.g:5291:2: ( () otherlv_1= 'verticalGroup' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiMobileVerticalComponentGroupAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )
+            // InternalUIGrammar.g:5292:3: () otherlv_1= 'verticalGroup' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? otherlv_10= '{' ( (lv_contents_11_0= ruleUiMobileVerticalComponentGroupAssigment ) )* ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}'
+            {
+            // InternalUIGrammar.g:5292:3: ()
+            // InternalUIGrammar.g:5293:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiMobileVerticalComponentGroupAccess().getUiVerticalComponentGroupAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,73,FOLLOW_52); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiMobileVerticalComponentGroupAccess().getVerticalGroupKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:5303:3: (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )?
+            int alt114=2;
+            int LA114_0 = input.LA(1);
+
+            if ( (LA114_0==45) ) {
+                alt114=1;
+            }
+            switch (alt114) {
+                case 1 :
+                    // InternalUIGrammar.g:5304:4: otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')'
+                    {
+                    otherlv_2=(Token)match(input,45,FOLLOW_62); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getUiMobileVerticalComponentGroupAccess().getLeftParenthesisKeyword_2_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:5308:4: ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:5309:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:5309:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:5310:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1());
+                    // InternalUIGrammar.g:5313:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:5314:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:5314:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )*
+                    loop113:
+                    do {
+                        int alt113=4;
+                        int LA113_0 = input.LA(1);
+
+                        if ( LA113_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1(), 0) ) {
+                            alt113=1;
+                        }
+                        else if ( LA113_0 == 65 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1(), 1) ) {
+                            alt113=2;
+                        }
+                        else if ( LA113_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1(), 2) ) {
+                            alt113=3;
+                        }
+
+
+                        switch (alt113) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:5315:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:5315:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    // InternalUIGrammar.g:5316:6: {...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileVerticalComponentGroup", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:5316:130: ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    // InternalUIGrammar.g:5317:7: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1(), 0);
+                    	    // InternalUIGrammar.g:5320:10: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    // InternalUIGrammar.g:5320:11: {...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileVerticalComponentGroup", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:5320:20: ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    // InternalUIGrammar.g:5320:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    {
+                    	    // InternalUIGrammar.g:5320:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    // InternalUIGrammar.g:5321:11: lv_i18nInfo_4_0= ruleUiI18nInfo
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getUiMobileVerticalComponentGroupAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_62);
+                    	    lv_i18nInfo_4_0=ruleUiI18nInfo();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getUiMobileVerticalComponentGroupRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"i18nInfo",
+                    	      												lv_i18nInfo_4_0,
+                    	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:5343:5: ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:5343:5: ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) )
+                    	    // InternalUIGrammar.g:5344:6: {...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileVerticalComponentGroup", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:5344:130: ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) )
+                    	    // InternalUIGrammar.g:5345:7: ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1(), 1);
+                    	    // InternalUIGrammar.g:5348:10: ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) )
+                    	    // InternalUIGrammar.g:5348:11: {...}? => ( (lv_readonly_5_0= 'readonly' ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileVerticalComponentGroup", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:5348:20: ( (lv_readonly_5_0= 'readonly' ) )
+                    	    // InternalUIGrammar.g:5348:21: (lv_readonly_5_0= 'readonly' )
+                    	    {
+                    	    // InternalUIGrammar.g:5348:21: (lv_readonly_5_0= 'readonly' )
+                    	    // InternalUIGrammar.g:5349:11: lv_readonly_5_0= 'readonly'
+                    	    {
+                    	    lv_readonly_5_0=(Token)match(input,65,FOLLOW_62); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newLeafNode(lv_readonly_5_0, grammarAccess.getUiMobileVerticalComponentGroupAccess().getReadonlyReadonlyKeyword_2_1_1_0());
+                    	      										
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElement(grammarAccess.getUiMobileVerticalComponentGroupRule());
+                    	      											}
+                    	      											setWithLastConsumed(current, "readonly", true, "readonly");
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 3 :
+                    	    // InternalUIGrammar.g:5366:5: ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:5366:5: ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:5367:6: {...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1(), 2) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileVerticalComponentGroup", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1(), 2)");
+                    	    }
+                    	    // InternalUIGrammar.g:5367:130: ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:5368:7: ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1(), 2);
+                    	    // InternalUIGrammar.g:5371:10: ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:5371:11: {...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileVerticalComponentGroup", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:5371:20: (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:5371:21: otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_6=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_6, grammarAccess.getUiMobileVerticalComponentGroupAccess().getStylesKeyword_2_1_2_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:5375:10: ( (lv_styles_7_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:5376:11: (lv_styles_7_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:5376:11: (lv_styles_7_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:5377:12: lv_styles_7_0= RULE_STRING
+                    	    {
+                    	    lv_styles_7_0=(Token)match(input,RULE_STRING,FOLLOW_62); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_styles_7_0, grammarAccess.getUiMobileVerticalComponentGroupAccess().getStylesSTRINGTerminalRuleCall_2_1_2_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiMobileVerticalComponentGroupRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"styles",
+                    	      													lv_styles_7_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop113;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1());
+
+                    }
+
+                    otherlv_8=(Token)match(input,47,FOLLOW_55); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_8, grammarAccess.getUiMobileVerticalComponentGroupAccess().getRightParenthesisKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:5411:3: ( (lv_name_9_0= RULE_ID ) )?
+            int alt115=2;
+            int LA115_0 = input.LA(1);
+
+            if ( (LA115_0==RULE_ID) ) {
+                alt115=1;
+            }
+            switch (alt115) {
+                case 1 :
+                    // InternalUIGrammar.g:5412:4: (lv_name_9_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:5412:4: (lv_name_9_0= RULE_ID )
+                    // InternalUIGrammar.g:5413:5: lv_name_9_0= RULE_ID
+                    {
+                    lv_name_9_0=(Token)match(input,RULE_ID,FOLLOW_11); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_9_0, grammarAccess.getUiMobileVerticalComponentGroupAccess().getNameIDTerminalRuleCall_3_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiMobileVerticalComponentGroupRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_9_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_10=(Token)match(input,20,FOLLOW_60); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_10, grammarAccess.getUiMobileVerticalComponentGroupAccess().getLeftCurlyBracketKeyword_4());
+              		
+            }
+            // InternalUIGrammar.g:5433:3: ( (lv_contents_11_0= ruleUiMobileVerticalComponentGroupAssigment ) )*
+            loop116:
+            do {
+                int alt116=2;
+                int LA116_0 = input.LA(1);
+
+                if ( ((LA116_0>=68 && LA116_0<=69)||(LA116_0>=71 && LA116_0<=73)||(LA116_0>=76 && LA116_0<=77)||LA116_0==89||LA116_0==91||(LA116_0>=95 && LA116_0<=96)||(LA116_0>=98 && LA116_0<=100)||LA116_0==105||LA116_0==107||(LA116_0>=117 && LA116_0<=122)||LA116_0==124||(LA116_0>=128 && LA116_0<=130)||(LA116_0>=132 && LA116_0<=134)||LA116_0==138||LA116_0==145) ) {
+                    alt116=1;
+                }
+
+
+                switch (alt116) {
+            	case 1 :
+            	    // InternalUIGrammar.g:5434:4: (lv_contents_11_0= ruleUiMobileVerticalComponentGroupAssigment )
+            	    {
+            	    // InternalUIGrammar.g:5434:4: (lv_contents_11_0= ruleUiMobileVerticalComponentGroupAssigment )
+            	    // InternalUIGrammar.g:5435:5: lv_contents_11_0= ruleUiMobileVerticalComponentGroupAssigment
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiMobileVerticalComponentGroupAccess().getContentsUiMobileVerticalComponentGroupAssigmentParserRuleCall_5_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_60);
+            	    lv_contents_11_0=ruleUiMobileVerticalComponentGroupAssigment();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiMobileVerticalComponentGroupRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"contents",
+            	      						lv_contents_11_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileVerticalComponentGroupAssigment");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop116;
+                }
+            } while (true);
+
+            // InternalUIGrammar.g:5452:3: ( (lv_bindings_12_0= ruleUiBinding ) )*
+            loop117:
+            do {
+                int alt117=2;
+                int LA117_0 = input.LA(1);
+
+                if ( (LA117_0==26) ) {
+                    alt117=1;
+                }
+
+
+                switch (alt117) {
+            	case 1 :
+            	    // InternalUIGrammar.g:5453:4: (lv_bindings_12_0= ruleUiBinding )
+            	    {
+            	    // InternalUIGrammar.g:5453:4: (lv_bindings_12_0= ruleUiBinding )
+            	    // InternalUIGrammar.g:5454:5: lv_bindings_12_0= ruleUiBinding
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiMobileVerticalComponentGroupAccess().getBindingsUiBindingParserRuleCall_6_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_42);
+            	    lv_bindings_12_0=ruleUiBinding();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiMobileVerticalComponentGroupRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"bindings",
+            	      						lv_bindings_12_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop117;
+                }
+            } while (true);
+
+            // InternalUIGrammar.g:5471:3: ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )*
+            loop118:
+            do {
+                int alt118=2;
+                int LA118_0 = input.LA(1);
+
+                if ( (LA118_0==153) ) {
+                    alt118=1;
+                }
+
+
+                switch (alt118) {
+            	case 1 :
+            	    // InternalUIGrammar.g:5472:4: (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment )
+            	    {
+            	    // InternalUIGrammar.g:5472:4: (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment )
+            	    // InternalUIGrammar.g:5473:5: lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiMobileVerticalComponentGroupAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_42);
+            	    lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiMobileVerticalComponentGroupRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"processorAssignments",
+            	      						lv_processorAssignments_13_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop118;
+                }
+            } while (true);
+
+            otherlv_14=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_14, grammarAccess.getUiMobileVerticalComponentGroupAccess().getRightCurlyBracketKeyword_8());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiMobileVerticalComponentGroup"
+
+
+    // $ANTLR start "entryRuleUiMobileVerticalComponentGroupAssigment"
+    // InternalUIGrammar.g:5498:1: entryRuleUiMobileVerticalComponentGroupAssigment returns [EObject current=null] : iv_ruleUiMobileVerticalComponentGroupAssigment= ruleUiMobileVerticalComponentGroupAssigment EOF ;
+    public final EObject entryRuleUiMobileVerticalComponentGroupAssigment() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiMobileVerticalComponentGroupAssigment = null;
+
+
+        try {
+            // InternalUIGrammar.g:5498:80: (iv_ruleUiMobileVerticalComponentGroupAssigment= ruleUiMobileVerticalComponentGroupAssigment EOF )
+            // InternalUIGrammar.g:5499:2: iv_ruleUiMobileVerticalComponentGroupAssigment= ruleUiMobileVerticalComponentGroupAssigment EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiMobileVerticalComponentGroupAssigmentRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiMobileVerticalComponentGroupAssigment=ruleUiMobileVerticalComponentGroupAssigment();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiMobileVerticalComponentGroupAssigment; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiMobileVerticalComponentGroupAssigment"
+
+
+    // $ANTLR start "ruleUiMobileVerticalComponentGroupAssigment"
+    // InternalUIGrammar.g:5505:1: ruleUiMobileVerticalComponentGroupAssigment returns [EObject current=null] : ( (lv_element_0_0= ruleUiMobileEmbeddable ) ) ;
+    public final EObject ruleUiMobileVerticalComponentGroupAssigment() throws RecognitionException {
+        EObject current = null;
+
+        EObject lv_element_0_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:5511:2: ( ( (lv_element_0_0= ruleUiMobileEmbeddable ) ) )
+            // InternalUIGrammar.g:5512:2: ( (lv_element_0_0= ruleUiMobileEmbeddable ) )
+            {
+            // InternalUIGrammar.g:5512:2: ( (lv_element_0_0= ruleUiMobileEmbeddable ) )
+            // InternalUIGrammar.g:5513:3: (lv_element_0_0= ruleUiMobileEmbeddable )
+            {
+            // InternalUIGrammar.g:5513:3: (lv_element_0_0= ruleUiMobileEmbeddable )
+            // InternalUIGrammar.g:5514:4: lv_element_0_0= ruleUiMobileEmbeddable
+            {
+            if ( state.backtracking==0 ) {
+
+              				newCompositeNode(grammarAccess.getUiMobileVerticalComponentGroupAssigmentAccess().getElementUiMobileEmbeddableParserRuleCall_0());
+              			
+            }
+            pushFollow(FOLLOW_2);
+            lv_element_0_0=ruleUiMobileEmbeddable();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              				if (current==null) {
+              					current = createModelElementForParent(grammarAccess.getUiMobileVerticalComponentGroupAssigmentRule());
+              				}
+              				set(
+              					current,
+              					"element",
+              					lv_element_0_0,
+              					"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileEmbeddable");
+              				afterParserOrEnumRuleCall();
+              			
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiMobileVerticalComponentGroupAssigment"
+
+
+    // $ANTLR start "entryRuleUiSearchPanel"
+    // InternalUIGrammar.g:5534:1: entryRuleUiSearchPanel returns [EObject current=null] : iv_ruleUiSearchPanel= ruleUiSearchPanel EOF ;
+    public final EObject entryRuleUiSearchPanel() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiSearchPanel = null;
+
+
+        try {
+            // InternalUIGrammar.g:5534:54: (iv_ruleUiSearchPanel= ruleUiSearchPanel EOF )
+            // InternalUIGrammar.g:5535:2: iv_ruleUiSearchPanel= ruleUiSearchPanel EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiSearchPanelRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiSearchPanel=ruleUiSearchPanel();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiSearchPanel; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiSearchPanel"
+
+
+    // $ANTLR start "ruleUiSearchPanel"
+    // InternalUIGrammar.g:5541:1: ruleUiSearchPanel returns [EObject current=null] : ( () otherlv_1= 'searchPanel' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? otherlv_9= '{' otherlv_10= 'type' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ( (lv_contents_13_0= ruleUiSearchField ) )* ( (lv_bindings_14_0= ruleUiBinding ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}' ) ;
+    public final EObject ruleUiSearchPanel() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_5=null;
+        Token lv_styles_6_0=null;
+        Token otherlv_7=null;
+        Token lv_name_8_0=null;
+        Token otherlv_9=null;
+        Token otherlv_10=null;
+        Token otherlv_12=null;
+        Token otherlv_16=null;
+        EObject lv_i18nInfo_4_0 = null;
+
+        EObject lv_jvmType_11_0 = null;
+
+        EObject lv_contents_13_0 = null;
+
+        EObject lv_bindings_14_0 = null;
+
+        EObject lv_processorAssignments_15_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:5547:2: ( ( () otherlv_1= 'searchPanel' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? otherlv_9= '{' otherlv_10= 'type' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ( (lv_contents_13_0= ruleUiSearchField ) )* ( (lv_bindings_14_0= ruleUiBinding ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}' ) )
+            // InternalUIGrammar.g:5548:2: ( () otherlv_1= 'searchPanel' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? otherlv_9= '{' otherlv_10= 'type' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ( (lv_contents_13_0= ruleUiSearchField ) )* ( (lv_bindings_14_0= ruleUiBinding ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}' )
+            {
+            // InternalUIGrammar.g:5548:2: ( () otherlv_1= 'searchPanel' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? otherlv_9= '{' otherlv_10= 'type' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ( (lv_contents_13_0= ruleUiSearchField ) )* ( (lv_bindings_14_0= ruleUiBinding ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}' )
+            // InternalUIGrammar.g:5549:3: () otherlv_1= 'searchPanel' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? otherlv_9= '{' otherlv_10= 'type' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ( (lv_contents_13_0= ruleUiSearchField ) )* ( (lv_bindings_14_0= ruleUiBinding ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}'
+            {
+            // InternalUIGrammar.g:5549:3: ()
+            // InternalUIGrammar.g:5550:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiSearchPanelAccess().getUiSearchPanelAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,74,FOLLOW_52); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiSearchPanelAccess().getSearchPanelKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:5560:3: (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )?
+            int alt120=2;
+            int LA120_0 = input.LA(1);
+
+            if ( (LA120_0==45) ) {
+                alt120=1;
+            }
+            switch (alt120) {
+                case 1 :
+                    // InternalUIGrammar.g:5561:4: otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')'
+                    {
+                    otherlv_2=(Token)match(input,45,FOLLOW_63); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getUiSearchPanelAccess().getLeftParenthesisKeyword_2_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:5565:4: ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:5566:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:5566:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:5567:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiSearchPanelAccess().getUnorderedGroup_2_1());
+                    // InternalUIGrammar.g:5570:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:5571:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:5571:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )*
+                    loop119:
+                    do {
+                        int alt119=3;
+                        int LA119_0 = input.LA(1);
+
+                        if ( LA119_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiSearchPanelAccess().getUnorderedGroup_2_1(), 0) ) {
+                            alt119=1;
+                        }
+                        else if ( LA119_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiSearchPanelAccess().getUnorderedGroup_2_1(), 1) ) {
+                            alt119=2;
+                        }
+
+
+                        switch (alt119) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:5572:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:5572:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    // InternalUIGrammar.g:5573:6: {...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiSearchPanelAccess().getUnorderedGroup_2_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiSearchPanel", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiSearchPanelAccess().getUnorderedGroup_2_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:5573:113: ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    // InternalUIGrammar.g:5574:7: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiSearchPanelAccess().getUnorderedGroup_2_1(), 0);
+                    	    // InternalUIGrammar.g:5577:10: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    // InternalUIGrammar.g:5577:11: {...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiSearchPanel", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:5577:20: ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    // InternalUIGrammar.g:5577:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    {
+                    	    // InternalUIGrammar.g:5577:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    // InternalUIGrammar.g:5578:11: lv_i18nInfo_4_0= ruleUiI18nInfo
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getUiSearchPanelAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_63);
+                    	    lv_i18nInfo_4_0=ruleUiI18nInfo();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getUiSearchPanelRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"i18nInfo",
+                    	      												lv_i18nInfo_4_0,
+                    	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSearchPanelAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:5600:5: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:5600:5: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:5601:6: {...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiSearchPanelAccess().getUnorderedGroup_2_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiSearchPanel", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiSearchPanelAccess().getUnorderedGroup_2_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:5601:113: ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:5602:7: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiSearchPanelAccess().getUnorderedGroup_2_1(), 1);
+                    	    // InternalUIGrammar.g:5605:10: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:5605:11: {...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiSearchPanel", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:5605:20: (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:5605:21: otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_5=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_5, grammarAccess.getUiSearchPanelAccess().getStylesKeyword_2_1_1_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:5609:10: ( (lv_styles_6_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:5610:11: (lv_styles_6_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:5610:11: (lv_styles_6_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:5611:12: lv_styles_6_0= RULE_STRING
+                    	    {
+                    	    lv_styles_6_0=(Token)match(input,RULE_STRING,FOLLOW_63); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_styles_6_0, grammarAccess.getUiSearchPanelAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiSearchPanelRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"styles",
+                    	      													lv_styles_6_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSearchPanelAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop119;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiSearchPanelAccess().getUnorderedGroup_2_1());
+
+                    }
+
+                    otherlv_7=(Token)match(input,47,FOLLOW_55); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_7, grammarAccess.getUiSearchPanelAccess().getRightParenthesisKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:5645:3: ( (lv_name_8_0= RULE_ID ) )?
+            int alt121=2;
+            int LA121_0 = input.LA(1);
+
+            if ( (LA121_0==RULE_ID) ) {
+                alt121=1;
+            }
+            switch (alt121) {
+                case 1 :
+                    // InternalUIGrammar.g:5646:4: (lv_name_8_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:5646:4: (lv_name_8_0= RULE_ID )
+                    // InternalUIGrammar.g:5647:5: lv_name_8_0= RULE_ID
+                    {
+                    lv_name_8_0=(Token)match(input,RULE_ID,FOLLOW_11); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_8_0, grammarAccess.getUiSearchPanelAccess().getNameIDTerminalRuleCall_3_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiSearchPanelRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_8_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_9=(Token)match(input,20,FOLLOW_64); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_9, grammarAccess.getUiSearchPanelAccess().getLeftCurlyBracketKeyword_4());
+              		
+            }
+            otherlv_10=(Token)match(input,75,FOLLOW_16); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_10, grammarAccess.getUiSearchPanelAccess().getTypeKeyword_5());
+              		
+            }
+            // InternalUIGrammar.g:5671:3: ( (lv_jvmType_11_0= ruleJvmTypeReference ) )
+            // InternalUIGrammar.g:5672:4: (lv_jvmType_11_0= ruleJvmTypeReference )
+            {
+            // InternalUIGrammar.g:5672:4: (lv_jvmType_11_0= ruleJvmTypeReference )
+            // InternalUIGrammar.g:5673:5: lv_jvmType_11_0= ruleJvmTypeReference
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getUiSearchPanelAccess().getJvmTypeJvmTypeReferenceParserRuleCall_6_0());
+              				
+            }
+            pushFollow(FOLLOW_65);
+            lv_jvmType_11_0=ruleJvmTypeReference();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getUiSearchPanelRule());
+              					}
+              					set(
+              						current,
+              						"jvmType",
+              						lv_jvmType_11_0,
+              						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalUIGrammar.g:5690:3: (otherlv_12= ';' )?
+            int alt122=2;
+            int LA122_0 = input.LA(1);
+
+            if ( (LA122_0==16) ) {
+                alt122=1;
+            }
+            switch (alt122) {
+                case 1 :
+                    // InternalUIGrammar.g:5691:4: otherlv_12= ';'
+                    {
+                    otherlv_12=(Token)match(input,16,FOLLOW_66); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_12, grammarAccess.getUiSearchPanelAccess().getSemicolonKeyword_7());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:5696:3: ( (lv_contents_13_0= ruleUiSearchField ) )*
+            loop123:
+            do {
+                int alt123=2;
+                int LA123_0 = input.LA(1);
+
+                if ( (LA123_0==117) ) {
+                    alt123=1;
+                }
+
+
+                switch (alt123) {
+            	case 1 :
+            	    // InternalUIGrammar.g:5697:4: (lv_contents_13_0= ruleUiSearchField )
+            	    {
+            	    // InternalUIGrammar.g:5697:4: (lv_contents_13_0= ruleUiSearchField )
+            	    // InternalUIGrammar.g:5698:5: lv_contents_13_0= ruleUiSearchField
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiSearchPanelAccess().getContentsUiSearchFieldParserRuleCall_8_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_66);
+            	    lv_contents_13_0=ruleUiSearchField();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiSearchPanelRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"contents",
+            	      						lv_contents_13_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiSearchField");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop123;
+                }
+            } while (true);
+
+            // InternalUIGrammar.g:5715:3: ( (lv_bindings_14_0= ruleUiBinding ) )*
+            loop124:
+            do {
+                int alt124=2;
+                int LA124_0 = input.LA(1);
+
+                if ( (LA124_0==26) ) {
+                    alt124=1;
+                }
+
+
+                switch (alt124) {
+            	case 1 :
+            	    // InternalUIGrammar.g:5716:4: (lv_bindings_14_0= ruleUiBinding )
+            	    {
+            	    // InternalUIGrammar.g:5716:4: (lv_bindings_14_0= ruleUiBinding )
+            	    // InternalUIGrammar.g:5717:5: lv_bindings_14_0= ruleUiBinding
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiSearchPanelAccess().getBindingsUiBindingParserRuleCall_9_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_42);
+            	    lv_bindings_14_0=ruleUiBinding();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiSearchPanelRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"bindings",
+            	      						lv_bindings_14_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop124;
+                }
+            } while (true);
+
+            // InternalUIGrammar.g:5734:3: ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )*
+            loop125:
+            do {
+                int alt125=2;
+                int LA125_0 = input.LA(1);
+
+                if ( (LA125_0==153) ) {
+                    alt125=1;
+                }
+
+
+                switch (alt125) {
+            	case 1 :
+            	    // InternalUIGrammar.g:5735:4: (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment )
+            	    {
+            	    // InternalUIGrammar.g:5735:4: (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment )
+            	    // InternalUIGrammar.g:5736:5: lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiSearchPanelAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_10_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_42);
+            	    lv_processorAssignments_15_0=ruleUiVisibilityProcessorAssignment();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiSearchPanelRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"processorAssignments",
+            	      						lv_processorAssignments_15_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop125;
+                }
+            } while (true);
+
+            otherlv_16=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_16, grammarAccess.getUiSearchPanelAccess().getRightCurlyBracketKeyword_11());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiSearchPanel"
+
+
+    // $ANTLR start "entryRuleUiMobileSearchPanel"
+    // InternalUIGrammar.g:5761:1: entryRuleUiMobileSearchPanel returns [EObject current=null] : iv_ruleUiMobileSearchPanel= ruleUiMobileSearchPanel EOF ;
+    public final EObject entryRuleUiMobileSearchPanel() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiMobileSearchPanel = null;
+
+
+        try {
+            // InternalUIGrammar.g:5761:60: (iv_ruleUiMobileSearchPanel= ruleUiMobileSearchPanel EOF )
+            // InternalUIGrammar.g:5762:2: iv_ruleUiMobileSearchPanel= ruleUiMobileSearchPanel EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiMobileSearchPanelRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiMobileSearchPanel=ruleUiMobileSearchPanel();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiMobileSearchPanel; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiMobileSearchPanel"
+
+
+    // $ANTLR start "ruleUiMobileSearchPanel"
+    // InternalUIGrammar.g:5768:1: ruleUiMobileSearchPanel returns [EObject current=null] : ( () otherlv_1= 'mobileSearchPanel' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? otherlv_9= '{' otherlv_10= 'type' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ( (lv_contents_13_0= ruleUiSearchField ) )* ( (lv_bindings_14_0= ruleUiBinding ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}' ) ;
+    public final EObject ruleUiMobileSearchPanel() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_5=null;
+        Token lv_styles_6_0=null;
+        Token otherlv_7=null;
+        Token lv_name_8_0=null;
+        Token otherlv_9=null;
+        Token otherlv_10=null;
+        Token otherlv_12=null;
+        Token otherlv_16=null;
+        EObject lv_i18nInfo_4_0 = null;
+
+        EObject lv_jvmType_11_0 = null;
+
+        EObject lv_contents_13_0 = null;
+
+        EObject lv_bindings_14_0 = null;
+
+        EObject lv_processorAssignments_15_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:5774:2: ( ( () otherlv_1= 'mobileSearchPanel' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? otherlv_9= '{' otherlv_10= 'type' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ( (lv_contents_13_0= ruleUiSearchField ) )* ( (lv_bindings_14_0= ruleUiBinding ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}' ) )
+            // InternalUIGrammar.g:5775:2: ( () otherlv_1= 'mobileSearchPanel' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? otherlv_9= '{' otherlv_10= 'type' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ( (lv_contents_13_0= ruleUiSearchField ) )* ( (lv_bindings_14_0= ruleUiBinding ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}' )
+            {
+            // InternalUIGrammar.g:5775:2: ( () otherlv_1= 'mobileSearchPanel' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? otherlv_9= '{' otherlv_10= 'type' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ( (lv_contents_13_0= ruleUiSearchField ) )* ( (lv_bindings_14_0= ruleUiBinding ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}' )
+            // InternalUIGrammar.g:5776:3: () otherlv_1= 'mobileSearchPanel' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? otherlv_9= '{' otherlv_10= 'type' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? ( (lv_contents_13_0= ruleUiSearchField ) )* ( (lv_bindings_14_0= ruleUiBinding ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}'
+            {
+            // InternalUIGrammar.g:5776:3: ()
+            // InternalUIGrammar.g:5777:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiMobileSearchPanelAccess().getUiMobileSearchPanelAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,76,FOLLOW_52); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiMobileSearchPanelAccess().getMobileSearchPanelKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:5787:3: (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )?
+            int alt127=2;
+            int LA127_0 = input.LA(1);
+
+            if ( (LA127_0==45) ) {
+                alt127=1;
+            }
+            switch (alt127) {
+                case 1 :
+                    // InternalUIGrammar.g:5788:4: otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')'
+                    {
+                    otherlv_2=(Token)match(input,45,FOLLOW_63); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getUiMobileSearchPanelAccess().getLeftParenthesisKeyword_2_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:5792:4: ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:5793:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:5793:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:5794:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiMobileSearchPanelAccess().getUnorderedGroup_2_1());
+                    // InternalUIGrammar.g:5797:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:5798:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:5798:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )*
+                    loop126:
+                    do {
+                        int alt126=3;
+                        int LA126_0 = input.LA(1);
+
+                        if ( LA126_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileSearchPanelAccess().getUnorderedGroup_2_1(), 0) ) {
+                            alt126=1;
+                        }
+                        else if ( LA126_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileSearchPanelAccess().getUnorderedGroup_2_1(), 1) ) {
+                            alt126=2;
+                        }
+
+
+                        switch (alt126) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:5799:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:5799:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    // InternalUIGrammar.g:5800:6: {...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileSearchPanelAccess().getUnorderedGroup_2_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileSearchPanel", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileSearchPanelAccess().getUnorderedGroup_2_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:5800:119: ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    // InternalUIGrammar.g:5801:7: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiMobileSearchPanelAccess().getUnorderedGroup_2_1(), 0);
+                    	    // InternalUIGrammar.g:5804:10: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    // InternalUIGrammar.g:5804:11: {...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileSearchPanel", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:5804:20: ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    // InternalUIGrammar.g:5804:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    {
+                    	    // InternalUIGrammar.g:5804:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    // InternalUIGrammar.g:5805:11: lv_i18nInfo_4_0= ruleUiI18nInfo
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getUiMobileSearchPanelAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_63);
+                    	    lv_i18nInfo_4_0=ruleUiI18nInfo();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getUiMobileSearchPanelRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"i18nInfo",
+                    	      												lv_i18nInfo_4_0,
+                    	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileSearchPanelAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:5827:5: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:5827:5: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:5828:6: {...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileSearchPanelAccess().getUnorderedGroup_2_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileSearchPanel", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileSearchPanelAccess().getUnorderedGroup_2_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:5828:119: ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:5829:7: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiMobileSearchPanelAccess().getUnorderedGroup_2_1(), 1);
+                    	    // InternalUIGrammar.g:5832:10: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:5832:11: {...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileSearchPanel", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:5832:20: (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:5832:21: otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_5=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_5, grammarAccess.getUiMobileSearchPanelAccess().getStylesKeyword_2_1_1_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:5836:10: ( (lv_styles_6_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:5837:11: (lv_styles_6_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:5837:11: (lv_styles_6_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:5838:12: lv_styles_6_0= RULE_STRING
+                    	    {
+                    	    lv_styles_6_0=(Token)match(input,RULE_STRING,FOLLOW_63); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_styles_6_0, grammarAccess.getUiMobileSearchPanelAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiMobileSearchPanelRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"styles",
+                    	      													lv_styles_6_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileSearchPanelAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop126;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiMobileSearchPanelAccess().getUnorderedGroup_2_1());
+
+                    }
+
+                    otherlv_7=(Token)match(input,47,FOLLOW_55); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_7, grammarAccess.getUiMobileSearchPanelAccess().getRightParenthesisKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:5872:3: ( (lv_name_8_0= RULE_ID ) )?
+            int alt128=2;
+            int LA128_0 = input.LA(1);
+
+            if ( (LA128_0==RULE_ID) ) {
+                alt128=1;
+            }
+            switch (alt128) {
+                case 1 :
+                    // InternalUIGrammar.g:5873:4: (lv_name_8_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:5873:4: (lv_name_8_0= RULE_ID )
+                    // InternalUIGrammar.g:5874:5: lv_name_8_0= RULE_ID
+                    {
+                    lv_name_8_0=(Token)match(input,RULE_ID,FOLLOW_11); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_8_0, grammarAccess.getUiMobileSearchPanelAccess().getNameIDTerminalRuleCall_3_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiMobileSearchPanelRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_8_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_9=(Token)match(input,20,FOLLOW_64); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_9, grammarAccess.getUiMobileSearchPanelAccess().getLeftCurlyBracketKeyword_4());
+              		
+            }
+            otherlv_10=(Token)match(input,75,FOLLOW_16); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_10, grammarAccess.getUiMobileSearchPanelAccess().getTypeKeyword_5());
+              		
+            }
+            // InternalUIGrammar.g:5898:3: ( (lv_jvmType_11_0= ruleJvmTypeReference ) )
+            // InternalUIGrammar.g:5899:4: (lv_jvmType_11_0= ruleJvmTypeReference )
+            {
+            // InternalUIGrammar.g:5899:4: (lv_jvmType_11_0= ruleJvmTypeReference )
+            // InternalUIGrammar.g:5900:5: lv_jvmType_11_0= ruleJvmTypeReference
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getUiMobileSearchPanelAccess().getJvmTypeJvmTypeReferenceParserRuleCall_6_0());
+              				
+            }
+            pushFollow(FOLLOW_65);
+            lv_jvmType_11_0=ruleJvmTypeReference();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getUiMobileSearchPanelRule());
+              					}
+              					set(
+              						current,
+              						"jvmType",
+              						lv_jvmType_11_0,
+              						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalUIGrammar.g:5917:3: (otherlv_12= ';' )?
+            int alt129=2;
+            int LA129_0 = input.LA(1);
+
+            if ( (LA129_0==16) ) {
+                alt129=1;
+            }
+            switch (alt129) {
+                case 1 :
+                    // InternalUIGrammar.g:5918:4: otherlv_12= ';'
+                    {
+                    otherlv_12=(Token)match(input,16,FOLLOW_66); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_12, grammarAccess.getUiMobileSearchPanelAccess().getSemicolonKeyword_7());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:5923:3: ( (lv_contents_13_0= ruleUiSearchField ) )*
+            loop130:
+            do {
+                int alt130=2;
+                int LA130_0 = input.LA(1);
+
+                if ( (LA130_0==117) ) {
+                    alt130=1;
+                }
+
+
+                switch (alt130) {
+            	case 1 :
+            	    // InternalUIGrammar.g:5924:4: (lv_contents_13_0= ruleUiSearchField )
+            	    {
+            	    // InternalUIGrammar.g:5924:4: (lv_contents_13_0= ruleUiSearchField )
+            	    // InternalUIGrammar.g:5925:5: lv_contents_13_0= ruleUiSearchField
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiMobileSearchPanelAccess().getContentsUiSearchFieldParserRuleCall_8_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_66);
+            	    lv_contents_13_0=ruleUiSearchField();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiMobileSearchPanelRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"contents",
+            	      						lv_contents_13_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiSearchField");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop130;
+                }
+            } while (true);
+
+            // InternalUIGrammar.g:5942:3: ( (lv_bindings_14_0= ruleUiBinding ) )*
+            loop131:
+            do {
+                int alt131=2;
+                int LA131_0 = input.LA(1);
+
+                if ( (LA131_0==26) ) {
+                    alt131=1;
+                }
+
+
+                switch (alt131) {
+            	case 1 :
+            	    // InternalUIGrammar.g:5943:4: (lv_bindings_14_0= ruleUiBinding )
+            	    {
+            	    // InternalUIGrammar.g:5943:4: (lv_bindings_14_0= ruleUiBinding )
+            	    // InternalUIGrammar.g:5944:5: lv_bindings_14_0= ruleUiBinding
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiMobileSearchPanelAccess().getBindingsUiBindingParserRuleCall_9_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_42);
+            	    lv_bindings_14_0=ruleUiBinding();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiMobileSearchPanelRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"bindings",
+            	      						lv_bindings_14_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop131;
+                }
+            } while (true);
+
+            // InternalUIGrammar.g:5961:3: ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )*
+            loop132:
+            do {
+                int alt132=2;
+                int LA132_0 = input.LA(1);
+
+                if ( (LA132_0==153) ) {
+                    alt132=1;
+                }
+
+
+                switch (alt132) {
+            	case 1 :
+            	    // InternalUIGrammar.g:5962:4: (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment )
+            	    {
+            	    // InternalUIGrammar.g:5962:4: (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment )
+            	    // InternalUIGrammar.g:5963:5: lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiMobileSearchPanelAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_10_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_42);
+            	    lv_processorAssignments_15_0=ruleUiVisibilityProcessorAssignment();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiMobileSearchPanelRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"processorAssignments",
+            	      						lv_processorAssignments_15_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop132;
+                }
+            } while (true);
+
+            otherlv_16=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_16, grammarAccess.getUiMobileSearchPanelAccess().getRightCurlyBracketKeyword_11());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiMobileSearchPanel"
+
+
+    // $ANTLR start "entryRuleUiMobileTabSheet"
+    // InternalUIGrammar.g:5988:1: entryRuleUiMobileTabSheet returns [EObject current=null] : iv_ruleUiMobileTabSheet= ruleUiMobileTabSheet EOF ;
+    public final EObject entryRuleUiMobileTabSheet() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiMobileTabSheet = null;
+
+
+        try {
+            // InternalUIGrammar.g:5988:57: (iv_ruleUiMobileTabSheet= ruleUiMobileTabSheet EOF )
+            // InternalUIGrammar.g:5989:2: iv_ruleUiMobileTabSheet= ruleUiMobileTabSheet EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiMobileTabSheetRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiMobileTabSheet=ruleUiMobileTabSheet();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiMobileTabSheet; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiMobileTabSheet"
+
+
+    // $ANTLR start "ruleUiMobileTabSheet"
+    // InternalUIGrammar.g:5995:1: ruleUiMobileTabSheet returns [EObject current=null] : ( () otherlv_1= 'mobileTab' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? otherlv_9= '{' ( (lv_tabs_10_0= ruleUiMobileTabAssignment ) )* ( (lv_bindings_11_0= ruleUiBinding ) )* ( (lv_processorAssignments_12_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_13= '}' ) ;
+    public final EObject ruleUiMobileTabSheet() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_5=null;
+        Token lv_styles_6_0=null;
+        Token otherlv_7=null;
+        Token lv_name_8_0=null;
+        Token otherlv_9=null;
+        Token otherlv_13=null;
+        EObject lv_i18nInfo_4_0 = null;
+
+        EObject lv_tabs_10_0 = null;
+
+        EObject lv_bindings_11_0 = null;
+
+        EObject lv_processorAssignments_12_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:6001:2: ( ( () otherlv_1= 'mobileTab' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? otherlv_9= '{' ( (lv_tabs_10_0= ruleUiMobileTabAssignment ) )* ( (lv_bindings_11_0= ruleUiBinding ) )* ( (lv_processorAssignments_12_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_13= '}' ) )
+            // InternalUIGrammar.g:6002:2: ( () otherlv_1= 'mobileTab' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? otherlv_9= '{' ( (lv_tabs_10_0= ruleUiMobileTabAssignment ) )* ( (lv_bindings_11_0= ruleUiBinding ) )* ( (lv_processorAssignments_12_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_13= '}' )
+            {
+            // InternalUIGrammar.g:6002:2: ( () otherlv_1= 'mobileTab' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? otherlv_9= '{' ( (lv_tabs_10_0= ruleUiMobileTabAssignment ) )* ( (lv_bindings_11_0= ruleUiBinding ) )* ( (lv_processorAssignments_12_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_13= '}' )
+            // InternalUIGrammar.g:6003:3: () otherlv_1= 'mobileTab' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? otherlv_9= '{' ( (lv_tabs_10_0= ruleUiMobileTabAssignment ) )* ( (lv_bindings_11_0= ruleUiBinding ) )* ( (lv_processorAssignments_12_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_13= '}'
+            {
+            // InternalUIGrammar.g:6003:3: ()
+            // InternalUIGrammar.g:6004:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiMobileTabSheetAccess().getUiMobileTabSheetAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,77,FOLLOW_52); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiMobileTabSheetAccess().getMobileTabKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:6014:3: (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )?
+            int alt134=2;
+            int LA134_0 = input.LA(1);
+
+            if ( (LA134_0==45) ) {
+                alt134=1;
+            }
+            switch (alt134) {
+                case 1 :
+                    // InternalUIGrammar.g:6015:4: otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')'
+                    {
+                    otherlv_2=(Token)match(input,45,FOLLOW_63); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getUiMobileTabSheetAccess().getLeftParenthesisKeyword_2_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:6019:4: ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:6020:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:6020:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:6021:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiMobileTabSheetAccess().getUnorderedGroup_2_1());
+                    // InternalUIGrammar.g:6024:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:6025:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:6025:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )*
+                    loop133:
+                    do {
+                        int alt133=3;
+                        int LA133_0 = input.LA(1);
+
+                        if ( LA133_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileTabSheetAccess().getUnorderedGroup_2_1(), 0) ) {
+                            alt133=1;
+                        }
+                        else if ( LA133_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileTabSheetAccess().getUnorderedGroup_2_1(), 1) ) {
+                            alt133=2;
+                        }
+
+
+                        switch (alt133) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:6026:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:6026:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    // InternalUIGrammar.g:6027:6: {...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileTabSheetAccess().getUnorderedGroup_2_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileTabSheet", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileTabSheetAccess().getUnorderedGroup_2_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:6027:116: ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    // InternalUIGrammar.g:6028:7: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiMobileTabSheetAccess().getUnorderedGroup_2_1(), 0);
+                    	    // InternalUIGrammar.g:6031:10: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    // InternalUIGrammar.g:6031:11: {...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileTabSheet", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:6031:20: ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    // InternalUIGrammar.g:6031:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    {
+                    	    // InternalUIGrammar.g:6031:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    // InternalUIGrammar.g:6032:11: lv_i18nInfo_4_0= ruleUiI18nInfo
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getUiMobileTabSheetAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_63);
+                    	    lv_i18nInfo_4_0=ruleUiI18nInfo();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getUiMobileTabSheetRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"i18nInfo",
+                    	      												lv_i18nInfo_4_0,
+                    	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileTabSheetAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:6054:5: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:6054:5: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:6055:6: {...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileTabSheetAccess().getUnorderedGroup_2_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileTabSheet", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileTabSheetAccess().getUnorderedGroup_2_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:6055:116: ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:6056:7: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiMobileTabSheetAccess().getUnorderedGroup_2_1(), 1);
+                    	    // InternalUIGrammar.g:6059:10: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:6059:11: {...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileTabSheet", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:6059:20: (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:6059:21: otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_5=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_5, grammarAccess.getUiMobileTabSheetAccess().getStylesKeyword_2_1_1_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:6063:10: ( (lv_styles_6_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:6064:11: (lv_styles_6_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:6064:11: (lv_styles_6_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:6065:12: lv_styles_6_0= RULE_STRING
+                    	    {
+                    	    lv_styles_6_0=(Token)match(input,RULE_STRING,FOLLOW_63); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_styles_6_0, grammarAccess.getUiMobileTabSheetAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiMobileTabSheetRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"styles",
+                    	      													lv_styles_6_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileTabSheetAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop133;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiMobileTabSheetAccess().getUnorderedGroup_2_1());
+
+                    }
+
+                    otherlv_7=(Token)match(input,47,FOLLOW_55); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_7, grammarAccess.getUiMobileTabSheetAccess().getRightParenthesisKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:6099:3: ( (lv_name_8_0= RULE_ID ) )?
+            int alt135=2;
+            int LA135_0 = input.LA(1);
+
+            if ( (LA135_0==RULE_ID) ) {
+                alt135=1;
+            }
+            switch (alt135) {
+                case 1 :
+                    // InternalUIGrammar.g:6100:4: (lv_name_8_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:6100:4: (lv_name_8_0= RULE_ID )
+                    // InternalUIGrammar.g:6101:5: lv_name_8_0= RULE_ID
+                    {
+                    lv_name_8_0=(Token)match(input,RULE_ID,FOLLOW_11); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_8_0, grammarAccess.getUiMobileTabSheetAccess().getNameIDTerminalRuleCall_3_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiMobileTabSheetRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_8_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_9=(Token)match(input,20,FOLLOW_67); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_9, grammarAccess.getUiMobileTabSheetAccess().getLeftCurlyBracketKeyword_4());
+              		
+            }
+            // InternalUIGrammar.g:6121:3: ( (lv_tabs_10_0= ruleUiMobileTabAssignment ) )*
+            loop136:
+            do {
+                int alt136=2;
+                int LA136_0 = input.LA(1);
+
+                if ( (LA136_0==78) ) {
+                    alt136=1;
+                }
+
+
+                switch (alt136) {
+            	case 1 :
+            	    // InternalUIGrammar.g:6122:4: (lv_tabs_10_0= ruleUiMobileTabAssignment )
+            	    {
+            	    // InternalUIGrammar.g:6122:4: (lv_tabs_10_0= ruleUiMobileTabAssignment )
+            	    // InternalUIGrammar.g:6123:5: lv_tabs_10_0= ruleUiMobileTabAssignment
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiMobileTabSheetAccess().getTabsUiMobileTabAssignmentParserRuleCall_5_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_67);
+            	    lv_tabs_10_0=ruleUiMobileTabAssignment();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiMobileTabSheetRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"tabs",
+            	      						lv_tabs_10_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileTabAssignment");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop136;
+                }
+            } while (true);
+
+            // InternalUIGrammar.g:6140:3: ( (lv_bindings_11_0= ruleUiBinding ) )*
+            loop137:
+            do {
+                int alt137=2;
+                int LA137_0 = input.LA(1);
+
+                if ( (LA137_0==26) ) {
+                    alt137=1;
+                }
+
+
+                switch (alt137) {
+            	case 1 :
+            	    // InternalUIGrammar.g:6141:4: (lv_bindings_11_0= ruleUiBinding )
+            	    {
+            	    // InternalUIGrammar.g:6141:4: (lv_bindings_11_0= ruleUiBinding )
+            	    // InternalUIGrammar.g:6142:5: lv_bindings_11_0= ruleUiBinding
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiMobileTabSheetAccess().getBindingsUiBindingParserRuleCall_6_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_42);
+            	    lv_bindings_11_0=ruleUiBinding();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiMobileTabSheetRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"bindings",
+            	      						lv_bindings_11_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop137;
+                }
+            } while (true);
+
+            // InternalUIGrammar.g:6159:3: ( (lv_processorAssignments_12_0= ruleUiVisibilityProcessorAssignment ) )*
+            loop138:
+            do {
+                int alt138=2;
+                int LA138_0 = input.LA(1);
+
+                if ( (LA138_0==153) ) {
+                    alt138=1;
+                }
+
+
+                switch (alt138) {
+            	case 1 :
+            	    // InternalUIGrammar.g:6160:4: (lv_processorAssignments_12_0= ruleUiVisibilityProcessorAssignment )
+            	    {
+            	    // InternalUIGrammar.g:6160:4: (lv_processorAssignments_12_0= ruleUiVisibilityProcessorAssignment )
+            	    // InternalUIGrammar.g:6161:5: lv_processorAssignments_12_0= ruleUiVisibilityProcessorAssignment
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiMobileTabSheetAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_42);
+            	    lv_processorAssignments_12_0=ruleUiVisibilityProcessorAssignment();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiMobileTabSheetRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"processorAssignments",
+            	      						lv_processorAssignments_12_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop138;
+                }
+            } while (true);
+
+            otherlv_13=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_13, grammarAccess.getUiMobileTabSheetAccess().getRightCurlyBracketKeyword_8());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiMobileTabSheet"
+
+
+    // $ANTLR start "entryRuleUiMobileTabAssignment"
+    // InternalUIGrammar.g:6186:1: entryRuleUiMobileTabAssignment returns [EObject current=null] : iv_ruleUiMobileTabAssignment= ruleUiMobileTabAssignment EOF ;
+    public final EObject entryRuleUiMobileTabAssignment() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiMobileTabAssignment = null;
+
+
+        try {
+            // InternalUIGrammar.g:6186:62: (iv_ruleUiMobileTabAssignment= ruleUiMobileTabAssignment EOF )
+            // InternalUIGrammar.g:6187:2: iv_ruleUiMobileTabAssignment= ruleUiMobileTabAssignment EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiMobileTabAssignmentRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiMobileTabAssignment=ruleUiMobileTabAssignment();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiMobileTabAssignment; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiMobileTabAssignment"
+
+
+    // $ANTLR start "ruleUiMobileTabAssignment"
+    // InternalUIGrammar.g:6193:1: ruleUiMobileTabAssignment returns [EObject current=null] : (otherlv_0= 'tab' ( (lv_name_1_0= RULE_ID ) )? ( (lv_element_2_0= ruleUiMobileEmbeddable ) ) ) ;
+    public final EObject ruleUiMobileTabAssignment() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token lv_name_1_0=null;
+        EObject lv_element_2_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:6199:2: ( (otherlv_0= 'tab' ( (lv_name_1_0= RULE_ID ) )? ( (lv_element_2_0= ruleUiMobileEmbeddable ) ) ) )
+            // InternalUIGrammar.g:6200:2: (otherlv_0= 'tab' ( (lv_name_1_0= RULE_ID ) )? ( (lv_element_2_0= ruleUiMobileEmbeddable ) ) )
+            {
+            // InternalUIGrammar.g:6200:2: (otherlv_0= 'tab' ( (lv_name_1_0= RULE_ID ) )? ( (lv_element_2_0= ruleUiMobileEmbeddable ) ) )
+            // InternalUIGrammar.g:6201:3: otherlv_0= 'tab' ( (lv_name_1_0= RULE_ID ) )? ( (lv_element_2_0= ruleUiMobileEmbeddable ) )
+            {
+            otherlv_0=(Token)match(input,78,FOLLOW_68); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getUiMobileTabAssignmentAccess().getTabKeyword_0());
+              		
+            }
+            // InternalUIGrammar.g:6205:3: ( (lv_name_1_0= RULE_ID ) )?
+            int alt139=2;
+            int LA139_0 = input.LA(1);
+
+            if ( (LA139_0==RULE_ID) ) {
+                alt139=1;
+            }
+            switch (alt139) {
+                case 1 :
+                    // InternalUIGrammar.g:6206:4: (lv_name_1_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:6206:4: (lv_name_1_0= RULE_ID )
+                    // InternalUIGrammar.g:6207:5: lv_name_1_0= RULE_ID
+                    {
+                    lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_49); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_1_0, grammarAccess.getUiMobileTabAssignmentAccess().getNameIDTerminalRuleCall_1_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiMobileTabAssignmentRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_1_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:6223:3: ( (lv_element_2_0= ruleUiMobileEmbeddable ) )
+            // InternalUIGrammar.g:6224:4: (lv_element_2_0= ruleUiMobileEmbeddable )
+            {
+            // InternalUIGrammar.g:6224:4: (lv_element_2_0= ruleUiMobileEmbeddable )
+            // InternalUIGrammar.g:6225:5: lv_element_2_0= ruleUiMobileEmbeddable
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getUiMobileTabAssignmentAccess().getElementUiMobileEmbeddableParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FOLLOW_2);
+            lv_element_2_0=ruleUiMobileEmbeddable();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getUiMobileTabAssignmentRule());
+              					}
+              					set(
+              						current,
+              						"element",
+              						lv_element_2_0,
+              						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileEmbeddable");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiMobileTabAssignment"
+
+
+    // $ANTLR start "entryRuleUiTabSheet"
+    // InternalUIGrammar.g:6246:1: entryRuleUiTabSheet returns [EObject current=null] : iv_ruleUiTabSheet= ruleUiTabSheet EOF ;
+    public final EObject entryRuleUiTabSheet() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiTabSheet = null;
+
+
+        try {
+            // InternalUIGrammar.g:6246:51: (iv_ruleUiTabSheet= ruleUiTabSheet EOF )
+            // InternalUIGrammar.g:6247:2: iv_ruleUiTabSheet= ruleUiTabSheet EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiTabSheetRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiTabSheet=ruleUiTabSheet();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiTabSheet; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiTabSheet"
+
+
+    // $ANTLR start "ruleUiTabSheet"
+    // InternalUIGrammar.g:6253:1: ruleUiTabSheet returns [EObject current=null] : ( () otherlv_1= 'tabsheet' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? otherlv_9= '{' ( (lv_tabs_10_0= ruleUiTabAssignment ) )* ( (lv_bindings_11_0= ruleUiBinding ) )* ( (lv_processorAssignments_12_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_13= '}' ) ;
+    public final EObject ruleUiTabSheet() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_5=null;
+        Token lv_styles_6_0=null;
+        Token otherlv_7=null;
+        Token lv_name_8_0=null;
+        Token otherlv_9=null;
+        Token otherlv_13=null;
+        EObject lv_i18nInfo_4_0 = null;
+
+        EObject lv_tabs_10_0 = null;
+
+        EObject lv_bindings_11_0 = null;
+
+        EObject lv_processorAssignments_12_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:6259:2: ( ( () otherlv_1= 'tabsheet' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? otherlv_9= '{' ( (lv_tabs_10_0= ruleUiTabAssignment ) )* ( (lv_bindings_11_0= ruleUiBinding ) )* ( (lv_processorAssignments_12_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_13= '}' ) )
+            // InternalUIGrammar.g:6260:2: ( () otherlv_1= 'tabsheet' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? otherlv_9= '{' ( (lv_tabs_10_0= ruleUiTabAssignment ) )* ( (lv_bindings_11_0= ruleUiBinding ) )* ( (lv_processorAssignments_12_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_13= '}' )
+            {
+            // InternalUIGrammar.g:6260:2: ( () otherlv_1= 'tabsheet' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? otherlv_9= '{' ( (lv_tabs_10_0= ruleUiTabAssignment ) )* ( (lv_bindings_11_0= ruleUiBinding ) )* ( (lv_processorAssignments_12_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_13= '}' )
+            // InternalUIGrammar.g:6261:3: () otherlv_1= 'tabsheet' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? otherlv_9= '{' ( (lv_tabs_10_0= ruleUiTabAssignment ) )* ( (lv_bindings_11_0= ruleUiBinding ) )* ( (lv_processorAssignments_12_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_13= '}'
+            {
+            // InternalUIGrammar.g:6261:3: ()
+            // InternalUIGrammar.g:6262:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiTabSheetAccess().getUiTabSheetAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,79,FOLLOW_52); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiTabSheetAccess().getTabsheetKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:6272:3: (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )?
+            int alt141=2;
+            int LA141_0 = input.LA(1);
+
+            if ( (LA141_0==45) ) {
+                alt141=1;
+            }
+            switch (alt141) {
+                case 1 :
+                    // InternalUIGrammar.g:6273:4: otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')'
+                    {
+                    otherlv_2=(Token)match(input,45,FOLLOW_63); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getUiTabSheetAccess().getLeftParenthesisKeyword_2_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:6277:4: ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:6278:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:6278:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:6279:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiTabSheetAccess().getUnorderedGroup_2_1());
+                    // InternalUIGrammar.g:6282:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:6283:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:6283:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )*
+                    loop140:
+                    do {
+                        int alt140=3;
+                        int LA140_0 = input.LA(1);
+
+                        if ( LA140_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiTabSheetAccess().getUnorderedGroup_2_1(), 0) ) {
+                            alt140=1;
+                        }
+                        else if ( LA140_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiTabSheetAccess().getUnorderedGroup_2_1(), 1) ) {
+                            alt140=2;
+                        }
+
+
+                        switch (alt140) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:6284:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:6284:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    // InternalUIGrammar.g:6285:6: {...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiTabSheetAccess().getUnorderedGroup_2_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiTabSheet", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiTabSheetAccess().getUnorderedGroup_2_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:6285:110: ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    // InternalUIGrammar.g:6286:7: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiTabSheetAccess().getUnorderedGroup_2_1(), 0);
+                    	    // InternalUIGrammar.g:6289:10: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    // InternalUIGrammar.g:6289:11: {...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiTabSheet", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:6289:20: ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    // InternalUIGrammar.g:6289:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    {
+                    	    // InternalUIGrammar.g:6289:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    // InternalUIGrammar.g:6290:11: lv_i18nInfo_4_0= ruleUiI18nInfo
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getUiTabSheetAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_63);
+                    	    lv_i18nInfo_4_0=ruleUiI18nInfo();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getUiTabSheetRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"i18nInfo",
+                    	      												lv_i18nInfo_4_0,
+                    	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTabSheetAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:6312:5: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:6312:5: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:6313:6: {...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiTabSheetAccess().getUnorderedGroup_2_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiTabSheet", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiTabSheetAccess().getUnorderedGroup_2_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:6313:110: ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:6314:7: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiTabSheetAccess().getUnorderedGroup_2_1(), 1);
+                    	    // InternalUIGrammar.g:6317:10: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:6317:11: {...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiTabSheet", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:6317:20: (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:6317:21: otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_5=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_5, grammarAccess.getUiTabSheetAccess().getStylesKeyword_2_1_1_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:6321:10: ( (lv_styles_6_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:6322:11: (lv_styles_6_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:6322:11: (lv_styles_6_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:6323:12: lv_styles_6_0= RULE_STRING
+                    	    {
+                    	    lv_styles_6_0=(Token)match(input,RULE_STRING,FOLLOW_63); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_styles_6_0, grammarAccess.getUiTabSheetAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiTabSheetRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"styles",
+                    	      													lv_styles_6_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTabSheetAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop140;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiTabSheetAccess().getUnorderedGroup_2_1());
+
+                    }
+
+                    otherlv_7=(Token)match(input,47,FOLLOW_55); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_7, grammarAccess.getUiTabSheetAccess().getRightParenthesisKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:6357:3: ( (lv_name_8_0= RULE_ID ) )?
+            int alt142=2;
+            int LA142_0 = input.LA(1);
+
+            if ( (LA142_0==RULE_ID) ) {
+                alt142=1;
+            }
+            switch (alt142) {
+                case 1 :
+                    // InternalUIGrammar.g:6358:4: (lv_name_8_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:6358:4: (lv_name_8_0= RULE_ID )
+                    // InternalUIGrammar.g:6359:5: lv_name_8_0= RULE_ID
+                    {
+                    lv_name_8_0=(Token)match(input,RULE_ID,FOLLOW_11); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_8_0, grammarAccess.getUiTabSheetAccess().getNameIDTerminalRuleCall_3_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiTabSheetRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_8_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_9=(Token)match(input,20,FOLLOW_67); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_9, grammarAccess.getUiTabSheetAccess().getLeftCurlyBracketKeyword_4());
+              		
+            }
+            // InternalUIGrammar.g:6379:3: ( (lv_tabs_10_0= ruleUiTabAssignment ) )*
+            loop143:
+            do {
+                int alt143=2;
+                int LA143_0 = input.LA(1);
+
+                if ( (LA143_0==78) ) {
+                    alt143=1;
+                }
+
+
+                switch (alt143) {
+            	case 1 :
+            	    // InternalUIGrammar.g:6380:4: (lv_tabs_10_0= ruleUiTabAssignment )
+            	    {
+            	    // InternalUIGrammar.g:6380:4: (lv_tabs_10_0= ruleUiTabAssignment )
+            	    // InternalUIGrammar.g:6381:5: lv_tabs_10_0= ruleUiTabAssignment
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiTabSheetAccess().getTabsUiTabAssignmentParserRuleCall_5_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_67);
+            	    lv_tabs_10_0=ruleUiTabAssignment();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiTabSheetRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"tabs",
+            	      						lv_tabs_10_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiTabAssignment");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop143;
+                }
+            } while (true);
+
+            // InternalUIGrammar.g:6398:3: ( (lv_bindings_11_0= ruleUiBinding ) )*
+            loop144:
+            do {
+                int alt144=2;
+                int LA144_0 = input.LA(1);
+
+                if ( (LA144_0==26) ) {
+                    alt144=1;
+                }
+
+
+                switch (alt144) {
+            	case 1 :
+            	    // InternalUIGrammar.g:6399:4: (lv_bindings_11_0= ruleUiBinding )
+            	    {
+            	    // InternalUIGrammar.g:6399:4: (lv_bindings_11_0= ruleUiBinding )
+            	    // InternalUIGrammar.g:6400:5: lv_bindings_11_0= ruleUiBinding
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiTabSheetAccess().getBindingsUiBindingParserRuleCall_6_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_42);
+            	    lv_bindings_11_0=ruleUiBinding();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiTabSheetRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"bindings",
+            	      						lv_bindings_11_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop144;
+                }
+            } while (true);
+
+            // InternalUIGrammar.g:6417:3: ( (lv_processorAssignments_12_0= ruleUiVisibilityProcessorAssignment ) )*
+            loop145:
+            do {
+                int alt145=2;
+                int LA145_0 = input.LA(1);
+
+                if ( (LA145_0==153) ) {
+                    alt145=1;
+                }
+
+
+                switch (alt145) {
+            	case 1 :
+            	    // InternalUIGrammar.g:6418:4: (lv_processorAssignments_12_0= ruleUiVisibilityProcessorAssignment )
+            	    {
+            	    // InternalUIGrammar.g:6418:4: (lv_processorAssignments_12_0= ruleUiVisibilityProcessorAssignment )
+            	    // InternalUIGrammar.g:6419:5: lv_processorAssignments_12_0= ruleUiVisibilityProcessorAssignment
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiTabSheetAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_42);
+            	    lv_processorAssignments_12_0=ruleUiVisibilityProcessorAssignment();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiTabSheetRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"processorAssignments",
+            	      						lv_processorAssignments_12_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop145;
+                }
+            } while (true);
+
+            otherlv_13=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_13, grammarAccess.getUiTabSheetAccess().getRightCurlyBracketKeyword_8());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiTabSheet"
+
+
+    // $ANTLR start "entryRuleUiTabAssignment"
+    // InternalUIGrammar.g:6444:1: entryRuleUiTabAssignment returns [EObject current=null] : iv_ruleUiTabAssignment= ruleUiTabAssignment EOF ;
+    public final EObject entryRuleUiTabAssignment() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiTabAssignment = null;
+
+
+        try {
+            // InternalUIGrammar.g:6444:56: (iv_ruleUiTabAssignment= ruleUiTabAssignment EOF )
+            // InternalUIGrammar.g:6445:2: iv_ruleUiTabAssignment= ruleUiTabAssignment EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiTabAssignmentRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiTabAssignment=ruleUiTabAssignment();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiTabAssignment; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiTabAssignment"
+
+
+    // $ANTLR start "ruleUiTabAssignment"
+    // InternalUIGrammar.g:6451:1: ruleUiTabAssignment returns [EObject current=null] : (otherlv_0= 'tab' ( (lv_name_1_0= RULE_ID ) )? ( (lv_element_2_0= ruleUiEmbeddable ) ) ) ;
+    public final EObject ruleUiTabAssignment() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token lv_name_1_0=null;
+        EObject lv_element_2_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:6457:2: ( (otherlv_0= 'tab' ( (lv_name_1_0= RULE_ID ) )? ( (lv_element_2_0= ruleUiEmbeddable ) ) ) )
+            // InternalUIGrammar.g:6458:2: (otherlv_0= 'tab' ( (lv_name_1_0= RULE_ID ) )? ( (lv_element_2_0= ruleUiEmbeddable ) ) )
+            {
+            // InternalUIGrammar.g:6458:2: (otherlv_0= 'tab' ( (lv_name_1_0= RULE_ID ) )? ( (lv_element_2_0= ruleUiEmbeddable ) ) )
+            // InternalUIGrammar.g:6459:3: otherlv_0= 'tab' ( (lv_name_1_0= RULE_ID ) )? ( (lv_element_2_0= ruleUiEmbeddable ) )
+            {
+            otherlv_0=(Token)match(input,78,FOLLOW_69); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getUiTabAssignmentAccess().getTabKeyword_0());
+              		
+            }
+            // InternalUIGrammar.g:6463:3: ( (lv_name_1_0= RULE_ID ) )?
+            int alt146=2;
+            int LA146_0 = input.LA(1);
+
+            if ( (LA146_0==RULE_ID) ) {
+                alt146=1;
+            }
+            switch (alt146) {
+                case 1 :
+                    // InternalUIGrammar.g:6464:4: (lv_name_1_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:6464:4: (lv_name_1_0= RULE_ID )
+                    // InternalUIGrammar.g:6465:5: lv_name_1_0= RULE_ID
+                    {
+                    lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_37); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_1_0, grammarAccess.getUiTabAssignmentAccess().getNameIDTerminalRuleCall_1_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiTabAssignmentRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_1_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:6481:3: ( (lv_element_2_0= ruleUiEmbeddable ) )
+            // InternalUIGrammar.g:6482:4: (lv_element_2_0= ruleUiEmbeddable )
+            {
+            // InternalUIGrammar.g:6482:4: (lv_element_2_0= ruleUiEmbeddable )
+            // InternalUIGrammar.g:6483:5: lv_element_2_0= ruleUiEmbeddable
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getUiTabAssignmentAccess().getElementUiEmbeddableParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FOLLOW_2);
+            lv_element_2_0=ruleUiEmbeddable();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getUiTabAssignmentRule());
+              					}
+              					set(
+              						current,
+              						"element",
+              						lv_element_2_0,
+              						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiEmbeddable");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiTabAssignment"
+
+
+    // $ANTLR start "entryRuleUiSplitpanel"
+    // InternalUIGrammar.g:6504:1: entryRuleUiSplitpanel returns [EObject current=null] : iv_ruleUiSplitpanel= ruleUiSplitpanel EOF ;
+    public final EObject entryRuleUiSplitpanel() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiSplitpanel = null;
+
+
+        try {
+            // InternalUIGrammar.g:6504:53: (iv_ruleUiSplitpanel= ruleUiSplitpanel EOF )
+            // InternalUIGrammar.g:6505:2: iv_ruleUiSplitpanel= ruleUiSplitpanel EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiSplitpanelRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiSplitpanel=ruleUiSplitpanel();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiSplitpanel; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiSplitpanel"
+
+
+    // $ANTLR start "ruleUiSplitpanel"
+    // InternalUIGrammar.g:6511:1: ruleUiSplitpanel returns [EObject current=null] : (otherlv_0= 'splitter' ( ( ( ( ({...}? => ( ({...}? => (otherlv_2= '(' ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) )? otherlv_6= ')' ) ) ) ) )+ {...}?) ) )? ( (lv_name_7_0= RULE_ID ) ) otherlv_8= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_10= 'first' ( (lv_firstContent_11_0= ruleUiSplitpanelAssigment ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'second' ( (lv_secondContent_13_0= ruleUiSplitpanelAssigment ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'splitPos' ( (lv_splitPosition_15_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_16_0= 'readonly' ) ) ) ) ) )+ {...}?) ) ) ( (lv_bindings_17_0= ruleUiBinding ) )* ( (lv_processorAssignments_18_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_19= '}' ) ;
+    public final EObject ruleUiSplitpanel() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Token lv_styles_5_0=null;
+        Token otherlv_6=null;
+        Token lv_name_7_0=null;
+        Token otherlv_8=null;
+        Token otherlv_10=null;
+        Token otherlv_12=null;
+        Token otherlv_14=null;
+        Token lv_splitPosition_15_0=null;
+        Token lv_readonly_16_0=null;
+        Token otherlv_19=null;
+        EObject lv_i18nInfo_3_0 = null;
+
+        EObject lv_firstContent_11_0 = null;
+
+        EObject lv_secondContent_13_0 = null;
+
+        EObject lv_bindings_17_0 = null;
+
+        EObject lv_processorAssignments_18_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:6517:2: ( (otherlv_0= 'splitter' ( ( ( ( ({...}? => ( ({...}? => (otherlv_2= '(' ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) )? otherlv_6= ')' ) ) ) ) )+ {...}?) ) )? ( (lv_name_7_0= RULE_ID ) ) otherlv_8= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_10= 'first' ( (lv_firstContent_11_0= ruleUiSplitpanelAssigment ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'second' ( (lv_secondContent_13_0= ruleUiSplitpanelAssigment ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'splitPos' ( (lv_splitPosition_15_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_16_0= 'readonly' ) ) ) ) ) )+ {...}?) ) ) ( (lv_bindings_17_0= ruleUiBinding ) )* ( (lv_processorAssignments_18_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_19= '}' ) )
+            // InternalUIGrammar.g:6518:2: (otherlv_0= 'splitter' ( ( ( ( ({...}? => ( ({...}? => (otherlv_2= '(' ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) )? otherlv_6= ')' ) ) ) ) )+ {...}?) ) )? ( (lv_name_7_0= RULE_ID ) ) otherlv_8= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_10= 'first' ( (lv_firstContent_11_0= ruleUiSplitpanelAssigment ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'second' ( (lv_secondContent_13_0= ruleUiSplitpanelAssigment ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'splitPos' ( (lv_splitPosition_15_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_16_0= 'readonly' ) ) ) ) ) )+ {...}?) ) ) ( (lv_bindings_17_0= ruleUiBinding ) )* ( (lv_processorAssignments_18_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_19= '}' )
+            {
+            // InternalUIGrammar.g:6518:2: (otherlv_0= 'splitter' ( ( ( ( ({...}? => ( ({...}? => (otherlv_2= '(' ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) )? otherlv_6= ')' ) ) ) ) )+ {...}?) ) )? ( (lv_name_7_0= RULE_ID ) ) otherlv_8= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_10= 'first' ( (lv_firstContent_11_0= ruleUiSplitpanelAssigment ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'second' ( (lv_secondContent_13_0= ruleUiSplitpanelAssigment ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'splitPos' ( (lv_splitPosition_15_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_16_0= 'readonly' ) ) ) ) ) )+ {...}?) ) ) ( (lv_bindings_17_0= ruleUiBinding ) )* ( (lv_processorAssignments_18_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_19= '}' )
+            // InternalUIGrammar.g:6519:3: otherlv_0= 'splitter' ( ( ( ( ({...}? => ( ({...}? => (otherlv_2= '(' ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) )? otherlv_6= ')' ) ) ) ) )+ {...}?) ) )? ( (lv_name_7_0= RULE_ID ) ) otherlv_8= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_10= 'first' ( (lv_firstContent_11_0= ruleUiSplitpanelAssigment ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'second' ( (lv_secondContent_13_0= ruleUiSplitpanelAssigment ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'splitPos' ( (lv_splitPosition_15_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_16_0= 'readonly' ) ) ) ) ) )+ {...}?) ) ) ( (lv_bindings_17_0= ruleUiBinding ) )* ( (lv_processorAssignments_18_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_19= '}'
+            {
+            otherlv_0=(Token)match(input,80,FOLLOW_70); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getUiSplitpanelAccess().getSplitterKeyword_0());
+              		
+            }
+            // InternalUIGrammar.g:6523:3: ( ( ( ( ({...}? => ( ({...}? => (otherlv_2= '(' ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) )? otherlv_6= ')' ) ) ) ) )+ {...}?) ) )?
+            int alt150=2;
+            int LA150_0 = input.LA(1);
+
+            if ( (LA150_0==45||LA150_0==47||LA150_0==64) ) {
+                alt150=1;
+            }
+            switch (alt150) {
+                case 1 :
+                    // InternalUIGrammar.g:6524:4: ( ( ( ({...}? => ( ({...}? => (otherlv_2= '(' ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) )? otherlv_6= ')' ) ) ) ) )+ {...}?) )
+                    {
+                    // InternalUIGrammar.g:6524:4: ( ( ( ({...}? => ( ({...}? => (otherlv_2= '(' ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) )? otherlv_6= ')' ) ) ) ) )+ {...}?) )
+                    // InternalUIGrammar.g:6525:5: ( ( ({...}? => ( ({...}? => (otherlv_2= '(' ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) )? otherlv_6= ')' ) ) ) ) )+ {...}?)
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_1());
+                    // InternalUIGrammar.g:6528:5: ( ( ({...}? => ( ({...}? => (otherlv_2= '(' ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) )? otherlv_6= ')' ) ) ) ) )+ {...}?)
+                    // InternalUIGrammar.g:6529:6: ( ({...}? => ( ({...}? => (otherlv_2= '(' ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) )? otherlv_6= ')' ) ) ) ) )+ {...}?
+                    {
+                    // InternalUIGrammar.g:6529:6: ( ({...}? => ( ({...}? => (otherlv_2= '(' ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) )? otherlv_6= ')' ) ) ) ) )+
+                    int cnt149=0;
+                    loop149:
+                    do {
+                        int alt149=3;
+                        int LA149_0 = input.LA(1);
+
+                        if ( LA149_0 == 45 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_1(), 0) ) {
+                            alt149=1;
+                        }
+                        else if ( ( LA149_0 == 47 || LA149_0 == 64 ) && getUnorderedGroupHelper().canSelect(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_1(), 1) ) {
+                            alt149=2;
+                        }
+
+
+                        switch (alt149) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:6530:4: ({...}? => ( ({...}? => (otherlv_2= '(' ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) )? ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:6530:4: ({...}? => ( ({...}? => (otherlv_2= '(' ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) )? ) ) ) )
+                    	    // InternalUIGrammar.g:6531:5: {...}? => ( ({...}? => (otherlv_2= '(' ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) )? ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiSplitpanel", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:6531:109: ( ({...}? => (otherlv_2= '(' ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) )? ) ) )
+                    	    // InternalUIGrammar.g:6532:6: ({...}? => (otherlv_2= '(' ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) )? ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_1(), 0);
+                    	    // InternalUIGrammar.g:6535:9: ({...}? => (otherlv_2= '(' ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) )? ) )
+                    	    // InternalUIGrammar.g:6535:10: {...}? => (otherlv_2= '(' ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) )? )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiSplitpanel", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:6535:19: (otherlv_2= '(' ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) )? )
+                    	    // InternalUIGrammar.g:6535:20: otherlv_2= '(' ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) )?
+                    	    {
+                    	    otherlv_2=(Token)match(input,45,FOLLOW_71); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      									newLeafNode(otherlv_2, grammarAccess.getUiSplitpanelAccess().getLeftParenthesisKeyword_1_0_0());
+                    	      								
+                    	    }
+                    	    // InternalUIGrammar.g:6539:9: ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) )?
+                    	    int alt147=2;
+                    	    int LA147_0 = input.LA(1);
+
+                    	    if ( (LA147_0==60) ) {
+                    	        alt147=1;
+                    	    }
+                    	    switch (alt147) {
+                    	        case 1 :
+                    	            // InternalUIGrammar.g:6540:10: (lv_i18nInfo_3_0= ruleUiI18nInfo )
+                    	            {
+                    	            // InternalUIGrammar.g:6540:10: (lv_i18nInfo_3_0= ruleUiI18nInfo )
+                    	            // InternalUIGrammar.g:6541:11: lv_i18nInfo_3_0= ruleUiI18nInfo
+                    	            {
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											newCompositeNode(grammarAccess.getUiSplitpanelAccess().getI18nInfoUiI18nInfoParserRuleCall_1_0_1_0());
+                    	              										
+                    	            }
+                    	            pushFollow(FOLLOW_70);
+                    	            lv_i18nInfo_3_0=ruleUiI18nInfo();
+
+                    	            state._fsp--;
+                    	            if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											if (current==null) {
+                    	              												current = createModelElementForParent(grammarAccess.getUiSplitpanelRule());
+                    	              											}
+                    	              											set(
+                    	              												current,
+                    	              												"i18nInfo",
+                    	              												lv_i18nInfo_3_0,
+                    	              												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	              											afterParserOrEnumRuleCall();
+                    	              										
+                    	            }
+
+                    	            }
+
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:6564:4: ({...}? => ( ({...}? => ( (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) )? otherlv_6= ')' ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:6564:4: ({...}? => ( ({...}? => ( (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) )? otherlv_6= ')' ) ) ) )
+                    	    // InternalUIGrammar.g:6565:5: {...}? => ( ({...}? => ( (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) )? otherlv_6= ')' ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiSplitpanel", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:6565:109: ( ({...}? => ( (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) )? otherlv_6= ')' ) ) )
+                    	    // InternalUIGrammar.g:6566:6: ({...}? => ( (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) )? otherlv_6= ')' ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_1(), 1);
+                    	    // InternalUIGrammar.g:6569:9: ({...}? => ( (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) )? otherlv_6= ')' ) )
+                    	    // InternalUIGrammar.g:6569:10: {...}? => ( (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) )? otherlv_6= ')' )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiSplitpanel", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:6569:19: ( (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) )? otherlv_6= ')' )
+                    	    // InternalUIGrammar.g:6569:20: (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) )? otherlv_6= ')'
+                    	    {
+                    	    // InternalUIGrammar.g:6569:20: (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) )?
+                    	    int alt148=2;
+                    	    int LA148_0 = input.LA(1);
+
+                    	    if ( (LA148_0==64) ) {
+                    	        alt148=1;
+                    	    }
+                    	    switch (alt148) {
+                    	        case 1 :
+                    	            // InternalUIGrammar.g:6570:10: otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) )
+                    	            {
+                    	            otherlv_4=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              										newLeafNode(otherlv_4, grammarAccess.getUiSplitpanelAccess().getStylesKeyword_1_1_0_0());
+                    	              									
+                    	            }
+                    	            // InternalUIGrammar.g:6574:10: ( (lv_styles_5_0= RULE_STRING ) )
+                    	            // InternalUIGrammar.g:6575:11: (lv_styles_5_0= RULE_STRING )
+                    	            {
+                    	            // InternalUIGrammar.g:6575:11: (lv_styles_5_0= RULE_STRING )
+                    	            // InternalUIGrammar.g:6576:12: lv_styles_5_0= RULE_STRING
+                    	            {
+                    	            lv_styles_5_0=(Token)match(input,RULE_STRING,FOLLOW_36); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              												newLeafNode(lv_styles_5_0, grammarAccess.getUiSplitpanelAccess().getStylesSTRINGTerminalRuleCall_1_1_0_1_0());
+                    	              											
+                    	            }
+                    	            if ( state.backtracking==0 ) {
+
+                    	              												if (current==null) {
+                    	              													current = createModelElement(grammarAccess.getUiSplitpanelRule());
+                    	              												}
+                    	              												setWithLastConsumed(
+                    	              													current,
+                    	              													"styles",
+                    	              													lv_styles_5_0,
+                    	              													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	              											
+                    	            }
+
+                    	            }
+
+
+                    	            }
+
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+                    	    otherlv_6=(Token)match(input,47,FOLLOW_70); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      									newLeafNode(otherlv_6, grammarAccess.getUiSplitpanelAccess().getRightParenthesisKeyword_1_1_1());
+                    	      								
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    if ( cnt149 >= 1 ) break loop149;
+                    	    if (state.backtracking>0) {state.failed=true; return current;}
+                                EarlyExitException eee =
+                                    new EarlyExitException(149, input);
+                                throw eee;
+                        }
+                        cnt149++;
+                    } while (true);
+
+                    if ( ! getUnorderedGroupHelper().canLeave(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_1()) ) {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        throw new FailedPredicateException(input, "ruleUiSplitpanel", "getUnorderedGroupHelper().canLeave(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_1())");
+                    }
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_1());
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:6611:3: ( (lv_name_7_0= RULE_ID ) )
+            // InternalUIGrammar.g:6612:4: (lv_name_7_0= RULE_ID )
+            {
+            // InternalUIGrammar.g:6612:4: (lv_name_7_0= RULE_ID )
+            // InternalUIGrammar.g:6613:5: lv_name_7_0= RULE_ID
+            {
+            lv_name_7_0=(Token)match(input,RULE_ID,FOLLOW_11); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_name_7_0, grammarAccess.getUiSplitpanelAccess().getNameIDTerminalRuleCall_2_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getUiSplitpanelRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"name",
+              						lv_name_7_0,
+              						"org.eclipse.xtext.xbase.Xtype.ID");
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_8=(Token)match(input,20,FOLLOW_72); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_8, grammarAccess.getUiSplitpanelAccess().getLeftCurlyBracketKeyword_3());
+              		
+            }
+            // InternalUIGrammar.g:6633:3: ( ( ( ( ({...}? => ( ({...}? => (otherlv_10= 'first' ( (lv_firstContent_11_0= ruleUiSplitpanelAssigment ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'second' ( (lv_secondContent_13_0= ruleUiSplitpanelAssigment ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'splitPos' ( (lv_splitPosition_15_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_16_0= 'readonly' ) ) ) ) ) )+ {...}?) ) )
+            // InternalUIGrammar.g:6634:4: ( ( ( ({...}? => ( ({...}? => (otherlv_10= 'first' ( (lv_firstContent_11_0= ruleUiSplitpanelAssigment ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'second' ( (lv_secondContent_13_0= ruleUiSplitpanelAssigment ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'splitPos' ( (lv_splitPosition_15_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_16_0= 'readonly' ) ) ) ) ) )+ {...}?) )
+            {
+            // InternalUIGrammar.g:6634:4: ( ( ( ({...}? => ( ({...}? => (otherlv_10= 'first' ( (lv_firstContent_11_0= ruleUiSplitpanelAssigment ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'second' ( (lv_secondContent_13_0= ruleUiSplitpanelAssigment ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'splitPos' ( (lv_splitPosition_15_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_16_0= 'readonly' ) ) ) ) ) )+ {...}?) )
+            // InternalUIGrammar.g:6635:5: ( ( ({...}? => ( ({...}? => (otherlv_10= 'first' ( (lv_firstContent_11_0= ruleUiSplitpanelAssigment ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'second' ( (lv_secondContent_13_0= ruleUiSplitpanelAssigment ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'splitPos' ( (lv_splitPosition_15_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_16_0= 'readonly' ) ) ) ) ) )+ {...}?)
+            {
+            getUnorderedGroupHelper().enter(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4());
+            // InternalUIGrammar.g:6638:5: ( ( ({...}? => ( ({...}? => (otherlv_10= 'first' ( (lv_firstContent_11_0= ruleUiSplitpanelAssigment ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'second' ( (lv_secondContent_13_0= ruleUiSplitpanelAssigment ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'splitPos' ( (lv_splitPosition_15_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_16_0= 'readonly' ) ) ) ) ) )+ {...}?)
+            // InternalUIGrammar.g:6639:6: ( ({...}? => ( ({...}? => (otherlv_10= 'first' ( (lv_firstContent_11_0= ruleUiSplitpanelAssigment ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'second' ( (lv_secondContent_13_0= ruleUiSplitpanelAssigment ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'splitPos' ( (lv_splitPosition_15_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_16_0= 'readonly' ) ) ) ) ) )+ {...}?
+            {
+            // InternalUIGrammar.g:6639:6: ( ({...}? => ( ({...}? => (otherlv_10= 'first' ( (lv_firstContent_11_0= ruleUiSplitpanelAssigment ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'second' ( (lv_secondContent_13_0= ruleUiSplitpanelAssigment ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'splitPos' ( (lv_splitPosition_15_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_16_0= 'readonly' ) ) ) ) ) )+
+            int cnt151=0;
+            loop151:
+            do {
+                int alt151=5;
+                int LA151_0 = input.LA(1);
+
+                if ( LA151_0 == 81 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4(), 0) ) {
+                    alt151=1;
+                }
+                else if ( LA151_0 == 82 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4(), 1) ) {
+                    alt151=2;
+                }
+                else if ( LA151_0 == 83 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4(), 2) ) {
+                    alt151=3;
+                }
+                else if ( LA151_0 == 65 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4(), 3) ) {
+                    alt151=4;
+                }
+
+
+                switch (alt151) {
+            	case 1 :
+            	    // InternalUIGrammar.g:6640:4: ({...}? => ( ({...}? => (otherlv_10= 'first' ( (lv_firstContent_11_0= ruleUiSplitpanelAssigment ) ) ) ) ) )
+            	    {
+            	    // InternalUIGrammar.g:6640:4: ({...}? => ( ({...}? => (otherlv_10= 'first' ( (lv_firstContent_11_0= ruleUiSplitpanelAssigment ) ) ) ) ) )
+            	    // InternalUIGrammar.g:6641:5: {...}? => ( ({...}? => (otherlv_10= 'first' ( (lv_firstContent_11_0= ruleUiSplitpanelAssigment ) ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4(), 0) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleUiSplitpanel", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4(), 0)");
+            	    }
+            	    // InternalUIGrammar.g:6641:109: ( ({...}? => (otherlv_10= 'first' ( (lv_firstContent_11_0= ruleUiSplitpanelAssigment ) ) ) ) )
+            	    // InternalUIGrammar.g:6642:6: ({...}? => (otherlv_10= 'first' ( (lv_firstContent_11_0= ruleUiSplitpanelAssigment ) ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4(), 0);
+            	    // InternalUIGrammar.g:6645:9: ({...}? => (otherlv_10= 'first' ( (lv_firstContent_11_0= ruleUiSplitpanelAssigment ) ) ) )
+            	    // InternalUIGrammar.g:6645:10: {...}? => (otherlv_10= 'first' ( (lv_firstContent_11_0= ruleUiSplitpanelAssigment ) ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleUiSplitpanel", "true");
+            	    }
+            	    // InternalUIGrammar.g:6645:19: (otherlv_10= 'first' ( (lv_firstContent_11_0= ruleUiSplitpanelAssigment ) ) )
+            	    // InternalUIGrammar.g:6645:20: otherlv_10= 'first' ( (lv_firstContent_11_0= ruleUiSplitpanelAssigment ) )
+            	    {
+            	    otherlv_10=(Token)match(input,81,FOLLOW_37); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      									newLeafNode(otherlv_10, grammarAccess.getUiSplitpanelAccess().getFirstKeyword_4_0_0());
+            	      								
+            	    }
+            	    // InternalUIGrammar.g:6649:9: ( (lv_firstContent_11_0= ruleUiSplitpanelAssigment ) )
+            	    // InternalUIGrammar.g:6650:10: (lv_firstContent_11_0= ruleUiSplitpanelAssigment )
+            	    {
+            	    // InternalUIGrammar.g:6650:10: (lv_firstContent_11_0= ruleUiSplitpanelAssigment )
+            	    // InternalUIGrammar.g:6651:11: lv_firstContent_11_0= ruleUiSplitpanelAssigment
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      											newCompositeNode(grammarAccess.getUiSplitpanelAccess().getFirstContentUiSplitpanelAssigmentParserRuleCall_4_0_1_0());
+            	      										
+            	    }
+            	    pushFollow(FOLLOW_73);
+            	    lv_firstContent_11_0=ruleUiSplitpanelAssigment();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      											if (current==null) {
+            	      												current = createModelElementForParent(grammarAccess.getUiSplitpanelRule());
+            	      											}
+            	      											set(
+            	      												current,
+            	      												"firstContent",
+            	      												lv_firstContent_11_0,
+            	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiSplitpanelAssigment");
+            	      											afterParserOrEnumRuleCall();
+            	      										
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // InternalUIGrammar.g:6674:4: ({...}? => ( ({...}? => (otherlv_12= 'second' ( (lv_secondContent_13_0= ruleUiSplitpanelAssigment ) ) ) ) ) )
+            	    {
+            	    // InternalUIGrammar.g:6674:4: ({...}? => ( ({...}? => (otherlv_12= 'second' ( (lv_secondContent_13_0= ruleUiSplitpanelAssigment ) ) ) ) ) )
+            	    // InternalUIGrammar.g:6675:5: {...}? => ( ({...}? => (otherlv_12= 'second' ( (lv_secondContent_13_0= ruleUiSplitpanelAssigment ) ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4(), 1) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleUiSplitpanel", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4(), 1)");
+            	    }
+            	    // InternalUIGrammar.g:6675:109: ( ({...}? => (otherlv_12= 'second' ( (lv_secondContent_13_0= ruleUiSplitpanelAssigment ) ) ) ) )
+            	    // InternalUIGrammar.g:6676:6: ({...}? => (otherlv_12= 'second' ( (lv_secondContent_13_0= ruleUiSplitpanelAssigment ) ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4(), 1);
+            	    // InternalUIGrammar.g:6679:9: ({...}? => (otherlv_12= 'second' ( (lv_secondContent_13_0= ruleUiSplitpanelAssigment ) ) ) )
+            	    // InternalUIGrammar.g:6679:10: {...}? => (otherlv_12= 'second' ( (lv_secondContent_13_0= ruleUiSplitpanelAssigment ) ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleUiSplitpanel", "true");
+            	    }
+            	    // InternalUIGrammar.g:6679:19: (otherlv_12= 'second' ( (lv_secondContent_13_0= ruleUiSplitpanelAssigment ) ) )
+            	    // InternalUIGrammar.g:6679:20: otherlv_12= 'second' ( (lv_secondContent_13_0= ruleUiSplitpanelAssigment ) )
+            	    {
+            	    otherlv_12=(Token)match(input,82,FOLLOW_37); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      									newLeafNode(otherlv_12, grammarAccess.getUiSplitpanelAccess().getSecondKeyword_4_1_0());
+            	      								
+            	    }
+            	    // InternalUIGrammar.g:6683:9: ( (lv_secondContent_13_0= ruleUiSplitpanelAssigment ) )
+            	    // InternalUIGrammar.g:6684:10: (lv_secondContent_13_0= ruleUiSplitpanelAssigment )
+            	    {
+            	    // InternalUIGrammar.g:6684:10: (lv_secondContent_13_0= ruleUiSplitpanelAssigment )
+            	    // InternalUIGrammar.g:6685:11: lv_secondContent_13_0= ruleUiSplitpanelAssigment
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      											newCompositeNode(grammarAccess.getUiSplitpanelAccess().getSecondContentUiSplitpanelAssigmentParserRuleCall_4_1_1_0());
+            	      										
+            	    }
+            	    pushFollow(FOLLOW_73);
+            	    lv_secondContent_13_0=ruleUiSplitpanelAssigment();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      											if (current==null) {
+            	      												current = createModelElementForParent(grammarAccess.getUiSplitpanelRule());
+            	      											}
+            	      											set(
+            	      												current,
+            	      												"secondContent",
+            	      												lv_secondContent_13_0,
+            	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiSplitpanelAssigment");
+            	      											afterParserOrEnumRuleCall();
+            	      										
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 3 :
+            	    // InternalUIGrammar.g:6708:4: ({...}? => ( ({...}? => (otherlv_14= 'splitPos' ( (lv_splitPosition_15_0= RULE_INT ) ) ) ) ) )
+            	    {
+            	    // InternalUIGrammar.g:6708:4: ({...}? => ( ({...}? => (otherlv_14= 'splitPos' ( (lv_splitPosition_15_0= RULE_INT ) ) ) ) ) )
+            	    // InternalUIGrammar.g:6709:5: {...}? => ( ({...}? => (otherlv_14= 'splitPos' ( (lv_splitPosition_15_0= RULE_INT ) ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4(), 2) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleUiSplitpanel", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4(), 2)");
+            	    }
+            	    // InternalUIGrammar.g:6709:109: ( ({...}? => (otherlv_14= 'splitPos' ( (lv_splitPosition_15_0= RULE_INT ) ) ) ) )
+            	    // InternalUIGrammar.g:6710:6: ({...}? => (otherlv_14= 'splitPos' ( (lv_splitPosition_15_0= RULE_INT ) ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4(), 2);
+            	    // InternalUIGrammar.g:6713:9: ({...}? => (otherlv_14= 'splitPos' ( (lv_splitPosition_15_0= RULE_INT ) ) ) )
+            	    // InternalUIGrammar.g:6713:10: {...}? => (otherlv_14= 'splitPos' ( (lv_splitPosition_15_0= RULE_INT ) ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleUiSplitpanel", "true");
+            	    }
+            	    // InternalUIGrammar.g:6713:19: (otherlv_14= 'splitPos' ( (lv_splitPosition_15_0= RULE_INT ) ) )
+            	    // InternalUIGrammar.g:6713:20: otherlv_14= 'splitPos' ( (lv_splitPosition_15_0= RULE_INT ) )
+            	    {
+            	    otherlv_14=(Token)match(input,83,FOLLOW_54); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      									newLeafNode(otherlv_14, grammarAccess.getUiSplitpanelAccess().getSplitPosKeyword_4_2_0());
+            	      								
+            	    }
+            	    // InternalUIGrammar.g:6717:9: ( (lv_splitPosition_15_0= RULE_INT ) )
+            	    // InternalUIGrammar.g:6718:10: (lv_splitPosition_15_0= RULE_INT )
+            	    {
+            	    // InternalUIGrammar.g:6718:10: (lv_splitPosition_15_0= RULE_INT )
+            	    // InternalUIGrammar.g:6719:11: lv_splitPosition_15_0= RULE_INT
+            	    {
+            	    lv_splitPosition_15_0=(Token)match(input,RULE_INT,FOLLOW_73); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      											newLeafNode(lv_splitPosition_15_0, grammarAccess.getUiSplitpanelAccess().getSplitPositionINTTerminalRuleCall_4_2_1_0());
+            	      										
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      											if (current==null) {
+            	      												current = createModelElement(grammarAccess.getUiSplitpanelRule());
+            	      											}
+            	      											setWithLastConsumed(
+            	      												current,
+            	      												"splitPosition",
+            	      												lv_splitPosition_15_0,
+            	      												"org.eclipse.xtext.xbase.Xbase.INT");
+            	      										
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 4 :
+            	    // InternalUIGrammar.g:6741:4: ({...}? => ( ({...}? => ( (lv_readonly_16_0= 'readonly' ) ) ) ) )
+            	    {
+            	    // InternalUIGrammar.g:6741:4: ({...}? => ( ({...}? => ( (lv_readonly_16_0= 'readonly' ) ) ) ) )
+            	    // InternalUIGrammar.g:6742:5: {...}? => ( ({...}? => ( (lv_readonly_16_0= 'readonly' ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4(), 3) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleUiSplitpanel", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4(), 3)");
+            	    }
+            	    // InternalUIGrammar.g:6742:109: ( ({...}? => ( (lv_readonly_16_0= 'readonly' ) ) ) )
+            	    // InternalUIGrammar.g:6743:6: ({...}? => ( (lv_readonly_16_0= 'readonly' ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4(), 3);
+            	    // InternalUIGrammar.g:6746:9: ({...}? => ( (lv_readonly_16_0= 'readonly' ) ) )
+            	    // InternalUIGrammar.g:6746:10: {...}? => ( (lv_readonly_16_0= 'readonly' ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleUiSplitpanel", "true");
+            	    }
+            	    // InternalUIGrammar.g:6746:19: ( (lv_readonly_16_0= 'readonly' ) )
+            	    // InternalUIGrammar.g:6746:20: (lv_readonly_16_0= 'readonly' )
+            	    {
+            	    // InternalUIGrammar.g:6746:20: (lv_readonly_16_0= 'readonly' )
+            	    // InternalUIGrammar.g:6747:10: lv_readonly_16_0= 'readonly'
+            	    {
+            	    lv_readonly_16_0=(Token)match(input,65,FOLLOW_73); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      										newLeafNode(lv_readonly_16_0, grammarAccess.getUiSplitpanelAccess().getReadonlyReadonlyKeyword_4_3_0());
+            	      									
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      										if (current==null) {
+            	      											current = createModelElement(grammarAccess.getUiSplitpanelRule());
+            	      										}
+            	      										setWithLastConsumed(current, "readonly", true, "readonly");
+            	      									
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt151 >= 1 ) break loop151;
+            	    if (state.backtracking>0) {state.failed=true; return current;}
+                        EarlyExitException eee =
+                            new EarlyExitException(151, input);
+                        throw eee;
+                }
+                cnt151++;
+            } while (true);
+
+            if ( ! getUnorderedGroupHelper().canLeave(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4()) ) {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                throw new FailedPredicateException(input, "ruleUiSplitpanel", "getUnorderedGroupHelper().canLeave(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4())");
+            }
+
+            }
+
+
+            }
+
+            getUnorderedGroupHelper().leave(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4());
+
+            }
+
+            // InternalUIGrammar.g:6772:3: ( (lv_bindings_17_0= ruleUiBinding ) )*
+            loop152:
+            do {
+                int alt152=2;
+                int LA152_0 = input.LA(1);
+
+                if ( (LA152_0==26) ) {
+                    alt152=1;
+                }
+
+
+                switch (alt152) {
+            	case 1 :
+            	    // InternalUIGrammar.g:6773:4: (lv_bindings_17_0= ruleUiBinding )
+            	    {
+            	    // InternalUIGrammar.g:6773:4: (lv_bindings_17_0= ruleUiBinding )
+            	    // InternalUIGrammar.g:6774:5: lv_bindings_17_0= ruleUiBinding
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiSplitpanelAccess().getBindingsUiBindingParserRuleCall_5_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_42);
+            	    lv_bindings_17_0=ruleUiBinding();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiSplitpanelRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"bindings",
+            	      						lv_bindings_17_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop152;
+                }
+            } while (true);
+
+            // InternalUIGrammar.g:6791:3: ( (lv_processorAssignments_18_0= ruleUiVisibilityProcessorAssignment ) )*
+            loop153:
+            do {
+                int alt153=2;
+                int LA153_0 = input.LA(1);
+
+                if ( (LA153_0==153) ) {
+                    alt153=1;
+                }
+
+
+                switch (alt153) {
+            	case 1 :
+            	    // InternalUIGrammar.g:6792:4: (lv_processorAssignments_18_0= ruleUiVisibilityProcessorAssignment )
+            	    {
+            	    // InternalUIGrammar.g:6792:4: (lv_processorAssignments_18_0= ruleUiVisibilityProcessorAssignment )
+            	    // InternalUIGrammar.g:6793:5: lv_processorAssignments_18_0= ruleUiVisibilityProcessorAssignment
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiSplitpanelAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_6_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_42);
+            	    lv_processorAssignments_18_0=ruleUiVisibilityProcessorAssignment();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiSplitpanelRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"processorAssignments",
+            	      						lv_processorAssignments_18_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop153;
+                }
+            } while (true);
+
+            otherlv_19=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_19, grammarAccess.getUiSplitpanelAccess().getRightCurlyBracketKeyword_7());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiSplitpanel"
+
+
+    // $ANTLR start "entryRuleUiSplitpanelAssigment"
+    // InternalUIGrammar.g:6818:1: entryRuleUiSplitpanelAssigment returns [EObject current=null] : iv_ruleUiSplitpanelAssigment= ruleUiSplitpanelAssigment EOF ;
+    public final EObject entryRuleUiSplitpanelAssigment() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiSplitpanelAssigment = null;
+
+
+        try {
+            // InternalUIGrammar.g:6818:62: (iv_ruleUiSplitpanelAssigment= ruleUiSplitpanelAssigment EOF )
+            // InternalUIGrammar.g:6819:2: iv_ruleUiSplitpanelAssigment= ruleUiSplitpanelAssigment EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiSplitpanelAssigmentRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiSplitpanelAssigment=ruleUiSplitpanelAssigment();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiSplitpanelAssigment; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiSplitpanelAssigment"
+
+
+    // $ANTLR start "ruleUiSplitpanelAssigment"
+    // InternalUIGrammar.g:6825:1: ruleUiSplitpanelAssigment returns [EObject current=null] : ( (lv_element_0_0= ruleUiEmbeddable ) ) ;
+    public final EObject ruleUiSplitpanelAssigment() throws RecognitionException {
+        EObject current = null;
+
+        EObject lv_element_0_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:6831:2: ( ( (lv_element_0_0= ruleUiEmbeddable ) ) )
+            // InternalUIGrammar.g:6832:2: ( (lv_element_0_0= ruleUiEmbeddable ) )
+            {
+            // InternalUIGrammar.g:6832:2: ( (lv_element_0_0= ruleUiEmbeddable ) )
+            // InternalUIGrammar.g:6833:3: (lv_element_0_0= ruleUiEmbeddable )
+            {
+            // InternalUIGrammar.g:6833:3: (lv_element_0_0= ruleUiEmbeddable )
+            // InternalUIGrammar.g:6834:4: lv_element_0_0= ruleUiEmbeddable
+            {
+            if ( state.backtracking==0 ) {
+
+              				newCompositeNode(grammarAccess.getUiSplitpanelAssigmentAccess().getElementUiEmbeddableParserRuleCall_0());
+              			
+            }
+            pushFollow(FOLLOW_2);
+            lv_element_0_0=ruleUiEmbeddable();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              				if (current==null) {
+              					current = createModelElementForParent(grammarAccess.getUiSplitpanelAssigmentRule());
+              				}
+              				set(
+              					current,
+              					"element",
+              					lv_element_0_0,
+              					"org.eclipse.osbp.ecview.dsl.UIGrammar.UiEmbeddable");
+              				afterParserOrEnumRuleCall();
+              			
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiSplitpanelAssigment"
+
+
+    // $ANTLR start "entryRuleUiPanel"
+    // InternalUIGrammar.g:6854:1: entryRuleUiPanel returns [EObject current=null] : iv_ruleUiPanel= ruleUiPanel EOF ;
+    public final EObject entryRuleUiPanel() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiPanel = null;
+
+
+        try {
+            // InternalUIGrammar.g:6854:48: (iv_ruleUiPanel= ruleUiPanel EOF )
+            // InternalUIGrammar.g:6855:2: iv_ruleUiPanel= ruleUiPanel EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiPanelRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiPanel=ruleUiPanel();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiPanel; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiPanel"
+
+
+    // $ANTLR start "ruleUiPanel"
+    // InternalUIGrammar.g:6861:1: ruleUiPanel returns [EObject current=null] : (otherlv_0= 'panel' (otherlv_1= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_4_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) ) otherlv_9= '{' otherlv_10= 'content' ( (lv_content_11_0= ruleUiEmbeddable ) ) ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' ) ;
+    public final EObject ruleUiPanel() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_1=null;
+        Token lv_readonly_4_0=null;
+        Token otherlv_5=null;
+        Token lv_styles_6_0=null;
+        Token otherlv_7=null;
+        Token lv_name_8_0=null;
+        Token otherlv_9=null;
+        Token otherlv_10=null;
+        Token otherlv_14=null;
+        EObject lv_i18nInfo_3_0 = null;
+
+        EObject lv_content_11_0 = null;
+
+        EObject lv_bindings_12_0 = null;
+
+        EObject lv_processorAssignments_13_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:6867:2: ( (otherlv_0= 'panel' (otherlv_1= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_4_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) ) otherlv_9= '{' otherlv_10= 'content' ( (lv_content_11_0= ruleUiEmbeddable ) ) ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' ) )
+            // InternalUIGrammar.g:6868:2: (otherlv_0= 'panel' (otherlv_1= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_4_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) ) otherlv_9= '{' otherlv_10= 'content' ( (lv_content_11_0= ruleUiEmbeddable ) ) ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )
+            {
+            // InternalUIGrammar.g:6868:2: (otherlv_0= 'panel' (otherlv_1= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_4_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) ) otherlv_9= '{' otherlv_10= 'content' ( (lv_content_11_0= ruleUiEmbeddable ) ) ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )
+            // InternalUIGrammar.g:6869:3: otherlv_0= 'panel' (otherlv_1= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_4_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) ) otherlv_9= '{' otherlv_10= 'content' ( (lv_content_11_0= ruleUiEmbeddable ) ) ( (lv_bindings_12_0= ruleUiBinding ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}'
+            {
+            otherlv_0=(Token)match(input,84,FOLLOW_74); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getUiPanelAccess().getPanelKeyword_0());
+              		
+            }
+            // InternalUIGrammar.g:6873:3: (otherlv_1= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_4_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )?
+            int alt155=2;
+            int LA155_0 = input.LA(1);
+
+            if ( (LA155_0==45) ) {
+                alt155=1;
+            }
+            switch (alt155) {
+                case 1 :
+                    // InternalUIGrammar.g:6874:4: otherlv_1= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_4_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')'
+                    {
+                    otherlv_1=(Token)match(input,45,FOLLOW_62); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_1, grammarAccess.getUiPanelAccess().getLeftParenthesisKeyword_1_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:6878:4: ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_4_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:6879:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_4_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:6879:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_4_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:6880:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_4_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1());
+                    // InternalUIGrammar.g:6883:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_4_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:6884:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_4_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:6884:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_4_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )*
+                    loop154:
+                    do {
+                        int alt154=4;
+                        int LA154_0 = input.LA(1);
+
+                        if ( LA154_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1(), 0) ) {
+                            alt154=1;
+                        }
+                        else if ( LA154_0 == 65 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1(), 1) ) {
+                            alt154=2;
+                        }
+                        else if ( LA154_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1(), 2) ) {
+                            alt154=3;
+                        }
+
+
+                        switch (alt154) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:6885:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:6885:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) ) ) ) )
+                    	    // InternalUIGrammar.g:6886:6: {...}? => ( ({...}? => ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiPanel", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:6886:107: ( ({...}? => ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) ) ) )
+                    	    // InternalUIGrammar.g:6887:7: ({...}? => ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1(), 0);
+                    	    // InternalUIGrammar.g:6890:10: ({...}? => ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) ) )
+                    	    // InternalUIGrammar.g:6890:11: {...}? => ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiPanel", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:6890:20: ( (lv_i18nInfo_3_0= ruleUiI18nInfo ) )
+                    	    // InternalUIGrammar.g:6890:21: (lv_i18nInfo_3_0= ruleUiI18nInfo )
+                    	    {
+                    	    // InternalUIGrammar.g:6890:21: (lv_i18nInfo_3_0= ruleUiI18nInfo )
+                    	    // InternalUIGrammar.g:6891:11: lv_i18nInfo_3_0= ruleUiI18nInfo
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getUiPanelAccess().getI18nInfoUiI18nInfoParserRuleCall_1_1_0_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_62);
+                    	    lv_i18nInfo_3_0=ruleUiI18nInfo();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getUiPanelRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"i18nInfo",
+                    	      												lv_i18nInfo_3_0,
+                    	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:6913:5: ({...}? => ( ({...}? => ( (lv_readonly_4_0= 'readonly' ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:6913:5: ({...}? => ( ({...}? => ( (lv_readonly_4_0= 'readonly' ) ) ) ) )
+                    	    // InternalUIGrammar.g:6914:6: {...}? => ( ({...}? => ( (lv_readonly_4_0= 'readonly' ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiPanel", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:6914:107: ( ({...}? => ( (lv_readonly_4_0= 'readonly' ) ) ) )
+                    	    // InternalUIGrammar.g:6915:7: ({...}? => ( (lv_readonly_4_0= 'readonly' ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1(), 1);
+                    	    // InternalUIGrammar.g:6918:10: ({...}? => ( (lv_readonly_4_0= 'readonly' ) ) )
+                    	    // InternalUIGrammar.g:6918:11: {...}? => ( (lv_readonly_4_0= 'readonly' ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiPanel", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:6918:20: ( (lv_readonly_4_0= 'readonly' ) )
+                    	    // InternalUIGrammar.g:6918:21: (lv_readonly_4_0= 'readonly' )
+                    	    {
+                    	    // InternalUIGrammar.g:6918:21: (lv_readonly_4_0= 'readonly' )
+                    	    // InternalUIGrammar.g:6919:11: lv_readonly_4_0= 'readonly'
+                    	    {
+                    	    lv_readonly_4_0=(Token)match(input,65,FOLLOW_62); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newLeafNode(lv_readonly_4_0, grammarAccess.getUiPanelAccess().getReadonlyReadonlyKeyword_1_1_1_0());
+                    	      										
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElement(grammarAccess.getUiPanelRule());
+                    	      											}
+                    	      											setWithLastConsumed(current, "readonly", true, "readonly");
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 3 :
+                    	    // InternalUIGrammar.g:6936:5: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:6936:5: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:6937:6: {...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1(), 2) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiPanel", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1(), 2)");
+                    	    }
+                    	    // InternalUIGrammar.g:6937:107: ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:6938:7: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1(), 2);
+                    	    // InternalUIGrammar.g:6941:10: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:6941:11: {...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiPanel", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:6941:20: (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:6941:21: otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_5=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_5, grammarAccess.getUiPanelAccess().getStylesKeyword_1_1_2_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:6945:10: ( (lv_styles_6_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:6946:11: (lv_styles_6_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:6946:11: (lv_styles_6_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:6947:12: lv_styles_6_0= RULE_STRING
+                    	    {
+                    	    lv_styles_6_0=(Token)match(input,RULE_STRING,FOLLOW_62); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_styles_6_0, grammarAccess.getUiPanelAccess().getStylesSTRINGTerminalRuleCall_1_1_2_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiPanelRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"styles",
+                    	      													lv_styles_6_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop154;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1());
+
+                    }
+
+                    otherlv_7=(Token)match(input,47,FOLLOW_3); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_7, grammarAccess.getUiPanelAccess().getRightParenthesisKeyword_1_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:6981:3: ( (lv_name_8_0= RULE_ID ) )
+            // InternalUIGrammar.g:6982:4: (lv_name_8_0= RULE_ID )
+            {
+            // InternalUIGrammar.g:6982:4: (lv_name_8_0= RULE_ID )
+            // InternalUIGrammar.g:6983:5: lv_name_8_0= RULE_ID
+            {
+            lv_name_8_0=(Token)match(input,RULE_ID,FOLLOW_11); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_name_8_0, grammarAccess.getUiPanelAccess().getNameIDTerminalRuleCall_2_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getUiPanelRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"name",
+              						lv_name_8_0,
+              						"org.eclipse.xtext.xbase.Xtype.ID");
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_9=(Token)match(input,20,FOLLOW_75); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_9, grammarAccess.getUiPanelAccess().getLeftCurlyBracketKeyword_3());
+              		
+            }
+            otherlv_10=(Token)match(input,85,FOLLOW_37); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_10, grammarAccess.getUiPanelAccess().getContentKeyword_4());
+              		
+            }
+            // InternalUIGrammar.g:7007:3: ( (lv_content_11_0= ruleUiEmbeddable ) )
+            // InternalUIGrammar.g:7008:4: (lv_content_11_0= ruleUiEmbeddable )
+            {
+            // InternalUIGrammar.g:7008:4: (lv_content_11_0= ruleUiEmbeddable )
+            // InternalUIGrammar.g:7009:5: lv_content_11_0= ruleUiEmbeddable
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getUiPanelAccess().getContentUiEmbeddableParserRuleCall_5_0());
+              				
+            }
+            pushFollow(FOLLOW_42);
+            lv_content_11_0=ruleUiEmbeddable();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getUiPanelRule());
+              					}
+              					set(
+              						current,
+              						"content",
+              						lv_content_11_0,
+              						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiEmbeddable");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalUIGrammar.g:7026:3: ( (lv_bindings_12_0= ruleUiBinding ) )*
+            loop156:
+            do {
+                int alt156=2;
+                int LA156_0 = input.LA(1);
+
+                if ( (LA156_0==26) ) {
+                    alt156=1;
+                }
+
+
+                switch (alt156) {
+            	case 1 :
+            	    // InternalUIGrammar.g:7027:4: (lv_bindings_12_0= ruleUiBinding )
+            	    {
+            	    // InternalUIGrammar.g:7027:4: (lv_bindings_12_0= ruleUiBinding )
+            	    // InternalUIGrammar.g:7028:5: lv_bindings_12_0= ruleUiBinding
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiPanelAccess().getBindingsUiBindingParserRuleCall_6_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_42);
+            	    lv_bindings_12_0=ruleUiBinding();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiPanelRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"bindings",
+            	      						lv_bindings_12_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop156;
+                }
+            } while (true);
+
+            // InternalUIGrammar.g:7045:3: ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )*
+            loop157:
+            do {
+                int alt157=2;
+                int LA157_0 = input.LA(1);
+
+                if ( (LA157_0==153) ) {
+                    alt157=1;
+                }
+
+
+                switch (alt157) {
+            	case 1 :
+            	    // InternalUIGrammar.g:7046:4: (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment )
+            	    {
+            	    // InternalUIGrammar.g:7046:4: (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment )
+            	    // InternalUIGrammar.g:7047:5: lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiPanelAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_42);
+            	    lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiPanelRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"processorAssignments",
+            	      						lv_processorAssignments_13_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop157;
+                }
+            } while (true);
+
+            otherlv_14=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_14, grammarAccess.getUiPanelAccess().getRightCurlyBracketKeyword_8());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiPanel"
+
+
+    // $ANTLR start "entryRuleUiDialog"
+    // InternalUIGrammar.g:7072:1: entryRuleUiDialog returns [EObject current=null] : iv_ruleUiDialog= ruleUiDialog EOF ;
+    public final EObject entryRuleUiDialog() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiDialog = null;
+
+
+        try {
+            // InternalUIGrammar.g:7072:49: (iv_ruleUiDialog= ruleUiDialog EOF )
+            // InternalUIGrammar.g:7073:2: iv_ruleUiDialog= ruleUiDialog EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiDialogRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiDialog=ruleUiDialog();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiDialog; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiDialog"
+
+
+    // $ANTLR start "ruleUiDialog"
+    // InternalUIGrammar.g:7079:1: ruleUiDialog returns [EObject current=null] : ( () otherlv_1= 'dialog' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? otherlv_9= '{' (otherlv_10= 'type' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? )? ( ( (lv_content_13_0= ruleUiDialogAssignment ) ) (otherlv_14= ';' )? )? ( (lv_bindings_15_0= ruleUiBinding ) )* ( (lv_processorAssignments_16_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_17= '}' ) ;
+    public final EObject ruleUiDialog() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_5=null;
+        Token lv_styles_6_0=null;
+        Token otherlv_7=null;
+        Token lv_name_8_0=null;
+        Token otherlv_9=null;
+        Token otherlv_10=null;
+        Token otherlv_12=null;
+        Token otherlv_14=null;
+        Token otherlv_17=null;
+        EObject lv_i18nInfo_4_0 = null;
+
+        EObject lv_jvmType_11_0 = null;
+
+        EObject lv_content_13_0 = null;
+
+        EObject lv_bindings_15_0 = null;
+
+        EObject lv_processorAssignments_16_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:7085:2: ( ( () otherlv_1= 'dialog' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? otherlv_9= '{' (otherlv_10= 'type' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? )? ( ( (lv_content_13_0= ruleUiDialogAssignment ) ) (otherlv_14= ';' )? )? ( (lv_bindings_15_0= ruleUiBinding ) )* ( (lv_processorAssignments_16_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_17= '}' ) )
+            // InternalUIGrammar.g:7086:2: ( () otherlv_1= 'dialog' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? otherlv_9= '{' (otherlv_10= 'type' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? )? ( ( (lv_content_13_0= ruleUiDialogAssignment ) ) (otherlv_14= ';' )? )? ( (lv_bindings_15_0= ruleUiBinding ) )* ( (lv_processorAssignments_16_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_17= '}' )
+            {
+            // InternalUIGrammar.g:7086:2: ( () otherlv_1= 'dialog' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? otherlv_9= '{' (otherlv_10= 'type' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? )? ( ( (lv_content_13_0= ruleUiDialogAssignment ) ) (otherlv_14= ';' )? )? ( (lv_bindings_15_0= ruleUiBinding ) )* ( (lv_processorAssignments_16_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_17= '}' )
+            // InternalUIGrammar.g:7087:3: () otherlv_1= 'dialog' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? otherlv_9= '{' (otherlv_10= 'type' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? )? ( ( (lv_content_13_0= ruleUiDialogAssignment ) ) (otherlv_14= ';' )? )? ( (lv_bindings_15_0= ruleUiBinding ) )* ( (lv_processorAssignments_16_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_17= '}'
+            {
+            // InternalUIGrammar.g:7087:3: ()
+            // InternalUIGrammar.g:7088:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiDialogAccess().getUiDialogAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,86,FOLLOW_52); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiDialogAccess().getDialogKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:7098:3: (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )?
+            int alt159=2;
+            int LA159_0 = input.LA(1);
+
+            if ( (LA159_0==45) ) {
+                alt159=1;
+            }
+            switch (alt159) {
+                case 1 :
+                    // InternalUIGrammar.g:7099:4: otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')'
+                    {
+                    otherlv_2=(Token)match(input,45,FOLLOW_63); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getUiDialogAccess().getLeftParenthesisKeyword_2_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:7103:4: ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:7104:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:7104:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:7105:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiDialogAccess().getUnorderedGroup_2_1());
+                    // InternalUIGrammar.g:7108:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:7109:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:7109:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )*
+                    loop158:
+                    do {
+                        int alt158=3;
+                        int LA158_0 = input.LA(1);
+
+                        if ( LA158_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiDialogAccess().getUnorderedGroup_2_1(), 0) ) {
+                            alt158=1;
+                        }
+                        else if ( LA158_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiDialogAccess().getUnorderedGroup_2_1(), 1) ) {
+                            alt158=2;
+                        }
+
+
+                        switch (alt158) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:7110:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:7110:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    // InternalUIGrammar.g:7111:6: {...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiDialogAccess().getUnorderedGroup_2_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiDialog", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiDialogAccess().getUnorderedGroup_2_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:7111:108: ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    // InternalUIGrammar.g:7112:7: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiDialogAccess().getUnorderedGroup_2_1(), 0);
+                    	    // InternalUIGrammar.g:7115:10: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    // InternalUIGrammar.g:7115:11: {...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiDialog", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:7115:20: ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    // InternalUIGrammar.g:7115:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    {
+                    	    // InternalUIGrammar.g:7115:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    // InternalUIGrammar.g:7116:11: lv_i18nInfo_4_0= ruleUiI18nInfo
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getUiDialogAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_63);
+                    	    lv_i18nInfo_4_0=ruleUiI18nInfo();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getUiDialogRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"i18nInfo",
+                    	      												lv_i18nInfo_4_0,
+                    	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDialogAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:7138:5: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:7138:5: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:7139:6: {...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiDialogAccess().getUnorderedGroup_2_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiDialog", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiDialogAccess().getUnorderedGroup_2_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:7139:108: ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:7140:7: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiDialogAccess().getUnorderedGroup_2_1(), 1);
+                    	    // InternalUIGrammar.g:7143:10: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:7143:11: {...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiDialog", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:7143:20: (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:7143:21: otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_5=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_5, grammarAccess.getUiDialogAccess().getStylesKeyword_2_1_1_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:7147:10: ( (lv_styles_6_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:7148:11: (lv_styles_6_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:7148:11: (lv_styles_6_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:7149:12: lv_styles_6_0= RULE_STRING
+                    	    {
+                    	    lv_styles_6_0=(Token)match(input,RULE_STRING,FOLLOW_63); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_styles_6_0, grammarAccess.getUiDialogAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiDialogRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"styles",
+                    	      													lv_styles_6_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDialogAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop158;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiDialogAccess().getUnorderedGroup_2_1());
+
+                    }
+
+                    otherlv_7=(Token)match(input,47,FOLLOW_55); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_7, grammarAccess.getUiDialogAccess().getRightParenthesisKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:7183:3: ( (lv_name_8_0= RULE_ID ) )?
+            int alt160=2;
+            int LA160_0 = input.LA(1);
+
+            if ( (LA160_0==RULE_ID) ) {
+                alt160=1;
+            }
+            switch (alt160) {
+                case 1 :
+                    // InternalUIGrammar.g:7184:4: (lv_name_8_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:7184:4: (lv_name_8_0= RULE_ID )
+                    // InternalUIGrammar.g:7185:5: lv_name_8_0= RULE_ID
+                    {
+                    lv_name_8_0=(Token)match(input,RULE_ID,FOLLOW_11); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_8_0, grammarAccess.getUiDialogAccess().getNameIDTerminalRuleCall_3_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiDialogRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_8_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_9=(Token)match(input,20,FOLLOW_76); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_9, grammarAccess.getUiDialogAccess().getLeftCurlyBracketKeyword_4());
+              		
+            }
+            // InternalUIGrammar.g:7205:3: (otherlv_10= 'type' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? )?
+            int alt162=2;
+            int LA162_0 = input.LA(1);
+
+            if ( (LA162_0==75) ) {
+                alt162=1;
+            }
+            switch (alt162) {
+                case 1 :
+                    // InternalUIGrammar.g:7206:4: otherlv_10= 'type' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )?
+                    {
+                    otherlv_10=(Token)match(input,75,FOLLOW_16); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_10, grammarAccess.getUiDialogAccess().getTypeKeyword_5_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:7210:4: ( (lv_jvmType_11_0= ruleJvmTypeReference ) )
+                    // InternalUIGrammar.g:7211:5: (lv_jvmType_11_0= ruleJvmTypeReference )
+                    {
+                    // InternalUIGrammar.g:7211:5: (lv_jvmType_11_0= ruleJvmTypeReference )
+                    // InternalUIGrammar.g:7212:6: lv_jvmType_11_0= ruleJvmTypeReference
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getUiDialogAccess().getJvmTypeJvmTypeReferenceParserRuleCall_5_1_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_77);
+                    lv_jvmType_11_0=ruleJvmTypeReference();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getUiDialogRule());
+                      						}
+                      						set(
+                      							current,
+                      							"jvmType",
+                      							lv_jvmType_11_0,
+                      							"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalUIGrammar.g:7229:4: (otherlv_12= ';' )?
+                    int alt161=2;
+                    int LA161_0 = input.LA(1);
+
+                    if ( (LA161_0==16) ) {
+                        alt161=1;
+                    }
+                    switch (alt161) {
+                        case 1 :
+                            // InternalUIGrammar.g:7230:5: otherlv_12= ';'
+                            {
+                            otherlv_12=(Token)match(input,16,FOLLOW_56); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(otherlv_12, grammarAccess.getUiDialogAccess().getSemicolonKeyword_5_2());
+                              				
+                            }
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:7236:3: ( ( (lv_content_13_0= ruleUiDialogAssignment ) ) (otherlv_14= ';' )? )?
+            int alt164=2;
+            int LA164_0 = input.LA(1);
+
+            if ( (LA164_0==62||(LA164_0>=66 && LA164_0<=67)||LA164_0==70||LA164_0==74||(LA164_0>=79 && LA164_0<=80)||LA164_0==84||LA164_0==91||(LA164_0>=95 && LA164_0<=96)||(LA164_0>=98 && LA164_0<=100)||LA164_0==105||LA164_0==107||LA164_0==112||(LA164_0>=117 && LA164_0<=122)||LA164_0==124||(LA164_0>=128 && LA164_0<=129)||(LA164_0>=133 && LA164_0<=134)||(LA164_0>=138 && LA164_0<=139)||(LA164_0>=145 && LA164_0<=146)) ) {
+                alt164=1;
+            }
+            switch (alt164) {
+                case 1 :
+                    // InternalUIGrammar.g:7237:4: ( (lv_content_13_0= ruleUiDialogAssignment ) ) (otherlv_14= ';' )?
+                    {
+                    // InternalUIGrammar.g:7237:4: ( (lv_content_13_0= ruleUiDialogAssignment ) )
+                    // InternalUIGrammar.g:7238:5: (lv_content_13_0= ruleUiDialogAssignment )
+                    {
+                    // InternalUIGrammar.g:7238:5: (lv_content_13_0= ruleUiDialogAssignment )
+                    // InternalUIGrammar.g:7239:6: lv_content_13_0= ruleUiDialogAssignment
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getUiDialogAccess().getContentUiDialogAssignmentParserRuleCall_6_0_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_78);
+                    lv_content_13_0=ruleUiDialogAssignment();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getUiDialogRule());
+                      						}
+                      						set(
+                      							current,
+                      							"content",
+                      							lv_content_13_0,
+                      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiDialogAssignment");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalUIGrammar.g:7256:4: (otherlv_14= ';' )?
+                    int alt163=2;
+                    int LA163_0 = input.LA(1);
+
+                    if ( (LA163_0==16) ) {
+                        alt163=1;
+                    }
+                    switch (alt163) {
+                        case 1 :
+                            // InternalUIGrammar.g:7257:5: otherlv_14= ';'
+                            {
+                            otherlv_14=(Token)match(input,16,FOLLOW_42); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(otherlv_14, grammarAccess.getUiDialogAccess().getSemicolonKeyword_6_1());
+                              				
+                            }
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:7263:3: ( (lv_bindings_15_0= ruleUiBinding ) )*
+            loop165:
+            do {
+                int alt165=2;
+                int LA165_0 = input.LA(1);
+
+                if ( (LA165_0==26) ) {
+                    alt165=1;
+                }
+
+
+                switch (alt165) {
+            	case 1 :
+            	    // InternalUIGrammar.g:7264:4: (lv_bindings_15_0= ruleUiBinding )
+            	    {
+            	    // InternalUIGrammar.g:7264:4: (lv_bindings_15_0= ruleUiBinding )
+            	    // InternalUIGrammar.g:7265:5: lv_bindings_15_0= ruleUiBinding
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiDialogAccess().getBindingsUiBindingParserRuleCall_7_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_42);
+            	    lv_bindings_15_0=ruleUiBinding();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiDialogRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"bindings",
+            	      						lv_bindings_15_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop165;
+                }
+            } while (true);
+
+            // InternalUIGrammar.g:7282:3: ( (lv_processorAssignments_16_0= ruleUiVisibilityProcessorAssignment ) )*
+            loop166:
+            do {
+                int alt166=2;
+                int LA166_0 = input.LA(1);
+
+                if ( (LA166_0==153) ) {
+                    alt166=1;
+                }
+
+
+                switch (alt166) {
+            	case 1 :
+            	    // InternalUIGrammar.g:7283:4: (lv_processorAssignments_16_0= ruleUiVisibilityProcessorAssignment )
+            	    {
+            	    // InternalUIGrammar.g:7283:4: (lv_processorAssignments_16_0= ruleUiVisibilityProcessorAssignment )
+            	    // InternalUIGrammar.g:7284:5: lv_processorAssignments_16_0= ruleUiVisibilityProcessorAssignment
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiDialogAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_8_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_42);
+            	    lv_processorAssignments_16_0=ruleUiVisibilityProcessorAssignment();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiDialogRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"processorAssignments",
+            	      						lv_processorAssignments_16_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop166;
+                }
+            } while (true);
+
+            otherlv_17=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_17, grammarAccess.getUiDialogAccess().getRightCurlyBracketKeyword_9());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiDialog"
+
+
+    // $ANTLR start "entryRuleUiDialogAssignment"
+    // InternalUIGrammar.g:7309:1: entryRuleUiDialogAssignment returns [EObject current=null] : iv_ruleUiDialogAssignment= ruleUiDialogAssignment EOF ;
+    public final EObject entryRuleUiDialogAssignment() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiDialogAssignment = null;
+
+
+        try {
+            // InternalUIGrammar.g:7309:59: (iv_ruleUiDialogAssignment= ruleUiDialogAssignment EOF )
+            // InternalUIGrammar.g:7310:2: iv_ruleUiDialogAssignment= ruleUiDialogAssignment EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiDialogAssignmentRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiDialogAssignment=ruleUiDialogAssignment();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiDialogAssignment; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiDialogAssignment"
+
+
+    // $ANTLR start "ruleUiDialogAssignment"
+    // InternalUIGrammar.g:7316:1: ruleUiDialogAssignment returns [EObject current=null] : ( (lv_element_0_0= ruleUiEmbeddable ) ) ;
+    public final EObject ruleUiDialogAssignment() throws RecognitionException {
+        EObject current = null;
+
+        EObject lv_element_0_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:7322:2: ( ( (lv_element_0_0= ruleUiEmbeddable ) ) )
+            // InternalUIGrammar.g:7323:2: ( (lv_element_0_0= ruleUiEmbeddable ) )
+            {
+            // InternalUIGrammar.g:7323:2: ( (lv_element_0_0= ruleUiEmbeddable ) )
+            // InternalUIGrammar.g:7324:3: (lv_element_0_0= ruleUiEmbeddable )
+            {
+            // InternalUIGrammar.g:7324:3: (lv_element_0_0= ruleUiEmbeddable )
+            // InternalUIGrammar.g:7325:4: lv_element_0_0= ruleUiEmbeddable
+            {
+            if ( state.backtracking==0 ) {
+
+              				newCompositeNode(grammarAccess.getUiDialogAssignmentAccess().getElementUiEmbeddableParserRuleCall_0());
+              			
+            }
+            pushFollow(FOLLOW_2);
+            lv_element_0_0=ruleUiEmbeddable();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              				if (current==null) {
+              					current = createModelElementForParent(grammarAccess.getUiDialogAssignmentRule());
+              				}
+              				set(
+              					current,
+              					"element",
+              					lv_element_0_0,
+              					"org.eclipse.osbp.ecview.dsl.UIGrammar.UiEmbeddable");
+              				afterParserOrEnumRuleCall();
+              			
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiDialogAssignment"
+
+
+    // $ANTLR start "entryRuleUiSearchDialog"
+    // InternalUIGrammar.g:7345:1: entryRuleUiSearchDialog returns [EObject current=null] : iv_ruleUiSearchDialog= ruleUiSearchDialog EOF ;
+    public final EObject entryRuleUiSearchDialog() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiSearchDialog = null;
+
+
+        try {
+            // InternalUIGrammar.g:7345:55: (iv_ruleUiSearchDialog= ruleUiSearchDialog EOF )
+            // InternalUIGrammar.g:7346:2: iv_ruleUiSearchDialog= ruleUiSearchDialog EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiSearchDialogRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiSearchDialog=ruleUiSearchDialog();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiSearchDialog; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiSearchDialog"
+
+
+    // $ANTLR start "ruleUiSearchDialog"
+    // InternalUIGrammar.g:7352:1: ruleUiSearchDialog returns [EObject current=null] : ( () otherlv_1= 'searchdialog' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? otherlv_9= '{' (otherlv_10= 'type' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) )? (otherlv_12= 'search' otherlv_13= '{' ( (lv_searchFields_14_0= ruleUiDialogSearchFieldAssignment ) )* otherlv_15= '}' )? (otherlv_16= 'content' otherlv_17= '{' ( (lv_content_18_0= ruleUiDialogAssignment ) ) otherlv_19= '}' )? ( (lv_bindings_20_0= ruleUiBinding ) )* ( (lv_processorAssignments_21_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_22= '}' ) ;
+    public final EObject ruleUiSearchDialog() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_5=null;
+        Token lv_styles_6_0=null;
+        Token otherlv_7=null;
+        Token lv_name_8_0=null;
+        Token otherlv_9=null;
+        Token otherlv_10=null;
+        Token otherlv_12=null;
+        Token otherlv_13=null;
+        Token otherlv_15=null;
+        Token otherlv_16=null;
+        Token otherlv_17=null;
+        Token otherlv_19=null;
+        Token otherlv_22=null;
+        EObject lv_i18nInfo_4_0 = null;
+
+        EObject lv_jvmType_11_0 = null;
+
+        EObject lv_searchFields_14_0 = null;
+
+        EObject lv_content_18_0 = null;
+
+        EObject lv_bindings_20_0 = null;
+
+        EObject lv_processorAssignments_21_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:7358:2: ( ( () otherlv_1= 'searchdialog' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? otherlv_9= '{' (otherlv_10= 'type' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) )? (otherlv_12= 'search' otherlv_13= '{' ( (lv_searchFields_14_0= ruleUiDialogSearchFieldAssignment ) )* otherlv_15= '}' )? (otherlv_16= 'content' otherlv_17= '{' ( (lv_content_18_0= ruleUiDialogAssignment ) ) otherlv_19= '}' )? ( (lv_bindings_20_0= ruleUiBinding ) )* ( (lv_processorAssignments_21_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_22= '}' ) )
+            // InternalUIGrammar.g:7359:2: ( () otherlv_1= 'searchdialog' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? otherlv_9= '{' (otherlv_10= 'type' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) )? (otherlv_12= 'search' otherlv_13= '{' ( (lv_searchFields_14_0= ruleUiDialogSearchFieldAssignment ) )* otherlv_15= '}' )? (otherlv_16= 'content' otherlv_17= '{' ( (lv_content_18_0= ruleUiDialogAssignment ) ) otherlv_19= '}' )? ( (lv_bindings_20_0= ruleUiBinding ) )* ( (lv_processorAssignments_21_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_22= '}' )
+            {
+            // InternalUIGrammar.g:7359:2: ( () otherlv_1= 'searchdialog' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? otherlv_9= '{' (otherlv_10= 'type' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) )? (otherlv_12= 'search' otherlv_13= '{' ( (lv_searchFields_14_0= ruleUiDialogSearchFieldAssignment ) )* otherlv_15= '}' )? (otherlv_16= 'content' otherlv_17= '{' ( (lv_content_18_0= ruleUiDialogAssignment ) ) otherlv_19= '}' )? ( (lv_bindings_20_0= ruleUiBinding ) )* ( (lv_processorAssignments_21_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_22= '}' )
+            // InternalUIGrammar.g:7360:3: () otherlv_1= 'searchdialog' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? otherlv_9= '{' (otherlv_10= 'type' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) )? (otherlv_12= 'search' otherlv_13= '{' ( (lv_searchFields_14_0= ruleUiDialogSearchFieldAssignment ) )* otherlv_15= '}' )? (otherlv_16= 'content' otherlv_17= '{' ( (lv_content_18_0= ruleUiDialogAssignment ) ) otherlv_19= '}' )? ( (lv_bindings_20_0= ruleUiBinding ) )* ( (lv_processorAssignments_21_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_22= '}'
+            {
+            // InternalUIGrammar.g:7360:3: ()
+            // InternalUIGrammar.g:7361:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiSearchDialogAccess().getUiSearchDialogAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,87,FOLLOW_52); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiSearchDialogAccess().getSearchdialogKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:7371:3: (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )?
+            int alt168=2;
+            int LA168_0 = input.LA(1);
+
+            if ( (LA168_0==45) ) {
+                alt168=1;
+            }
+            switch (alt168) {
+                case 1 :
+                    // InternalUIGrammar.g:7372:4: otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')'
+                    {
+                    otherlv_2=(Token)match(input,45,FOLLOW_63); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getUiSearchDialogAccess().getLeftParenthesisKeyword_2_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:7376:4: ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:7377:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:7377:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:7378:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiSearchDialogAccess().getUnorderedGroup_2_1());
+                    // InternalUIGrammar.g:7381:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:7382:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:7382:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )*
+                    loop167:
+                    do {
+                        int alt167=3;
+                        int LA167_0 = input.LA(1);
+
+                        if ( LA167_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiSearchDialogAccess().getUnorderedGroup_2_1(), 0) ) {
+                            alt167=1;
+                        }
+                        else if ( LA167_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiSearchDialogAccess().getUnorderedGroup_2_1(), 1) ) {
+                            alt167=2;
+                        }
+
+
+                        switch (alt167) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:7383:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:7383:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    // InternalUIGrammar.g:7384:6: {...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiSearchDialogAccess().getUnorderedGroup_2_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiSearchDialog", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiSearchDialogAccess().getUnorderedGroup_2_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:7384:114: ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    // InternalUIGrammar.g:7385:7: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiSearchDialogAccess().getUnorderedGroup_2_1(), 0);
+                    	    // InternalUIGrammar.g:7388:10: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    // InternalUIGrammar.g:7388:11: {...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiSearchDialog", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:7388:20: ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    // InternalUIGrammar.g:7388:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    {
+                    	    // InternalUIGrammar.g:7388:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    // InternalUIGrammar.g:7389:11: lv_i18nInfo_4_0= ruleUiI18nInfo
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getUiSearchDialogAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_63);
+                    	    lv_i18nInfo_4_0=ruleUiI18nInfo();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getUiSearchDialogRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"i18nInfo",
+                    	      												lv_i18nInfo_4_0,
+                    	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSearchDialogAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:7411:5: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:7411:5: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:7412:6: {...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiSearchDialogAccess().getUnorderedGroup_2_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiSearchDialog", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiSearchDialogAccess().getUnorderedGroup_2_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:7412:114: ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:7413:7: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiSearchDialogAccess().getUnorderedGroup_2_1(), 1);
+                    	    // InternalUIGrammar.g:7416:10: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:7416:11: {...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiSearchDialog", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:7416:20: (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:7416:21: otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_5=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_5, grammarAccess.getUiSearchDialogAccess().getStylesKeyword_2_1_1_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:7420:10: ( (lv_styles_6_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:7421:11: (lv_styles_6_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:7421:11: (lv_styles_6_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:7422:12: lv_styles_6_0= RULE_STRING
+                    	    {
+                    	    lv_styles_6_0=(Token)match(input,RULE_STRING,FOLLOW_63); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_styles_6_0, grammarAccess.getUiSearchDialogAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiSearchDialogRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"styles",
+                    	      													lv_styles_6_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSearchDialogAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop167;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiSearchDialogAccess().getUnorderedGroup_2_1());
+
+                    }
+
+                    otherlv_7=(Token)match(input,47,FOLLOW_55); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_7, grammarAccess.getUiSearchDialogAccess().getRightParenthesisKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:7456:3: ( (lv_name_8_0= RULE_ID ) )?
+            int alt169=2;
+            int LA169_0 = input.LA(1);
+
+            if ( (LA169_0==RULE_ID) ) {
+                alt169=1;
+            }
+            switch (alt169) {
+                case 1 :
+                    // InternalUIGrammar.g:7457:4: (lv_name_8_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:7457:4: (lv_name_8_0= RULE_ID )
+                    // InternalUIGrammar.g:7458:5: lv_name_8_0= RULE_ID
+                    {
+                    lv_name_8_0=(Token)match(input,RULE_ID,FOLLOW_11); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_8_0, grammarAccess.getUiSearchDialogAccess().getNameIDTerminalRuleCall_3_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiSearchDialogRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_8_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_9=(Token)match(input,20,FOLLOW_79); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_9, grammarAccess.getUiSearchDialogAccess().getLeftCurlyBracketKeyword_4());
+              		
+            }
+            // InternalUIGrammar.g:7478:3: (otherlv_10= 'type' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) )?
+            int alt170=2;
+            int LA170_0 = input.LA(1);
+
+            if ( (LA170_0==75) ) {
+                alt170=1;
+            }
+            switch (alt170) {
+                case 1 :
+                    // InternalUIGrammar.g:7479:4: otherlv_10= 'type' ( (lv_jvmType_11_0= ruleJvmTypeReference ) )
+                    {
+                    otherlv_10=(Token)match(input,75,FOLLOW_16); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_10, grammarAccess.getUiSearchDialogAccess().getTypeKeyword_5_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:7483:4: ( (lv_jvmType_11_0= ruleJvmTypeReference ) )
+                    // InternalUIGrammar.g:7484:5: (lv_jvmType_11_0= ruleJvmTypeReference )
+                    {
+                    // InternalUIGrammar.g:7484:5: (lv_jvmType_11_0= ruleJvmTypeReference )
+                    // InternalUIGrammar.g:7485:6: lv_jvmType_11_0= ruleJvmTypeReference
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getUiSearchDialogAccess().getJvmTypeJvmTypeReferenceParserRuleCall_5_1_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_80);
+                    lv_jvmType_11_0=ruleJvmTypeReference();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getUiSearchDialogRule());
+                      						}
+                      						set(
+                      							current,
+                      							"jvmType",
+                      							lv_jvmType_11_0,
+                      							"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:7503:3: (otherlv_12= 'search' otherlv_13= '{' ( (lv_searchFields_14_0= ruleUiDialogSearchFieldAssignment ) )* otherlv_15= '}' )?
+            int alt172=2;
+            int LA172_0 = input.LA(1);
+
+            if ( (LA172_0==88) ) {
+                alt172=1;
+            }
+            switch (alt172) {
+                case 1 :
+                    // InternalUIGrammar.g:7504:4: otherlv_12= 'search' otherlv_13= '{' ( (lv_searchFields_14_0= ruleUiDialogSearchFieldAssignment ) )* otherlv_15= '}'
+                    {
+                    otherlv_12=(Token)match(input,88,FOLLOW_11); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_12, grammarAccess.getUiSearchDialogAccess().getSearchKeyword_6_0());
+                      			
+                    }
+                    otherlv_13=(Token)match(input,20,FOLLOW_81); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_13, grammarAccess.getUiSearchDialogAccess().getLeftCurlyBracketKeyword_6_1());
+                      			
+                    }
+                    // InternalUIGrammar.g:7512:4: ( (lv_searchFields_14_0= ruleUiDialogSearchFieldAssignment ) )*
+                    loop171:
+                    do {
+                        int alt171=2;
+                        int LA171_0 = input.LA(1);
+
+                        if ( (LA171_0==117) ) {
+                            alt171=1;
+                        }
+
+
+                        switch (alt171) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:7513:5: (lv_searchFields_14_0= ruleUiDialogSearchFieldAssignment )
+                    	    {
+                    	    // InternalUIGrammar.g:7513:5: (lv_searchFields_14_0= ruleUiDialogSearchFieldAssignment )
+                    	    // InternalUIGrammar.g:7514:6: lv_searchFields_14_0= ruleUiDialogSearchFieldAssignment
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newCompositeNode(grammarAccess.getUiSearchDialogAccess().getSearchFieldsUiDialogSearchFieldAssignmentParserRuleCall_6_2_0());
+                    	      					
+                    	    }
+                    	    pushFollow(FOLLOW_81);
+                    	    lv_searchFields_14_0=ruleUiDialogSearchFieldAssignment();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						if (current==null) {
+                    	      							current = createModelElementForParent(grammarAccess.getUiSearchDialogRule());
+                    	      						}
+                    	      						add(
+                    	      							current,
+                    	      							"searchFields",
+                    	      							lv_searchFields_14_0,
+                    	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiDialogSearchFieldAssignment");
+                    	      						afterParserOrEnumRuleCall();
+                    	      					
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop171;
+                        }
+                    } while (true);
+
+                    otherlv_15=(Token)match(input,21,FOLLOW_82); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_15, grammarAccess.getUiSearchDialogAccess().getRightCurlyBracketKeyword_6_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:7536:3: (otherlv_16= 'content' otherlv_17= '{' ( (lv_content_18_0= ruleUiDialogAssignment ) ) otherlv_19= '}' )?
+            int alt173=2;
+            int LA173_0 = input.LA(1);
+
+            if ( (LA173_0==85) ) {
+                alt173=1;
+            }
+            switch (alt173) {
+                case 1 :
+                    // InternalUIGrammar.g:7537:4: otherlv_16= 'content' otherlv_17= '{' ( (lv_content_18_0= ruleUiDialogAssignment ) ) otherlv_19= '}'
+                    {
+                    otherlv_16=(Token)match(input,85,FOLLOW_11); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_16, grammarAccess.getUiSearchDialogAccess().getContentKeyword_7_0());
+                      			
+                    }
+                    otherlv_17=(Token)match(input,20,FOLLOW_37); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_17, grammarAccess.getUiSearchDialogAccess().getLeftCurlyBracketKeyword_7_1());
+                      			
+                    }
+                    // InternalUIGrammar.g:7545:4: ( (lv_content_18_0= ruleUiDialogAssignment ) )
+                    // InternalUIGrammar.g:7546:5: (lv_content_18_0= ruleUiDialogAssignment )
+                    {
+                    // InternalUIGrammar.g:7546:5: (lv_content_18_0= ruleUiDialogAssignment )
+                    // InternalUIGrammar.g:7547:6: lv_content_18_0= ruleUiDialogAssignment
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getUiSearchDialogAccess().getContentUiDialogAssignmentParserRuleCall_7_2_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_61);
+                    lv_content_18_0=ruleUiDialogAssignment();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getUiSearchDialogRule());
+                      						}
+                      						set(
+                      							current,
+                      							"content",
+                      							lv_content_18_0,
+                      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiDialogAssignment");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_19=(Token)match(input,21,FOLLOW_42); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_19, grammarAccess.getUiSearchDialogAccess().getRightCurlyBracketKeyword_7_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:7569:3: ( (lv_bindings_20_0= ruleUiBinding ) )*
+            loop174:
+            do {
+                int alt174=2;
+                int LA174_0 = input.LA(1);
+
+                if ( (LA174_0==26) ) {
+                    alt174=1;
+                }
+
+
+                switch (alt174) {
+            	case 1 :
+            	    // InternalUIGrammar.g:7570:4: (lv_bindings_20_0= ruleUiBinding )
+            	    {
+            	    // InternalUIGrammar.g:7570:4: (lv_bindings_20_0= ruleUiBinding )
+            	    // InternalUIGrammar.g:7571:5: lv_bindings_20_0= ruleUiBinding
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiSearchDialogAccess().getBindingsUiBindingParserRuleCall_8_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_42);
+            	    lv_bindings_20_0=ruleUiBinding();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiSearchDialogRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"bindings",
+            	      						lv_bindings_20_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop174;
+                }
+            } while (true);
+
+            // InternalUIGrammar.g:7588:3: ( (lv_processorAssignments_21_0= ruleUiVisibilityProcessorAssignment ) )*
+            loop175:
+            do {
+                int alt175=2;
+                int LA175_0 = input.LA(1);
+
+                if ( (LA175_0==153) ) {
+                    alt175=1;
+                }
+
+
+                switch (alt175) {
+            	case 1 :
+            	    // InternalUIGrammar.g:7589:4: (lv_processorAssignments_21_0= ruleUiVisibilityProcessorAssignment )
+            	    {
+            	    // InternalUIGrammar.g:7589:4: (lv_processorAssignments_21_0= ruleUiVisibilityProcessorAssignment )
+            	    // InternalUIGrammar.g:7590:5: lv_processorAssignments_21_0= ruleUiVisibilityProcessorAssignment
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiSearchDialogAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_9_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_42);
+            	    lv_processorAssignments_21_0=ruleUiVisibilityProcessorAssignment();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiSearchDialogRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"processorAssignments",
+            	      						lv_processorAssignments_21_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop175;
+                }
+            } while (true);
+
+            otherlv_22=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_22, grammarAccess.getUiSearchDialogAccess().getRightCurlyBracketKeyword_10());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiSearchDialog"
+
+
+    // $ANTLR start "entryRuleUiDialogSearchFieldAssignment"
+    // InternalUIGrammar.g:7615:1: entryRuleUiDialogSearchFieldAssignment returns [EObject current=null] : iv_ruleUiDialogSearchFieldAssignment= ruleUiDialogSearchFieldAssignment EOF ;
+    public final EObject entryRuleUiDialogSearchFieldAssignment() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiDialogSearchFieldAssignment = null;
+
+
+        try {
+            // InternalUIGrammar.g:7615:70: (iv_ruleUiDialogSearchFieldAssignment= ruleUiDialogSearchFieldAssignment EOF )
+            // InternalUIGrammar.g:7616:2: iv_ruleUiDialogSearchFieldAssignment= ruleUiDialogSearchFieldAssignment EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiDialogSearchFieldAssignmentRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiDialogSearchFieldAssignment=ruleUiDialogSearchFieldAssignment();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiDialogSearchFieldAssignment; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiDialogSearchFieldAssignment"
+
+
+    // $ANTLR start "ruleUiDialogSearchFieldAssignment"
+    // InternalUIGrammar.g:7622:1: ruleUiDialogSearchFieldAssignment returns [EObject current=null] : ( (lv_element_0_0= ruleUiSearchField ) ) ;
+    public final EObject ruleUiDialogSearchFieldAssignment() throws RecognitionException {
+        EObject current = null;
+
+        EObject lv_element_0_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:7628:2: ( ( (lv_element_0_0= ruleUiSearchField ) ) )
+            // InternalUIGrammar.g:7629:2: ( (lv_element_0_0= ruleUiSearchField ) )
+            {
+            // InternalUIGrammar.g:7629:2: ( (lv_element_0_0= ruleUiSearchField ) )
+            // InternalUIGrammar.g:7630:3: (lv_element_0_0= ruleUiSearchField )
+            {
+            // InternalUIGrammar.g:7630:3: (lv_element_0_0= ruleUiSearchField )
+            // InternalUIGrammar.g:7631:4: lv_element_0_0= ruleUiSearchField
+            {
+            if ( state.backtracking==0 ) {
+
+              				newCompositeNode(grammarAccess.getUiDialogSearchFieldAssignmentAccess().getElementUiSearchFieldParserRuleCall_0());
+              			
+            }
+            pushFollow(FOLLOW_2);
+            lv_element_0_0=ruleUiSearchField();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              				if (current==null) {
+              					current = createModelElementForParent(grammarAccess.getUiDialogSearchFieldAssignmentRule());
+              				}
+              				set(
+              					current,
+              					"element",
+              					lv_element_0_0,
+              					"org.eclipse.osbp.ecview.dsl.UIGrammar.UiSearchField");
+              				afterParserOrEnumRuleCall();
+              			
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiDialogSearchFieldAssignment"
+
+
+    // $ANTLR start "entryRuleUiMobileNavigationPage"
+    // InternalUIGrammar.g:7651:1: entryRuleUiMobileNavigationPage returns [EObject current=null] : iv_ruleUiMobileNavigationPage= ruleUiMobileNavigationPage EOF ;
+    public final EObject entryRuleUiMobileNavigationPage() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiMobileNavigationPage = null;
+
+
+        try {
+            // InternalUIGrammar.g:7651:63: (iv_ruleUiMobileNavigationPage= ruleUiMobileNavigationPage EOF )
+            // InternalUIGrammar.g:7652:2: iv_ruleUiMobileNavigationPage= ruleUiMobileNavigationPage EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiMobileNavigationPageRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiMobileNavigationPage=ruleUiMobileNavigationPage();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiMobileNavigationPage; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiMobileNavigationPage"
+
+
+    // $ANTLR start "ruleUiMobileNavigationPage"
+    // InternalUIGrammar.g:7658:1: ruleUiMobileNavigationPage returns [EObject current=null] : ( () otherlv_1= 'navPage' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? otherlv_9= '{' (otherlv_10= 'type' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? )? (otherlv_13= 'navbarActions' otherlv_14= '{' ( (lv_barActions_15_0= ruleUiMobileNavBarAction ) )* otherlv_16= '}' )? ( (lv_contents_17_0= ruleUiMobileNavigationPageAssignment ) )* ( (lv_bindings_18_0= ruleUiBinding ) )* ( (lv_processorAssignments_19_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_20= '}' ) ;
+    public final EObject ruleUiMobileNavigationPage() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_5=null;
+        Token lv_styles_6_0=null;
+        Token otherlv_7=null;
+        Token lv_name_8_0=null;
+        Token otherlv_9=null;
+        Token otherlv_10=null;
+        Token otherlv_12=null;
+        Token otherlv_13=null;
+        Token otherlv_14=null;
+        Token otherlv_16=null;
+        Token otherlv_20=null;
+        EObject lv_i18nInfo_4_0 = null;
+
+        EObject lv_jvmType_11_0 = null;
+
+        EObject lv_barActions_15_0 = null;
+
+        EObject lv_contents_17_0 = null;
+
+        EObject lv_bindings_18_0 = null;
+
+        EObject lv_processorAssignments_19_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:7664:2: ( ( () otherlv_1= 'navPage' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? otherlv_9= '{' (otherlv_10= 'type' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? )? (otherlv_13= 'navbarActions' otherlv_14= '{' ( (lv_barActions_15_0= ruleUiMobileNavBarAction ) )* otherlv_16= '}' )? ( (lv_contents_17_0= ruleUiMobileNavigationPageAssignment ) )* ( (lv_bindings_18_0= ruleUiBinding ) )* ( (lv_processorAssignments_19_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_20= '}' ) )
+            // InternalUIGrammar.g:7665:2: ( () otherlv_1= 'navPage' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? otherlv_9= '{' (otherlv_10= 'type' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? )? (otherlv_13= 'navbarActions' otherlv_14= '{' ( (lv_barActions_15_0= ruleUiMobileNavBarAction ) )* otherlv_16= '}' )? ( (lv_contents_17_0= ruleUiMobileNavigationPageAssignment ) )* ( (lv_bindings_18_0= ruleUiBinding ) )* ( (lv_processorAssignments_19_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_20= '}' )
+            {
+            // InternalUIGrammar.g:7665:2: ( () otherlv_1= 'navPage' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? otherlv_9= '{' (otherlv_10= 'type' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? )? (otherlv_13= 'navbarActions' otherlv_14= '{' ( (lv_barActions_15_0= ruleUiMobileNavBarAction ) )* otherlv_16= '}' )? ( (lv_contents_17_0= ruleUiMobileNavigationPageAssignment ) )* ( (lv_bindings_18_0= ruleUiBinding ) )* ( (lv_processorAssignments_19_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_20= '}' )
+            // InternalUIGrammar.g:7666:3: () otherlv_1= 'navPage' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? otherlv_9= '{' (otherlv_10= 'type' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? )? (otherlv_13= 'navbarActions' otherlv_14= '{' ( (lv_barActions_15_0= ruleUiMobileNavBarAction ) )* otherlv_16= '}' )? ( (lv_contents_17_0= ruleUiMobileNavigationPageAssignment ) )* ( (lv_bindings_18_0= ruleUiBinding ) )* ( (lv_processorAssignments_19_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_20= '}'
+            {
+            // InternalUIGrammar.g:7666:3: ()
+            // InternalUIGrammar.g:7667:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiMobileNavigationPageAccess().getUiMobileNavigationPageAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,89,FOLLOW_52); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiMobileNavigationPageAccess().getNavPageKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:7677:3: (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )?
+            int alt177=2;
+            int LA177_0 = input.LA(1);
+
+            if ( (LA177_0==45) ) {
+                alt177=1;
+            }
+            switch (alt177) {
+                case 1 :
+                    // InternalUIGrammar.g:7678:4: otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')'
+                    {
+                    otherlv_2=(Token)match(input,45,FOLLOW_63); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getUiMobileNavigationPageAccess().getLeftParenthesisKeyword_2_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:7682:4: ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:7683:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:7683:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:7684:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiMobileNavigationPageAccess().getUnorderedGroup_2_1());
+                    // InternalUIGrammar.g:7687:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:7688:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:7688:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )*
+                    loop176:
+                    do {
+                        int alt176=3;
+                        int LA176_0 = input.LA(1);
+
+                        if ( LA176_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileNavigationPageAccess().getUnorderedGroup_2_1(), 0) ) {
+                            alt176=1;
+                        }
+                        else if ( LA176_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileNavigationPageAccess().getUnorderedGroup_2_1(), 1) ) {
+                            alt176=2;
+                        }
+
+
+                        switch (alt176) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:7689:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:7689:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    // InternalUIGrammar.g:7690:6: {...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileNavigationPageAccess().getUnorderedGroup_2_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileNavigationPage", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileNavigationPageAccess().getUnorderedGroup_2_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:7690:122: ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    // InternalUIGrammar.g:7691:7: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiMobileNavigationPageAccess().getUnorderedGroup_2_1(), 0);
+                    	    // InternalUIGrammar.g:7694:10: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    // InternalUIGrammar.g:7694:11: {...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileNavigationPage", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:7694:20: ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    // InternalUIGrammar.g:7694:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    {
+                    	    // InternalUIGrammar.g:7694:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    // InternalUIGrammar.g:7695:11: lv_i18nInfo_4_0= ruleUiI18nInfo
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getUiMobileNavigationPageAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_63);
+                    	    lv_i18nInfo_4_0=ruleUiI18nInfo();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getUiMobileNavigationPageRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"i18nInfo",
+                    	      												lv_i18nInfo_4_0,
+                    	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileNavigationPageAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:7717:5: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:7717:5: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:7718:6: {...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileNavigationPageAccess().getUnorderedGroup_2_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileNavigationPage", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileNavigationPageAccess().getUnorderedGroup_2_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:7718:122: ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:7719:7: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiMobileNavigationPageAccess().getUnorderedGroup_2_1(), 1);
+                    	    // InternalUIGrammar.g:7722:10: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:7722:11: {...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileNavigationPage", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:7722:20: (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:7722:21: otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_5=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_5, grammarAccess.getUiMobileNavigationPageAccess().getStylesKeyword_2_1_1_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:7726:10: ( (lv_styles_6_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:7727:11: (lv_styles_6_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:7727:11: (lv_styles_6_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:7728:12: lv_styles_6_0= RULE_STRING
+                    	    {
+                    	    lv_styles_6_0=(Token)match(input,RULE_STRING,FOLLOW_63); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_styles_6_0, grammarAccess.getUiMobileNavigationPageAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiMobileNavigationPageRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"styles",
+                    	      													lv_styles_6_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileNavigationPageAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop176;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiMobileNavigationPageAccess().getUnorderedGroup_2_1());
+
+                    }
+
+                    otherlv_7=(Token)match(input,47,FOLLOW_55); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_7, grammarAccess.getUiMobileNavigationPageAccess().getRightParenthesisKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:7762:3: ( (lv_name_8_0= RULE_ID ) )?
+            int alt178=2;
+            int LA178_0 = input.LA(1);
+
+            if ( (LA178_0==RULE_ID) ) {
+                alt178=1;
+            }
+            switch (alt178) {
+                case 1 :
+                    // InternalUIGrammar.g:7763:4: (lv_name_8_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:7763:4: (lv_name_8_0= RULE_ID )
+                    // InternalUIGrammar.g:7764:5: lv_name_8_0= RULE_ID
+                    {
+                    lv_name_8_0=(Token)match(input,RULE_ID,FOLLOW_11); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_8_0, grammarAccess.getUiMobileNavigationPageAccess().getNameIDTerminalRuleCall_3_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiMobileNavigationPageRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_8_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_9=(Token)match(input,20,FOLLOW_83); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_9, grammarAccess.getUiMobileNavigationPageAccess().getLeftCurlyBracketKeyword_4());
+              		
+            }
+            // InternalUIGrammar.g:7784:3: (otherlv_10= 'type' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )? )?
+            int alt180=2;
+            int LA180_0 = input.LA(1);
+
+            if ( (LA180_0==75) ) {
+                alt180=1;
+            }
+            switch (alt180) {
+                case 1 :
+                    // InternalUIGrammar.g:7785:4: otherlv_10= 'type' ( (lv_jvmType_11_0= ruleJvmTypeReference ) ) (otherlv_12= ';' )?
+                    {
+                    otherlv_10=(Token)match(input,75,FOLLOW_16); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_10, grammarAccess.getUiMobileNavigationPageAccess().getTypeKeyword_5_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:7789:4: ( (lv_jvmType_11_0= ruleJvmTypeReference ) )
+                    // InternalUIGrammar.g:7790:5: (lv_jvmType_11_0= ruleJvmTypeReference )
+                    {
+                    // InternalUIGrammar.g:7790:5: (lv_jvmType_11_0= ruleJvmTypeReference )
+                    // InternalUIGrammar.g:7791:6: lv_jvmType_11_0= ruleJvmTypeReference
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getUiMobileNavigationPageAccess().getJvmTypeJvmTypeReferenceParserRuleCall_5_1_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_84);
+                    lv_jvmType_11_0=ruleJvmTypeReference();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getUiMobileNavigationPageRule());
+                      						}
+                      						set(
+                      							current,
+                      							"jvmType",
+                      							lv_jvmType_11_0,
+                      							"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalUIGrammar.g:7808:4: (otherlv_12= ';' )?
+                    int alt179=2;
+                    int LA179_0 = input.LA(1);
+
+                    if ( (LA179_0==16) ) {
+                        alt179=1;
+                    }
+                    switch (alt179) {
+                        case 1 :
+                            // InternalUIGrammar.g:7809:5: otherlv_12= ';'
+                            {
+                            otherlv_12=(Token)match(input,16,FOLLOW_85); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(otherlv_12, grammarAccess.getUiMobileNavigationPageAccess().getSemicolonKeyword_5_2());
+                              				
+                            }
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:7815:3: (otherlv_13= 'navbarActions' otherlv_14= '{' ( (lv_barActions_15_0= ruleUiMobileNavBarAction ) )* otherlv_16= '}' )?
+            int alt182=2;
+            int LA182_0 = input.LA(1);
+
+            if ( (LA182_0==90) ) {
+                alt182=1;
+            }
+            switch (alt182) {
+                case 1 :
+                    // InternalUIGrammar.g:7816:4: otherlv_13= 'navbarActions' otherlv_14= '{' ( (lv_barActions_15_0= ruleUiMobileNavBarAction ) )* otherlv_16= '}'
+                    {
+                    otherlv_13=(Token)match(input,90,FOLLOW_11); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_13, grammarAccess.getUiMobileNavigationPageAccess().getNavbarActionsKeyword_6_0());
+                      			
+                    }
+                    otherlv_14=(Token)match(input,20,FOLLOW_39); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_14, grammarAccess.getUiMobileNavigationPageAccess().getLeftCurlyBracketKeyword_6_1());
+                      			
+                    }
+                    // InternalUIGrammar.g:7824:4: ( (lv_barActions_15_0= ruleUiMobileNavBarAction ) )*
+                    loop181:
+                    do {
+                        int alt181=2;
+                        int LA181_0 = input.LA(1);
+
+                        if ( (LA181_0==RULE_ID) ) {
+                            alt181=1;
+                        }
+
+
+                        switch (alt181) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:7825:5: (lv_barActions_15_0= ruleUiMobileNavBarAction )
+                    	    {
+                    	    // InternalUIGrammar.g:7825:5: (lv_barActions_15_0= ruleUiMobileNavBarAction )
+                    	    // InternalUIGrammar.g:7826:6: lv_barActions_15_0= ruleUiMobileNavBarAction
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newCompositeNode(grammarAccess.getUiMobileNavigationPageAccess().getBarActionsUiMobileNavBarActionParserRuleCall_6_2_0());
+                    	      					
+                    	    }
+                    	    pushFollow(FOLLOW_39);
+                    	    lv_barActions_15_0=ruleUiMobileNavBarAction();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						if (current==null) {
+                    	      							current = createModelElementForParent(grammarAccess.getUiMobileNavigationPageRule());
+                    	      						}
+                    	      						add(
+                    	      							current,
+                    	      							"barActions",
+                    	      							lv_barActions_15_0,
+                    	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileNavBarAction");
+                    	      						afterParserOrEnumRuleCall();
+                    	      					
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop181;
+                        }
+                    } while (true);
+
+                    otherlv_16=(Token)match(input,21,FOLLOW_60); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_16, grammarAccess.getUiMobileNavigationPageAccess().getRightCurlyBracketKeyword_6_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:7848:3: ( (lv_contents_17_0= ruleUiMobileNavigationPageAssignment ) )*
+            loop183:
+            do {
+                int alt183=2;
+                int LA183_0 = input.LA(1);
+
+                if ( ((LA183_0>=68 && LA183_0<=69)||(LA183_0>=71 && LA183_0<=73)||(LA183_0>=76 && LA183_0<=77)||LA183_0==89||LA183_0==91||(LA183_0>=95 && LA183_0<=96)||(LA183_0>=98 && LA183_0<=100)||LA183_0==105||LA183_0==107||(LA183_0>=117 && LA183_0<=122)||LA183_0==124||(LA183_0>=128 && LA183_0<=130)||(LA183_0>=132 && LA183_0<=134)||LA183_0==138||LA183_0==145) ) {
+                    alt183=1;
+                }
+
+
+                switch (alt183) {
+            	case 1 :
+            	    // InternalUIGrammar.g:7849:4: (lv_contents_17_0= ruleUiMobileNavigationPageAssignment )
+            	    {
+            	    // InternalUIGrammar.g:7849:4: (lv_contents_17_0= ruleUiMobileNavigationPageAssignment )
+            	    // InternalUIGrammar.g:7850:5: lv_contents_17_0= ruleUiMobileNavigationPageAssignment
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiMobileNavigationPageAccess().getContentsUiMobileNavigationPageAssignmentParserRuleCall_7_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_60);
+            	    lv_contents_17_0=ruleUiMobileNavigationPageAssignment();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiMobileNavigationPageRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"contents",
+            	      						lv_contents_17_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileNavigationPageAssignment");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop183;
+                }
+            } while (true);
+
+            // InternalUIGrammar.g:7867:3: ( (lv_bindings_18_0= ruleUiBinding ) )*
+            loop184:
+            do {
+                int alt184=2;
+                int LA184_0 = input.LA(1);
+
+                if ( (LA184_0==26) ) {
+                    alt184=1;
+                }
+
+
+                switch (alt184) {
+            	case 1 :
+            	    // InternalUIGrammar.g:7868:4: (lv_bindings_18_0= ruleUiBinding )
+            	    {
+            	    // InternalUIGrammar.g:7868:4: (lv_bindings_18_0= ruleUiBinding )
+            	    // InternalUIGrammar.g:7869:5: lv_bindings_18_0= ruleUiBinding
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiMobileNavigationPageAccess().getBindingsUiBindingParserRuleCall_8_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_42);
+            	    lv_bindings_18_0=ruleUiBinding();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiMobileNavigationPageRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"bindings",
+            	      						lv_bindings_18_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop184;
+                }
+            } while (true);
+
+            // InternalUIGrammar.g:7886:3: ( (lv_processorAssignments_19_0= ruleUiVisibilityProcessorAssignment ) )*
+            loop185:
+            do {
+                int alt185=2;
+                int LA185_0 = input.LA(1);
+
+                if ( (LA185_0==153) ) {
+                    alt185=1;
+                }
+
+
+                switch (alt185) {
+            	case 1 :
+            	    // InternalUIGrammar.g:7887:4: (lv_processorAssignments_19_0= ruleUiVisibilityProcessorAssignment )
+            	    {
+            	    // InternalUIGrammar.g:7887:4: (lv_processorAssignments_19_0= ruleUiVisibilityProcessorAssignment )
+            	    // InternalUIGrammar.g:7888:5: lv_processorAssignments_19_0= ruleUiVisibilityProcessorAssignment
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiMobileNavigationPageAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_9_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_42);
+            	    lv_processorAssignments_19_0=ruleUiVisibilityProcessorAssignment();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiMobileNavigationPageRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"processorAssignments",
+            	      						lv_processorAssignments_19_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop185;
+                }
+            } while (true);
+
+            otherlv_20=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_20, grammarAccess.getUiMobileNavigationPageAccess().getRightCurlyBracketKeyword_10());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiMobileNavigationPage"
+
+
+    // $ANTLR start "entryRuleUiMobileNavigationPageAssignment"
+    // InternalUIGrammar.g:7913:1: entryRuleUiMobileNavigationPageAssignment returns [EObject current=null] : iv_ruleUiMobileNavigationPageAssignment= ruleUiMobileNavigationPageAssignment EOF ;
+    public final EObject entryRuleUiMobileNavigationPageAssignment() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiMobileNavigationPageAssignment = null;
+
+
+        try {
+            // InternalUIGrammar.g:7913:73: (iv_ruleUiMobileNavigationPageAssignment= ruleUiMobileNavigationPageAssignment EOF )
+            // InternalUIGrammar.g:7914:2: iv_ruleUiMobileNavigationPageAssignment= ruleUiMobileNavigationPageAssignment EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiMobileNavigationPageAssignmentRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiMobileNavigationPageAssignment=ruleUiMobileNavigationPageAssignment();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiMobileNavigationPageAssignment; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiMobileNavigationPageAssignment"
+
+
+    // $ANTLR start "ruleUiMobileNavigationPageAssignment"
+    // InternalUIGrammar.g:7920:1: ruleUiMobileNavigationPageAssignment returns [EObject current=null] : ( ( (lv_element_0_0= ruleUiMobileEmbeddable ) ) (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )? ) ;
+    public final EObject ruleUiMobileNavigationPageAssignment() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        EObject lv_element_0_0 = null;
+
+        Enumerator lv_alignment_2_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:7926:2: ( ( ( (lv_element_0_0= ruleUiMobileEmbeddable ) ) (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )? ) )
+            // InternalUIGrammar.g:7927:2: ( ( (lv_element_0_0= ruleUiMobileEmbeddable ) ) (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )? )
+            {
+            // InternalUIGrammar.g:7927:2: ( ( (lv_element_0_0= ruleUiMobileEmbeddable ) ) (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )? )
+            // InternalUIGrammar.g:7928:3: ( (lv_element_0_0= ruleUiMobileEmbeddable ) ) (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )?
+            {
+            // InternalUIGrammar.g:7928:3: ( (lv_element_0_0= ruleUiMobileEmbeddable ) )
+            // InternalUIGrammar.g:7929:4: (lv_element_0_0= ruleUiMobileEmbeddable )
+            {
+            // InternalUIGrammar.g:7929:4: (lv_element_0_0= ruleUiMobileEmbeddable )
+            // InternalUIGrammar.g:7930:5: lv_element_0_0= ruleUiMobileEmbeddable
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getUiMobileNavigationPageAssignmentAccess().getElementUiMobileEmbeddableParserRuleCall_0_0());
+              				
+            }
+            pushFollow(FOLLOW_57);
+            lv_element_0_0=ruleUiMobileEmbeddable();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getUiMobileNavigationPageAssignmentRule());
+              					}
+              					set(
+              						current,
+              						"element",
+              						lv_element_0_0,
+              						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileEmbeddable");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalUIGrammar.g:7947:3: (otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) ) )?
+            int alt186=2;
+            int LA186_0 = input.LA(1);
+
+            if ( (LA186_0==53) ) {
+                alt186=1;
+            }
+            switch (alt186) {
+                case 1 :
+                    // InternalUIGrammar.g:7948:4: otherlv_1= 'align' ( (lv_alignment_2_0= ruleUiAlignment ) )
+                    {
+                    otherlv_1=(Token)match(input,53,FOLLOW_41); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_1, grammarAccess.getUiMobileNavigationPageAssignmentAccess().getAlignKeyword_1_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:7952:4: ( (lv_alignment_2_0= ruleUiAlignment ) )
+                    // InternalUIGrammar.g:7953:5: (lv_alignment_2_0= ruleUiAlignment )
+                    {
+                    // InternalUIGrammar.g:7953:5: (lv_alignment_2_0= ruleUiAlignment )
+                    // InternalUIGrammar.g:7954:6: lv_alignment_2_0= ruleUiAlignment
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getUiMobileNavigationPageAssignmentAccess().getAlignmentUiAlignmentEnumRuleCall_1_1_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_2);
+                    lv_alignment_2_0=ruleUiAlignment();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getUiMobileNavigationPageAssignmentRule());
+                      						}
+                      						set(
+                      							current,
+                      							"alignment",
+                      							lv_alignment_2_0,
+                      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiAlignment");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiMobileNavigationPageAssignment"
+
+
+    // $ANTLR start "entryRuleUiTextField"
+    // InternalUIGrammar.g:7976:1: entryRuleUiTextField returns [EObject current=null] : iv_ruleUiTextField= ruleUiTextField EOF ;
+    public final EObject entryRuleUiTextField() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiTextField = null;
+
+
+        try {
+            // InternalUIGrammar.g:7976:52: (iv_ruleUiTextField= ruleUiTextField EOF )
+            // InternalUIGrammar.g:7977:2: iv_ruleUiTextField= ruleUiTextField EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiTextFieldRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiTextField=ruleUiTextField();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiTextField; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiTextField"
+
+
+    // $ANTLR start "ruleUiTextField"
+    // InternalUIGrammar.g:7983:1: ruleUiTextField returns [EObject current=null] : ( () otherlv_1= 'textfield' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'maxLength=' ( (lv_maxLength_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'minLength=' ( (lv_minLength_7_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'regex=' ( (lv_regex_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'styles' ( (lv_styles_11_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_12_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_13_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_14= ')' )? ( (lv_name_15_0= RULE_ID ) )? (otherlv_16= '{' ( ( (lv_validators_17_0= ruleUiValidator ) ) | ( (lv_bindings_18_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_19_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_20= '}' )? ) ;
+    public final EObject ruleUiTextField() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Token lv_maxLength_5_0=null;
+        Token otherlv_6=null;
+        Token lv_minLength_7_0=null;
+        Token otherlv_8=null;
+        Token lv_regex_9_0=null;
+        Token otherlv_10=null;
+        Token lv_styles_11_0=null;
+        Token lv_readonly_13_0=null;
+        Token otherlv_14=null;
+        Token lv_name_15_0=null;
+        Token otherlv_16=null;
+        Token otherlv_20=null;
+        EObject lv_i18nInfo_12_0 = null;
+
+        EObject lv_validators_17_0 = null;
+
+        EObject lv_bindings_18_0 = null;
+
+        EObject lv_processorAssignments_19_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:7989:2: ( ( () otherlv_1= 'textfield' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'maxLength=' ( (lv_maxLength_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'minLength=' ( (lv_minLength_7_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'regex=' ( (lv_regex_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'styles' ( (lv_styles_11_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_12_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_13_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_14= ')' )? ( (lv_name_15_0= RULE_ID ) )? (otherlv_16= '{' ( ( (lv_validators_17_0= ruleUiValidator ) ) | ( (lv_bindings_18_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_19_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_20= '}' )? ) )
+            // InternalUIGrammar.g:7990:2: ( () otherlv_1= 'textfield' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'maxLength=' ( (lv_maxLength_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'minLength=' ( (lv_minLength_7_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'regex=' ( (lv_regex_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'styles' ( (lv_styles_11_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_12_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_13_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_14= ')' )? ( (lv_name_15_0= RULE_ID ) )? (otherlv_16= '{' ( ( (lv_validators_17_0= ruleUiValidator ) ) | ( (lv_bindings_18_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_19_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_20= '}' )? )
+            {
+            // InternalUIGrammar.g:7990:2: ( () otherlv_1= 'textfield' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'maxLength=' ( (lv_maxLength_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'minLength=' ( (lv_minLength_7_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'regex=' ( (lv_regex_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'styles' ( (lv_styles_11_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_12_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_13_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_14= ')' )? ( (lv_name_15_0= RULE_ID ) )? (otherlv_16= '{' ( ( (lv_validators_17_0= ruleUiValidator ) ) | ( (lv_bindings_18_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_19_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_20= '}' )? )
+            // InternalUIGrammar.g:7991:3: () otherlv_1= 'textfield' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'maxLength=' ( (lv_maxLength_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'minLength=' ( (lv_minLength_7_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'regex=' ( (lv_regex_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'styles' ( (lv_styles_11_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_12_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_13_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_14= ')' )? ( (lv_name_15_0= RULE_ID ) )? (otherlv_16= '{' ( ( (lv_validators_17_0= ruleUiValidator ) ) | ( (lv_bindings_18_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_19_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_20= '}' )?
+            {
+            // InternalUIGrammar.g:7991:3: ()
+            // InternalUIGrammar.g:7992:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiTextFieldAccess().getUiTextFieldAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,91,FOLLOW_86); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiTextFieldAccess().getTextfieldKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:8002:3: (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'maxLength=' ( (lv_maxLength_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'minLength=' ( (lv_minLength_7_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'regex=' ( (lv_regex_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'styles' ( (lv_styles_11_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_12_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_13_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_14= ')' )?
+            int alt188=2;
+            int LA188_0 = input.LA(1);
+
+            if ( (LA188_0==45) ) {
+                alt188=1;
+            }
+            switch (alt188) {
+                case 1 :
+                    // InternalUIGrammar.g:8003:4: otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'maxLength=' ( (lv_maxLength_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'minLength=' ( (lv_minLength_7_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'regex=' ( (lv_regex_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'styles' ( (lv_styles_11_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_12_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_13_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_14= ')'
+                    {
+                    otherlv_2=(Token)match(input,45,FOLLOW_87); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getUiTextFieldAccess().getLeftParenthesisKeyword_2_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:8007:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'maxLength=' ( (lv_maxLength_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'minLength=' ( (lv_minLength_7_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'regex=' ( (lv_regex_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'styles' ( (lv_styles_11_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_12_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_13_0= 'readonly' ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:8008:5: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'maxLength=' ( (lv_maxLength_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'minLength=' ( (lv_minLength_7_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'regex=' ( (lv_regex_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'styles' ( (lv_styles_11_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_12_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_13_0= 'readonly' ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:8008:5: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'maxLength=' ( (lv_maxLength_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'minLength=' ( (lv_minLength_7_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'regex=' ( (lv_regex_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'styles' ( (lv_styles_11_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_12_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_13_0= 'readonly' ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:8009:6: ( ( ({...}? => ( ({...}? => (otherlv_4= 'maxLength=' ( (lv_maxLength_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'minLength=' ( (lv_minLength_7_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'regex=' ( (lv_regex_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'styles' ( (lv_styles_11_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_12_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_13_0= 'readonly' ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1());
+                    // InternalUIGrammar.g:8012:6: ( ( ({...}? => ( ({...}? => (otherlv_4= 'maxLength=' ( (lv_maxLength_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'minLength=' ( (lv_minLength_7_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'regex=' ( (lv_regex_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'styles' ( (lv_styles_11_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_12_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_13_0= 'readonly' ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:8013:7: ( ({...}? => ( ({...}? => (otherlv_4= 'maxLength=' ( (lv_maxLength_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'minLength=' ( (lv_minLength_7_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'regex=' ( (lv_regex_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'styles' ( (lv_styles_11_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_12_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_13_0= 'readonly' ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:8013:7: ( ({...}? => ( ({...}? => (otherlv_4= 'maxLength=' ( (lv_maxLength_5_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'minLength=' ( (lv_minLength_7_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'regex=' ( (lv_regex_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'styles' ( (lv_styles_11_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_12_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_13_0= 'readonly' ) ) ) ) ) )*
+                    loop187:
+                    do {
+                        int alt187=7;
+                        int LA187_0 = input.LA(1);
+
+                        if ( LA187_0 == 92 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 0) ) {
+                            alt187=1;
+                        }
+                        else if ( LA187_0 == 93 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 1) ) {
+                            alt187=2;
+                        }
+                        else if ( LA187_0 == 94 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 2) ) {
+                            alt187=3;
+                        }
+                        else if ( LA187_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 3) ) {
+                            alt187=4;
+                        }
+                        else if ( LA187_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 4) ) {
+                            alt187=5;
+                        }
+                        else if ( LA187_0 == 65 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 5) ) {
+                            alt187=6;
+                        }
+
+
+                        switch (alt187) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:8014:5: ({...}? => ( ({...}? => (otherlv_4= 'maxLength=' ( (lv_maxLength_5_0= RULE_INT ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:8014:5: ({...}? => ( ({...}? => (otherlv_4= 'maxLength=' ( (lv_maxLength_5_0= RULE_INT ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:8015:6: {...}? => ( ({...}? => (otherlv_4= 'maxLength=' ( (lv_maxLength_5_0= RULE_INT ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiTextField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:8015:111: ( ({...}? => (otherlv_4= 'maxLength=' ( (lv_maxLength_5_0= RULE_INT ) ) ) ) )
+                    	    // InternalUIGrammar.g:8016:7: ({...}? => (otherlv_4= 'maxLength=' ( (lv_maxLength_5_0= RULE_INT ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 0);
+                    	    // InternalUIGrammar.g:8019:10: ({...}? => (otherlv_4= 'maxLength=' ( (lv_maxLength_5_0= RULE_INT ) ) ) )
+                    	    // InternalUIGrammar.g:8019:11: {...}? => (otherlv_4= 'maxLength=' ( (lv_maxLength_5_0= RULE_INT ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiTextField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:8019:20: (otherlv_4= 'maxLength=' ( (lv_maxLength_5_0= RULE_INT ) ) )
+                    	    // InternalUIGrammar.g:8019:21: otherlv_4= 'maxLength=' ( (lv_maxLength_5_0= RULE_INT ) )
+                    	    {
+                    	    otherlv_4=(Token)match(input,92,FOLLOW_54); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_4, grammarAccess.getUiTextFieldAccess().getMaxLengthKeyword_2_1_0_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:8023:10: ( (lv_maxLength_5_0= RULE_INT ) )
+                    	    // InternalUIGrammar.g:8024:11: (lv_maxLength_5_0= RULE_INT )
+                    	    {
+                    	    // InternalUIGrammar.g:8024:11: (lv_maxLength_5_0= RULE_INT )
+                    	    // InternalUIGrammar.g:8025:12: lv_maxLength_5_0= RULE_INT
+                    	    {
+                    	    lv_maxLength_5_0=(Token)match(input,RULE_INT,FOLLOW_87); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_maxLength_5_0, grammarAccess.getUiTextFieldAccess().getMaxLengthINTTerminalRuleCall_2_1_0_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiTextFieldRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"maxLength",
+                    	      													lv_maxLength_5_0,
+                    	      													"org.eclipse.xtext.xbase.Xbase.INT");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:8047:5: ({...}? => ( ({...}? => (otherlv_6= 'minLength=' ( (lv_minLength_7_0= RULE_INT ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:8047:5: ({...}? => ( ({...}? => (otherlv_6= 'minLength=' ( (lv_minLength_7_0= RULE_INT ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:8048:6: {...}? => ( ({...}? => (otherlv_6= 'minLength=' ( (lv_minLength_7_0= RULE_INT ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiTextField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:8048:111: ( ({...}? => (otherlv_6= 'minLength=' ( (lv_minLength_7_0= RULE_INT ) ) ) ) )
+                    	    // InternalUIGrammar.g:8049:7: ({...}? => (otherlv_6= 'minLength=' ( (lv_minLength_7_0= RULE_INT ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 1);
+                    	    // InternalUIGrammar.g:8052:10: ({...}? => (otherlv_6= 'minLength=' ( (lv_minLength_7_0= RULE_INT ) ) ) )
+                    	    // InternalUIGrammar.g:8052:11: {...}? => (otherlv_6= 'minLength=' ( (lv_minLength_7_0= RULE_INT ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiTextField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:8052:20: (otherlv_6= 'minLength=' ( (lv_minLength_7_0= RULE_INT ) ) )
+                    	    // InternalUIGrammar.g:8052:21: otherlv_6= 'minLength=' ( (lv_minLength_7_0= RULE_INT ) )
+                    	    {
+                    	    otherlv_6=(Token)match(input,93,FOLLOW_54); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_6, grammarAccess.getUiTextFieldAccess().getMinLengthKeyword_2_1_1_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:8056:10: ( (lv_minLength_7_0= RULE_INT ) )
+                    	    // InternalUIGrammar.g:8057:11: (lv_minLength_7_0= RULE_INT )
+                    	    {
+                    	    // InternalUIGrammar.g:8057:11: (lv_minLength_7_0= RULE_INT )
+                    	    // InternalUIGrammar.g:8058:12: lv_minLength_7_0= RULE_INT
+                    	    {
+                    	    lv_minLength_7_0=(Token)match(input,RULE_INT,FOLLOW_87); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_minLength_7_0, grammarAccess.getUiTextFieldAccess().getMinLengthINTTerminalRuleCall_2_1_1_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiTextFieldRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"minLength",
+                    	      													lv_minLength_7_0,
+                    	      													"org.eclipse.xtext.xbase.Xbase.INT");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 3 :
+                    	    // InternalUIGrammar.g:8080:5: ({...}? => ( ({...}? => (otherlv_8= 'regex=' ( (lv_regex_9_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:8080:5: ({...}? => ( ({...}? => (otherlv_8= 'regex=' ( (lv_regex_9_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:8081:6: {...}? => ( ({...}? => (otherlv_8= 'regex=' ( (lv_regex_9_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 2) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiTextField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 2)");
+                    	    }
+                    	    // InternalUIGrammar.g:8081:111: ( ({...}? => (otherlv_8= 'regex=' ( (lv_regex_9_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:8082:7: ({...}? => (otherlv_8= 'regex=' ( (lv_regex_9_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 2);
+                    	    // InternalUIGrammar.g:8085:10: ({...}? => (otherlv_8= 'regex=' ( (lv_regex_9_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:8085:11: {...}? => (otherlv_8= 'regex=' ( (lv_regex_9_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiTextField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:8085:20: (otherlv_8= 'regex=' ( (lv_regex_9_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:8085:21: otherlv_8= 'regex=' ( (lv_regex_9_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_8=(Token)match(input,94,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_8, grammarAccess.getUiTextFieldAccess().getRegexKeyword_2_1_2_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:8089:10: ( (lv_regex_9_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:8090:11: (lv_regex_9_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:8090:11: (lv_regex_9_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:8091:12: lv_regex_9_0= RULE_STRING
+                    	    {
+                    	    lv_regex_9_0=(Token)match(input,RULE_STRING,FOLLOW_87); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_regex_9_0, grammarAccess.getUiTextFieldAccess().getRegexSTRINGTerminalRuleCall_2_1_2_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiTextFieldRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"regex",
+                    	      													lv_regex_9_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 4 :
+                    	    // InternalUIGrammar.g:8113:5: ({...}? => ( ({...}? => (otherlv_10= 'styles' ( (lv_styles_11_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:8113:5: ({...}? => ( ({...}? => (otherlv_10= 'styles' ( (lv_styles_11_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:8114:6: {...}? => ( ({...}? => (otherlv_10= 'styles' ( (lv_styles_11_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 3) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiTextField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 3)");
+                    	    }
+                    	    // InternalUIGrammar.g:8114:111: ( ({...}? => (otherlv_10= 'styles' ( (lv_styles_11_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:8115:7: ({...}? => (otherlv_10= 'styles' ( (lv_styles_11_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 3);
+                    	    // InternalUIGrammar.g:8118:10: ({...}? => (otherlv_10= 'styles' ( (lv_styles_11_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:8118:11: {...}? => (otherlv_10= 'styles' ( (lv_styles_11_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiTextField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:8118:20: (otherlv_10= 'styles' ( (lv_styles_11_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:8118:21: otherlv_10= 'styles' ( (lv_styles_11_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_10=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_10, grammarAccess.getUiTextFieldAccess().getStylesKeyword_2_1_3_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:8122:10: ( (lv_styles_11_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:8123:11: (lv_styles_11_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:8123:11: (lv_styles_11_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:8124:12: lv_styles_11_0= RULE_STRING
+                    	    {
+                    	    lv_styles_11_0=(Token)match(input,RULE_STRING,FOLLOW_87); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_styles_11_0, grammarAccess.getUiTextFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_3_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiTextFieldRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"styles",
+                    	      													lv_styles_11_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 5 :
+                    	    // InternalUIGrammar.g:8146:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_12_0= ruleUiI18nInfo ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:8146:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_12_0= ruleUiI18nInfo ) ) ) ) )
+                    	    // InternalUIGrammar.g:8147:6: {...}? => ( ({...}? => ( (lv_i18nInfo_12_0= ruleUiI18nInfo ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 4) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiTextField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 4)");
+                    	    }
+                    	    // InternalUIGrammar.g:8147:111: ( ({...}? => ( (lv_i18nInfo_12_0= ruleUiI18nInfo ) ) ) )
+                    	    // InternalUIGrammar.g:8148:7: ({...}? => ( (lv_i18nInfo_12_0= ruleUiI18nInfo ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 4);
+                    	    // InternalUIGrammar.g:8151:10: ({...}? => ( (lv_i18nInfo_12_0= ruleUiI18nInfo ) ) )
+                    	    // InternalUIGrammar.g:8151:11: {...}? => ( (lv_i18nInfo_12_0= ruleUiI18nInfo ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiTextField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:8151:20: ( (lv_i18nInfo_12_0= ruleUiI18nInfo ) )
+                    	    // InternalUIGrammar.g:8151:21: (lv_i18nInfo_12_0= ruleUiI18nInfo )
+                    	    {
+                    	    // InternalUIGrammar.g:8151:21: (lv_i18nInfo_12_0= ruleUiI18nInfo )
+                    	    // InternalUIGrammar.g:8152:11: lv_i18nInfo_12_0= ruleUiI18nInfo
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getUiTextFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_4_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_87);
+                    	    lv_i18nInfo_12_0=ruleUiI18nInfo();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getUiTextFieldRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"i18nInfo",
+                    	      												lv_i18nInfo_12_0,
+                    	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 6 :
+                    	    // InternalUIGrammar.g:8174:5: ({...}? => ( ({...}? => ( (lv_readonly_13_0= 'readonly' ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:8174:5: ({...}? => ( ({...}? => ( (lv_readonly_13_0= 'readonly' ) ) ) ) )
+                    	    // InternalUIGrammar.g:8175:6: {...}? => ( ({...}? => ( (lv_readonly_13_0= 'readonly' ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 5) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiTextField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 5)");
+                    	    }
+                    	    // InternalUIGrammar.g:8175:111: ( ({...}? => ( (lv_readonly_13_0= 'readonly' ) ) ) )
+                    	    // InternalUIGrammar.g:8176:7: ({...}? => ( (lv_readonly_13_0= 'readonly' ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 5);
+                    	    // InternalUIGrammar.g:8179:10: ({...}? => ( (lv_readonly_13_0= 'readonly' ) ) )
+                    	    // InternalUIGrammar.g:8179:11: {...}? => ( (lv_readonly_13_0= 'readonly' ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiTextField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:8179:20: ( (lv_readonly_13_0= 'readonly' ) )
+                    	    // InternalUIGrammar.g:8179:21: (lv_readonly_13_0= 'readonly' )
+                    	    {
+                    	    // InternalUIGrammar.g:8179:21: (lv_readonly_13_0= 'readonly' )
+                    	    // InternalUIGrammar.g:8180:11: lv_readonly_13_0= 'readonly'
+                    	    {
+                    	    lv_readonly_13_0=(Token)match(input,65,FOLLOW_87); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newLeafNode(lv_readonly_13_0, grammarAccess.getUiTextFieldAccess().getReadonlyReadonlyKeyword_2_1_5_0());
+                    	      										
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElement(grammarAccess.getUiTextFieldRule());
+                    	      											}
+                    	      											setWithLastConsumed(current, "readonly", true, "readonly");
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop187;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1());
+
+                    }
+
+                    otherlv_14=(Token)match(input,47,FOLLOW_88); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_14, grammarAccess.getUiTextFieldAccess().getRightParenthesisKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:8209:3: ( (lv_name_15_0= RULE_ID ) )?
+            int alt189=2;
+            int LA189_0 = input.LA(1);
+
+            if ( (LA189_0==RULE_ID) ) {
+                alt189=1;
+            }
+            switch (alt189) {
+                case 1 :
+                    // InternalUIGrammar.g:8210:4: (lv_name_15_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:8210:4: (lv_name_15_0= RULE_ID )
+                    // InternalUIGrammar.g:8211:5: lv_name_15_0= RULE_ID
+                    {
+                    lv_name_15_0=(Token)match(input,RULE_ID,FOLLOW_89); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_15_0, grammarAccess.getUiTextFieldAccess().getNameIDTerminalRuleCall_3_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiTextFieldRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_15_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:8227:3: (otherlv_16= '{' ( ( (lv_validators_17_0= ruleUiValidator ) ) | ( (lv_bindings_18_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_19_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_20= '}' )?
+            int alt192=2;
+            int LA192_0 = input.LA(1);
+
+            if ( (LA192_0==20) ) {
+                alt192=1;
+            }
+            switch (alt192) {
+                case 1 :
+                    // InternalUIGrammar.g:8228:4: otherlv_16= '{' ( ( (lv_validators_17_0= ruleUiValidator ) ) | ( (lv_bindings_18_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_19_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_20= '}'
+                    {
+                    otherlv_16=(Token)match(input,20,FOLLOW_90); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_16, grammarAccess.getUiTextFieldAccess().getLeftCurlyBracketKeyword_4_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:8232:4: ( ( (lv_validators_17_0= ruleUiValidator ) ) | ( (lv_bindings_18_0= ruleUiBinding ) ) )*
+                    loop190:
+                    do {
+                        int alt190=3;
+                        int LA190_0 = input.LA(1);
+
+                        if ( ((LA190_0>=147 && LA190_0<=151)) ) {
+                            alt190=1;
+                        }
+                        else if ( (LA190_0==26) ) {
+                            alt190=2;
+                        }
+
+
+                        switch (alt190) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:8233:5: ( (lv_validators_17_0= ruleUiValidator ) )
+                    	    {
+                    	    // InternalUIGrammar.g:8233:5: ( (lv_validators_17_0= ruleUiValidator ) )
+                    	    // InternalUIGrammar.g:8234:6: (lv_validators_17_0= ruleUiValidator )
+                    	    {
+                    	    // InternalUIGrammar.g:8234:6: (lv_validators_17_0= ruleUiValidator )
+                    	    // InternalUIGrammar.g:8235:7: lv_validators_17_0= ruleUiValidator
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiTextFieldAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_validators_17_0=ruleUiValidator();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiTextFieldRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"validators",
+                    	      								lv_validators_17_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:8253:5: ( (lv_bindings_18_0= ruleUiBinding ) )
+                    	    {
+                    	    // InternalUIGrammar.g:8253:5: ( (lv_bindings_18_0= ruleUiBinding ) )
+                    	    // InternalUIGrammar.g:8254:6: (lv_bindings_18_0= ruleUiBinding )
+                    	    {
+                    	    // InternalUIGrammar.g:8254:6: (lv_bindings_18_0= ruleUiBinding )
+                    	    // InternalUIGrammar.g:8255:7: lv_bindings_18_0= ruleUiBinding
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiTextFieldAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_bindings_18_0=ruleUiBinding();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiTextFieldRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"bindings",
+                    	      								lv_bindings_18_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop190;
+                        }
+                    } while (true);
+
+                    // InternalUIGrammar.g:8273:4: ( (lv_processorAssignments_19_0= ruleUiVisibilityProcessorAssignment ) )*
+                    loop191:
+                    do {
+                        int alt191=2;
+                        int LA191_0 = input.LA(1);
+
+                        if ( (LA191_0==153) ) {
+                            alt191=1;
+                        }
+
+
+                        switch (alt191) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:8274:5: (lv_processorAssignments_19_0= ruleUiVisibilityProcessorAssignment )
+                    	    {
+                    	    // InternalUIGrammar.g:8274:5: (lv_processorAssignments_19_0= ruleUiVisibilityProcessorAssignment )
+                    	    // InternalUIGrammar.g:8275:6: lv_processorAssignments_19_0= ruleUiVisibilityProcessorAssignment
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newCompositeNode(grammarAccess.getUiTextFieldAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
+                    	      					
+                    	    }
+                    	    pushFollow(FOLLOW_42);
+                    	    lv_processorAssignments_19_0=ruleUiVisibilityProcessorAssignment();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						if (current==null) {
+                    	      							current = createModelElementForParent(grammarAccess.getUiTextFieldRule());
+                    	      						}
+                    	      						add(
+                    	      							current,
+                    	      							"processorAssignments",
+                    	      							lv_processorAssignments_19_0,
+                    	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+                    	      						afterParserOrEnumRuleCall();
+                    	      					
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop191;
+                        }
+                    } while (true);
+
+                    otherlv_20=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_20, grammarAccess.getUiTextFieldAccess().getRightCurlyBracketKeyword_4_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiTextField"
+
+
+    // $ANTLR start "entryRuleUiPasswordField"
+    // InternalUIGrammar.g:8301:1: entryRuleUiPasswordField returns [EObject current=null] : iv_ruleUiPasswordField= ruleUiPasswordField EOF ;
+    public final EObject entryRuleUiPasswordField() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiPasswordField = null;
+
+
+        try {
+            // InternalUIGrammar.g:8301:56: (iv_ruleUiPasswordField= ruleUiPasswordField EOF )
+            // InternalUIGrammar.g:8302:2: iv_ruleUiPasswordField= ruleUiPasswordField EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiPasswordFieldRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiPasswordField=ruleUiPasswordField();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiPasswordField; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiPasswordField"
+
+
+    // $ANTLR start "ruleUiPasswordField"
+    // InternalUIGrammar.g:8308:1: ruleUiPasswordField returns [EObject current=null] : ( () otherlv_1= 'passwordField' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? (otherlv_10= '{' ( ( (lv_validators_11_0= ruleUiValidator ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )? ) ;
+    public final EObject ruleUiPasswordField() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Token lv_styles_5_0=null;
+        Token lv_readonly_7_0=null;
+        Token otherlv_8=null;
+        Token lv_name_9_0=null;
+        Token otherlv_10=null;
+        Token otherlv_14=null;
+        EObject lv_i18nInfo_6_0 = null;
+
+        EObject lv_validators_11_0 = null;
+
+        EObject lv_bindings_12_0 = null;
+
+        EObject lv_processorAssignments_13_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:8314:2: ( ( () otherlv_1= 'passwordField' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? (otherlv_10= '{' ( ( (lv_validators_11_0= ruleUiValidator ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )? ) )
+            // InternalUIGrammar.g:8315:2: ( () otherlv_1= 'passwordField' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? (otherlv_10= '{' ( ( (lv_validators_11_0= ruleUiValidator ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )? )
+            {
+            // InternalUIGrammar.g:8315:2: ( () otherlv_1= 'passwordField' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? (otherlv_10= '{' ( ( (lv_validators_11_0= ruleUiValidator ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )? )
+            // InternalUIGrammar.g:8316:3: () otherlv_1= 'passwordField' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? (otherlv_10= '{' ( ( (lv_validators_11_0= ruleUiValidator ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )?
+            {
+            // InternalUIGrammar.g:8316:3: ()
+            // InternalUIGrammar.g:8317:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiPasswordFieldAccess().getUiPasswordFieldAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,95,FOLLOW_86); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiPasswordFieldAccess().getPasswordFieldKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:8327:3: (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_8= ')' )?
+            int alt194=2;
+            int LA194_0 = input.LA(1);
+
+            if ( (LA194_0==45) ) {
+                alt194=1;
+            }
+            switch (alt194) {
+                case 1 :
+                    // InternalUIGrammar.g:8328:4: otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_8= ')'
+                    {
+                    otherlv_2=(Token)match(input,45,FOLLOW_62); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getUiPasswordFieldAccess().getLeftParenthesisKeyword_2_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:8332:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:8333:5: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:8333:5: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:8334:6: ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1());
+                    // InternalUIGrammar.g:8337:6: ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:8338:7: ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:8338:7: ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )*
+                    loop193:
+                    do {
+                        int alt193=4;
+                        int LA193_0 = input.LA(1);
+
+                        if ( LA193_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1(), 0) ) {
+                            alt193=1;
+                        }
+                        else if ( LA193_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1(), 1) ) {
+                            alt193=2;
+                        }
+                        else if ( LA193_0 == 65 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1(), 2) ) {
+                            alt193=3;
+                        }
+
+
+                        switch (alt193) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:8339:5: ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:8339:5: ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:8340:6: {...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiPasswordField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:8340:115: ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:8341:7: ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1(), 0);
+                    	    // InternalUIGrammar.g:8344:10: ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:8344:11: {...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiPasswordField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:8344:20: (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:8344:21: otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_4=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_4, grammarAccess.getUiPasswordFieldAccess().getStylesKeyword_2_1_0_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:8348:10: ( (lv_styles_5_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:8349:11: (lv_styles_5_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:8349:11: (lv_styles_5_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:8350:12: lv_styles_5_0= RULE_STRING
+                    	    {
+                    	    lv_styles_5_0=(Token)match(input,RULE_STRING,FOLLOW_62); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_styles_5_0, grammarAccess.getUiPasswordFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_0_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiPasswordFieldRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"styles",
+                    	      													lv_styles_5_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:8372:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:8372:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) )
+                    	    // InternalUIGrammar.g:8373:6: {...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiPasswordField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:8373:115: ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) )
+                    	    // InternalUIGrammar.g:8374:7: ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1(), 1);
+                    	    // InternalUIGrammar.g:8377:10: ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) )
+                    	    // InternalUIGrammar.g:8377:11: {...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiPasswordField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:8377:20: ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) )
+                    	    // InternalUIGrammar.g:8377:21: (lv_i18nInfo_6_0= ruleUiI18nInfo )
+                    	    {
+                    	    // InternalUIGrammar.g:8377:21: (lv_i18nInfo_6_0= ruleUiI18nInfo )
+                    	    // InternalUIGrammar.g:8378:11: lv_i18nInfo_6_0= ruleUiI18nInfo
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getUiPasswordFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_1_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_62);
+                    	    lv_i18nInfo_6_0=ruleUiI18nInfo();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getUiPasswordFieldRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"i18nInfo",
+                    	      												lv_i18nInfo_6_0,
+                    	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 3 :
+                    	    // InternalUIGrammar.g:8400:5: ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:8400:5: ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) )
+                    	    // InternalUIGrammar.g:8401:6: {...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1(), 2) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiPasswordField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1(), 2)");
+                    	    }
+                    	    // InternalUIGrammar.g:8401:115: ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) )
+                    	    // InternalUIGrammar.g:8402:7: ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1(), 2);
+                    	    // InternalUIGrammar.g:8405:10: ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) )
+                    	    // InternalUIGrammar.g:8405:11: {...}? => ( (lv_readonly_7_0= 'readonly' ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiPasswordField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:8405:20: ( (lv_readonly_7_0= 'readonly' ) )
+                    	    // InternalUIGrammar.g:8405:21: (lv_readonly_7_0= 'readonly' )
+                    	    {
+                    	    // InternalUIGrammar.g:8405:21: (lv_readonly_7_0= 'readonly' )
+                    	    // InternalUIGrammar.g:8406:11: lv_readonly_7_0= 'readonly'
+                    	    {
+                    	    lv_readonly_7_0=(Token)match(input,65,FOLLOW_62); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newLeafNode(lv_readonly_7_0, grammarAccess.getUiPasswordFieldAccess().getReadonlyReadonlyKeyword_2_1_2_0());
+                    	      										
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElement(grammarAccess.getUiPasswordFieldRule());
+                    	      											}
+                    	      											setWithLastConsumed(current, "readonly", true, "readonly");
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop193;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1());
+
+                    }
+
+                    otherlv_8=(Token)match(input,47,FOLLOW_88); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_8, grammarAccess.getUiPasswordFieldAccess().getRightParenthesisKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:8435:3: ( (lv_name_9_0= RULE_ID ) )?
+            int alt195=2;
+            int LA195_0 = input.LA(1);
+
+            if ( (LA195_0==RULE_ID) ) {
+                alt195=1;
+            }
+            switch (alt195) {
+                case 1 :
+                    // InternalUIGrammar.g:8436:4: (lv_name_9_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:8436:4: (lv_name_9_0= RULE_ID )
+                    // InternalUIGrammar.g:8437:5: lv_name_9_0= RULE_ID
+                    {
+                    lv_name_9_0=(Token)match(input,RULE_ID,FOLLOW_89); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_9_0, grammarAccess.getUiPasswordFieldAccess().getNameIDTerminalRuleCall_3_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiPasswordFieldRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_9_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:8453:3: (otherlv_10= '{' ( ( (lv_validators_11_0= ruleUiValidator ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )?
+            int alt198=2;
+            int LA198_0 = input.LA(1);
+
+            if ( (LA198_0==20) ) {
+                alt198=1;
+            }
+            switch (alt198) {
+                case 1 :
+                    // InternalUIGrammar.g:8454:4: otherlv_10= '{' ( ( (lv_validators_11_0= ruleUiValidator ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}'
+                    {
+                    otherlv_10=(Token)match(input,20,FOLLOW_90); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_10, grammarAccess.getUiPasswordFieldAccess().getLeftCurlyBracketKeyword_4_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:8458:4: ( ( (lv_validators_11_0= ruleUiValidator ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) )*
+                    loop196:
+                    do {
+                        int alt196=3;
+                        int LA196_0 = input.LA(1);
+
+                        if ( ((LA196_0>=147 && LA196_0<=151)) ) {
+                            alt196=1;
+                        }
+                        else if ( (LA196_0==26) ) {
+                            alt196=2;
+                        }
+
+
+                        switch (alt196) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:8459:5: ( (lv_validators_11_0= ruleUiValidator ) )
+                    	    {
+                    	    // InternalUIGrammar.g:8459:5: ( (lv_validators_11_0= ruleUiValidator ) )
+                    	    // InternalUIGrammar.g:8460:6: (lv_validators_11_0= ruleUiValidator )
+                    	    {
+                    	    // InternalUIGrammar.g:8460:6: (lv_validators_11_0= ruleUiValidator )
+                    	    // InternalUIGrammar.g:8461:7: lv_validators_11_0= ruleUiValidator
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiPasswordFieldAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_validators_11_0=ruleUiValidator();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiPasswordFieldRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"validators",
+                    	      								lv_validators_11_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:8479:5: ( (lv_bindings_12_0= ruleUiBinding ) )
+                    	    {
+                    	    // InternalUIGrammar.g:8479:5: ( (lv_bindings_12_0= ruleUiBinding ) )
+                    	    // InternalUIGrammar.g:8480:6: (lv_bindings_12_0= ruleUiBinding )
+                    	    {
+                    	    // InternalUIGrammar.g:8480:6: (lv_bindings_12_0= ruleUiBinding )
+                    	    // InternalUIGrammar.g:8481:7: lv_bindings_12_0= ruleUiBinding
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiPasswordFieldAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_bindings_12_0=ruleUiBinding();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiPasswordFieldRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"bindings",
+                    	      								lv_bindings_12_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop196;
+                        }
+                    } while (true);
+
+                    // InternalUIGrammar.g:8499:4: ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )*
+                    loop197:
+                    do {
+                        int alt197=2;
+                        int LA197_0 = input.LA(1);
+
+                        if ( (LA197_0==153) ) {
+                            alt197=1;
+                        }
+
+
+                        switch (alt197) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:8500:5: (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment )
+                    	    {
+                    	    // InternalUIGrammar.g:8500:5: (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment )
+                    	    // InternalUIGrammar.g:8501:6: lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newCompositeNode(grammarAccess.getUiPasswordFieldAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
+                    	      					
+                    	    }
+                    	    pushFollow(FOLLOW_42);
+                    	    lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						if (current==null) {
+                    	      							current = createModelElementForParent(grammarAccess.getUiPasswordFieldRule());
+                    	      						}
+                    	      						add(
+                    	      							current,
+                    	      							"processorAssignments",
+                    	      							lv_processorAssignments_13_0,
+                    	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+                    	      						afterParserOrEnumRuleCall();
+                    	      					
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop197;
+                        }
+                    } while (true);
+
+                    otherlv_14=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_14, grammarAccess.getUiPasswordFieldAccess().getRightCurlyBracketKeyword_4_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiPasswordField"
+
+
+    // $ANTLR start "entryRuleUiMaskedTextField"
+    // InternalUIGrammar.g:8527:1: entryRuleUiMaskedTextField returns [EObject current=null] : iv_ruleUiMaskedTextField= ruleUiMaskedTextField EOF ;
+    public final EObject entryRuleUiMaskedTextField() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiMaskedTextField = null;
+
+
+        try {
+            // InternalUIGrammar.g:8527:58: (iv_ruleUiMaskedTextField= ruleUiMaskedTextField EOF )
+            // InternalUIGrammar.g:8528:2: iv_ruleUiMaskedTextField= ruleUiMaskedTextField EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiMaskedTextFieldRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiMaskedTextField=ruleUiMaskedTextField();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiMaskedTextField; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiMaskedTextField"
+
+
+    // $ANTLR start "ruleUiMaskedTextField"
+    // InternalUIGrammar.g:8534:1: ruleUiMaskedTextField returns [EObject current=null] : ( () otherlv_1= 'maskedText' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')' )? ( (lv_name_11_0= RULE_ID ) )? (otherlv_12= '{' ( ( (lv_validators_13_0= ruleUiValidator ) ) | ( (lv_bindings_14_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}' )? ) ;
+    public final EObject ruleUiMaskedTextField() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Token lv_styles_5_0=null;
+        Token otherlv_6=null;
+        Token lv_mask_7_0=null;
+        Token lv_readonly_9_0=null;
+        Token otherlv_10=null;
+        Token lv_name_11_0=null;
+        Token otherlv_12=null;
+        Token otherlv_16=null;
+        EObject lv_i18nInfo_8_0 = null;
+
+        EObject lv_validators_13_0 = null;
+
+        EObject lv_bindings_14_0 = null;
+
+        EObject lv_processorAssignments_15_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:8540:2: ( ( () otherlv_1= 'maskedText' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')' )? ( (lv_name_11_0= RULE_ID ) )? (otherlv_12= '{' ( ( (lv_validators_13_0= ruleUiValidator ) ) | ( (lv_bindings_14_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}' )? ) )
+            // InternalUIGrammar.g:8541:2: ( () otherlv_1= 'maskedText' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')' )? ( (lv_name_11_0= RULE_ID ) )? (otherlv_12= '{' ( ( (lv_validators_13_0= ruleUiValidator ) ) | ( (lv_bindings_14_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}' )? )
+            {
+            // InternalUIGrammar.g:8541:2: ( () otherlv_1= 'maskedText' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')' )? ( (lv_name_11_0= RULE_ID ) )? (otherlv_12= '{' ( ( (lv_validators_13_0= ruleUiValidator ) ) | ( (lv_bindings_14_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}' )? )
+            // InternalUIGrammar.g:8542:3: () otherlv_1= 'maskedText' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')' )? ( (lv_name_11_0= RULE_ID ) )? (otherlv_12= '{' ( ( (lv_validators_13_0= ruleUiValidator ) ) | ( (lv_bindings_14_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}' )?
+            {
+            // InternalUIGrammar.g:8542:3: ()
+            // InternalUIGrammar.g:8543:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiMaskedTextFieldAccess().getUiMaskedTextFieldAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,96,FOLLOW_86); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiMaskedTextFieldAccess().getMaskedTextKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:8553:3: (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')' )?
+            int alt200=2;
+            int LA200_0 = input.LA(1);
+
+            if ( (LA200_0==45) ) {
+                alt200=1;
+            }
+            switch (alt200) {
+                case 1 :
+                    // InternalUIGrammar.g:8554:4: otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')'
+                    {
+                    otherlv_2=(Token)match(input,45,FOLLOW_91); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getUiMaskedTextFieldAccess().getLeftParenthesisKeyword_2_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:8558:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:8559:5: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:8559:5: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:8560:6: ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1());
+                    // InternalUIGrammar.g:8563:6: ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:8564:7: ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:8564:7: ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )*
+                    loop199:
+                    do {
+                        int alt199=5;
+                        int LA199_0 = input.LA(1);
+
+                        if ( LA199_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), 0) ) {
+                            alt199=1;
+                        }
+                        else if ( LA199_0 == 97 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), 1) ) {
+                            alt199=2;
+                        }
+                        else if ( LA199_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), 2) ) {
+                            alt199=3;
+                        }
+                        else if ( LA199_0 == 65 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), 3) ) {
+                            alt199=4;
+                        }
+
+
+                        switch (alt199) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:8565:5: ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:8565:5: ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:8566:6: {...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMaskedTextField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:8566:117: ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:8567:7: ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), 0);
+                    	    // InternalUIGrammar.g:8570:10: ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:8570:11: {...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMaskedTextField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:8570:20: (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:8570:21: otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_4=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_4, grammarAccess.getUiMaskedTextFieldAccess().getStylesKeyword_2_1_0_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:8574:10: ( (lv_styles_5_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:8575:11: (lv_styles_5_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:8575:11: (lv_styles_5_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:8576:12: lv_styles_5_0= RULE_STRING
+                    	    {
+                    	    lv_styles_5_0=(Token)match(input,RULE_STRING,FOLLOW_91); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_styles_5_0, grammarAccess.getUiMaskedTextFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_0_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiMaskedTextFieldRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"styles",
+                    	      													lv_styles_5_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:8598:5: ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:8598:5: ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:8599:6: {...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMaskedTextField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:8599:117: ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:8600:7: ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), 1);
+                    	    // InternalUIGrammar.g:8603:10: ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:8603:11: {...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMaskedTextField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:8603:20: (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:8603:21: otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_6=(Token)match(input,97,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_6, grammarAccess.getUiMaskedTextFieldAccess().getMaskKeyword_2_1_1_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:8607:10: ( (lv_mask_7_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:8608:11: (lv_mask_7_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:8608:11: (lv_mask_7_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:8609:12: lv_mask_7_0= RULE_STRING
+                    	    {
+                    	    lv_mask_7_0=(Token)match(input,RULE_STRING,FOLLOW_91); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_mask_7_0, grammarAccess.getUiMaskedTextFieldAccess().getMaskSTRINGTerminalRuleCall_2_1_1_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiMaskedTextFieldRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"mask",
+                    	      													lv_mask_7_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 3 :
+                    	    // InternalUIGrammar.g:8631:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:8631:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) )
+                    	    // InternalUIGrammar.g:8632:6: {...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), 2) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMaskedTextField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), 2)");
+                    	    }
+                    	    // InternalUIGrammar.g:8632:117: ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) )
+                    	    // InternalUIGrammar.g:8633:7: ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), 2);
+                    	    // InternalUIGrammar.g:8636:10: ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) )
+                    	    // InternalUIGrammar.g:8636:11: {...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMaskedTextField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:8636:20: ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) )
+                    	    // InternalUIGrammar.g:8636:21: (lv_i18nInfo_8_0= ruleUiI18nInfo )
+                    	    {
+                    	    // InternalUIGrammar.g:8636:21: (lv_i18nInfo_8_0= ruleUiI18nInfo )
+                    	    // InternalUIGrammar.g:8637:11: lv_i18nInfo_8_0= ruleUiI18nInfo
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getUiMaskedTextFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_2_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_91);
+                    	    lv_i18nInfo_8_0=ruleUiI18nInfo();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getUiMaskedTextFieldRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"i18nInfo",
+                    	      												lv_i18nInfo_8_0,
+                    	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 4 :
+                    	    // InternalUIGrammar.g:8659:5: ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:8659:5: ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) )
+                    	    // InternalUIGrammar.g:8660:6: {...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), 3) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMaskedTextField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), 3)");
+                    	    }
+                    	    // InternalUIGrammar.g:8660:117: ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) )
+                    	    // InternalUIGrammar.g:8661:7: ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), 3);
+                    	    // InternalUIGrammar.g:8664:10: ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) )
+                    	    // InternalUIGrammar.g:8664:11: {...}? => ( (lv_readonly_9_0= 'readonly' ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMaskedTextField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:8664:20: ( (lv_readonly_9_0= 'readonly' ) )
+                    	    // InternalUIGrammar.g:8664:21: (lv_readonly_9_0= 'readonly' )
+                    	    {
+                    	    // InternalUIGrammar.g:8664:21: (lv_readonly_9_0= 'readonly' )
+                    	    // InternalUIGrammar.g:8665:11: lv_readonly_9_0= 'readonly'
+                    	    {
+                    	    lv_readonly_9_0=(Token)match(input,65,FOLLOW_91); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newLeafNode(lv_readonly_9_0, grammarAccess.getUiMaskedTextFieldAccess().getReadonlyReadonlyKeyword_2_1_3_0());
+                    	      										
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElement(grammarAccess.getUiMaskedTextFieldRule());
+                    	      											}
+                    	      											setWithLastConsumed(current, "readonly", true, "readonly");
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop199;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1());
+
+                    }
+
+                    otherlv_10=(Token)match(input,47,FOLLOW_88); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_10, grammarAccess.getUiMaskedTextFieldAccess().getRightParenthesisKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:8694:3: ( (lv_name_11_0= RULE_ID ) )?
+            int alt201=2;
+            int LA201_0 = input.LA(1);
+
+            if ( (LA201_0==RULE_ID) ) {
+                alt201=1;
+            }
+            switch (alt201) {
+                case 1 :
+                    // InternalUIGrammar.g:8695:4: (lv_name_11_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:8695:4: (lv_name_11_0= RULE_ID )
+                    // InternalUIGrammar.g:8696:5: lv_name_11_0= RULE_ID
+                    {
+                    lv_name_11_0=(Token)match(input,RULE_ID,FOLLOW_89); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_11_0, grammarAccess.getUiMaskedTextFieldAccess().getNameIDTerminalRuleCall_3_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiMaskedTextFieldRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_11_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:8712:3: (otherlv_12= '{' ( ( (lv_validators_13_0= ruleUiValidator ) ) | ( (lv_bindings_14_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}' )?
+            int alt204=2;
+            int LA204_0 = input.LA(1);
+
+            if ( (LA204_0==20) ) {
+                alt204=1;
+            }
+            switch (alt204) {
+                case 1 :
+                    // InternalUIGrammar.g:8713:4: otherlv_12= '{' ( ( (lv_validators_13_0= ruleUiValidator ) ) | ( (lv_bindings_14_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}'
+                    {
+                    otherlv_12=(Token)match(input,20,FOLLOW_90); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_12, grammarAccess.getUiMaskedTextFieldAccess().getLeftCurlyBracketKeyword_4_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:8717:4: ( ( (lv_validators_13_0= ruleUiValidator ) ) | ( (lv_bindings_14_0= ruleUiBinding ) ) )*
+                    loop202:
+                    do {
+                        int alt202=3;
+                        int LA202_0 = input.LA(1);
+
+                        if ( ((LA202_0>=147 && LA202_0<=151)) ) {
+                            alt202=1;
+                        }
+                        else if ( (LA202_0==26) ) {
+                            alt202=2;
+                        }
+
+
+                        switch (alt202) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:8718:5: ( (lv_validators_13_0= ruleUiValidator ) )
+                    	    {
+                    	    // InternalUIGrammar.g:8718:5: ( (lv_validators_13_0= ruleUiValidator ) )
+                    	    // InternalUIGrammar.g:8719:6: (lv_validators_13_0= ruleUiValidator )
+                    	    {
+                    	    // InternalUIGrammar.g:8719:6: (lv_validators_13_0= ruleUiValidator )
+                    	    // InternalUIGrammar.g:8720:7: lv_validators_13_0= ruleUiValidator
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiMaskedTextFieldAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_validators_13_0=ruleUiValidator();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiMaskedTextFieldRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"validators",
+                    	      								lv_validators_13_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:8738:5: ( (lv_bindings_14_0= ruleUiBinding ) )
+                    	    {
+                    	    // InternalUIGrammar.g:8738:5: ( (lv_bindings_14_0= ruleUiBinding ) )
+                    	    // InternalUIGrammar.g:8739:6: (lv_bindings_14_0= ruleUiBinding )
+                    	    {
+                    	    // InternalUIGrammar.g:8739:6: (lv_bindings_14_0= ruleUiBinding )
+                    	    // InternalUIGrammar.g:8740:7: lv_bindings_14_0= ruleUiBinding
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiMaskedTextFieldAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_bindings_14_0=ruleUiBinding();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiMaskedTextFieldRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"bindings",
+                    	      								lv_bindings_14_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop202;
+                        }
+                    } while (true);
+
+                    // InternalUIGrammar.g:8758:4: ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )*
+                    loop203:
+                    do {
+                        int alt203=2;
+                        int LA203_0 = input.LA(1);
+
+                        if ( (LA203_0==153) ) {
+                            alt203=1;
+                        }
+
+
+                        switch (alt203) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:8759:5: (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment )
+                    	    {
+                    	    // InternalUIGrammar.g:8759:5: (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment )
+                    	    // InternalUIGrammar.g:8760:6: lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newCompositeNode(grammarAccess.getUiMaskedTextFieldAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
+                    	      					
+                    	    }
+                    	    pushFollow(FOLLOW_42);
+                    	    lv_processorAssignments_15_0=ruleUiVisibilityProcessorAssignment();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						if (current==null) {
+                    	      							current = createModelElementForParent(grammarAccess.getUiMaskedTextFieldRule());
+                    	      						}
+                    	      						add(
+                    	      							current,
+                    	      							"processorAssignments",
+                    	      							lv_processorAssignments_15_0,
+                    	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+                    	      						afterParserOrEnumRuleCall();
+                    	      					
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop203;
+                        }
+                    } while (true);
+
+                    otherlv_16=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_16, grammarAccess.getUiMaskedTextFieldAccess().getRightCurlyBracketKeyword_4_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiMaskedTextField"
+
+
+    // $ANTLR start "entryRuleUiMaskedNumericField"
+    // InternalUIGrammar.g:8786:1: entryRuleUiMaskedNumericField returns [EObject current=null] : iv_ruleUiMaskedNumericField= ruleUiMaskedNumericField EOF ;
+    public final EObject entryRuleUiMaskedNumericField() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiMaskedNumericField = null;
+
+
+        try {
+            // InternalUIGrammar.g:8786:61: (iv_ruleUiMaskedNumericField= ruleUiMaskedNumericField EOF )
+            // InternalUIGrammar.g:8787:2: iv_ruleUiMaskedNumericField= ruleUiMaskedNumericField EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiMaskedNumericFieldRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiMaskedNumericField=ruleUiMaskedNumericField();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiMaskedNumericField; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiMaskedNumericField"
+
+
+    // $ANTLR start "ruleUiMaskedNumericField"
+    // InternalUIGrammar.g:8793:1: ruleUiMaskedNumericField returns [EObject current=null] : ( () otherlv_1= 'maskedNumeric' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? (otherlv_10= '{' ( ( (lv_validators_11_0= ruleUiValidator ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )? ) ;
+    public final EObject ruleUiMaskedNumericField() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Token lv_styles_5_0=null;
+        Token lv_readonly_7_0=null;
+        Token otherlv_8=null;
+        Token lv_name_9_0=null;
+        Token otherlv_10=null;
+        Token otherlv_14=null;
+        EObject lv_i18nInfo_6_0 = null;
+
+        EObject lv_validators_11_0 = null;
+
+        EObject lv_bindings_12_0 = null;
+
+        EObject lv_processorAssignments_13_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:8799:2: ( ( () otherlv_1= 'maskedNumeric' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? (otherlv_10= '{' ( ( (lv_validators_11_0= ruleUiValidator ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )? ) )
+            // InternalUIGrammar.g:8800:2: ( () otherlv_1= 'maskedNumeric' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? (otherlv_10= '{' ( ( (lv_validators_11_0= ruleUiValidator ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )? )
+            {
+            // InternalUIGrammar.g:8800:2: ( () otherlv_1= 'maskedNumeric' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? (otherlv_10= '{' ( ( (lv_validators_11_0= ruleUiValidator ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )? )
+            // InternalUIGrammar.g:8801:3: () otherlv_1= 'maskedNumeric' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? (otherlv_10= '{' ( ( (lv_validators_11_0= ruleUiValidator ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )?
+            {
+            // InternalUIGrammar.g:8801:3: ()
+            // InternalUIGrammar.g:8802:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiMaskedNumericFieldAccess().getUiMaskedNumericFieldAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,98,FOLLOW_86); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiMaskedNumericFieldAccess().getMaskedNumericKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:8812:3: (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_8= ')' )?
+            int alt206=2;
+            int LA206_0 = input.LA(1);
+
+            if ( (LA206_0==45) ) {
+                alt206=1;
+            }
+            switch (alt206) {
+                case 1 :
+                    // InternalUIGrammar.g:8813:4: otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_8= ')'
+                    {
+                    otherlv_2=(Token)match(input,45,FOLLOW_62); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getUiMaskedNumericFieldAccess().getLeftParenthesisKeyword_2_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:8817:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:8818:5: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:8818:5: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:8819:6: ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1());
+                    // InternalUIGrammar.g:8822:6: ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:8823:7: ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:8823:7: ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) ) )*
+                    loop205:
+                    do {
+                        int alt205=4;
+                        int LA205_0 = input.LA(1);
+
+                        if ( LA205_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1(), 0) ) {
+                            alt205=1;
+                        }
+                        else if ( LA205_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1(), 1) ) {
+                            alt205=2;
+                        }
+                        else if ( LA205_0 == 65 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1(), 2) ) {
+                            alt205=3;
+                        }
+
+
+                        switch (alt205) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:8824:5: ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:8824:5: ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:8825:6: {...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMaskedNumericField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:8825:120: ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:8826:7: ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1(), 0);
+                    	    // InternalUIGrammar.g:8829:10: ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:8829:11: {...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMaskedNumericField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:8829:20: (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:8829:21: otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_4=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_4, grammarAccess.getUiMaskedNumericFieldAccess().getStylesKeyword_2_1_0_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:8833:10: ( (lv_styles_5_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:8834:11: (lv_styles_5_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:8834:11: (lv_styles_5_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:8835:12: lv_styles_5_0= RULE_STRING
+                    	    {
+                    	    lv_styles_5_0=(Token)match(input,RULE_STRING,FOLLOW_62); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_styles_5_0, grammarAccess.getUiMaskedNumericFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_0_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiMaskedNumericFieldRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"styles",
+                    	      													lv_styles_5_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:8857:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:8857:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) )
+                    	    // InternalUIGrammar.g:8858:6: {...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMaskedNumericField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:8858:120: ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) )
+                    	    // InternalUIGrammar.g:8859:7: ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1(), 1);
+                    	    // InternalUIGrammar.g:8862:10: ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) )
+                    	    // InternalUIGrammar.g:8862:11: {...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMaskedNumericField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:8862:20: ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) )
+                    	    // InternalUIGrammar.g:8862:21: (lv_i18nInfo_6_0= ruleUiI18nInfo )
+                    	    {
+                    	    // InternalUIGrammar.g:8862:21: (lv_i18nInfo_6_0= ruleUiI18nInfo )
+                    	    // InternalUIGrammar.g:8863:11: lv_i18nInfo_6_0= ruleUiI18nInfo
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getUiMaskedNumericFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_1_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_62);
+                    	    lv_i18nInfo_6_0=ruleUiI18nInfo();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getUiMaskedNumericFieldRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"i18nInfo",
+                    	      												lv_i18nInfo_6_0,
+                    	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 3 :
+                    	    // InternalUIGrammar.g:8885:5: ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:8885:5: ({...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) ) )
+                    	    // InternalUIGrammar.g:8886:6: {...}? => ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1(), 2) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMaskedNumericField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1(), 2)");
+                    	    }
+                    	    // InternalUIGrammar.g:8886:120: ( ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) ) )
+                    	    // InternalUIGrammar.g:8887:7: ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1(), 2);
+                    	    // InternalUIGrammar.g:8890:10: ({...}? => ( (lv_readonly_7_0= 'readonly' ) ) )
+                    	    // InternalUIGrammar.g:8890:11: {...}? => ( (lv_readonly_7_0= 'readonly' ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMaskedNumericField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:8890:20: ( (lv_readonly_7_0= 'readonly' ) )
+                    	    // InternalUIGrammar.g:8890:21: (lv_readonly_7_0= 'readonly' )
+                    	    {
+                    	    // InternalUIGrammar.g:8890:21: (lv_readonly_7_0= 'readonly' )
+                    	    // InternalUIGrammar.g:8891:11: lv_readonly_7_0= 'readonly'
+                    	    {
+                    	    lv_readonly_7_0=(Token)match(input,65,FOLLOW_62); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newLeafNode(lv_readonly_7_0, grammarAccess.getUiMaskedNumericFieldAccess().getReadonlyReadonlyKeyword_2_1_2_0());
+                    	      										
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElement(grammarAccess.getUiMaskedNumericFieldRule());
+                    	      											}
+                    	      											setWithLastConsumed(current, "readonly", true, "readonly");
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop205;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1());
+
+                    }
+
+                    otherlv_8=(Token)match(input,47,FOLLOW_88); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_8, grammarAccess.getUiMaskedNumericFieldAccess().getRightParenthesisKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:8920:3: ( (lv_name_9_0= RULE_ID ) )?
+            int alt207=2;
+            int LA207_0 = input.LA(1);
+
+            if ( (LA207_0==RULE_ID) ) {
+                alt207=1;
+            }
+            switch (alt207) {
+                case 1 :
+                    // InternalUIGrammar.g:8921:4: (lv_name_9_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:8921:4: (lv_name_9_0= RULE_ID )
+                    // InternalUIGrammar.g:8922:5: lv_name_9_0= RULE_ID
+                    {
+                    lv_name_9_0=(Token)match(input,RULE_ID,FOLLOW_89); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_9_0, grammarAccess.getUiMaskedNumericFieldAccess().getNameIDTerminalRuleCall_3_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiMaskedNumericFieldRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_9_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:8938:3: (otherlv_10= '{' ( ( (lv_validators_11_0= ruleUiValidator ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )?
+            int alt210=2;
+            int LA210_0 = input.LA(1);
+
+            if ( (LA210_0==20) ) {
+                alt210=1;
+            }
+            switch (alt210) {
+                case 1 :
+                    // InternalUIGrammar.g:8939:4: otherlv_10= '{' ( ( (lv_validators_11_0= ruleUiValidator ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}'
+                    {
+                    otherlv_10=(Token)match(input,20,FOLLOW_90); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_10, grammarAccess.getUiMaskedNumericFieldAccess().getLeftCurlyBracketKeyword_4_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:8943:4: ( ( (lv_validators_11_0= ruleUiValidator ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) )*
+                    loop208:
+                    do {
+                        int alt208=3;
+                        int LA208_0 = input.LA(1);
+
+                        if ( ((LA208_0>=147 && LA208_0<=151)) ) {
+                            alt208=1;
+                        }
+                        else if ( (LA208_0==26) ) {
+                            alt208=2;
+                        }
+
+
+                        switch (alt208) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:8944:5: ( (lv_validators_11_0= ruleUiValidator ) )
+                    	    {
+                    	    // InternalUIGrammar.g:8944:5: ( (lv_validators_11_0= ruleUiValidator ) )
+                    	    // InternalUIGrammar.g:8945:6: (lv_validators_11_0= ruleUiValidator )
+                    	    {
+                    	    // InternalUIGrammar.g:8945:6: (lv_validators_11_0= ruleUiValidator )
+                    	    // InternalUIGrammar.g:8946:7: lv_validators_11_0= ruleUiValidator
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiMaskedNumericFieldAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_validators_11_0=ruleUiValidator();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiMaskedNumericFieldRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"validators",
+                    	      								lv_validators_11_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:8964:5: ( (lv_bindings_12_0= ruleUiBinding ) )
+                    	    {
+                    	    // InternalUIGrammar.g:8964:5: ( (lv_bindings_12_0= ruleUiBinding ) )
+                    	    // InternalUIGrammar.g:8965:6: (lv_bindings_12_0= ruleUiBinding )
+                    	    {
+                    	    // InternalUIGrammar.g:8965:6: (lv_bindings_12_0= ruleUiBinding )
+                    	    // InternalUIGrammar.g:8966:7: lv_bindings_12_0= ruleUiBinding
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiMaskedNumericFieldAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_bindings_12_0=ruleUiBinding();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiMaskedNumericFieldRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"bindings",
+                    	      								lv_bindings_12_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop208;
+                        }
+                    } while (true);
+
+                    // InternalUIGrammar.g:8984:4: ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )*
+                    loop209:
+                    do {
+                        int alt209=2;
+                        int LA209_0 = input.LA(1);
+
+                        if ( (LA209_0==153) ) {
+                            alt209=1;
+                        }
+
+
+                        switch (alt209) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:8985:5: (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment )
+                    	    {
+                    	    // InternalUIGrammar.g:8985:5: (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment )
+                    	    // InternalUIGrammar.g:8986:6: lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newCompositeNode(grammarAccess.getUiMaskedNumericFieldAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
+                    	      					
+                    	    }
+                    	    pushFollow(FOLLOW_42);
+                    	    lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						if (current==null) {
+                    	      							current = createModelElementForParent(grammarAccess.getUiMaskedNumericFieldRule());
+                    	      						}
+                    	      						add(
+                    	      							current,
+                    	      							"processorAssignments",
+                    	      							lv_processorAssignments_13_0,
+                    	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+                    	      						afterParserOrEnumRuleCall();
+                    	      					
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop209;
+                        }
+                    } while (true);
+
+                    otherlv_14=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_14, grammarAccess.getUiMaskedNumericFieldAccess().getRightCurlyBracketKeyword_4_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiMaskedNumericField"
+
+
+    // $ANTLR start "entryRuleUiMaskedDecimalField"
+    // InternalUIGrammar.g:9012:1: entryRuleUiMaskedDecimalField returns [EObject current=null] : iv_ruleUiMaskedDecimalField= ruleUiMaskedDecimalField EOF ;
+    public final EObject entryRuleUiMaskedDecimalField() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiMaskedDecimalField = null;
+
+
+        try {
+            // InternalUIGrammar.g:9012:61: (iv_ruleUiMaskedDecimalField= ruleUiMaskedDecimalField EOF )
+            // InternalUIGrammar.g:9013:2: iv_ruleUiMaskedDecimalField= ruleUiMaskedDecimalField EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiMaskedDecimalFieldRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiMaskedDecimalField=ruleUiMaskedDecimalField();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiMaskedDecimalField; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiMaskedDecimalField"
+
+
+    // $ANTLR start "ruleUiMaskedDecimalField"
+    // InternalUIGrammar.g:9019:1: ruleUiMaskedDecimalField returns [EObject current=null] : ( () otherlv_1= 'maskedDecimal' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')' )? ( (lv_name_11_0= RULE_ID ) )? (otherlv_12= '{' ( ( (lv_validators_13_0= ruleUiValidator ) ) | ( (lv_bindings_14_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}' )? ) ;
+    public final EObject ruleUiMaskedDecimalField() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Token lv_styles_5_0=null;
+        Token otherlv_6=null;
+        Token lv_mask_7_0=null;
+        Token lv_readonly_9_0=null;
+        Token otherlv_10=null;
+        Token lv_name_11_0=null;
+        Token otherlv_12=null;
+        Token otherlv_16=null;
+        EObject lv_i18nInfo_8_0 = null;
+
+        EObject lv_validators_13_0 = null;
+
+        EObject lv_bindings_14_0 = null;
+
+        EObject lv_processorAssignments_15_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:9025:2: ( ( () otherlv_1= 'maskedDecimal' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')' )? ( (lv_name_11_0= RULE_ID ) )? (otherlv_12= '{' ( ( (lv_validators_13_0= ruleUiValidator ) ) | ( (lv_bindings_14_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}' )? ) )
+            // InternalUIGrammar.g:9026:2: ( () otherlv_1= 'maskedDecimal' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')' )? ( (lv_name_11_0= RULE_ID ) )? (otherlv_12= '{' ( ( (lv_validators_13_0= ruleUiValidator ) ) | ( (lv_bindings_14_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}' )? )
+            {
+            // InternalUIGrammar.g:9026:2: ( () otherlv_1= 'maskedDecimal' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')' )? ( (lv_name_11_0= RULE_ID ) )? (otherlv_12= '{' ( ( (lv_validators_13_0= ruleUiValidator ) ) | ( (lv_bindings_14_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}' )? )
+            // InternalUIGrammar.g:9027:3: () otherlv_1= 'maskedDecimal' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')' )? ( (lv_name_11_0= RULE_ID ) )? (otherlv_12= '{' ( ( (lv_validators_13_0= ruleUiValidator ) ) | ( (lv_bindings_14_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}' )?
+            {
+            // InternalUIGrammar.g:9027:3: ()
+            // InternalUIGrammar.g:9028:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiMaskedDecimalFieldAccess().getUiMaskedDecimalFieldAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,99,FOLLOW_86); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiMaskedDecimalFieldAccess().getMaskedDecimalKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:9038:3: (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')' )?
+            int alt212=2;
+            int LA212_0 = input.LA(1);
+
+            if ( (LA212_0==45) ) {
+                alt212=1;
+            }
+            switch (alt212) {
+                case 1 :
+                    // InternalUIGrammar.g:9039:4: otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')'
+                    {
+                    otherlv_2=(Token)match(input,45,FOLLOW_91); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getUiMaskedDecimalFieldAccess().getLeftParenthesisKeyword_2_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:9043:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:9044:5: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:9044:5: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:9045:6: ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1());
+                    // InternalUIGrammar.g:9048:6: ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:9049:7: ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:9049:7: ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )*
+                    loop211:
+                    do {
+                        int alt211=5;
+                        int LA211_0 = input.LA(1);
+
+                        if ( LA211_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), 0) ) {
+                            alt211=1;
+                        }
+                        else if ( LA211_0 == 97 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), 1) ) {
+                            alt211=2;
+                        }
+                        else if ( LA211_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), 2) ) {
+                            alt211=3;
+                        }
+                        else if ( LA211_0 == 65 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), 3) ) {
+                            alt211=4;
+                        }
+
+
+                        switch (alt211) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:9050:5: ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:9050:5: ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:9051:6: {...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMaskedDecimalField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:9051:120: ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:9052:7: ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), 0);
+                    	    // InternalUIGrammar.g:9055:10: ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:9055:11: {...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMaskedDecimalField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:9055:20: (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:9055:21: otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_4=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_4, grammarAccess.getUiMaskedDecimalFieldAccess().getStylesKeyword_2_1_0_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:9059:10: ( (lv_styles_5_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:9060:11: (lv_styles_5_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:9060:11: (lv_styles_5_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:9061:12: lv_styles_5_0= RULE_STRING
+                    	    {
+                    	    lv_styles_5_0=(Token)match(input,RULE_STRING,FOLLOW_91); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_styles_5_0, grammarAccess.getUiMaskedDecimalFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_0_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiMaskedDecimalFieldRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"styles",
+                    	      													lv_styles_5_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:9083:5: ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:9083:5: ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:9084:6: {...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMaskedDecimalField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:9084:120: ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:9085:7: ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), 1);
+                    	    // InternalUIGrammar.g:9088:10: ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:9088:11: {...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMaskedDecimalField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:9088:20: (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:9088:21: otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_6=(Token)match(input,97,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_6, grammarAccess.getUiMaskedDecimalFieldAccess().getMaskKeyword_2_1_1_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:9092:10: ( (lv_mask_7_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:9093:11: (lv_mask_7_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:9093:11: (lv_mask_7_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:9094:12: lv_mask_7_0= RULE_STRING
+                    	    {
+                    	    lv_mask_7_0=(Token)match(input,RULE_STRING,FOLLOW_91); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_mask_7_0, grammarAccess.getUiMaskedDecimalFieldAccess().getMaskSTRINGTerminalRuleCall_2_1_1_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiMaskedDecimalFieldRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"mask",
+                    	      													lv_mask_7_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 3 :
+                    	    // InternalUIGrammar.g:9116:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:9116:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) )
+                    	    // InternalUIGrammar.g:9117:6: {...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), 2) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMaskedDecimalField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), 2)");
+                    	    }
+                    	    // InternalUIGrammar.g:9117:120: ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) )
+                    	    // InternalUIGrammar.g:9118:7: ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), 2);
+                    	    // InternalUIGrammar.g:9121:10: ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) )
+                    	    // InternalUIGrammar.g:9121:11: {...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMaskedDecimalField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:9121:20: ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) )
+                    	    // InternalUIGrammar.g:9121:21: (lv_i18nInfo_8_0= ruleUiI18nInfo )
+                    	    {
+                    	    // InternalUIGrammar.g:9121:21: (lv_i18nInfo_8_0= ruleUiI18nInfo )
+                    	    // InternalUIGrammar.g:9122:11: lv_i18nInfo_8_0= ruleUiI18nInfo
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getUiMaskedDecimalFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_2_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_91);
+                    	    lv_i18nInfo_8_0=ruleUiI18nInfo();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getUiMaskedDecimalFieldRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"i18nInfo",
+                    	      												lv_i18nInfo_8_0,
+                    	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 4 :
+                    	    // InternalUIGrammar.g:9144:5: ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:9144:5: ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) )
+                    	    // InternalUIGrammar.g:9145:6: {...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), 3) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMaskedDecimalField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), 3)");
+                    	    }
+                    	    // InternalUIGrammar.g:9145:120: ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) )
+                    	    // InternalUIGrammar.g:9146:7: ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), 3);
+                    	    // InternalUIGrammar.g:9149:10: ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) )
+                    	    // InternalUIGrammar.g:9149:11: {...}? => ( (lv_readonly_9_0= 'readonly' ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMaskedDecimalField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:9149:20: ( (lv_readonly_9_0= 'readonly' ) )
+                    	    // InternalUIGrammar.g:9149:21: (lv_readonly_9_0= 'readonly' )
+                    	    {
+                    	    // InternalUIGrammar.g:9149:21: (lv_readonly_9_0= 'readonly' )
+                    	    // InternalUIGrammar.g:9150:11: lv_readonly_9_0= 'readonly'
+                    	    {
+                    	    lv_readonly_9_0=(Token)match(input,65,FOLLOW_91); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newLeafNode(lv_readonly_9_0, grammarAccess.getUiMaskedDecimalFieldAccess().getReadonlyReadonlyKeyword_2_1_3_0());
+                    	      										
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElement(grammarAccess.getUiMaskedDecimalFieldRule());
+                    	      											}
+                    	      											setWithLastConsumed(current, "readonly", true, "readonly");
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop211;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1());
+
+                    }
+
+                    otherlv_10=(Token)match(input,47,FOLLOW_88); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_10, grammarAccess.getUiMaskedDecimalFieldAccess().getRightParenthesisKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:9179:3: ( (lv_name_11_0= RULE_ID ) )?
+            int alt213=2;
+            int LA213_0 = input.LA(1);
+
+            if ( (LA213_0==RULE_ID) ) {
+                alt213=1;
+            }
+            switch (alt213) {
+                case 1 :
+                    // InternalUIGrammar.g:9180:4: (lv_name_11_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:9180:4: (lv_name_11_0= RULE_ID )
+                    // InternalUIGrammar.g:9181:5: lv_name_11_0= RULE_ID
+                    {
+                    lv_name_11_0=(Token)match(input,RULE_ID,FOLLOW_89); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_11_0, grammarAccess.getUiMaskedDecimalFieldAccess().getNameIDTerminalRuleCall_3_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiMaskedDecimalFieldRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_11_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:9197:3: (otherlv_12= '{' ( ( (lv_validators_13_0= ruleUiValidator ) ) | ( (lv_bindings_14_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}' )?
+            int alt216=2;
+            int LA216_0 = input.LA(1);
+
+            if ( (LA216_0==20) ) {
+                alt216=1;
+            }
+            switch (alt216) {
+                case 1 :
+                    // InternalUIGrammar.g:9198:4: otherlv_12= '{' ( ( (lv_validators_13_0= ruleUiValidator ) ) | ( (lv_bindings_14_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}'
+                    {
+                    otherlv_12=(Token)match(input,20,FOLLOW_90); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_12, grammarAccess.getUiMaskedDecimalFieldAccess().getLeftCurlyBracketKeyword_4_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:9202:4: ( ( (lv_validators_13_0= ruleUiValidator ) ) | ( (lv_bindings_14_0= ruleUiBinding ) ) )*
+                    loop214:
+                    do {
+                        int alt214=3;
+                        int LA214_0 = input.LA(1);
+
+                        if ( ((LA214_0>=147 && LA214_0<=151)) ) {
+                            alt214=1;
+                        }
+                        else if ( (LA214_0==26) ) {
+                            alt214=2;
+                        }
+
+
+                        switch (alt214) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:9203:5: ( (lv_validators_13_0= ruleUiValidator ) )
+                    	    {
+                    	    // InternalUIGrammar.g:9203:5: ( (lv_validators_13_0= ruleUiValidator ) )
+                    	    // InternalUIGrammar.g:9204:6: (lv_validators_13_0= ruleUiValidator )
+                    	    {
+                    	    // InternalUIGrammar.g:9204:6: (lv_validators_13_0= ruleUiValidator )
+                    	    // InternalUIGrammar.g:9205:7: lv_validators_13_0= ruleUiValidator
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiMaskedDecimalFieldAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_validators_13_0=ruleUiValidator();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiMaskedDecimalFieldRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"validators",
+                    	      								lv_validators_13_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:9223:5: ( (lv_bindings_14_0= ruleUiBinding ) )
+                    	    {
+                    	    // InternalUIGrammar.g:9223:5: ( (lv_bindings_14_0= ruleUiBinding ) )
+                    	    // InternalUIGrammar.g:9224:6: (lv_bindings_14_0= ruleUiBinding )
+                    	    {
+                    	    // InternalUIGrammar.g:9224:6: (lv_bindings_14_0= ruleUiBinding )
+                    	    // InternalUIGrammar.g:9225:7: lv_bindings_14_0= ruleUiBinding
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiMaskedDecimalFieldAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_bindings_14_0=ruleUiBinding();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiMaskedDecimalFieldRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"bindings",
+                    	      								lv_bindings_14_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop214;
+                        }
+                    } while (true);
+
+                    // InternalUIGrammar.g:9243:4: ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )*
+                    loop215:
+                    do {
+                        int alt215=2;
+                        int LA215_0 = input.LA(1);
+
+                        if ( (LA215_0==153) ) {
+                            alt215=1;
+                        }
+
+
+                        switch (alt215) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:9244:5: (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment )
+                    	    {
+                    	    // InternalUIGrammar.g:9244:5: (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment )
+                    	    // InternalUIGrammar.g:9245:6: lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newCompositeNode(grammarAccess.getUiMaskedDecimalFieldAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
+                    	      					
+                    	    }
+                    	    pushFollow(FOLLOW_42);
+                    	    lv_processorAssignments_15_0=ruleUiVisibilityProcessorAssignment();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						if (current==null) {
+                    	      							current = createModelElementForParent(grammarAccess.getUiMaskedDecimalFieldRule());
+                    	      						}
+                    	      						add(
+                    	      							current,
+                    	      							"processorAssignments",
+                    	      							lv_processorAssignments_15_0,
+                    	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+                    	      						afterParserOrEnumRuleCall();
+                    	      					
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop215;
+                        }
+                    } while (true);
+
+                    otherlv_16=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_16, grammarAccess.getUiMaskedDecimalFieldAccess().getRightCurlyBracketKeyword_4_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiMaskedDecimalField"
+
+
+    // $ANTLR start "entryRuleUiPrefixedMaskedTextField"
+    // InternalUIGrammar.g:9271:1: entryRuleUiPrefixedMaskedTextField returns [EObject current=null] : iv_ruleUiPrefixedMaskedTextField= ruleUiPrefixedMaskedTextField EOF ;
+    public final EObject entryRuleUiPrefixedMaskedTextField() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiPrefixedMaskedTextField = null;
+
+
+        try {
+            // InternalUIGrammar.g:9271:66: (iv_ruleUiPrefixedMaskedTextField= ruleUiPrefixedMaskedTextField EOF )
+            // InternalUIGrammar.g:9272:2: iv_ruleUiPrefixedMaskedTextField= ruleUiPrefixedMaskedTextField EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiPrefixedMaskedTextFieldRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiPrefixedMaskedTextField=ruleUiPrefixedMaskedTextField();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiPrefixedMaskedTextField; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiPrefixedMaskedTextField"
+
+
+    // $ANTLR start "ruleUiPrefixedMaskedTextField"
+    // InternalUIGrammar.g:9278:1: ruleUiPrefixedMaskedTextField returns [EObject current=null] : ( () otherlv_1= 'maskedTextWithPrefix' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'prefixes=' otherlv_9= '(' ( (lv_prefixMasks_10_0= ruleUiPrefixToMaskMapEntry ) ) (otherlv_11= ',' ( (lv_prefixMasks_12_0= ruleUiPrefixToMaskMapEntry ) ) )* otherlv_13= ')' ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_14_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_15_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_16= ')' )? ( (lv_name_17_0= RULE_ID ) )? (otherlv_18= '{' ( ( (lv_validators_19_0= ruleUiValidator ) ) | ( (lv_bindings_20_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_21_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_22= '}' )? ) ;
+    public final EObject ruleUiPrefixedMaskedTextField() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Token lv_styles_5_0=null;
+        Token otherlv_6=null;
+        Token lv_mask_7_0=null;
+        Token otherlv_8=null;
+        Token otherlv_9=null;
+        Token otherlv_11=null;
+        Token otherlv_13=null;
+        Token lv_readonly_15_0=null;
+        Token otherlv_16=null;
+        Token lv_name_17_0=null;
+        Token otherlv_18=null;
+        Token otherlv_22=null;
+        EObject lv_prefixMasks_10_0 = null;
+
+        EObject lv_prefixMasks_12_0 = null;
+
+        EObject lv_i18nInfo_14_0 = null;
+
+        EObject lv_validators_19_0 = null;
+
+        EObject lv_bindings_20_0 = null;
+
+        EObject lv_processorAssignments_21_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:9284:2: ( ( () otherlv_1= 'maskedTextWithPrefix' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'prefixes=' otherlv_9= '(' ( (lv_prefixMasks_10_0= ruleUiPrefixToMaskMapEntry ) ) (otherlv_11= ',' ( (lv_prefixMasks_12_0= ruleUiPrefixToMaskMapEntry ) ) )* otherlv_13= ')' ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_14_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_15_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_16= ')' )? ( (lv_name_17_0= RULE_ID ) )? (otherlv_18= '{' ( ( (lv_validators_19_0= ruleUiValidator ) ) | ( (lv_bindings_20_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_21_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_22= '}' )? ) )
+            // InternalUIGrammar.g:9285:2: ( () otherlv_1= 'maskedTextWithPrefix' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'prefixes=' otherlv_9= '(' ( (lv_prefixMasks_10_0= ruleUiPrefixToMaskMapEntry ) ) (otherlv_11= ',' ( (lv_prefixMasks_12_0= ruleUiPrefixToMaskMapEntry ) ) )* otherlv_13= ')' ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_14_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_15_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_16= ')' )? ( (lv_name_17_0= RULE_ID ) )? (otherlv_18= '{' ( ( (lv_validators_19_0= ruleUiValidator ) ) | ( (lv_bindings_20_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_21_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_22= '}' )? )
+            {
+            // InternalUIGrammar.g:9285:2: ( () otherlv_1= 'maskedTextWithPrefix' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'prefixes=' otherlv_9= '(' ( (lv_prefixMasks_10_0= ruleUiPrefixToMaskMapEntry ) ) (otherlv_11= ',' ( (lv_prefixMasks_12_0= ruleUiPrefixToMaskMapEntry ) ) )* otherlv_13= ')' ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_14_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_15_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_16= ')' )? ( (lv_name_17_0= RULE_ID ) )? (otherlv_18= '{' ( ( (lv_validators_19_0= ruleUiValidator ) ) | ( (lv_bindings_20_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_21_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_22= '}' )? )
+            // InternalUIGrammar.g:9286:3: () otherlv_1= 'maskedTextWithPrefix' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'prefixes=' otherlv_9= '(' ( (lv_prefixMasks_10_0= ruleUiPrefixToMaskMapEntry ) ) (otherlv_11= ',' ( (lv_prefixMasks_12_0= ruleUiPrefixToMaskMapEntry ) ) )* otherlv_13= ')' ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_14_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_15_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_16= ')' )? ( (lv_name_17_0= RULE_ID ) )? (otherlv_18= '{' ( ( (lv_validators_19_0= ruleUiValidator ) ) | ( (lv_bindings_20_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_21_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_22= '}' )?
+            {
+            // InternalUIGrammar.g:9286:3: ()
+            // InternalUIGrammar.g:9287:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUiPrefixedMaskedTextFieldAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,100,FOLLOW_86); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getMaskedTextWithPrefixKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:9297:3: (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'prefixes=' otherlv_9= '(' ( (lv_prefixMasks_10_0= ruleUiPrefixToMaskMapEntry ) ) (otherlv_11= ',' ( (lv_prefixMasks_12_0= ruleUiPrefixToMaskMapEntry ) ) )* otherlv_13= ')' ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_14_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_15_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_16= ')' )?
+            int alt219=2;
+            int LA219_0 = input.LA(1);
+
+            if ( (LA219_0==45) ) {
+                alt219=1;
+            }
+            switch (alt219) {
+                case 1 :
+                    // InternalUIGrammar.g:9298:4: otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'prefixes=' otherlv_9= '(' ( (lv_prefixMasks_10_0= ruleUiPrefixToMaskMapEntry ) ) (otherlv_11= ',' ( (lv_prefixMasks_12_0= ruleUiPrefixToMaskMapEntry ) ) )* otherlv_13= ')' ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_14_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_15_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_16= ')'
+                    {
+                    otherlv_2=(Token)match(input,45,FOLLOW_92); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getLeftParenthesisKeyword_2_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:9302:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'prefixes=' otherlv_9= '(' ( (lv_prefixMasks_10_0= ruleUiPrefixToMaskMapEntry ) ) (otherlv_11= ',' ( (lv_prefixMasks_12_0= ruleUiPrefixToMaskMapEntry ) ) )* otherlv_13= ')' ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_14_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_15_0= 'readonly' ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:9303:5: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'prefixes=' otherlv_9= '(' ( (lv_prefixMasks_10_0= ruleUiPrefixToMaskMapEntry ) ) (otherlv_11= ',' ( (lv_prefixMasks_12_0= ruleUiPrefixToMaskMapEntry ) ) )* otherlv_13= ')' ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_14_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_15_0= 'readonly' ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:9303:5: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'prefixes=' otherlv_9= '(' ( (lv_prefixMasks_10_0= ruleUiPrefixToMaskMapEntry ) ) (otherlv_11= ',' ( (lv_prefixMasks_12_0= ruleUiPrefixToMaskMapEntry ) ) )* otherlv_13= ')' ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_14_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_15_0= 'readonly' ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:9304:6: ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'prefixes=' otherlv_9= '(' ( (lv_prefixMasks_10_0= ruleUiPrefixToMaskMapEntry ) ) (otherlv_11= ',' ( (lv_prefixMasks_12_0= ruleUiPrefixToMaskMapEntry ) ) )* otherlv_13= ')' ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_14_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_15_0= 'readonly' ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1());
+                    // InternalUIGrammar.g:9307:6: ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'prefixes=' otherlv_9= '(' ( (lv_prefixMasks_10_0= ruleUiPrefixToMaskMapEntry ) ) (otherlv_11= ',' ( (lv_prefixMasks_12_0= ruleUiPrefixToMaskMapEntry ) ) )* otherlv_13= ')' ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_14_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_15_0= 'readonly' ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:9308:7: ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'prefixes=' otherlv_9= '(' ( (lv_prefixMasks_10_0= ruleUiPrefixToMaskMapEntry ) ) (otherlv_11= ',' ( (lv_prefixMasks_12_0= ruleUiPrefixToMaskMapEntry ) ) )* otherlv_13= ')' ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_14_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_15_0= 'readonly' ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:9308:7: ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'prefixes=' otherlv_9= '(' ( (lv_prefixMasks_10_0= ruleUiPrefixToMaskMapEntry ) ) (otherlv_11= ',' ( (lv_prefixMasks_12_0= ruleUiPrefixToMaskMapEntry ) ) )* otherlv_13= ')' ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_14_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_15_0= 'readonly' ) ) ) ) ) )*
+                    loop218:
+                    do {
+                        int alt218=6;
+                        int LA218_0 = input.LA(1);
+
+                        if ( LA218_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 0) ) {
+                            alt218=1;
+                        }
+                        else if ( LA218_0 == 97 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 1) ) {
+                            alt218=2;
+                        }
+                        else if ( LA218_0 == 101 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 2) ) {
+                            alt218=3;
+                        }
+                        else if ( LA218_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 3) ) {
+                            alt218=4;
+                        }
+                        else if ( LA218_0 == 65 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 4) ) {
+                            alt218=5;
+                        }
+
+
+                        switch (alt218) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:9309:5: ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:9309:5: ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:9310:6: {...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiPrefixedMaskedTextField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:9310:125: ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:9311:7: ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 0);
+                    	    // InternalUIGrammar.g:9314:10: ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:9314:11: {...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiPrefixedMaskedTextField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:9314:20: (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:9314:21: otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_4=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_4, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getStylesKeyword_2_1_0_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:9318:10: ( (lv_styles_5_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:9319:11: (lv_styles_5_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:9319:11: (lv_styles_5_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:9320:12: lv_styles_5_0= RULE_STRING
+                    	    {
+                    	    lv_styles_5_0=(Token)match(input,RULE_STRING,FOLLOW_92); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_styles_5_0, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_0_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiPrefixedMaskedTextFieldRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"styles",
+                    	      													lv_styles_5_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:9342:5: ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:9342:5: ({...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:9343:6: {...}? => ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiPrefixedMaskedTextField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:9343:125: ( ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:9344:7: ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 1);
+                    	    // InternalUIGrammar.g:9347:10: ({...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:9347:11: {...}? => (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiPrefixedMaskedTextField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:9347:20: (otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:9347:21: otherlv_6= 'mask=' ( (lv_mask_7_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_6=(Token)match(input,97,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_6, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getMaskKeyword_2_1_1_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:9351:10: ( (lv_mask_7_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:9352:11: (lv_mask_7_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:9352:11: (lv_mask_7_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:9353:12: lv_mask_7_0= RULE_STRING
+                    	    {
+                    	    lv_mask_7_0=(Token)match(input,RULE_STRING,FOLLOW_92); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_mask_7_0, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getMaskSTRINGTerminalRuleCall_2_1_1_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiPrefixedMaskedTextFieldRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"mask",
+                    	      													lv_mask_7_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 3 :
+                    	    // InternalUIGrammar.g:9375:5: ({...}? => ( ({...}? => (otherlv_8= 'prefixes=' otherlv_9= '(' ( (lv_prefixMasks_10_0= ruleUiPrefixToMaskMapEntry ) ) (otherlv_11= ',' ( (lv_prefixMasks_12_0= ruleUiPrefixToMaskMapEntry ) ) )* otherlv_13= ')' ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:9375:5: ({...}? => ( ({...}? => (otherlv_8= 'prefixes=' otherlv_9= '(' ( (lv_prefixMasks_10_0= ruleUiPrefixToMaskMapEntry ) ) (otherlv_11= ',' ( (lv_prefixMasks_12_0= ruleUiPrefixToMaskMapEntry ) ) )* otherlv_13= ')' ) ) ) )
+                    	    // InternalUIGrammar.g:9376:6: {...}? => ( ({...}? => (otherlv_8= 'prefixes=' otherlv_9= '(' ( (lv_prefixMasks_10_0= ruleUiPrefixToMaskMapEntry ) ) (otherlv_11= ',' ( (lv_prefixMasks_12_0= ruleUiPrefixToMaskMapEntry ) ) )* otherlv_13= ')' ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 2) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiPrefixedMaskedTextField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 2)");
+                    	    }
+                    	    // InternalUIGrammar.g:9376:125: ( ({...}? => (otherlv_8= 'prefixes=' otherlv_9= '(' ( (lv_prefixMasks_10_0= ruleUiPrefixToMaskMapEntry ) ) (otherlv_11= ',' ( (lv_prefixMasks_12_0= ruleUiPrefixToMaskMapEntry ) ) )* otherlv_13= ')' ) ) )
+                    	    // InternalUIGrammar.g:9377:7: ({...}? => (otherlv_8= 'prefixes=' otherlv_9= '(' ( (lv_prefixMasks_10_0= ruleUiPrefixToMaskMapEntry ) ) (otherlv_11= ',' ( (lv_prefixMasks_12_0= ruleUiPrefixToMaskMapEntry ) ) )* otherlv_13= ')' ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 2);
+                    	    // InternalUIGrammar.g:9380:10: ({...}? => (otherlv_8= 'prefixes=' otherlv_9= '(' ( (lv_prefixMasks_10_0= ruleUiPrefixToMaskMapEntry ) ) (otherlv_11= ',' ( (lv_prefixMasks_12_0= ruleUiPrefixToMaskMapEntry ) ) )* otherlv_13= ')' ) )
+                    	    // InternalUIGrammar.g:9380:11: {...}? => (otherlv_8= 'prefixes=' otherlv_9= '(' ( (lv_prefixMasks_10_0= ruleUiPrefixToMaskMapEntry ) ) (otherlv_11= ',' ( (lv_prefixMasks_12_0= ruleUiPrefixToMaskMapEntry ) ) )* otherlv_13= ')' )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiPrefixedMaskedTextField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:9380:20: (otherlv_8= 'prefixes=' otherlv_9= '(' ( (lv_prefixMasks_10_0= ruleUiPrefixToMaskMapEntry ) ) (otherlv_11= ',' ( (lv_prefixMasks_12_0= ruleUiPrefixToMaskMapEntry ) ) )* otherlv_13= ')' )
+                    	    // InternalUIGrammar.g:9380:21: otherlv_8= 'prefixes=' otherlv_9= '(' ( (lv_prefixMasks_10_0= ruleUiPrefixToMaskMapEntry ) ) (otherlv_11= ',' ( (lv_prefixMasks_12_0= ruleUiPrefixToMaskMapEntry ) ) )* otherlv_13= ')'
+                    	    {
+                    	    otherlv_8=(Token)match(input,101,FOLLOW_34); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_8, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getPrefixesKeyword_2_1_2_0());
+                    	      									
+                    	    }
+                    	    otherlv_9=(Token)match(input,45,FOLLOW_93); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_9, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getLeftParenthesisKeyword_2_1_2_1());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:9388:10: ( (lv_prefixMasks_10_0= ruleUiPrefixToMaskMapEntry ) )
+                    	    // InternalUIGrammar.g:9389:11: (lv_prefixMasks_10_0= ruleUiPrefixToMaskMapEntry )
+                    	    {
+                    	    // InternalUIGrammar.g:9389:11: (lv_prefixMasks_10_0= ruleUiPrefixToMaskMapEntry )
+                    	    // InternalUIGrammar.g:9390:12: lv_prefixMasks_10_0= ruleUiPrefixToMaskMapEntry
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newCompositeNode(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getPrefixMasksUiPrefixToMaskMapEntryParserRuleCall_2_1_2_2_0());
+                    	      											
+                    	    }
+                    	    pushFollow(FOLLOW_94);
+                    	    lv_prefixMasks_10_0=ruleUiPrefixToMaskMapEntry();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElementForParent(grammarAccess.getUiPrefixedMaskedTextFieldRule());
+                    	      												}
+                    	      												add(
+                    	      													current,
+                    	      													"prefixMasks",
+                    	      													lv_prefixMasks_10_0,
+                    	      													"org.eclipse.osbp.ecview.dsl.UIGrammar.UiPrefixToMaskMapEntry");
+                    	      												afterParserOrEnumRuleCall();
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    // InternalUIGrammar.g:9407:10: (otherlv_11= ',' ( (lv_prefixMasks_12_0= ruleUiPrefixToMaskMapEntry ) ) )*
+                    	    loop217:
+                    	    do {
+                    	        int alt217=2;
+                    	        int LA217_0 = input.LA(1);
+
+                    	        if ( (LA217_0==102) ) {
+                    	            alt217=1;
+                    	        }
+
+
+                    	        switch (alt217) {
+                    	    	case 1 :
+                    	    	    // InternalUIGrammar.g:9408:11: otherlv_11= ',' ( (lv_prefixMasks_12_0= ruleUiPrefixToMaskMapEntry ) )
+                    	    	    {
+                    	    	    otherlv_11=(Token)match(input,102,FOLLOW_93); if (state.failed) return current;
+                    	    	    if ( state.backtracking==0 ) {
+
+                    	    	      											newLeafNode(otherlv_11, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getCommaKeyword_2_1_2_3_0());
+                    	    	      										
+                    	    	    }
+                    	    	    // InternalUIGrammar.g:9412:11: ( (lv_prefixMasks_12_0= ruleUiPrefixToMaskMapEntry ) )
+                    	    	    // InternalUIGrammar.g:9413:12: (lv_prefixMasks_12_0= ruleUiPrefixToMaskMapEntry )
+                    	    	    {
+                    	    	    // InternalUIGrammar.g:9413:12: (lv_prefixMasks_12_0= ruleUiPrefixToMaskMapEntry )
+                    	    	    // InternalUIGrammar.g:9414:13: lv_prefixMasks_12_0= ruleUiPrefixToMaskMapEntry
+                    	    	    {
+                    	    	    if ( state.backtracking==0 ) {
+
+                    	    	      													newCompositeNode(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getPrefixMasksUiPrefixToMaskMapEntryParserRuleCall_2_1_2_3_1_0());
+                    	    	      												
+                    	    	    }
+                    	    	    pushFollow(FOLLOW_94);
+                    	    	    lv_prefixMasks_12_0=ruleUiPrefixToMaskMapEntry();
+
+                    	    	    state._fsp--;
+                    	    	    if (state.failed) return current;
+                    	    	    if ( state.backtracking==0 ) {
+
+                    	    	      													if (current==null) {
+                    	    	      														current = createModelElementForParent(grammarAccess.getUiPrefixedMaskedTextFieldRule());
+                    	    	      													}
+                    	    	      													add(
+                    	    	      														current,
+                    	    	      														"prefixMasks",
+                    	    	      														lv_prefixMasks_12_0,
+                    	    	      														"org.eclipse.osbp.ecview.dsl.UIGrammar.UiPrefixToMaskMapEntry");
+                    	    	      													afterParserOrEnumRuleCall();
+                    	    	      												
+                    	    	    }
+
+                    	    	    }
+
+
+                    	    	    }
+
+
+                    	    	    }
+                    	    	    break;
+
+                    	    	default :
+                    	    	    break loop217;
+                    	        }
+                    	    } while (true);
+
+                    	    otherlv_13=(Token)match(input,47,FOLLOW_92); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_13, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getRightParenthesisKeyword_2_1_2_4());
+                    	      									
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 4 :
+                    	    // InternalUIGrammar.g:9442:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_14_0= ruleUiI18nInfo ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:9442:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_14_0= ruleUiI18nInfo ) ) ) ) )
+                    	    // InternalUIGrammar.g:9443:6: {...}? => ( ({...}? => ( (lv_i18nInfo_14_0= ruleUiI18nInfo ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 3) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiPrefixedMaskedTextField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 3)");
+                    	    }
+                    	    // InternalUIGrammar.g:9443:125: ( ({...}? => ( (lv_i18nInfo_14_0= ruleUiI18nInfo ) ) ) )
+                    	    // InternalUIGrammar.g:9444:7: ({...}? => ( (lv_i18nInfo_14_0= ruleUiI18nInfo ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 3);
+                    	    // InternalUIGrammar.g:9447:10: ({...}? => ( (lv_i18nInfo_14_0= ruleUiI18nInfo ) ) )
+                    	    // InternalUIGrammar.g:9447:11: {...}? => ( (lv_i18nInfo_14_0= ruleUiI18nInfo ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiPrefixedMaskedTextField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:9447:20: ( (lv_i18nInfo_14_0= ruleUiI18nInfo ) )
+                    	    // InternalUIGrammar.g:9447:21: (lv_i18nInfo_14_0= ruleUiI18nInfo )
+                    	    {
+                    	    // InternalUIGrammar.g:9447:21: (lv_i18nInfo_14_0= ruleUiI18nInfo )
+                    	    // InternalUIGrammar.g:9448:11: lv_i18nInfo_14_0= ruleUiI18nInfo
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_3_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_92);
+                    	    lv_i18nInfo_14_0=ruleUiI18nInfo();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getUiPrefixedMaskedTextFieldRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"i18nInfo",
+                    	      												lv_i18nInfo_14_0,
+                    	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 5 :
+                    	    // InternalUIGrammar.g:9470:5: ({...}? => ( ({...}? => ( (lv_readonly_15_0= 'readonly' ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:9470:5: ({...}? => ( ({...}? => ( (lv_readonly_15_0= 'readonly' ) ) ) ) )
+                    	    // InternalUIGrammar.g:9471:6: {...}? => ( ({...}? => ( (lv_readonly_15_0= 'readonly' ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 4) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiPrefixedMaskedTextField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 4)");
+                    	    }
+                    	    // InternalUIGrammar.g:9471:125: ( ({...}? => ( (lv_readonly_15_0= 'readonly' ) ) ) )
+                    	    // InternalUIGrammar.g:9472:7: ({...}? => ( (lv_readonly_15_0= 'readonly' ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 4);
+                    	    // InternalUIGrammar.g:9475:10: ({...}? => ( (lv_readonly_15_0= 'readonly' ) ) )
+                    	    // InternalUIGrammar.g:9475:11: {...}? => ( (lv_readonly_15_0= 'readonly' ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiPrefixedMaskedTextField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:9475:20: ( (lv_readonly_15_0= 'readonly' ) )
+                    	    // InternalUIGrammar.g:9475:21: (lv_readonly_15_0= 'readonly' )
+                    	    {
+                    	    // InternalUIGrammar.g:9475:21: (lv_readonly_15_0= 'readonly' )
+                    	    // InternalUIGrammar.g:9476:11: lv_readonly_15_0= 'readonly'
+                    	    {
+                    	    lv_readonly_15_0=(Token)match(input,65,FOLLOW_92); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newLeafNode(lv_readonly_15_0, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getReadonlyReadonlyKeyword_2_1_4_0());
+                    	      										
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElement(grammarAccess.getUiPrefixedMaskedTextFieldRule());
+                    	      											}
+                    	      											setWithLastConsumed(current, "readonly", true, "readonly");
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop218;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1());
+
+                    }
+
+                    otherlv_16=(Token)match(input,47,FOLLOW_88); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_16, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getRightParenthesisKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:9505:3: ( (lv_name_17_0= RULE_ID ) )?
+            int alt220=2;
+            int LA220_0 = input.LA(1);
+
+            if ( (LA220_0==RULE_ID) ) {
+                alt220=1;
+            }
+            switch (alt220) {
+                case 1 :
+                    // InternalUIGrammar.g:9506:4: (lv_name_17_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:9506:4: (lv_name_17_0= RULE_ID )
+                    // InternalUIGrammar.g:9507:5: lv_name_17_0= RULE_ID
+                    {
+                    lv_name_17_0=(Token)match(input,RULE_ID,FOLLOW_89); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_17_0, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getNameIDTerminalRuleCall_3_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiPrefixedMaskedTextFieldRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_17_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:9523:3: (otherlv_18= '{' ( ( (lv_validators_19_0= ruleUiValidator ) ) | ( (lv_bindings_20_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_21_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_22= '}' )?
+            int alt223=2;
+            int LA223_0 = input.LA(1);
+
+            if ( (LA223_0==20) ) {
+                alt223=1;
+            }
+            switch (alt223) {
+                case 1 :
+                    // InternalUIGrammar.g:9524:4: otherlv_18= '{' ( ( (lv_validators_19_0= ruleUiValidator ) ) | ( (lv_bindings_20_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_21_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_22= '}'
+                    {
+                    otherlv_18=(Token)match(input,20,FOLLOW_90); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_18, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getLeftCurlyBracketKeyword_4_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:9528:4: ( ( (lv_validators_19_0= ruleUiValidator ) ) | ( (lv_bindings_20_0= ruleUiBinding ) ) )*
+                    loop221:
+                    do {
+                        int alt221=3;
+                        int LA221_0 = input.LA(1);
+
+                        if ( ((LA221_0>=147 && LA221_0<=151)) ) {
+                            alt221=1;
+                        }
+                        else if ( (LA221_0==26) ) {
+                            alt221=2;
+                        }
+
+
+                        switch (alt221) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:9529:5: ( (lv_validators_19_0= ruleUiValidator ) )
+                    	    {
+                    	    // InternalUIGrammar.g:9529:5: ( (lv_validators_19_0= ruleUiValidator ) )
+                    	    // InternalUIGrammar.g:9530:6: (lv_validators_19_0= ruleUiValidator )
+                    	    {
+                    	    // InternalUIGrammar.g:9530:6: (lv_validators_19_0= ruleUiValidator )
+                    	    // InternalUIGrammar.g:9531:7: lv_validators_19_0= ruleUiValidator
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_validators_19_0=ruleUiValidator();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiPrefixedMaskedTextFieldRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"validators",
+                    	      								lv_validators_19_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:9549:5: ( (lv_bindings_20_0= ruleUiBinding ) )
+                    	    {
+                    	    // InternalUIGrammar.g:9549:5: ( (lv_bindings_20_0= ruleUiBinding ) )
+                    	    // InternalUIGrammar.g:9550:6: (lv_bindings_20_0= ruleUiBinding )
+                    	    {
+                    	    // InternalUIGrammar.g:9550:6: (lv_bindings_20_0= ruleUiBinding )
+                    	    // InternalUIGrammar.g:9551:7: lv_bindings_20_0= ruleUiBinding
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_bindings_20_0=ruleUiBinding();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiPrefixedMaskedTextFieldRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"bindings",
+                    	      								lv_bindings_20_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop221;
+                        }
+                    } while (true);
+
+                    // InternalUIGrammar.g:9569:4: ( (lv_processorAssignments_21_0= ruleUiVisibilityProcessorAssignment ) )*
+                    loop222:
+                    do {
+                        int alt222=2;
+                        int LA222_0 = input.LA(1);
+
+                        if ( (LA222_0==153) ) {
+                            alt222=1;
+                        }
+
+
+                        switch (alt222) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:9570:5: (lv_processorAssignments_21_0= ruleUiVisibilityProcessorAssignment )
+                    	    {
+                    	    // InternalUIGrammar.g:9570:5: (lv_processorAssignments_21_0= ruleUiVisibilityProcessorAssignment )
+                    	    // InternalUIGrammar.g:9571:6: lv_processorAssignments_21_0= ruleUiVisibilityProcessorAssignment
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newCompositeNode(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
+                    	      					
+                    	    }
+                    	    pushFollow(FOLLOW_42);
+                    	    lv_processorAssignments_21_0=ruleUiVisibilityProcessorAssignment();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						if (current==null) {
+                    	      							current = createModelElementForParent(grammarAccess.getUiPrefixedMaskedTextFieldRule());
+                    	      						}
+                    	      						add(
+                    	      							current,
+                    	      							"processorAssignments",
+                    	      							lv_processorAssignments_21_0,
+                    	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+                    	      						afterParserOrEnumRuleCall();
+                    	      					
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop222;
+                        }
+                    } while (true);
+
+                    otherlv_22=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_22, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getRightCurlyBracketKeyword_4_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiPrefixedMaskedTextField"
+
+
+    // $ANTLR start "entryRuleUiPrefixToMaskMapEntry"
+    // InternalUIGrammar.g:9597:1: entryRuleUiPrefixToMaskMapEntry returns [EObject current=null] : iv_ruleUiPrefixToMaskMapEntry= ruleUiPrefixToMaskMapEntry EOF ;
+    public final EObject entryRuleUiPrefixToMaskMapEntry() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiPrefixToMaskMapEntry = null;
+
+
+        try {
+            // InternalUIGrammar.g:9597:63: (iv_ruleUiPrefixToMaskMapEntry= ruleUiPrefixToMaskMapEntry EOF )
+            // InternalUIGrammar.g:9598:2: iv_ruleUiPrefixToMaskMapEntry= ruleUiPrefixToMaskMapEntry EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiPrefixToMaskMapEntryRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiPrefixToMaskMapEntry=ruleUiPrefixToMaskMapEntry();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiPrefixToMaskMapEntry; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiPrefixToMaskMapEntry"
+
+
+    // $ANTLR start "ruleUiPrefixToMaskMapEntry"
+    // InternalUIGrammar.g:9604:1: ruleUiPrefixToMaskMapEntry returns [EObject current=null] : ( () otherlv_1= 'prefix' ( (lv_key_2_0= RULE_STRING ) ) otherlv_3= 'mask' ( (lv_value_4_0= RULE_STRING ) ) ) ;
+    public final EObject ruleUiPrefixToMaskMapEntry() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token lv_key_2_0=null;
+        Token otherlv_3=null;
+        Token lv_value_4_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:9610:2: ( ( () otherlv_1= 'prefix' ( (lv_key_2_0= RULE_STRING ) ) otherlv_3= 'mask' ( (lv_value_4_0= RULE_STRING ) ) ) )
+            // InternalUIGrammar.g:9611:2: ( () otherlv_1= 'prefix' ( (lv_key_2_0= RULE_STRING ) ) otherlv_3= 'mask' ( (lv_value_4_0= RULE_STRING ) ) )
+            {
+            // InternalUIGrammar.g:9611:2: ( () otherlv_1= 'prefix' ( (lv_key_2_0= RULE_STRING ) ) otherlv_3= 'mask' ( (lv_value_4_0= RULE_STRING ) ) )
+            // InternalUIGrammar.g:9612:3: () otherlv_1= 'prefix' ( (lv_key_2_0= RULE_STRING ) ) otherlv_3= 'mask' ( (lv_value_4_0= RULE_STRING ) )
+            {
+            // InternalUIGrammar.g:9612:3: ()
+            // InternalUIGrammar.g:9613:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiPrefixToMaskMapEntryAccess().getUiPrefixToMaskMapEntryAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,103,FOLLOW_18); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiPrefixToMaskMapEntryAccess().getPrefixKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:9623:3: ( (lv_key_2_0= RULE_STRING ) )
+            // InternalUIGrammar.g:9624:4: (lv_key_2_0= RULE_STRING )
+            {
+            // InternalUIGrammar.g:9624:4: (lv_key_2_0= RULE_STRING )
+            // InternalUIGrammar.g:9625:5: lv_key_2_0= RULE_STRING
+            {
+            lv_key_2_0=(Token)match(input,RULE_STRING,FOLLOW_95); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_key_2_0, grammarAccess.getUiPrefixToMaskMapEntryAccess().getKeySTRINGTerminalRuleCall_2_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getUiPrefixToMaskMapEntryRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"key",
+              						lv_key_2_0,
+              						"org.eclipse.xtext.xbase.Xtype.STRING");
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_3=(Token)match(input,104,FOLLOW_18); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_3, grammarAccess.getUiPrefixToMaskMapEntryAccess().getMaskKeyword_3());
+              		
+            }
+            // InternalUIGrammar.g:9645:3: ( (lv_value_4_0= RULE_STRING ) )
+            // InternalUIGrammar.g:9646:4: (lv_value_4_0= RULE_STRING )
+            {
+            // InternalUIGrammar.g:9646:4: (lv_value_4_0= RULE_STRING )
+            // InternalUIGrammar.g:9647:5: lv_value_4_0= RULE_STRING
+            {
+            lv_value_4_0=(Token)match(input,RULE_STRING,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_value_4_0, grammarAccess.getUiPrefixToMaskMapEntryAccess().getValueSTRINGTerminalRuleCall_4_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getUiPrefixToMaskMapEntryRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"value",
+              						lv_value_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 "ruleUiPrefixToMaskMapEntry"
+
+
+    // $ANTLR start "entryRuleUiRichTextArea"
+    // InternalUIGrammar.g:9667:1: entryRuleUiRichTextArea returns [EObject current=null] : iv_ruleUiRichTextArea= ruleUiRichTextArea EOF ;
+    public final EObject entryRuleUiRichTextArea() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiRichTextArea = null;
+
+
+        try {
+            // InternalUIGrammar.g:9667:55: (iv_ruleUiRichTextArea= ruleUiRichTextArea EOF )
+            // InternalUIGrammar.g:9668:2: iv_ruleUiRichTextArea= ruleUiRichTextArea EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiRichTextAreaRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiRichTextArea=ruleUiRichTextArea();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiRichTextArea; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiRichTextArea"
+
+
+    // $ANTLR start "ruleUiRichTextArea"
+    // InternalUIGrammar.g:9674:1: ruleUiRichTextArea returns [EObject current=null] : ( () otherlv_1= 'richtextArea' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_asBlob_7_0= 'asBlob' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_8_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_9= ')' )? ( (lv_name_10_0= RULE_ID ) )? (otherlv_11= '{' ( ( (lv_validators_12_0= ruleUiValidator ) ) | ( (lv_bindings_13_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_14_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_15= '}' )? ) ;
+    public final EObject ruleUiRichTextArea() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Token lv_styles_5_0=null;
+        Token lv_asBlob_7_0=null;
+        Token lv_readonly_8_0=null;
+        Token otherlv_9=null;
+        Token lv_name_10_0=null;
+        Token otherlv_11=null;
+        Token otherlv_15=null;
+        EObject lv_i18nInfo_6_0 = null;
+
+        EObject lv_validators_12_0 = null;
+
+        EObject lv_bindings_13_0 = null;
+
+        EObject lv_processorAssignments_14_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:9680:2: ( ( () otherlv_1= 'richtextArea' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_asBlob_7_0= 'asBlob' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_8_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_9= ')' )? ( (lv_name_10_0= RULE_ID ) )? (otherlv_11= '{' ( ( (lv_validators_12_0= ruleUiValidator ) ) | ( (lv_bindings_13_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_14_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_15= '}' )? ) )
+            // InternalUIGrammar.g:9681:2: ( () otherlv_1= 'richtextArea' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_asBlob_7_0= 'asBlob' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_8_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_9= ')' )? ( (lv_name_10_0= RULE_ID ) )? (otherlv_11= '{' ( ( (lv_validators_12_0= ruleUiValidator ) ) | ( (lv_bindings_13_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_14_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_15= '}' )? )
+            {
+            // InternalUIGrammar.g:9681:2: ( () otherlv_1= 'richtextArea' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_asBlob_7_0= 'asBlob' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_8_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_9= ')' )? ( (lv_name_10_0= RULE_ID ) )? (otherlv_11= '{' ( ( (lv_validators_12_0= ruleUiValidator ) ) | ( (lv_bindings_13_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_14_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_15= '}' )? )
+            // InternalUIGrammar.g:9682:3: () otherlv_1= 'richtextArea' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_asBlob_7_0= 'asBlob' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_8_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_9= ')' )? ( (lv_name_10_0= RULE_ID ) )? (otherlv_11= '{' ( ( (lv_validators_12_0= ruleUiValidator ) ) | ( (lv_bindings_13_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_14_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_15= '}' )?
+            {
+            // InternalUIGrammar.g:9682:3: ()
+            // InternalUIGrammar.g:9683:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiRichTextAreaAccess().getUiRichTextAreaAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,105,FOLLOW_86); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiRichTextAreaAccess().getRichtextAreaKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:9693:3: (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_asBlob_7_0= 'asBlob' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_8_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_9= ')' )?
+            int alt225=2;
+            int LA225_0 = input.LA(1);
+
+            if ( (LA225_0==45) ) {
+                alt225=1;
+            }
+            switch (alt225) {
+                case 1 :
+                    // InternalUIGrammar.g:9694:4: otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_asBlob_7_0= 'asBlob' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_8_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_9= ')'
+                    {
+                    otherlv_2=(Token)match(input,45,FOLLOW_96); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getUiRichTextAreaAccess().getLeftParenthesisKeyword_2_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:9698:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_asBlob_7_0= 'asBlob' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_8_0= 'readonly' ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:9699:5: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_asBlob_7_0= 'asBlob' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_8_0= 'readonly' ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:9699:5: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_asBlob_7_0= 'asBlob' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_8_0= 'readonly' ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:9700:6: ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_asBlob_7_0= 'asBlob' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_8_0= 'readonly' ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1());
+                    // InternalUIGrammar.g:9703:6: ( ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_asBlob_7_0= 'asBlob' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_8_0= 'readonly' ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:9704:7: ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_asBlob_7_0= 'asBlob' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_8_0= 'readonly' ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:9704:7: ( ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_asBlob_7_0= 'asBlob' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_8_0= 'readonly' ) ) ) ) ) )*
+                    loop224:
+                    do {
+                        int alt224=5;
+                        int LA224_0 = input.LA(1);
+
+                        if ( LA224_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), 0) ) {
+                            alt224=1;
+                        }
+                        else if ( LA224_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), 1) ) {
+                            alt224=2;
+                        }
+                        else if ( LA224_0 == 106 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), 2) ) {
+                            alt224=3;
+                        }
+                        else if ( LA224_0 == 65 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), 3) ) {
+                            alt224=4;
+                        }
+
+
+                        switch (alt224) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:9705:5: ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:9705:5: ({...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:9706:6: {...}? => ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiRichTextArea", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:9706:114: ( ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:9707:7: ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), 0);
+                    	    // InternalUIGrammar.g:9710:10: ({...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:9710:11: {...}? => (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiRichTextArea", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:9710:20: (otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:9710:21: otherlv_4= 'styles' ( (lv_styles_5_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_4=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_4, grammarAccess.getUiRichTextAreaAccess().getStylesKeyword_2_1_0_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:9714:10: ( (lv_styles_5_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:9715:11: (lv_styles_5_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:9715:11: (lv_styles_5_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:9716:12: lv_styles_5_0= RULE_STRING
+                    	    {
+                    	    lv_styles_5_0=(Token)match(input,RULE_STRING,FOLLOW_96); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_styles_5_0, grammarAccess.getUiRichTextAreaAccess().getStylesSTRINGTerminalRuleCall_2_1_0_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiRichTextAreaRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"styles",
+                    	      													lv_styles_5_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:9738:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:9738:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) ) )
+                    	    // InternalUIGrammar.g:9739:6: {...}? => ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiRichTextArea", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:9739:114: ( ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) ) )
+                    	    // InternalUIGrammar.g:9740:7: ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), 1);
+                    	    // InternalUIGrammar.g:9743:10: ({...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) ) )
+                    	    // InternalUIGrammar.g:9743:11: {...}? => ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiRichTextArea", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:9743:20: ( (lv_i18nInfo_6_0= ruleUiI18nInfo ) )
+                    	    // InternalUIGrammar.g:9743:21: (lv_i18nInfo_6_0= ruleUiI18nInfo )
+                    	    {
+                    	    // InternalUIGrammar.g:9743:21: (lv_i18nInfo_6_0= ruleUiI18nInfo )
+                    	    // InternalUIGrammar.g:9744:11: lv_i18nInfo_6_0= ruleUiI18nInfo
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getUiRichTextAreaAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_1_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_96);
+                    	    lv_i18nInfo_6_0=ruleUiI18nInfo();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getUiRichTextAreaRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"i18nInfo",
+                    	      												lv_i18nInfo_6_0,
+                    	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 3 :
+                    	    // InternalUIGrammar.g:9766:5: ({...}? => ( ({...}? => ( (lv_asBlob_7_0= 'asBlob' ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:9766:5: ({...}? => ( ({...}? => ( (lv_asBlob_7_0= 'asBlob' ) ) ) ) )
+                    	    // InternalUIGrammar.g:9767:6: {...}? => ( ({...}? => ( (lv_asBlob_7_0= 'asBlob' ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), 2) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiRichTextArea", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), 2)");
+                    	    }
+                    	    // InternalUIGrammar.g:9767:114: ( ({...}? => ( (lv_asBlob_7_0= 'asBlob' ) ) ) )
+                    	    // InternalUIGrammar.g:9768:7: ({...}? => ( (lv_asBlob_7_0= 'asBlob' ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), 2);
+                    	    // InternalUIGrammar.g:9771:10: ({...}? => ( (lv_asBlob_7_0= 'asBlob' ) ) )
+                    	    // InternalUIGrammar.g:9771:11: {...}? => ( (lv_asBlob_7_0= 'asBlob' ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiRichTextArea", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:9771:20: ( (lv_asBlob_7_0= 'asBlob' ) )
+                    	    // InternalUIGrammar.g:9771:21: (lv_asBlob_7_0= 'asBlob' )
+                    	    {
+                    	    // InternalUIGrammar.g:9771:21: (lv_asBlob_7_0= 'asBlob' )
+                    	    // InternalUIGrammar.g:9772:11: lv_asBlob_7_0= 'asBlob'
+                    	    {
+                    	    lv_asBlob_7_0=(Token)match(input,106,FOLLOW_96); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newLeafNode(lv_asBlob_7_0, grammarAccess.getUiRichTextAreaAccess().getAsBlobAsBlobKeyword_2_1_2_0());
+                    	      										
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElement(grammarAccess.getUiRichTextAreaRule());
+                    	      											}
+                    	      											setWithLastConsumed(current, "asBlob", true, "asBlob");
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 4 :
+                    	    // InternalUIGrammar.g:9789:5: ({...}? => ( ({...}? => ( (lv_readonly_8_0= 'readonly' ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:9789:5: ({...}? => ( ({...}? => ( (lv_readonly_8_0= 'readonly' ) ) ) ) )
+                    	    // InternalUIGrammar.g:9790:6: {...}? => ( ({...}? => ( (lv_readonly_8_0= 'readonly' ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), 3) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiRichTextArea", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), 3)");
+                    	    }
+                    	    // InternalUIGrammar.g:9790:114: ( ({...}? => ( (lv_readonly_8_0= 'readonly' ) ) ) )
+                    	    // InternalUIGrammar.g:9791:7: ({...}? => ( (lv_readonly_8_0= 'readonly' ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), 3);
+                    	    // InternalUIGrammar.g:9794:10: ({...}? => ( (lv_readonly_8_0= 'readonly' ) ) )
+                    	    // InternalUIGrammar.g:9794:11: {...}? => ( (lv_readonly_8_0= 'readonly' ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiRichTextArea", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:9794:20: ( (lv_readonly_8_0= 'readonly' ) )
+                    	    // InternalUIGrammar.g:9794:21: (lv_readonly_8_0= 'readonly' )
+                    	    {
+                    	    // InternalUIGrammar.g:9794:21: (lv_readonly_8_0= 'readonly' )
+                    	    // InternalUIGrammar.g:9795:11: lv_readonly_8_0= 'readonly'
+                    	    {
+                    	    lv_readonly_8_0=(Token)match(input,65,FOLLOW_96); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newLeafNode(lv_readonly_8_0, grammarAccess.getUiRichTextAreaAccess().getReadonlyReadonlyKeyword_2_1_3_0());
+                    	      										
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElement(grammarAccess.getUiRichTextAreaRule());
+                    	      											}
+                    	      											setWithLastConsumed(current, "readonly", true, "readonly");
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop224;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1());
+
+                    }
+
+                    otherlv_9=(Token)match(input,47,FOLLOW_88); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_9, grammarAccess.getUiRichTextAreaAccess().getRightParenthesisKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:9824:3: ( (lv_name_10_0= RULE_ID ) )?
+            int alt226=2;
+            int LA226_0 = input.LA(1);
+
+            if ( (LA226_0==RULE_ID) ) {
+                alt226=1;
+            }
+            switch (alt226) {
+                case 1 :
+                    // InternalUIGrammar.g:9825:4: (lv_name_10_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:9825:4: (lv_name_10_0= RULE_ID )
+                    // InternalUIGrammar.g:9826:5: lv_name_10_0= RULE_ID
+                    {
+                    lv_name_10_0=(Token)match(input,RULE_ID,FOLLOW_89); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_10_0, grammarAccess.getUiRichTextAreaAccess().getNameIDTerminalRuleCall_3_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiRichTextAreaRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_10_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:9842:3: (otherlv_11= '{' ( ( (lv_validators_12_0= ruleUiValidator ) ) | ( (lv_bindings_13_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_14_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_15= '}' )?
+            int alt229=2;
+            int LA229_0 = input.LA(1);
+
+            if ( (LA229_0==20) ) {
+                alt229=1;
+            }
+            switch (alt229) {
+                case 1 :
+                    // InternalUIGrammar.g:9843:4: otherlv_11= '{' ( ( (lv_validators_12_0= ruleUiValidator ) ) | ( (lv_bindings_13_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_14_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_15= '}'
+                    {
+                    otherlv_11=(Token)match(input,20,FOLLOW_90); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_11, grammarAccess.getUiRichTextAreaAccess().getLeftCurlyBracketKeyword_4_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:9847:4: ( ( (lv_validators_12_0= ruleUiValidator ) ) | ( (lv_bindings_13_0= ruleUiBinding ) ) )*
+                    loop227:
+                    do {
+                        int alt227=3;
+                        int LA227_0 = input.LA(1);
+
+                        if ( ((LA227_0>=147 && LA227_0<=151)) ) {
+                            alt227=1;
+                        }
+                        else if ( (LA227_0==26) ) {
+                            alt227=2;
+                        }
+
+
+                        switch (alt227) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:9848:5: ( (lv_validators_12_0= ruleUiValidator ) )
+                    	    {
+                    	    // InternalUIGrammar.g:9848:5: ( (lv_validators_12_0= ruleUiValidator ) )
+                    	    // InternalUIGrammar.g:9849:6: (lv_validators_12_0= ruleUiValidator )
+                    	    {
+                    	    // InternalUIGrammar.g:9849:6: (lv_validators_12_0= ruleUiValidator )
+                    	    // InternalUIGrammar.g:9850:7: lv_validators_12_0= ruleUiValidator
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiRichTextAreaAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_validators_12_0=ruleUiValidator();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiRichTextAreaRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"validators",
+                    	      								lv_validators_12_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:9868:5: ( (lv_bindings_13_0= ruleUiBinding ) )
+                    	    {
+                    	    // InternalUIGrammar.g:9868:5: ( (lv_bindings_13_0= ruleUiBinding ) )
+                    	    // InternalUIGrammar.g:9869:6: (lv_bindings_13_0= ruleUiBinding )
+                    	    {
+                    	    // InternalUIGrammar.g:9869:6: (lv_bindings_13_0= ruleUiBinding )
+                    	    // InternalUIGrammar.g:9870:7: lv_bindings_13_0= ruleUiBinding
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiRichTextAreaAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_bindings_13_0=ruleUiBinding();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiRichTextAreaRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"bindings",
+                    	      								lv_bindings_13_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop227;
+                        }
+                    } while (true);
+
+                    // InternalUIGrammar.g:9888:4: ( (lv_processorAssignments_14_0= ruleUiVisibilityProcessorAssignment ) )*
+                    loop228:
+                    do {
+                        int alt228=2;
+                        int LA228_0 = input.LA(1);
+
+                        if ( (LA228_0==153) ) {
+                            alt228=1;
+                        }
+
+
+                        switch (alt228) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:9889:5: (lv_processorAssignments_14_0= ruleUiVisibilityProcessorAssignment )
+                    	    {
+                    	    // InternalUIGrammar.g:9889:5: (lv_processorAssignments_14_0= ruleUiVisibilityProcessorAssignment )
+                    	    // InternalUIGrammar.g:9890:6: lv_processorAssignments_14_0= ruleUiVisibilityProcessorAssignment
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newCompositeNode(grammarAccess.getUiRichTextAreaAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
+                    	      					
+                    	    }
+                    	    pushFollow(FOLLOW_42);
+                    	    lv_processorAssignments_14_0=ruleUiVisibilityProcessorAssignment();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						if (current==null) {
+                    	      							current = createModelElementForParent(grammarAccess.getUiRichTextAreaRule());
+                    	      						}
+                    	      						add(
+                    	      							current,
+                    	      							"processorAssignments",
+                    	      							lv_processorAssignments_14_0,
+                    	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+                    	      						afterParserOrEnumRuleCall();
+                    	      					
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop228;
+                        }
+                    } while (true);
+
+                    otherlv_15=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_15, grammarAccess.getUiRichTextAreaAccess().getRightCurlyBracketKeyword_4_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiRichTextArea"
+
+
+    // $ANTLR start "entryRuleUiSuggestTextField"
+    // InternalUIGrammar.g:9916:1: entryRuleUiSuggestTextField returns [EObject current=null] : iv_ruleUiSuggestTextField= ruleUiSuggestTextField EOF ;
+    public final EObject entryRuleUiSuggestTextField() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiSuggestTextField = null;
+
+
+        try {
+            // InternalUIGrammar.g:9916:59: (iv_ruleUiSuggestTextField= ruleUiSuggestTextField EOF )
+            // InternalUIGrammar.g:9917:2: iv_ruleUiSuggestTextField= ruleUiSuggestTextField EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiSuggestTextFieldRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiSuggestTextField=ruleUiSuggestTextField();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiSuggestTextField; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiSuggestTextField"
+
+
+    // $ANTLR start "ruleUiSuggestTextField"
+    // InternalUIGrammar.g:9923:1: ruleUiSuggestTextField returns [EObject current=null] : ( () otherlv_1= 'suggestText' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'filterField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'uuidField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_autoHidePopup_23_0= 'autoHidePopup' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* ) ) ) ( ( (lv_validators_25_0= ruleUiValidator ) ) | ( (lv_bindings_26_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_27_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_28= '}' )? ) ;
+    public final EObject ruleUiSuggestTextField() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_5=null;
+        Token lv_styles_6_0=null;
+        Token otherlv_7=null;
+        Token lv_name_8_0=null;
+        Token otherlv_9=null;
+        Token otherlv_11=null;
+        Token otherlv_13=null;
+        Token otherlv_14=null;
+        Token otherlv_15=null;
+        Token otherlv_16=null;
+        Token otherlv_17=null;
+        Token otherlv_18=null;
+        Token otherlv_19=null;
+        Token otherlv_20=null;
+        Token otherlv_21=null;
+        Token otherlv_22=null;
+        Token lv_autoHidePopup_23_0=null;
+        Token lv_readonly_24_0=null;
+        Token otherlv_28=null;
+        EObject lv_i18nInfo_4_0 = null;
+
+        EObject lv_jvmType_12_0 = null;
+
+        EObject lv_validators_25_0 = null;
+
+        EObject lv_bindings_26_0 = null;
+
+        EObject lv_processorAssignments_27_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:9929:2: ( ( () otherlv_1= 'suggestText' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'filterField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'uuidField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_autoHidePopup_23_0= 'autoHidePopup' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* ) ) ) ( ( (lv_validators_25_0= ruleUiValidator ) ) | ( (lv_bindings_26_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_27_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_28= '}' )? ) )
+            // InternalUIGrammar.g:9930:2: ( () otherlv_1= 'suggestText' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'filterField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'uuidField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_autoHidePopup_23_0= 'autoHidePopup' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* ) ) ) ( ( (lv_validators_25_0= ruleUiValidator ) ) | ( (lv_bindings_26_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_27_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_28= '}' )? )
+            {
+            // InternalUIGrammar.g:9930:2: ( () otherlv_1= 'suggestText' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'filterField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'uuidField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_autoHidePopup_23_0= 'autoHidePopup' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* ) ) ) ( ( (lv_validators_25_0= ruleUiValidator ) ) | ( (lv_bindings_26_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_27_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_28= '}' )? )
+            // InternalUIGrammar.g:9931:3: () otherlv_1= 'suggestText' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'filterField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'uuidField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_autoHidePopup_23_0= 'autoHidePopup' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* ) ) ) ( ( (lv_validators_25_0= ruleUiValidator ) ) | ( (lv_bindings_26_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_27_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_28= '}' )?
+            {
+            // InternalUIGrammar.g:9931:3: ()
+            // InternalUIGrammar.g:9932:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiSuggestTextFieldAccess().getUiSuggestTextFieldAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,107,FOLLOW_86); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiSuggestTextFieldAccess().getSuggestTextKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:9942:3: (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )?
+            int alt231=2;
+            int LA231_0 = input.LA(1);
+
+            if ( (LA231_0==45) ) {
+                alt231=1;
+            }
+            switch (alt231) {
+                case 1 :
+                    // InternalUIGrammar.g:9943:4: otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')'
+                    {
+                    otherlv_2=(Token)match(input,45,FOLLOW_63); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getUiSuggestTextFieldAccess().getLeftParenthesisKeyword_2_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:9947:4: ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:9948:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:9948:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:9949:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_2_1());
+                    // InternalUIGrammar.g:9952:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:9953:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:9953:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )*
+                    loop230:
+                    do {
+                        int alt230=3;
+                        int LA230_0 = input.LA(1);
+
+                        if ( LA230_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_2_1(), 0) ) {
+                            alt230=1;
+                        }
+                        else if ( LA230_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_2_1(), 1) ) {
+                            alt230=2;
+                        }
+
+
+                        switch (alt230) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:9954:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:9954:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    // InternalUIGrammar.g:9955:6: {...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_2_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiSuggestTextField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_2_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:9955:118: ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    // InternalUIGrammar.g:9956:7: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_2_1(), 0);
+                    	    // InternalUIGrammar.g:9959:10: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    // InternalUIGrammar.g:9959:11: {...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiSuggestTextField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:9959:20: ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    // InternalUIGrammar.g:9959:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    {
+                    	    // InternalUIGrammar.g:9959:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    // InternalUIGrammar.g:9960:11: lv_i18nInfo_4_0= ruleUiI18nInfo
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getUiSuggestTextFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_63);
+                    	    lv_i18nInfo_4_0=ruleUiI18nInfo();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getUiSuggestTextFieldRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"i18nInfo",
+                    	      												lv_i18nInfo_4_0,
+                    	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:9982:5: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:9982:5: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:9983:6: {...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_2_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiSuggestTextField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_2_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:9983:118: ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:9984:7: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_2_1(), 1);
+                    	    // InternalUIGrammar.g:9987:10: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:9987:11: {...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiSuggestTextField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:9987:20: (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:9987:21: otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_5=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_5, grammarAccess.getUiSuggestTextFieldAccess().getStylesKeyword_2_1_1_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:9991:10: ( (lv_styles_6_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:9992:11: (lv_styles_6_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:9992:11: (lv_styles_6_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:9993:12: lv_styles_6_0= RULE_STRING
+                    	    {
+                    	    lv_styles_6_0=(Token)match(input,RULE_STRING,FOLLOW_63); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_styles_6_0, grammarAccess.getUiSuggestTextFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiSuggestTextFieldRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"styles",
+                    	      													lv_styles_6_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop230;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_2_1());
+
+                    }
+
+                    otherlv_7=(Token)match(input,47,FOLLOW_88); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_7, grammarAccess.getUiSuggestTextFieldAccess().getRightParenthesisKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:10027:3: ( (lv_name_8_0= RULE_ID ) )?
+            int alt232=2;
+            int LA232_0 = input.LA(1);
+
+            if ( (LA232_0==RULE_ID) ) {
+                alt232=1;
+            }
+            switch (alt232) {
+                case 1 :
+                    // InternalUIGrammar.g:10028:4: (lv_name_8_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:10028:4: (lv_name_8_0= RULE_ID )
+                    // InternalUIGrammar.g:10029:5: lv_name_8_0= RULE_ID
+                    {
+                    lv_name_8_0=(Token)match(input,RULE_ID,FOLLOW_89); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_8_0, grammarAccess.getUiSuggestTextFieldAccess().getNameIDTerminalRuleCall_3_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiSuggestTextFieldRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_8_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:10045:3: (otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'filterField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'uuidField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_autoHidePopup_23_0= 'autoHidePopup' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* ) ) ) ( ( (lv_validators_25_0= ruleUiValidator ) ) | ( (lv_bindings_26_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_27_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_28= '}' )?
+            int alt240=2;
+            int LA240_0 = input.LA(1);
+
+            if ( (LA240_0==20) ) {
+                alt240=1;
+            }
+            switch (alt240) {
+                case 1 :
+                    // InternalUIGrammar.g:10046:4: otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'filterField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'uuidField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_autoHidePopup_23_0= 'autoHidePopup' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* ) ) ) ( ( (lv_validators_25_0= ruleUiValidator ) ) | ( (lv_bindings_26_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_27_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_28= '}'
+                    {
+                    otherlv_9=(Token)match(input,20,FOLLOW_97); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_9, grammarAccess.getUiSuggestTextFieldAccess().getLeftCurlyBracketKeyword_4_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:10050:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'filterField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'uuidField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_autoHidePopup_23_0= 'autoHidePopup' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:10051:5: ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'filterField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'uuidField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_autoHidePopup_23_0= 'autoHidePopup' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:10051:5: ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'filterField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'uuidField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_autoHidePopup_23_0= 'autoHidePopup' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:10052:6: ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'filterField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'uuidField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_autoHidePopup_23_0= 'autoHidePopup' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1());
+                    // InternalUIGrammar.g:10055:6: ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'filterField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'uuidField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_autoHidePopup_23_0= 'autoHidePopup' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:10056:7: ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'filterField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'uuidField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_autoHidePopup_23_0= 'autoHidePopup' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:10056:7: ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'filterField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'uuidField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_autoHidePopup_23_0= 'autoHidePopup' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )*
+                    loop237:
+                    do {
+                        int alt237=7;
+                        int LA237_0 = input.LA(1);
+
+                        if ( LA237_0 == 75 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 0) ) {
+                            alt237=1;
+                        }
+                        else if ( LA237_0 == 108 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 1) ) {
+                            alt237=2;
+                        }
+                        else if ( LA237_0 == 109 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 2) ) {
+                            alt237=3;
+                        }
+                        else if ( LA237_0 == 110 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 3) ) {
+                            alt237=4;
+                        }
+                        else if ( LA237_0 == 111 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 4) ) {
+                            alt237=5;
+                        }
+                        else if ( LA237_0 == 65 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 5) ) {
+                            alt237=6;
+                        }
+
+
+                        switch (alt237) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:10057:5: ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:10057:5: ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) )
+                    	    // InternalUIGrammar.g:10058:6: {...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiSuggestTextField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:10058:118: ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) )
+                    	    // InternalUIGrammar.g:10059:7: ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 0);
+                    	    // InternalUIGrammar.g:10062:10: ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) )
+                    	    // InternalUIGrammar.g:10062:11: {...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiSuggestTextField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:10062:20: (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? )
+                    	    // InternalUIGrammar.g:10062:21: otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )?
+                    	    {
+                    	    otherlv_11=(Token)match(input,75,FOLLOW_16); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_11, grammarAccess.getUiSuggestTextFieldAccess().getTypeKeyword_4_1_0_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:10066:10: ( (lv_jvmType_12_0= ruleJvmTypeReference ) )
+                    	    // InternalUIGrammar.g:10067:11: (lv_jvmType_12_0= ruleJvmTypeReference )
+                    	    {
+                    	    // InternalUIGrammar.g:10067:11: (lv_jvmType_12_0= ruleJvmTypeReference )
+                    	    // InternalUIGrammar.g:10068:12: lv_jvmType_12_0= ruleJvmTypeReference
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newCompositeNode(grammarAccess.getUiSuggestTextFieldAccess().getJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0());
+                    	      											
+                    	    }
+                    	    pushFollow(FOLLOW_98);
+                    	    lv_jvmType_12_0=ruleJvmTypeReference();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElementForParent(grammarAccess.getUiSuggestTextFieldRule());
+                    	      												}
+                    	      												set(
+                    	      													current,
+                    	      													"jvmType",
+                    	      													lv_jvmType_12_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+                    	      												afterParserOrEnumRuleCall();
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    // InternalUIGrammar.g:10085:10: (otherlv_13= ';' )?
+                    	    int alt233=2;
+                    	    int LA233_0 = input.LA(1);
+
+                    	    if ( (LA233_0==16) ) {
+                    	        alt233=1;
+                    	    }
+                    	    switch (alt233) {
+                    	        case 1 :
+                    	            // InternalUIGrammar.g:10086:11: otherlv_13= ';'
+                    	            {
+                    	            otherlv_13=(Token)match(input,16,FOLLOW_97); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											newLeafNode(otherlv_13, grammarAccess.getUiSuggestTextFieldAccess().getSemicolonKeyword_4_1_0_2());
+                    	              										
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:10097:5: ({...}? => ( ({...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:10097:5: ({...}? => ( ({...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? ) ) ) )
+                    	    // InternalUIGrammar.g:10098:6: {...}? => ( ({...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiSuggestTextField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:10098:118: ( ({...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? ) ) )
+                    	    // InternalUIGrammar.g:10099:7: ({...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 1);
+                    	    // InternalUIGrammar.g:10102:10: ({...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? ) )
+                    	    // InternalUIGrammar.g:10102:11: {...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiSuggestTextField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:10102:20: (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? )
+                    	    // InternalUIGrammar.g:10102:21: otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )?
+                    	    {
+                    	    otherlv_14=(Token)match(input,108,FOLLOW_3); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_14, grammarAccess.getUiSuggestTextFieldAccess().getCaptionFieldKeyword_4_1_1_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:10106:10: ( (otherlv_15= RULE_ID ) )
+                    	    // InternalUIGrammar.g:10107:11: (otherlv_15= RULE_ID )
+                    	    {
+                    	    // InternalUIGrammar.g:10107:11: (otherlv_15= RULE_ID )
+                    	    // InternalUIGrammar.g:10108:12: otherlv_15= RULE_ID
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiSuggestTextFieldRule());
+                    	      												}
+                    	      											
+                    	    }
+                    	    otherlv_15=(Token)match(input,RULE_ID,FOLLOW_98); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(otherlv_15, grammarAccess.getUiSuggestTextFieldAccess().getItemCaptionPropertyJvmOperationCrossReference_4_1_1_1_0());
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    // InternalUIGrammar.g:10119:10: (otherlv_16= ';' )?
+                    	    int alt234=2;
+                    	    int LA234_0 = input.LA(1);
+
+                    	    if ( (LA234_0==16) ) {
+                    	        alt234=1;
+                    	    }
+                    	    switch (alt234) {
+                    	        case 1 :
+                    	            // InternalUIGrammar.g:10120:11: otherlv_16= ';'
+                    	            {
+                    	            otherlv_16=(Token)match(input,16,FOLLOW_97); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											newLeafNode(otherlv_16, grammarAccess.getUiSuggestTextFieldAccess().getSemicolonKeyword_4_1_1_2());
+                    	              										
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 3 :
+                    	    // InternalUIGrammar.g:10131:5: ({...}? => ( ({...}? => (otherlv_17= 'filterField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:10131:5: ({...}? => ( ({...}? => (otherlv_17= 'filterField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? ) ) ) )
+                    	    // InternalUIGrammar.g:10132:6: {...}? => ( ({...}? => (otherlv_17= 'filterField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 2) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiSuggestTextField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 2)");
+                    	    }
+                    	    // InternalUIGrammar.g:10132:118: ( ({...}? => (otherlv_17= 'filterField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? ) ) )
+                    	    // InternalUIGrammar.g:10133:7: ({...}? => (otherlv_17= 'filterField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 2);
+                    	    // InternalUIGrammar.g:10136:10: ({...}? => (otherlv_17= 'filterField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? ) )
+                    	    // InternalUIGrammar.g:10136:11: {...}? => (otherlv_17= 'filterField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiSuggestTextField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:10136:20: (otherlv_17= 'filterField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? )
+                    	    // InternalUIGrammar.g:10136:21: otherlv_17= 'filterField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )?
+                    	    {
+                    	    otherlv_17=(Token)match(input,109,FOLLOW_3); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_17, grammarAccess.getUiSuggestTextFieldAccess().getFilterFieldKeyword_4_1_2_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:10140:10: ( (otherlv_18= RULE_ID ) )
+                    	    // InternalUIGrammar.g:10141:11: (otherlv_18= RULE_ID )
+                    	    {
+                    	    // InternalUIGrammar.g:10141:11: (otherlv_18= RULE_ID )
+                    	    // InternalUIGrammar.g:10142:12: otherlv_18= RULE_ID
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiSuggestTextFieldRule());
+                    	      												}
+                    	      											
+                    	    }
+                    	    otherlv_18=(Token)match(input,RULE_ID,FOLLOW_98); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(otherlv_18, grammarAccess.getUiSuggestTextFieldAccess().getItemFilterPropertyJvmOperationCrossReference_4_1_2_1_0());
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    // InternalUIGrammar.g:10153:10: (otherlv_19= ';' )?
+                    	    int alt235=2;
+                    	    int LA235_0 = input.LA(1);
+
+                    	    if ( (LA235_0==16) ) {
+                    	        alt235=1;
+                    	    }
+                    	    switch (alt235) {
+                    	        case 1 :
+                    	            // InternalUIGrammar.g:10154:11: otherlv_19= ';'
+                    	            {
+                    	            otherlv_19=(Token)match(input,16,FOLLOW_97); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											newLeafNode(otherlv_19, grammarAccess.getUiSuggestTextFieldAccess().getSemicolonKeyword_4_1_2_2());
+                    	              										
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 4 :
+                    	    // InternalUIGrammar.g:10165:5: ({...}? => ( ({...}? => (otherlv_20= 'uuidField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:10165:5: ({...}? => ( ({...}? => (otherlv_20= 'uuidField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? ) ) ) )
+                    	    // InternalUIGrammar.g:10166:6: {...}? => ( ({...}? => (otherlv_20= 'uuidField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 3) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiSuggestTextField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 3)");
+                    	    }
+                    	    // InternalUIGrammar.g:10166:118: ( ({...}? => (otherlv_20= 'uuidField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? ) ) )
+                    	    // InternalUIGrammar.g:10167:7: ({...}? => (otherlv_20= 'uuidField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 3);
+                    	    // InternalUIGrammar.g:10170:10: ({...}? => (otherlv_20= 'uuidField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? ) )
+                    	    // InternalUIGrammar.g:10170:11: {...}? => (otherlv_20= 'uuidField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiSuggestTextField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:10170:20: (otherlv_20= 'uuidField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? )
+                    	    // InternalUIGrammar.g:10170:21: otherlv_20= 'uuidField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )?
+                    	    {
+                    	    otherlv_20=(Token)match(input,110,FOLLOW_3); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_20, grammarAccess.getUiSuggestTextFieldAccess().getUuidFieldKeyword_4_1_3_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:10174:10: ( (otherlv_21= RULE_ID ) )
+                    	    // InternalUIGrammar.g:10175:11: (otherlv_21= RULE_ID )
+                    	    {
+                    	    // InternalUIGrammar.g:10175:11: (otherlv_21= RULE_ID )
+                    	    // InternalUIGrammar.g:10176:12: otherlv_21= RULE_ID
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiSuggestTextFieldRule());
+                    	      												}
+                    	      											
+                    	    }
+                    	    otherlv_21=(Token)match(input,RULE_ID,FOLLOW_98); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(otherlv_21, grammarAccess.getUiSuggestTextFieldAccess().getItemUUIDPropertyJvmOperationCrossReference_4_1_3_1_0());
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    // InternalUIGrammar.g:10187:10: (otherlv_22= ';' )?
+                    	    int alt236=2;
+                    	    int LA236_0 = input.LA(1);
+
+                    	    if ( (LA236_0==16) ) {
+                    	        alt236=1;
+                    	    }
+                    	    switch (alt236) {
+                    	        case 1 :
+                    	            // InternalUIGrammar.g:10188:11: otherlv_22= ';'
+                    	            {
+                    	            otherlv_22=(Token)match(input,16,FOLLOW_97); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											newLeafNode(otherlv_22, grammarAccess.getUiSuggestTextFieldAccess().getSemicolonKeyword_4_1_3_2());
+                    	              										
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 5 :
+                    	    // InternalUIGrammar.g:10199:5: ({...}? => ( ({...}? => ( (lv_autoHidePopup_23_0= 'autoHidePopup' ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:10199:5: ({...}? => ( ({...}? => ( (lv_autoHidePopup_23_0= 'autoHidePopup' ) ) ) ) )
+                    	    // InternalUIGrammar.g:10200:6: {...}? => ( ({...}? => ( (lv_autoHidePopup_23_0= 'autoHidePopup' ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 4) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiSuggestTextField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 4)");
+                    	    }
+                    	    // InternalUIGrammar.g:10200:118: ( ({...}? => ( (lv_autoHidePopup_23_0= 'autoHidePopup' ) ) ) )
+                    	    // InternalUIGrammar.g:10201:7: ({...}? => ( (lv_autoHidePopup_23_0= 'autoHidePopup' ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 4);
+                    	    // InternalUIGrammar.g:10204:10: ({...}? => ( (lv_autoHidePopup_23_0= 'autoHidePopup' ) ) )
+                    	    // InternalUIGrammar.g:10204:11: {...}? => ( (lv_autoHidePopup_23_0= 'autoHidePopup' ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiSuggestTextField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:10204:20: ( (lv_autoHidePopup_23_0= 'autoHidePopup' ) )
+                    	    // InternalUIGrammar.g:10204:21: (lv_autoHidePopup_23_0= 'autoHidePopup' )
+                    	    {
+                    	    // InternalUIGrammar.g:10204:21: (lv_autoHidePopup_23_0= 'autoHidePopup' )
+                    	    // InternalUIGrammar.g:10205:11: lv_autoHidePopup_23_0= 'autoHidePopup'
+                    	    {
+                    	    lv_autoHidePopup_23_0=(Token)match(input,111,FOLLOW_97); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newLeafNode(lv_autoHidePopup_23_0, grammarAccess.getUiSuggestTextFieldAccess().getAutoHidePopupAutoHidePopupKeyword_4_1_4_0());
+                    	      										
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElement(grammarAccess.getUiSuggestTextFieldRule());
+                    	      											}
+                    	      											setWithLastConsumed(current, "autoHidePopup", true, "autoHidePopup");
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 6 :
+                    	    // InternalUIGrammar.g:10222:5: ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:10222:5: ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) )
+                    	    // InternalUIGrammar.g:10223:6: {...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 5) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiSuggestTextField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 5)");
+                    	    }
+                    	    // InternalUIGrammar.g:10223:118: ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) )
+                    	    // InternalUIGrammar.g:10224:7: ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 5);
+                    	    // InternalUIGrammar.g:10227:10: ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) )
+                    	    // InternalUIGrammar.g:10227:11: {...}? => ( (lv_readonly_24_0= 'readonly' ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiSuggestTextField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:10227:20: ( (lv_readonly_24_0= 'readonly' ) )
+                    	    // InternalUIGrammar.g:10227:21: (lv_readonly_24_0= 'readonly' )
+                    	    {
+                    	    // InternalUIGrammar.g:10227:21: (lv_readonly_24_0= 'readonly' )
+                    	    // InternalUIGrammar.g:10228:11: lv_readonly_24_0= 'readonly'
+                    	    {
+                    	    lv_readonly_24_0=(Token)match(input,65,FOLLOW_97); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newLeafNode(lv_readonly_24_0, grammarAccess.getUiSuggestTextFieldAccess().getReadonlyReadonlyKeyword_4_1_5_0());
+                    	      										
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElement(grammarAccess.getUiSuggestTextFieldRule());
+                    	      											}
+                    	      											setWithLastConsumed(current, "readonly", true, "readonly");
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop237;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1());
+
+                    }
+
+                    // InternalUIGrammar.g:10252:4: ( ( (lv_validators_25_0= ruleUiValidator ) ) | ( (lv_bindings_26_0= ruleUiBinding ) ) )*
+                    loop238:
+                    do {
+                        int alt238=3;
+                        int LA238_0 = input.LA(1);
+
+                        if ( ((LA238_0>=147 && LA238_0<=151)) ) {
+                            alt238=1;
+                        }
+                        else if ( (LA238_0==26) ) {
+                            alt238=2;
+                        }
+
+
+                        switch (alt238) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:10253:5: ( (lv_validators_25_0= ruleUiValidator ) )
+                    	    {
+                    	    // InternalUIGrammar.g:10253:5: ( (lv_validators_25_0= ruleUiValidator ) )
+                    	    // InternalUIGrammar.g:10254:6: (lv_validators_25_0= ruleUiValidator )
+                    	    {
+                    	    // InternalUIGrammar.g:10254:6: (lv_validators_25_0= ruleUiValidator )
+                    	    // InternalUIGrammar.g:10255:7: lv_validators_25_0= ruleUiValidator
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiSuggestTextFieldAccess().getValidatorsUiValidatorParserRuleCall_4_2_0_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_validators_25_0=ruleUiValidator();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiSuggestTextFieldRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"validators",
+                    	      								lv_validators_25_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:10273:5: ( (lv_bindings_26_0= ruleUiBinding ) )
+                    	    {
+                    	    // InternalUIGrammar.g:10273:5: ( (lv_bindings_26_0= ruleUiBinding ) )
+                    	    // InternalUIGrammar.g:10274:6: (lv_bindings_26_0= ruleUiBinding )
+                    	    {
+                    	    // InternalUIGrammar.g:10274:6: (lv_bindings_26_0= ruleUiBinding )
+                    	    // InternalUIGrammar.g:10275:7: lv_bindings_26_0= ruleUiBinding
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiSuggestTextFieldAccess().getBindingsUiBindingParserRuleCall_4_2_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_bindings_26_0=ruleUiBinding();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiSuggestTextFieldRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"bindings",
+                    	      								lv_bindings_26_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop238;
+                        }
+                    } while (true);
+
+                    // InternalUIGrammar.g:10293:4: ( (lv_processorAssignments_27_0= ruleUiVisibilityProcessorAssignment ) )*
+                    loop239:
+                    do {
+                        int alt239=2;
+                        int LA239_0 = input.LA(1);
+
+                        if ( (LA239_0==153) ) {
+                            alt239=1;
+                        }
+
+
+                        switch (alt239) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:10294:5: (lv_processorAssignments_27_0= ruleUiVisibilityProcessorAssignment )
+                    	    {
+                    	    // InternalUIGrammar.g:10294:5: (lv_processorAssignments_27_0= ruleUiVisibilityProcessorAssignment )
+                    	    // InternalUIGrammar.g:10295:6: lv_processorAssignments_27_0= ruleUiVisibilityProcessorAssignment
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newCompositeNode(grammarAccess.getUiSuggestTextFieldAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0());
+                    	      					
+                    	    }
+                    	    pushFollow(FOLLOW_42);
+                    	    lv_processorAssignments_27_0=ruleUiVisibilityProcessorAssignment();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						if (current==null) {
+                    	      							current = createModelElementForParent(grammarAccess.getUiSuggestTextFieldRule());
+                    	      						}
+                    	      						add(
+                    	      							current,
+                    	      							"processorAssignments",
+                    	      							lv_processorAssignments_27_0,
+                    	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+                    	      						afterParserOrEnumRuleCall();
+                    	      					
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop239;
+                        }
+                    } while (true);
+
+                    otherlv_28=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_28, grammarAccess.getUiSuggestTextFieldAccess().getRightCurlyBracketKeyword_4_4());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiSuggestTextField"
+
+
+    // $ANTLR start "entryRuleUiBeanReferenceField"
+    // InternalUIGrammar.g:10321:1: entryRuleUiBeanReferenceField returns [EObject current=null] : iv_ruleUiBeanReferenceField= ruleUiBeanReferenceField EOF ;
+    public final EObject entryRuleUiBeanReferenceField() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiBeanReferenceField = null;
+
+
+        try {
+            // InternalUIGrammar.g:10321:61: (iv_ruleUiBeanReferenceField= ruleUiBeanReferenceField EOF )
+            // InternalUIGrammar.g:10322:2: iv_ruleUiBeanReferenceField= ruleUiBeanReferenceField EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiBeanReferenceFieldRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiBeanReferenceField=ruleUiBeanReferenceField();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiBeanReferenceField; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiBeanReferenceField"
+
+
+    // $ANTLR start "ruleUiBeanReferenceField"
+    // InternalUIGrammar.g:10328:1: ruleUiBeanReferenceField returns [EObject current=null] : ( () otherlv_1= 'referenceField' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'refSource' ( (lv_referenceSourceJvmType_15_0= ruleJvmTypeReference ) ) otherlv_16= ':' ( (otherlv_17= RULE_ID ) ) (otherlv_18= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_19= 'captionField' ( (lv_captionProperty_20_0= ruleUiNestedProperty ) ) (otherlv_21= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_22= 'descriptionField' ( (lv_descriptionProperty_23_0= ruleUiNestedProperty ) ) (otherlv_24= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_25= 'imageField' ( (lv_imageProperty_26_0= ruleUiNestedProperty ) ) (otherlv_27= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_28= 'inMemoryService' ( (lv_inMemoryBeanProvider_29_0= ruleJvmTypeReference ) ) (otherlv_30= ';' )? ) ) ) ) )* ) ) ) ( ( (lv_validators_31_0= ruleUiValidator ) ) | ( (lv_bindings_32_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_33_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_34= '}' )? ) ;
+    public final EObject ruleUiBeanReferenceField() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_5=null;
+        Token lv_styles_6_0=null;
+        Token otherlv_7=null;
+        Token lv_name_8_0=null;
+        Token otherlv_9=null;
+        Token otherlv_11=null;
+        Token otherlv_13=null;
+        Token otherlv_14=null;
+        Token otherlv_16=null;
+        Token otherlv_17=null;
+        Token otherlv_18=null;
+        Token otherlv_19=null;
+        Token otherlv_21=null;
+        Token otherlv_22=null;
+        Token otherlv_24=null;
+        Token otherlv_25=null;
+        Token otherlv_27=null;
+        Token otherlv_28=null;
+        Token otherlv_30=null;
+        Token otherlv_34=null;
+        EObject lv_i18nInfo_4_0 = null;
+
+        EObject lv_jvmType_12_0 = null;
+
+        EObject lv_referenceSourceJvmType_15_0 = null;
+
+        EObject lv_captionProperty_20_0 = null;
+
+        EObject lv_descriptionProperty_23_0 = null;
+
+        EObject lv_imageProperty_26_0 = null;
+
+        EObject lv_inMemoryBeanProvider_29_0 = null;
+
+        EObject lv_validators_31_0 = null;
+
+        EObject lv_bindings_32_0 = null;
+
+        EObject lv_processorAssignments_33_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:10334:2: ( ( () otherlv_1= 'referenceField' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'refSource' ( (lv_referenceSourceJvmType_15_0= ruleJvmTypeReference ) ) otherlv_16= ':' ( (otherlv_17= RULE_ID ) ) (otherlv_18= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_19= 'captionField' ( (lv_captionProperty_20_0= ruleUiNestedProperty ) ) (otherlv_21= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_22= 'descriptionField' ( (lv_descriptionProperty_23_0= ruleUiNestedProperty ) ) (otherlv_24= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_25= 'imageField' ( (lv_imageProperty_26_0= ruleUiNestedProperty ) ) (otherlv_27= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_28= 'inMemoryService' ( (lv_inMemoryBeanProvider_29_0= ruleJvmTypeReference ) ) (otherlv_30= ';' )? ) ) ) ) )* ) ) ) ( ( (lv_validators_31_0= ruleUiValidator ) ) | ( (lv_bindings_32_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_33_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_34= '}' )? ) )
+            // InternalUIGrammar.g:10335:2: ( () otherlv_1= 'referenceField' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'refSource' ( (lv_referenceSourceJvmType_15_0= ruleJvmTypeReference ) ) otherlv_16= ':' ( (otherlv_17= RULE_ID ) ) (otherlv_18= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_19= 'captionField' ( (lv_captionProperty_20_0= ruleUiNestedProperty ) ) (otherlv_21= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_22= 'descriptionField' ( (lv_descriptionProperty_23_0= ruleUiNestedProperty ) ) (otherlv_24= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_25= 'imageField' ( (lv_imageProperty_26_0= ruleUiNestedProperty ) ) (otherlv_27= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_28= 'inMemoryService' ( (lv_inMemoryBeanProvider_29_0= ruleJvmTypeReference ) ) (otherlv_30= ';' )? ) ) ) ) )* ) ) ) ( ( (lv_validators_31_0= ruleUiValidator ) ) | ( (lv_bindings_32_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_33_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_34= '}' )? )
+            {
+            // InternalUIGrammar.g:10335:2: ( () otherlv_1= 'referenceField' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'refSource' ( (lv_referenceSourceJvmType_15_0= ruleJvmTypeReference ) ) otherlv_16= ':' ( (otherlv_17= RULE_ID ) ) (otherlv_18= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_19= 'captionField' ( (lv_captionProperty_20_0= ruleUiNestedProperty ) ) (otherlv_21= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_22= 'descriptionField' ( (lv_descriptionProperty_23_0= ruleUiNestedProperty ) ) (otherlv_24= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_25= 'imageField' ( (lv_imageProperty_26_0= ruleUiNestedProperty ) ) (otherlv_27= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_28= 'inMemoryService' ( (lv_inMemoryBeanProvider_29_0= ruleJvmTypeReference ) ) (otherlv_30= ';' )? ) ) ) ) )* ) ) ) ( ( (lv_validators_31_0= ruleUiValidator ) ) | ( (lv_bindings_32_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_33_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_34= '}' )? )
+            // InternalUIGrammar.g:10336:3: () otherlv_1= 'referenceField' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'refSource' ( (lv_referenceSourceJvmType_15_0= ruleJvmTypeReference ) ) otherlv_16= ':' ( (otherlv_17= RULE_ID ) ) (otherlv_18= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_19= 'captionField' ( (lv_captionProperty_20_0= ruleUiNestedProperty ) ) (otherlv_21= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_22= 'descriptionField' ( (lv_descriptionProperty_23_0= ruleUiNestedProperty ) ) (otherlv_24= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_25= 'imageField' ( (lv_imageProperty_26_0= ruleUiNestedProperty ) ) (otherlv_27= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_28= 'inMemoryService' ( (lv_inMemoryBeanProvider_29_0= ruleJvmTypeReference ) ) (otherlv_30= ';' )? ) ) ) ) )* ) ) ) ( ( (lv_validators_31_0= ruleUiValidator ) ) | ( (lv_bindings_32_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_33_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_34= '}' )?
+            {
+            // InternalUIGrammar.g:10336:3: ()
+            // InternalUIGrammar.g:10337:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiBeanReferenceFieldAccess().getUiBeanReferenceFieldAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,112,FOLLOW_86); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiBeanReferenceFieldAccess().getReferenceFieldKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:10347:3: (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )?
+            int alt242=2;
+            int LA242_0 = input.LA(1);
+
+            if ( (LA242_0==45) ) {
+                alt242=1;
+            }
+            switch (alt242) {
+                case 1 :
+                    // InternalUIGrammar.g:10348:4: otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')'
+                    {
+                    otherlv_2=(Token)match(input,45,FOLLOW_63); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getUiBeanReferenceFieldAccess().getLeftParenthesisKeyword_2_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:10352:4: ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:10353:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:10353:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:10354:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_2_1());
+                    // InternalUIGrammar.g:10357:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:10358:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:10358:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )*
+                    loop241:
+                    do {
+                        int alt241=3;
+                        int LA241_0 = input.LA(1);
+
+                        if ( LA241_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_2_1(), 0) ) {
+                            alt241=1;
+                        }
+                        else if ( LA241_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_2_1(), 1) ) {
+                            alt241=2;
+                        }
+
+
+                        switch (alt241) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:10359:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:10359:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    // InternalUIGrammar.g:10360:6: {...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_2_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiBeanReferenceField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_2_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:10360:120: ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    // InternalUIGrammar.g:10361:7: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_2_1(), 0);
+                    	    // InternalUIGrammar.g:10364:10: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    // InternalUIGrammar.g:10364:11: {...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiBeanReferenceField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:10364:20: ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    // InternalUIGrammar.g:10364:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    {
+                    	    // InternalUIGrammar.g:10364:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    // InternalUIGrammar.g:10365:11: lv_i18nInfo_4_0= ruleUiI18nInfo
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getUiBeanReferenceFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_63);
+                    	    lv_i18nInfo_4_0=ruleUiI18nInfo();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getUiBeanReferenceFieldRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"i18nInfo",
+                    	      												lv_i18nInfo_4_0,
+                    	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:10387:5: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:10387:5: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:10388:6: {...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_2_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiBeanReferenceField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_2_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:10388:120: ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:10389:7: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_2_1(), 1);
+                    	    // InternalUIGrammar.g:10392:10: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:10392:11: {...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiBeanReferenceField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:10392:20: (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:10392:21: otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_5=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_5, grammarAccess.getUiBeanReferenceFieldAccess().getStylesKeyword_2_1_1_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:10396:10: ( (lv_styles_6_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:10397:11: (lv_styles_6_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:10397:11: (lv_styles_6_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:10398:12: lv_styles_6_0= RULE_STRING
+                    	    {
+                    	    lv_styles_6_0=(Token)match(input,RULE_STRING,FOLLOW_63); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_styles_6_0, grammarAccess.getUiBeanReferenceFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiBeanReferenceFieldRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"styles",
+                    	      													lv_styles_6_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop241;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_2_1());
+
+                    }
+
+                    otherlv_7=(Token)match(input,47,FOLLOW_88); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_7, grammarAccess.getUiBeanReferenceFieldAccess().getRightParenthesisKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:10432:3: ( (lv_name_8_0= RULE_ID ) )?
+            int alt243=2;
+            int LA243_0 = input.LA(1);
+
+            if ( (LA243_0==RULE_ID) ) {
+                alt243=1;
+            }
+            switch (alt243) {
+                case 1 :
+                    // InternalUIGrammar.g:10433:4: (lv_name_8_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:10433:4: (lv_name_8_0= RULE_ID )
+                    // InternalUIGrammar.g:10434:5: lv_name_8_0= RULE_ID
+                    {
+                    lv_name_8_0=(Token)match(input,RULE_ID,FOLLOW_89); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_8_0, grammarAccess.getUiBeanReferenceFieldAccess().getNameIDTerminalRuleCall_3_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiBeanReferenceFieldRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_8_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:10450:3: (otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'refSource' ( (lv_referenceSourceJvmType_15_0= ruleJvmTypeReference ) ) otherlv_16= ':' ( (otherlv_17= RULE_ID ) ) (otherlv_18= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_19= 'captionField' ( (lv_captionProperty_20_0= ruleUiNestedProperty ) ) (otherlv_21= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_22= 'descriptionField' ( (lv_descriptionProperty_23_0= ruleUiNestedProperty ) ) (otherlv_24= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_25= 'imageField' ( (lv_imageProperty_26_0= ruleUiNestedProperty ) ) (otherlv_27= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_28= 'inMemoryService' ( (lv_inMemoryBeanProvider_29_0= ruleJvmTypeReference ) ) (otherlv_30= ';' )? ) ) ) ) )* ) ) ) ( ( (lv_validators_31_0= ruleUiValidator ) ) | ( (lv_bindings_32_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_33_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_34= '}' )?
+            int alt253=2;
+            int LA253_0 = input.LA(1);
+
+            if ( (LA253_0==20) ) {
+                alt253=1;
+            }
+            switch (alt253) {
+                case 1 :
+                    // InternalUIGrammar.g:10451:4: otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'refSource' ( (lv_referenceSourceJvmType_15_0= ruleJvmTypeReference ) ) otherlv_16= ':' ( (otherlv_17= RULE_ID ) ) (otherlv_18= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_19= 'captionField' ( (lv_captionProperty_20_0= ruleUiNestedProperty ) ) (otherlv_21= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_22= 'descriptionField' ( (lv_descriptionProperty_23_0= ruleUiNestedProperty ) ) (otherlv_24= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_25= 'imageField' ( (lv_imageProperty_26_0= ruleUiNestedProperty ) ) (otherlv_27= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_28= 'inMemoryService' ( (lv_inMemoryBeanProvider_29_0= ruleJvmTypeReference ) ) (otherlv_30= ';' )? ) ) ) ) )* ) ) ) ( ( (lv_validators_31_0= ruleUiValidator ) ) | ( (lv_bindings_32_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_33_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_34= '}'
+                    {
+                    otherlv_9=(Token)match(input,20,FOLLOW_99); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_9, grammarAccess.getUiBeanReferenceFieldAccess().getLeftCurlyBracketKeyword_4_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:10455:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'refSource' ( (lv_referenceSourceJvmType_15_0= ruleJvmTypeReference ) ) otherlv_16= ':' ( (otherlv_17= RULE_ID ) ) (otherlv_18= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_19= 'captionField' ( (lv_captionProperty_20_0= ruleUiNestedProperty ) ) (otherlv_21= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_22= 'descriptionField' ( (lv_descriptionProperty_23_0= ruleUiNestedProperty ) ) (otherlv_24= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_25= 'imageField' ( (lv_imageProperty_26_0= ruleUiNestedProperty ) ) (otherlv_27= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_28= 'inMemoryService' ( (lv_inMemoryBeanProvider_29_0= ruleJvmTypeReference ) ) (otherlv_30= ';' )? ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:10456:5: ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'refSource' ( (lv_referenceSourceJvmType_15_0= ruleJvmTypeReference ) ) otherlv_16= ':' ( (otherlv_17= RULE_ID ) ) (otherlv_18= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_19= 'captionField' ( (lv_captionProperty_20_0= ruleUiNestedProperty ) ) (otherlv_21= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_22= 'descriptionField' ( (lv_descriptionProperty_23_0= ruleUiNestedProperty ) ) (otherlv_24= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_25= 'imageField' ( (lv_imageProperty_26_0= ruleUiNestedProperty ) ) (otherlv_27= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_28= 'inMemoryService' ( (lv_inMemoryBeanProvider_29_0= ruleJvmTypeReference ) ) (otherlv_30= ';' )? ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:10456:5: ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'refSource' ( (lv_referenceSourceJvmType_15_0= ruleJvmTypeReference ) ) otherlv_16= ':' ( (otherlv_17= RULE_ID ) ) (otherlv_18= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_19= 'captionField' ( (lv_captionProperty_20_0= ruleUiNestedProperty ) ) (otherlv_21= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_22= 'descriptionField' ( (lv_descriptionProperty_23_0= ruleUiNestedProperty ) ) (otherlv_24= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_25= 'imageField' ( (lv_imageProperty_26_0= ruleUiNestedProperty ) ) (otherlv_27= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_28= 'inMemoryService' ( (lv_inMemoryBeanProvider_29_0= ruleJvmTypeReference ) ) (otherlv_30= ';' )? ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:10457:6: ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'refSource' ( (lv_referenceSourceJvmType_15_0= ruleJvmTypeReference ) ) otherlv_16= ':' ( (otherlv_17= RULE_ID ) ) (otherlv_18= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_19= 'captionField' ( (lv_captionProperty_20_0= ruleUiNestedProperty ) ) (otherlv_21= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_22= 'descriptionField' ( (lv_descriptionProperty_23_0= ruleUiNestedProperty ) ) (otherlv_24= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_25= 'imageField' ( (lv_imageProperty_26_0= ruleUiNestedProperty ) ) (otherlv_27= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_28= 'inMemoryService' ( (lv_inMemoryBeanProvider_29_0= ruleJvmTypeReference ) ) (otherlv_30= ';' )? ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1());
+                    // InternalUIGrammar.g:10460:6: ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'refSource' ( (lv_referenceSourceJvmType_15_0= ruleJvmTypeReference ) ) otherlv_16= ':' ( (otherlv_17= RULE_ID ) ) (otherlv_18= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_19= 'captionField' ( (lv_captionProperty_20_0= ruleUiNestedProperty ) ) (otherlv_21= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_22= 'descriptionField' ( (lv_descriptionProperty_23_0= ruleUiNestedProperty ) ) (otherlv_24= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_25= 'imageField' ( (lv_imageProperty_26_0= ruleUiNestedProperty ) ) (otherlv_27= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_28= 'inMemoryService' ( (lv_inMemoryBeanProvider_29_0= ruleJvmTypeReference ) ) (otherlv_30= ';' )? ) ) ) ) )* )
+                    // InternalUIGrammar.g:10461:7: ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'refSource' ( (lv_referenceSourceJvmType_15_0= ruleJvmTypeReference ) ) otherlv_16= ':' ( (otherlv_17= RULE_ID ) ) (otherlv_18= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_19= 'captionField' ( (lv_captionProperty_20_0= ruleUiNestedProperty ) ) (otherlv_21= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_22= 'descriptionField' ( (lv_descriptionProperty_23_0= ruleUiNestedProperty ) ) (otherlv_24= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_25= 'imageField' ( (lv_imageProperty_26_0= ruleUiNestedProperty ) ) (otherlv_27= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_28= 'inMemoryService' ( (lv_inMemoryBeanProvider_29_0= ruleJvmTypeReference ) ) (otherlv_30= ';' )? ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:10461:7: ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'refSource' ( (lv_referenceSourceJvmType_15_0= ruleJvmTypeReference ) ) otherlv_16= ':' ( (otherlv_17= RULE_ID ) ) (otherlv_18= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_19= 'captionField' ( (lv_captionProperty_20_0= ruleUiNestedProperty ) ) (otherlv_21= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_22= 'descriptionField' ( (lv_descriptionProperty_23_0= ruleUiNestedProperty ) ) (otherlv_24= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_25= 'imageField' ( (lv_imageProperty_26_0= ruleUiNestedProperty ) ) (otherlv_27= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_28= 'inMemoryService' ( (lv_inMemoryBeanProvider_29_0= ruleJvmTypeReference ) ) (otherlv_30= ';' )? ) ) ) ) )*
+                    loop250:
+                    do {
+                        int alt250=7;
+                        int LA250_0 = input.LA(1);
+
+                        if ( LA250_0 == 75 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 0) ) {
+                            alt250=1;
+                        }
+                        else if ( LA250_0 == 113 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 1) ) {
+                            alt250=2;
+                        }
+                        else if ( LA250_0 == 108 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 2) ) {
+                            alt250=3;
+                        }
+                        else if ( LA250_0 == 114 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 3) ) {
+                            alt250=4;
+                        }
+                        else if ( LA250_0 == 115 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 4) ) {
+                            alt250=5;
+                        }
+                        else if ( LA250_0 == 116 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 5) ) {
+                            alt250=6;
+                        }
+
+
+                        switch (alt250) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:10462:5: ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:10462:5: ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) )
+                    	    // InternalUIGrammar.g:10463:6: {...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiBeanReferenceField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:10463:120: ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) )
+                    	    // InternalUIGrammar.g:10464:7: ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 0);
+                    	    // InternalUIGrammar.g:10467:10: ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) )
+                    	    // InternalUIGrammar.g:10467:11: {...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiBeanReferenceField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:10467:20: (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? )
+                    	    // InternalUIGrammar.g:10467:21: otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )?
+                    	    {
+                    	    otherlv_11=(Token)match(input,75,FOLLOW_16); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_11, grammarAccess.getUiBeanReferenceFieldAccess().getTypeKeyword_4_1_0_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:10471:10: ( (lv_jvmType_12_0= ruleJvmTypeReference ) )
+                    	    // InternalUIGrammar.g:10472:11: (lv_jvmType_12_0= ruleJvmTypeReference )
+                    	    {
+                    	    // InternalUIGrammar.g:10472:11: (lv_jvmType_12_0= ruleJvmTypeReference )
+                    	    // InternalUIGrammar.g:10473:12: lv_jvmType_12_0= ruleJvmTypeReference
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newCompositeNode(grammarAccess.getUiBeanReferenceFieldAccess().getJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0());
+                    	      											
+                    	    }
+                    	    pushFollow(FOLLOW_100);
+                    	    lv_jvmType_12_0=ruleJvmTypeReference();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElementForParent(grammarAccess.getUiBeanReferenceFieldRule());
+                    	      												}
+                    	      												set(
+                    	      													current,
+                    	      													"jvmType",
+                    	      													lv_jvmType_12_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+                    	      												afterParserOrEnumRuleCall();
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    // InternalUIGrammar.g:10490:10: (otherlv_13= ';' )?
+                    	    int alt244=2;
+                    	    int LA244_0 = input.LA(1);
+
+                    	    if ( (LA244_0==16) ) {
+                    	        alt244=1;
+                    	    }
+                    	    switch (alt244) {
+                    	        case 1 :
+                    	            // InternalUIGrammar.g:10491:11: otherlv_13= ';'
+                    	            {
+                    	            otherlv_13=(Token)match(input,16,FOLLOW_99); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											newLeafNode(otherlv_13, grammarAccess.getUiBeanReferenceFieldAccess().getSemicolonKeyword_4_1_0_2());
+                    	              										
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:10502:5: ({...}? => ( ({...}? => (otherlv_14= 'refSource' ( (lv_referenceSourceJvmType_15_0= ruleJvmTypeReference ) ) otherlv_16= ':' ( (otherlv_17= RULE_ID ) ) (otherlv_18= ';' )? ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:10502:5: ({...}? => ( ({...}? => (otherlv_14= 'refSource' ( (lv_referenceSourceJvmType_15_0= ruleJvmTypeReference ) ) otherlv_16= ':' ( (otherlv_17= RULE_ID ) ) (otherlv_18= ';' )? ) ) ) )
+                    	    // InternalUIGrammar.g:10503:6: {...}? => ( ({...}? => (otherlv_14= 'refSource' ( (lv_referenceSourceJvmType_15_0= ruleJvmTypeReference ) ) otherlv_16= ':' ( (otherlv_17= RULE_ID ) ) (otherlv_18= ';' )? ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiBeanReferenceField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:10503:120: ( ({...}? => (otherlv_14= 'refSource' ( (lv_referenceSourceJvmType_15_0= ruleJvmTypeReference ) ) otherlv_16= ':' ( (otherlv_17= RULE_ID ) ) (otherlv_18= ';' )? ) ) )
+                    	    // InternalUIGrammar.g:10504:7: ({...}? => (otherlv_14= 'refSource' ( (lv_referenceSourceJvmType_15_0= ruleJvmTypeReference ) ) otherlv_16= ':' ( (otherlv_17= RULE_ID ) ) (otherlv_18= ';' )? ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 1);
+                    	    // InternalUIGrammar.g:10507:10: ({...}? => (otherlv_14= 'refSource' ( (lv_referenceSourceJvmType_15_0= ruleJvmTypeReference ) ) otherlv_16= ':' ( (otherlv_17= RULE_ID ) ) (otherlv_18= ';' )? ) )
+                    	    // InternalUIGrammar.g:10507:11: {...}? => (otherlv_14= 'refSource' ( (lv_referenceSourceJvmType_15_0= ruleJvmTypeReference ) ) otherlv_16= ':' ( (otherlv_17= RULE_ID ) ) (otherlv_18= ';' )? )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiBeanReferenceField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:10507:20: (otherlv_14= 'refSource' ( (lv_referenceSourceJvmType_15_0= ruleJvmTypeReference ) ) otherlv_16= ':' ( (otherlv_17= RULE_ID ) ) (otherlv_18= ';' )? )
+                    	    // InternalUIGrammar.g:10507:21: otherlv_14= 'refSource' ( (lv_referenceSourceJvmType_15_0= ruleJvmTypeReference ) ) otherlv_16= ':' ( (otherlv_17= RULE_ID ) ) (otherlv_18= ';' )?
+                    	    {
+                    	    otherlv_14=(Token)match(input,113,FOLLOW_16); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_14, grammarAccess.getUiBeanReferenceFieldAccess().getRefSourceKeyword_4_1_1_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:10511:10: ( (lv_referenceSourceJvmType_15_0= ruleJvmTypeReference ) )
+                    	    // InternalUIGrammar.g:10512:11: (lv_referenceSourceJvmType_15_0= ruleJvmTypeReference )
+                    	    {
+                    	    // InternalUIGrammar.g:10512:11: (lv_referenceSourceJvmType_15_0= ruleJvmTypeReference )
+                    	    // InternalUIGrammar.g:10513:12: lv_referenceSourceJvmType_15_0= ruleJvmTypeReference
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newCompositeNode(grammarAccess.getUiBeanReferenceFieldAccess().getReferenceSourceJvmTypeJvmTypeReferenceParserRuleCall_4_1_1_1_0());
+                    	      											
+                    	    }
+                    	    pushFollow(FOLLOW_15);
+                    	    lv_referenceSourceJvmType_15_0=ruleJvmTypeReference();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElementForParent(grammarAccess.getUiBeanReferenceFieldRule());
+                    	      												}
+                    	      												set(
+                    	      													current,
+                    	      													"referenceSourceJvmType",
+                    	      													lv_referenceSourceJvmType_15_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+                    	      												afterParserOrEnumRuleCall();
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    otherlv_16=(Token)match(input,24,FOLLOW_3); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_16, grammarAccess.getUiBeanReferenceFieldAccess().getColonKeyword_4_1_1_2());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:10534:10: ( (otherlv_17= RULE_ID ) )
+                    	    // InternalUIGrammar.g:10535:11: (otherlv_17= RULE_ID )
+                    	    {
+                    	    // InternalUIGrammar.g:10535:11: (otherlv_17= RULE_ID )
+                    	    // InternalUIGrammar.g:10536:12: otherlv_17= RULE_ID
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiBeanReferenceFieldRule());
+                    	      												}
+                    	      											
+                    	    }
+                    	    otherlv_17=(Token)match(input,RULE_ID,FOLLOW_100); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(otherlv_17, grammarAccess.getUiBeanReferenceFieldAccess().getReferenceSourceFieldJvmFieldCrossReference_4_1_1_3_0());
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    // InternalUIGrammar.g:10547:10: (otherlv_18= ';' )?
+                    	    int alt245=2;
+                    	    int LA245_0 = input.LA(1);
+
+                    	    if ( (LA245_0==16) ) {
+                    	        alt245=1;
+                    	    }
+                    	    switch (alt245) {
+                    	        case 1 :
+                    	            // InternalUIGrammar.g:10548:11: otherlv_18= ';'
+                    	            {
+                    	            otherlv_18=(Token)match(input,16,FOLLOW_99); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											newLeafNode(otherlv_18, grammarAccess.getUiBeanReferenceFieldAccess().getSemicolonKeyword_4_1_1_4());
+                    	              										
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 3 :
+                    	    // InternalUIGrammar.g:10559:5: ({...}? => ( ({...}? => (otherlv_19= 'captionField' ( (lv_captionProperty_20_0= ruleUiNestedProperty ) ) (otherlv_21= ';' )? ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:10559:5: ({...}? => ( ({...}? => (otherlv_19= 'captionField' ( (lv_captionProperty_20_0= ruleUiNestedProperty ) ) (otherlv_21= ';' )? ) ) ) )
+                    	    // InternalUIGrammar.g:10560:6: {...}? => ( ({...}? => (otherlv_19= 'captionField' ( (lv_captionProperty_20_0= ruleUiNestedProperty ) ) (otherlv_21= ';' )? ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 2) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiBeanReferenceField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 2)");
+                    	    }
+                    	    // InternalUIGrammar.g:10560:120: ( ({...}? => (otherlv_19= 'captionField' ( (lv_captionProperty_20_0= ruleUiNestedProperty ) ) (otherlv_21= ';' )? ) ) )
+                    	    // InternalUIGrammar.g:10561:7: ({...}? => (otherlv_19= 'captionField' ( (lv_captionProperty_20_0= ruleUiNestedProperty ) ) (otherlv_21= ';' )? ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 2);
+                    	    // InternalUIGrammar.g:10564:10: ({...}? => (otherlv_19= 'captionField' ( (lv_captionProperty_20_0= ruleUiNestedProperty ) ) (otherlv_21= ';' )? ) )
+                    	    // InternalUIGrammar.g:10564:11: {...}? => (otherlv_19= 'captionField' ( (lv_captionProperty_20_0= ruleUiNestedProperty ) ) (otherlv_21= ';' )? )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiBeanReferenceField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:10564:20: (otherlv_19= 'captionField' ( (lv_captionProperty_20_0= ruleUiNestedProperty ) ) (otherlv_21= ';' )? )
+                    	    // InternalUIGrammar.g:10564:21: otherlv_19= 'captionField' ( (lv_captionProperty_20_0= ruleUiNestedProperty ) ) (otherlv_21= ';' )?
+                    	    {
+                    	    otherlv_19=(Token)match(input,108,FOLLOW_3); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_19, grammarAccess.getUiBeanReferenceFieldAccess().getCaptionFieldKeyword_4_1_2_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:10568:10: ( (lv_captionProperty_20_0= ruleUiNestedProperty ) )
+                    	    // InternalUIGrammar.g:10569:11: (lv_captionProperty_20_0= ruleUiNestedProperty )
+                    	    {
+                    	    // InternalUIGrammar.g:10569:11: (lv_captionProperty_20_0= ruleUiNestedProperty )
+                    	    // InternalUIGrammar.g:10570:12: lv_captionProperty_20_0= ruleUiNestedProperty
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newCompositeNode(grammarAccess.getUiBeanReferenceFieldAccess().getCaptionPropertyUiNestedPropertyParserRuleCall_4_1_2_1_0());
+                    	      											
+                    	    }
+                    	    pushFollow(FOLLOW_100);
+                    	    lv_captionProperty_20_0=ruleUiNestedProperty();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElementForParent(grammarAccess.getUiBeanReferenceFieldRule());
+                    	      												}
+                    	      												set(
+                    	      													current,
+                    	      													"captionProperty",
+                    	      													lv_captionProperty_20_0,
+                    	      													"org.eclipse.osbp.ecview.dsl.UIGrammar.UiNestedProperty");
+                    	      												afterParserOrEnumRuleCall();
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    // InternalUIGrammar.g:10587:10: (otherlv_21= ';' )?
+                    	    int alt246=2;
+                    	    int LA246_0 = input.LA(1);
+
+                    	    if ( (LA246_0==16) ) {
+                    	        alt246=1;
+                    	    }
+                    	    switch (alt246) {
+                    	        case 1 :
+                    	            // InternalUIGrammar.g:10588:11: otherlv_21= ';'
+                    	            {
+                    	            otherlv_21=(Token)match(input,16,FOLLOW_99); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											newLeafNode(otherlv_21, grammarAccess.getUiBeanReferenceFieldAccess().getSemicolonKeyword_4_1_2_2());
+                    	              										
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 4 :
+                    	    // InternalUIGrammar.g:10599:5: ({...}? => ( ({...}? => (otherlv_22= 'descriptionField' ( (lv_descriptionProperty_23_0= ruleUiNestedProperty ) ) (otherlv_24= ';' )? ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:10599:5: ({...}? => ( ({...}? => (otherlv_22= 'descriptionField' ( (lv_descriptionProperty_23_0= ruleUiNestedProperty ) ) (otherlv_24= ';' )? ) ) ) )
+                    	    // InternalUIGrammar.g:10600:6: {...}? => ( ({...}? => (otherlv_22= 'descriptionField' ( (lv_descriptionProperty_23_0= ruleUiNestedProperty ) ) (otherlv_24= ';' )? ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 3) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiBeanReferenceField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 3)");
+                    	    }
+                    	    // InternalUIGrammar.g:10600:120: ( ({...}? => (otherlv_22= 'descriptionField' ( (lv_descriptionProperty_23_0= ruleUiNestedProperty ) ) (otherlv_24= ';' )? ) ) )
+                    	    // InternalUIGrammar.g:10601:7: ({...}? => (otherlv_22= 'descriptionField' ( (lv_descriptionProperty_23_0= ruleUiNestedProperty ) ) (otherlv_24= ';' )? ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 3);
+                    	    // InternalUIGrammar.g:10604:10: ({...}? => (otherlv_22= 'descriptionField' ( (lv_descriptionProperty_23_0= ruleUiNestedProperty ) ) (otherlv_24= ';' )? ) )
+                    	    // InternalUIGrammar.g:10604:11: {...}? => (otherlv_22= 'descriptionField' ( (lv_descriptionProperty_23_0= ruleUiNestedProperty ) ) (otherlv_24= ';' )? )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiBeanReferenceField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:10604:20: (otherlv_22= 'descriptionField' ( (lv_descriptionProperty_23_0= ruleUiNestedProperty ) ) (otherlv_24= ';' )? )
+                    	    // InternalUIGrammar.g:10604:21: otherlv_22= 'descriptionField' ( (lv_descriptionProperty_23_0= ruleUiNestedProperty ) ) (otherlv_24= ';' )?
+                    	    {
+                    	    otherlv_22=(Token)match(input,114,FOLLOW_3); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_22, grammarAccess.getUiBeanReferenceFieldAccess().getDescriptionFieldKeyword_4_1_3_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:10608:10: ( (lv_descriptionProperty_23_0= ruleUiNestedProperty ) )
+                    	    // InternalUIGrammar.g:10609:11: (lv_descriptionProperty_23_0= ruleUiNestedProperty )
+                    	    {
+                    	    // InternalUIGrammar.g:10609:11: (lv_descriptionProperty_23_0= ruleUiNestedProperty )
+                    	    // InternalUIGrammar.g:10610:12: lv_descriptionProperty_23_0= ruleUiNestedProperty
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newCompositeNode(grammarAccess.getUiBeanReferenceFieldAccess().getDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_3_1_0());
+                    	      											
+                    	    }
+                    	    pushFollow(FOLLOW_100);
+                    	    lv_descriptionProperty_23_0=ruleUiNestedProperty();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElementForParent(grammarAccess.getUiBeanReferenceFieldRule());
+                    	      												}
+                    	      												set(
+                    	      													current,
+                    	      													"descriptionProperty",
+                    	      													lv_descriptionProperty_23_0,
+                    	      													"org.eclipse.osbp.ecview.dsl.UIGrammar.UiNestedProperty");
+                    	      												afterParserOrEnumRuleCall();
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    // InternalUIGrammar.g:10627:10: (otherlv_24= ';' )?
+                    	    int alt247=2;
+                    	    int LA247_0 = input.LA(1);
+
+                    	    if ( (LA247_0==16) ) {
+                    	        alt247=1;
+                    	    }
+                    	    switch (alt247) {
+                    	        case 1 :
+                    	            // InternalUIGrammar.g:10628:11: otherlv_24= ';'
+                    	            {
+                    	            otherlv_24=(Token)match(input,16,FOLLOW_99); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											newLeafNode(otherlv_24, grammarAccess.getUiBeanReferenceFieldAccess().getSemicolonKeyword_4_1_3_2());
+                    	              										
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 5 :
+                    	    // InternalUIGrammar.g:10639:5: ({...}? => ( ({...}? => (otherlv_25= 'imageField' ( (lv_imageProperty_26_0= ruleUiNestedProperty ) ) (otherlv_27= ';' )? ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:10639:5: ({...}? => ( ({...}? => (otherlv_25= 'imageField' ( (lv_imageProperty_26_0= ruleUiNestedProperty ) ) (otherlv_27= ';' )? ) ) ) )
+                    	    // InternalUIGrammar.g:10640:6: {...}? => ( ({...}? => (otherlv_25= 'imageField' ( (lv_imageProperty_26_0= ruleUiNestedProperty ) ) (otherlv_27= ';' )? ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 4) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiBeanReferenceField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 4)");
+                    	    }
+                    	    // InternalUIGrammar.g:10640:120: ( ({...}? => (otherlv_25= 'imageField' ( (lv_imageProperty_26_0= ruleUiNestedProperty ) ) (otherlv_27= ';' )? ) ) )
+                    	    // InternalUIGrammar.g:10641:7: ({...}? => (otherlv_25= 'imageField' ( (lv_imageProperty_26_0= ruleUiNestedProperty ) ) (otherlv_27= ';' )? ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 4);
+                    	    // InternalUIGrammar.g:10644:10: ({...}? => (otherlv_25= 'imageField' ( (lv_imageProperty_26_0= ruleUiNestedProperty ) ) (otherlv_27= ';' )? ) )
+                    	    // InternalUIGrammar.g:10644:11: {...}? => (otherlv_25= 'imageField' ( (lv_imageProperty_26_0= ruleUiNestedProperty ) ) (otherlv_27= ';' )? )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiBeanReferenceField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:10644:20: (otherlv_25= 'imageField' ( (lv_imageProperty_26_0= ruleUiNestedProperty ) ) (otherlv_27= ';' )? )
+                    	    // InternalUIGrammar.g:10644:21: otherlv_25= 'imageField' ( (lv_imageProperty_26_0= ruleUiNestedProperty ) ) (otherlv_27= ';' )?
+                    	    {
+                    	    otherlv_25=(Token)match(input,115,FOLLOW_3); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_25, grammarAccess.getUiBeanReferenceFieldAccess().getImageFieldKeyword_4_1_4_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:10648:10: ( (lv_imageProperty_26_0= ruleUiNestedProperty ) )
+                    	    // InternalUIGrammar.g:10649:11: (lv_imageProperty_26_0= ruleUiNestedProperty )
+                    	    {
+                    	    // InternalUIGrammar.g:10649:11: (lv_imageProperty_26_0= ruleUiNestedProperty )
+                    	    // InternalUIGrammar.g:10650:12: lv_imageProperty_26_0= ruleUiNestedProperty
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newCompositeNode(grammarAccess.getUiBeanReferenceFieldAccess().getImagePropertyUiNestedPropertyParserRuleCall_4_1_4_1_0());
+                    	      											
+                    	    }
+                    	    pushFollow(FOLLOW_100);
+                    	    lv_imageProperty_26_0=ruleUiNestedProperty();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElementForParent(grammarAccess.getUiBeanReferenceFieldRule());
+                    	      												}
+                    	      												set(
+                    	      													current,
+                    	      													"imageProperty",
+                    	      													lv_imageProperty_26_0,
+                    	      													"org.eclipse.osbp.ecview.dsl.UIGrammar.UiNestedProperty");
+                    	      												afterParserOrEnumRuleCall();
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    // InternalUIGrammar.g:10667:10: (otherlv_27= ';' )?
+                    	    int alt248=2;
+                    	    int LA248_0 = input.LA(1);
+
+                    	    if ( (LA248_0==16) ) {
+                    	        alt248=1;
+                    	    }
+                    	    switch (alt248) {
+                    	        case 1 :
+                    	            // InternalUIGrammar.g:10668:11: otherlv_27= ';'
+                    	            {
+                    	            otherlv_27=(Token)match(input,16,FOLLOW_99); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											newLeafNode(otherlv_27, grammarAccess.getUiBeanReferenceFieldAccess().getSemicolonKeyword_4_1_4_2());
+                    	              										
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 6 :
+                    	    // InternalUIGrammar.g:10679:5: ({...}? => ( ({...}? => (otherlv_28= 'inMemoryService' ( (lv_inMemoryBeanProvider_29_0= ruleJvmTypeReference ) ) (otherlv_30= ';' )? ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:10679:5: ({...}? => ( ({...}? => (otherlv_28= 'inMemoryService' ( (lv_inMemoryBeanProvider_29_0= ruleJvmTypeReference ) ) (otherlv_30= ';' )? ) ) ) )
+                    	    // InternalUIGrammar.g:10680:6: {...}? => ( ({...}? => (otherlv_28= 'inMemoryService' ( (lv_inMemoryBeanProvider_29_0= ruleJvmTypeReference ) ) (otherlv_30= ';' )? ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 5) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiBeanReferenceField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 5)");
+                    	    }
+                    	    // InternalUIGrammar.g:10680:120: ( ({...}? => (otherlv_28= 'inMemoryService' ( (lv_inMemoryBeanProvider_29_0= ruleJvmTypeReference ) ) (otherlv_30= ';' )? ) ) )
+                    	    // InternalUIGrammar.g:10681:7: ({...}? => (otherlv_28= 'inMemoryService' ( (lv_inMemoryBeanProvider_29_0= ruleJvmTypeReference ) ) (otherlv_30= ';' )? ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 5);
+                    	    // InternalUIGrammar.g:10684:10: ({...}? => (otherlv_28= 'inMemoryService' ( (lv_inMemoryBeanProvider_29_0= ruleJvmTypeReference ) ) (otherlv_30= ';' )? ) )
+                    	    // InternalUIGrammar.g:10684:11: {...}? => (otherlv_28= 'inMemoryService' ( (lv_inMemoryBeanProvider_29_0= ruleJvmTypeReference ) ) (otherlv_30= ';' )? )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiBeanReferenceField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:10684:20: (otherlv_28= 'inMemoryService' ( (lv_inMemoryBeanProvider_29_0= ruleJvmTypeReference ) ) (otherlv_30= ';' )? )
+                    	    // InternalUIGrammar.g:10684:21: otherlv_28= 'inMemoryService' ( (lv_inMemoryBeanProvider_29_0= ruleJvmTypeReference ) ) (otherlv_30= ';' )?
+                    	    {
+                    	    otherlv_28=(Token)match(input,116,FOLLOW_16); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_28, grammarAccess.getUiBeanReferenceFieldAccess().getInMemoryServiceKeyword_4_1_5_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:10688:10: ( (lv_inMemoryBeanProvider_29_0= ruleJvmTypeReference ) )
+                    	    // InternalUIGrammar.g:10689:11: (lv_inMemoryBeanProvider_29_0= ruleJvmTypeReference )
+                    	    {
+                    	    // InternalUIGrammar.g:10689:11: (lv_inMemoryBeanProvider_29_0= ruleJvmTypeReference )
+                    	    // InternalUIGrammar.g:10690:12: lv_inMemoryBeanProvider_29_0= ruleJvmTypeReference
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newCompositeNode(grammarAccess.getUiBeanReferenceFieldAccess().getInMemoryBeanProviderJvmTypeReferenceParserRuleCall_4_1_5_1_0());
+                    	      											
+                    	    }
+                    	    pushFollow(FOLLOW_100);
+                    	    lv_inMemoryBeanProvider_29_0=ruleJvmTypeReference();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElementForParent(grammarAccess.getUiBeanReferenceFieldRule());
+                    	      												}
+                    	      												set(
+                    	      													current,
+                    	      													"inMemoryBeanProvider",
+                    	      													lv_inMemoryBeanProvider_29_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+                    	      												afterParserOrEnumRuleCall();
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    // InternalUIGrammar.g:10707:10: (otherlv_30= ';' )?
+                    	    int alt249=2;
+                    	    int LA249_0 = input.LA(1);
+
+                    	    if ( (LA249_0==16) ) {
+                    	        alt249=1;
+                    	    }
+                    	    switch (alt249) {
+                    	        case 1 :
+                    	            // InternalUIGrammar.g:10708:11: otherlv_30= ';'
+                    	            {
+                    	            otherlv_30=(Token)match(input,16,FOLLOW_99); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											newLeafNode(otherlv_30, grammarAccess.getUiBeanReferenceFieldAccess().getSemicolonKeyword_4_1_5_2());
+                    	              										
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop250;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1());
+
+                    }
+
+                    // InternalUIGrammar.g:10726:4: ( ( (lv_validators_31_0= ruleUiValidator ) ) | ( (lv_bindings_32_0= ruleUiBinding ) ) )*
+                    loop251:
+                    do {
+                        int alt251=3;
+                        int LA251_0 = input.LA(1);
+
+                        if ( ((LA251_0>=147 && LA251_0<=151)) ) {
+                            alt251=1;
+                        }
+                        else if ( (LA251_0==26) ) {
+                            alt251=2;
+                        }
+
+
+                        switch (alt251) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:10727:5: ( (lv_validators_31_0= ruleUiValidator ) )
+                    	    {
+                    	    // InternalUIGrammar.g:10727:5: ( (lv_validators_31_0= ruleUiValidator ) )
+                    	    // InternalUIGrammar.g:10728:6: (lv_validators_31_0= ruleUiValidator )
+                    	    {
+                    	    // InternalUIGrammar.g:10728:6: (lv_validators_31_0= ruleUiValidator )
+                    	    // InternalUIGrammar.g:10729:7: lv_validators_31_0= ruleUiValidator
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiBeanReferenceFieldAccess().getValidatorsUiValidatorParserRuleCall_4_2_0_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_validators_31_0=ruleUiValidator();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiBeanReferenceFieldRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"validators",
+                    	      								lv_validators_31_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:10747:5: ( (lv_bindings_32_0= ruleUiBinding ) )
+                    	    {
+                    	    // InternalUIGrammar.g:10747:5: ( (lv_bindings_32_0= ruleUiBinding ) )
+                    	    // InternalUIGrammar.g:10748:6: (lv_bindings_32_0= ruleUiBinding )
+                    	    {
+                    	    // InternalUIGrammar.g:10748:6: (lv_bindings_32_0= ruleUiBinding )
+                    	    // InternalUIGrammar.g:10749:7: lv_bindings_32_0= ruleUiBinding
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiBeanReferenceFieldAccess().getBindingsUiBindingParserRuleCall_4_2_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_bindings_32_0=ruleUiBinding();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiBeanReferenceFieldRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"bindings",
+                    	      								lv_bindings_32_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop251;
+                        }
+                    } while (true);
+
+                    // InternalUIGrammar.g:10767:4: ( (lv_processorAssignments_33_0= ruleUiVisibilityProcessorAssignment ) )*
+                    loop252:
+                    do {
+                        int alt252=2;
+                        int LA252_0 = input.LA(1);
+
+                        if ( (LA252_0==153) ) {
+                            alt252=1;
+                        }
+
+
+                        switch (alt252) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:10768:5: (lv_processorAssignments_33_0= ruleUiVisibilityProcessorAssignment )
+                    	    {
+                    	    // InternalUIGrammar.g:10768:5: (lv_processorAssignments_33_0= ruleUiVisibilityProcessorAssignment )
+                    	    // InternalUIGrammar.g:10769:6: lv_processorAssignments_33_0= ruleUiVisibilityProcessorAssignment
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newCompositeNode(grammarAccess.getUiBeanReferenceFieldAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0());
+                    	      					
+                    	    }
+                    	    pushFollow(FOLLOW_42);
+                    	    lv_processorAssignments_33_0=ruleUiVisibilityProcessorAssignment();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						if (current==null) {
+                    	      							current = createModelElementForParent(grammarAccess.getUiBeanReferenceFieldRule());
+                    	      						}
+                    	      						add(
+                    	      							current,
+                    	      							"processorAssignments",
+                    	      							lv_processorAssignments_33_0,
+                    	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+                    	      						afterParserOrEnumRuleCall();
+                    	      					
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop252;
+                        }
+                    } while (true);
+
+                    otherlv_34=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_34, grammarAccess.getUiBeanReferenceFieldAccess().getRightCurlyBracketKeyword_4_4());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiBeanReferenceField"
+
+
+    // $ANTLR start "entryRuleUiSearchField"
+    // InternalUIGrammar.g:10795:1: entryRuleUiSearchField returns [EObject current=null] : iv_ruleUiSearchField= ruleUiSearchField EOF ;
+    public final EObject entryRuleUiSearchField() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiSearchField = null;
+
+
+        try {
+            // InternalUIGrammar.g:10795:54: (iv_ruleUiSearchField= ruleUiSearchField EOF )
+            // InternalUIGrammar.g:10796:2: iv_ruleUiSearchField= ruleUiSearchField EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiSearchFieldRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiSearchField=ruleUiSearchField();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiSearchField; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiSearchField"
+
+
+    // $ANTLR start "ruleUiSearchField"
+    // InternalUIGrammar.g:10802:1: ruleUiSearchField returns [EObject current=null] : ( () otherlv_1= 'searchfield' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_property_8_0= ruleUiNestedProperty ) ) ) ;
+    public final EObject ruleUiSearchField() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_5=null;
+        Token lv_styles_6_0=null;
+        Token otherlv_7=null;
+        EObject lv_i18nInfo_4_0 = null;
+
+        EObject lv_property_8_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:10808:2: ( ( () otherlv_1= 'searchfield' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_property_8_0= ruleUiNestedProperty ) ) ) )
+            // InternalUIGrammar.g:10809:2: ( () otherlv_1= 'searchfield' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_property_8_0= ruleUiNestedProperty ) ) )
+            {
+            // InternalUIGrammar.g:10809:2: ( () otherlv_1= 'searchfield' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_property_8_0= ruleUiNestedProperty ) ) )
+            // InternalUIGrammar.g:10810:3: () otherlv_1= 'searchfield' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_property_8_0= ruleUiNestedProperty ) )
+            {
+            // InternalUIGrammar.g:10810:3: ()
+            // InternalUIGrammar.g:10811:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiSearchFieldAccess().getUiSearchFieldAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,117,FOLLOW_74); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiSearchFieldAccess().getSearchfieldKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:10821:3: (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )?
+            int alt255=2;
+            int LA255_0 = input.LA(1);
+
+            if ( (LA255_0==45) ) {
+                alt255=1;
+            }
+            switch (alt255) {
+                case 1 :
+                    // InternalUIGrammar.g:10822:4: otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')'
+                    {
+                    otherlv_2=(Token)match(input,45,FOLLOW_63); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getUiSearchFieldAccess().getLeftParenthesisKeyword_2_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:10826:4: ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:10827:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:10827:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:10828:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiSearchFieldAccess().getUnorderedGroup_2_1());
+                    // InternalUIGrammar.g:10831:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:10832:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:10832:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )*
+                    loop254:
+                    do {
+                        int alt254=3;
+                        int LA254_0 = input.LA(1);
+
+                        if ( LA254_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiSearchFieldAccess().getUnorderedGroup_2_1(), 0) ) {
+                            alt254=1;
+                        }
+                        else if ( LA254_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiSearchFieldAccess().getUnorderedGroup_2_1(), 1) ) {
+                            alt254=2;
+                        }
+
+
+                        switch (alt254) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:10833:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:10833:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    // InternalUIGrammar.g:10834:6: {...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiSearchFieldAccess().getUnorderedGroup_2_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiSearchField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiSearchFieldAccess().getUnorderedGroup_2_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:10834:113: ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    // InternalUIGrammar.g:10835:7: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiSearchFieldAccess().getUnorderedGroup_2_1(), 0);
+                    	    // InternalUIGrammar.g:10838:10: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    // InternalUIGrammar.g:10838:11: {...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiSearchField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:10838:20: ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    // InternalUIGrammar.g:10838:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    {
+                    	    // InternalUIGrammar.g:10838:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    // InternalUIGrammar.g:10839:11: lv_i18nInfo_4_0= ruleUiI18nInfo
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getUiSearchFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_63);
+                    	    lv_i18nInfo_4_0=ruleUiI18nInfo();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getUiSearchFieldRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"i18nInfo",
+                    	      												lv_i18nInfo_4_0,
+                    	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSearchFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:10861:5: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:10861:5: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:10862:6: {...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiSearchFieldAccess().getUnorderedGroup_2_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiSearchField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiSearchFieldAccess().getUnorderedGroup_2_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:10862:113: ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:10863:7: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiSearchFieldAccess().getUnorderedGroup_2_1(), 1);
+                    	    // InternalUIGrammar.g:10866:10: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:10866:11: {...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiSearchField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:10866:20: (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:10866:21: otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_5=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_5, grammarAccess.getUiSearchFieldAccess().getStylesKeyword_2_1_1_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:10870:10: ( (lv_styles_6_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:10871:11: (lv_styles_6_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:10871:11: (lv_styles_6_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:10872:12: lv_styles_6_0= RULE_STRING
+                    	    {
+                    	    lv_styles_6_0=(Token)match(input,RULE_STRING,FOLLOW_63); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_styles_6_0, grammarAccess.getUiSearchFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiSearchFieldRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"styles",
+                    	      													lv_styles_6_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSearchFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop254;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiSearchFieldAccess().getUnorderedGroup_2_1());
+
+                    }
+
+                    otherlv_7=(Token)match(input,47,FOLLOW_3); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_7, grammarAccess.getUiSearchFieldAccess().getRightParenthesisKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:10906:3: ( (lv_property_8_0= ruleUiNestedProperty ) )
+            // InternalUIGrammar.g:10907:4: (lv_property_8_0= ruleUiNestedProperty )
+            {
+            // InternalUIGrammar.g:10907:4: (lv_property_8_0= ruleUiNestedProperty )
+            // InternalUIGrammar.g:10908:5: lv_property_8_0= ruleUiNestedProperty
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getUiSearchFieldAccess().getPropertyUiNestedPropertyParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FOLLOW_2);
+            lv_property_8_0=ruleUiNestedProperty();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getUiSearchFieldRule());
+              					}
+              					set(
+              						current,
+              						"property",
+              						lv_property_8_0,
+              						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiNestedProperty");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiSearchField"
+
+
+    // $ANTLR start "entryRuleUiTextArea"
+    // InternalUIGrammar.g:10929:1: entryRuleUiTextArea returns [EObject current=null] : iv_ruleUiTextArea= ruleUiTextArea EOF ;
+    public final EObject entryRuleUiTextArea() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiTextArea = null;
+
+
+        try {
+            // InternalUIGrammar.g:10929:51: (iv_ruleUiTextArea= ruleUiTextArea EOF )
+            // InternalUIGrammar.g:10930:2: iv_ruleUiTextArea= ruleUiTextArea EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiTextAreaRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiTextArea=ruleUiTextArea();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiTextArea; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiTextArea"
+
+
+    // $ANTLR start "ruleUiTextArea"
+    // InternalUIGrammar.g:10936:1: ruleUiTextArea returns [EObject current=null] : ( () otherlv_1= 'textarea' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? (otherlv_10= '{' ( ( (lv_validators_11_0= ruleUiValidator ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )? ) ;
+    public final EObject ruleUiTextArea() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token lv_readonly_5_0=null;
+        Token otherlv_6=null;
+        Token lv_styles_7_0=null;
+        Token otherlv_8=null;
+        Token lv_name_9_0=null;
+        Token otherlv_10=null;
+        Token otherlv_14=null;
+        EObject lv_i18nInfo_4_0 = null;
+
+        EObject lv_validators_11_0 = null;
+
+        EObject lv_bindings_12_0 = null;
+
+        EObject lv_processorAssignments_13_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:10942:2: ( ( () otherlv_1= 'textarea' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? (otherlv_10= '{' ( ( (lv_validators_11_0= ruleUiValidator ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )? ) )
+            // InternalUIGrammar.g:10943:2: ( () otherlv_1= 'textarea' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? (otherlv_10= '{' ( ( (lv_validators_11_0= ruleUiValidator ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )? )
+            {
+            // InternalUIGrammar.g:10943:2: ( () otherlv_1= 'textarea' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? (otherlv_10= '{' ( ( (lv_validators_11_0= ruleUiValidator ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )? )
+            // InternalUIGrammar.g:10944:3: () otherlv_1= 'textarea' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? (otherlv_10= '{' ( ( (lv_validators_11_0= ruleUiValidator ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )?
+            {
+            // InternalUIGrammar.g:10944:3: ()
+            // InternalUIGrammar.g:10945:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiTextAreaAccess().getUiTextAreaAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,118,FOLLOW_86); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiTextAreaAccess().getTextareaKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:10955:3: (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )?
+            int alt257=2;
+            int LA257_0 = input.LA(1);
+
+            if ( (LA257_0==45) ) {
+                alt257=1;
+            }
+            switch (alt257) {
+                case 1 :
+                    // InternalUIGrammar.g:10956:4: otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')'
+                    {
+                    otherlv_2=(Token)match(input,45,FOLLOW_62); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getUiTextAreaAccess().getLeftParenthesisKeyword_2_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:10960:4: ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:10961:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:10961:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:10962:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiTextAreaAccess().getUnorderedGroup_2_1());
+                    // InternalUIGrammar.g:10965:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:10966:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:10966:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )*
+                    loop256:
+                    do {
+                        int alt256=4;
+                        int LA256_0 = input.LA(1);
+
+                        if ( LA256_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextAreaAccess().getUnorderedGroup_2_1(), 0) ) {
+                            alt256=1;
+                        }
+                        else if ( LA256_0 == 65 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextAreaAccess().getUnorderedGroup_2_1(), 1) ) {
+                            alt256=2;
+                        }
+                        else if ( LA256_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextAreaAccess().getUnorderedGroup_2_1(), 2) ) {
+                            alt256=3;
+                        }
+
+
+                        switch (alt256) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:10967:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:10967:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    // InternalUIGrammar.g:10968:6: {...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextAreaAccess().getUnorderedGroup_2_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiTextArea", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextAreaAccess().getUnorderedGroup_2_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:10968:110: ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    // InternalUIGrammar.g:10969:7: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiTextAreaAccess().getUnorderedGroup_2_1(), 0);
+                    	    // InternalUIGrammar.g:10972:10: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    // InternalUIGrammar.g:10972:11: {...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiTextArea", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:10972:20: ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    // InternalUIGrammar.g:10972:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    {
+                    	    // InternalUIGrammar.g:10972:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    // InternalUIGrammar.g:10973:11: lv_i18nInfo_4_0= ruleUiI18nInfo
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getUiTextAreaAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_62);
+                    	    lv_i18nInfo_4_0=ruleUiI18nInfo();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getUiTextAreaRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"i18nInfo",
+                    	      												lv_i18nInfo_4_0,
+                    	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTextAreaAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:10995:5: ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:10995:5: ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) )
+                    	    // InternalUIGrammar.g:10996:6: {...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextAreaAccess().getUnorderedGroup_2_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiTextArea", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextAreaAccess().getUnorderedGroup_2_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:10996:110: ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) )
+                    	    // InternalUIGrammar.g:10997:7: ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiTextAreaAccess().getUnorderedGroup_2_1(), 1);
+                    	    // InternalUIGrammar.g:11000:10: ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) )
+                    	    // InternalUIGrammar.g:11000:11: {...}? => ( (lv_readonly_5_0= 'readonly' ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiTextArea", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:11000:20: ( (lv_readonly_5_0= 'readonly' ) )
+                    	    // InternalUIGrammar.g:11000:21: (lv_readonly_5_0= 'readonly' )
+                    	    {
+                    	    // InternalUIGrammar.g:11000:21: (lv_readonly_5_0= 'readonly' )
+                    	    // InternalUIGrammar.g:11001:11: lv_readonly_5_0= 'readonly'
+                    	    {
+                    	    lv_readonly_5_0=(Token)match(input,65,FOLLOW_62); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newLeafNode(lv_readonly_5_0, grammarAccess.getUiTextAreaAccess().getReadonlyReadonlyKeyword_2_1_1_0());
+                    	      										
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElement(grammarAccess.getUiTextAreaRule());
+                    	      											}
+                    	      											setWithLastConsumed(current, "readonly", true, "readonly");
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTextAreaAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 3 :
+                    	    // InternalUIGrammar.g:11018:5: ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:11018:5: ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:11019:6: {...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextAreaAccess().getUnorderedGroup_2_1(), 2) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiTextArea", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextAreaAccess().getUnorderedGroup_2_1(), 2)");
+                    	    }
+                    	    // InternalUIGrammar.g:11019:110: ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:11020:7: ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiTextAreaAccess().getUnorderedGroup_2_1(), 2);
+                    	    // InternalUIGrammar.g:11023:10: ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:11023:11: {...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiTextArea", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:11023:20: (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:11023:21: otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_6=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_6, grammarAccess.getUiTextAreaAccess().getStylesKeyword_2_1_2_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:11027:10: ( (lv_styles_7_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:11028:11: (lv_styles_7_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:11028:11: (lv_styles_7_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:11029:12: lv_styles_7_0= RULE_STRING
+                    	    {
+                    	    lv_styles_7_0=(Token)match(input,RULE_STRING,FOLLOW_62); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_styles_7_0, grammarAccess.getUiTextAreaAccess().getStylesSTRINGTerminalRuleCall_2_1_2_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiTextAreaRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"styles",
+                    	      													lv_styles_7_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTextAreaAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop256;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiTextAreaAccess().getUnorderedGroup_2_1());
+
+                    }
+
+                    otherlv_8=(Token)match(input,47,FOLLOW_88); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_8, grammarAccess.getUiTextAreaAccess().getRightParenthesisKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:11063:3: ( (lv_name_9_0= RULE_ID ) )?
+            int alt258=2;
+            int LA258_0 = input.LA(1);
+
+            if ( (LA258_0==RULE_ID) ) {
+                alt258=1;
+            }
+            switch (alt258) {
+                case 1 :
+                    // InternalUIGrammar.g:11064:4: (lv_name_9_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:11064:4: (lv_name_9_0= RULE_ID )
+                    // InternalUIGrammar.g:11065:5: lv_name_9_0= RULE_ID
+                    {
+                    lv_name_9_0=(Token)match(input,RULE_ID,FOLLOW_89); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_9_0, grammarAccess.getUiTextAreaAccess().getNameIDTerminalRuleCall_3_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiTextAreaRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_9_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:11081:3: (otherlv_10= '{' ( ( (lv_validators_11_0= ruleUiValidator ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )?
+            int alt261=2;
+            int LA261_0 = input.LA(1);
+
+            if ( (LA261_0==20) ) {
+                alt261=1;
+            }
+            switch (alt261) {
+                case 1 :
+                    // InternalUIGrammar.g:11082:4: otherlv_10= '{' ( ( (lv_validators_11_0= ruleUiValidator ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}'
+                    {
+                    otherlv_10=(Token)match(input,20,FOLLOW_90); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_10, grammarAccess.getUiTextAreaAccess().getLeftCurlyBracketKeyword_4_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:11086:4: ( ( (lv_validators_11_0= ruleUiValidator ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) )*
+                    loop259:
+                    do {
+                        int alt259=3;
+                        int LA259_0 = input.LA(1);
+
+                        if ( ((LA259_0>=147 && LA259_0<=151)) ) {
+                            alt259=1;
+                        }
+                        else if ( (LA259_0==26) ) {
+                            alt259=2;
+                        }
+
+
+                        switch (alt259) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:11087:5: ( (lv_validators_11_0= ruleUiValidator ) )
+                    	    {
+                    	    // InternalUIGrammar.g:11087:5: ( (lv_validators_11_0= ruleUiValidator ) )
+                    	    // InternalUIGrammar.g:11088:6: (lv_validators_11_0= ruleUiValidator )
+                    	    {
+                    	    // InternalUIGrammar.g:11088:6: (lv_validators_11_0= ruleUiValidator )
+                    	    // InternalUIGrammar.g:11089:7: lv_validators_11_0= ruleUiValidator
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiTextAreaAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_validators_11_0=ruleUiValidator();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiTextAreaRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"validators",
+                    	      								lv_validators_11_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:11107:5: ( (lv_bindings_12_0= ruleUiBinding ) )
+                    	    {
+                    	    // InternalUIGrammar.g:11107:5: ( (lv_bindings_12_0= ruleUiBinding ) )
+                    	    // InternalUIGrammar.g:11108:6: (lv_bindings_12_0= ruleUiBinding )
+                    	    {
+                    	    // InternalUIGrammar.g:11108:6: (lv_bindings_12_0= ruleUiBinding )
+                    	    // InternalUIGrammar.g:11109:7: lv_bindings_12_0= ruleUiBinding
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiTextAreaAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_bindings_12_0=ruleUiBinding();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiTextAreaRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"bindings",
+                    	      								lv_bindings_12_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop259;
+                        }
+                    } while (true);
+
+                    // InternalUIGrammar.g:11127:4: ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )*
+                    loop260:
+                    do {
+                        int alt260=2;
+                        int LA260_0 = input.LA(1);
+
+                        if ( (LA260_0==153) ) {
+                            alt260=1;
+                        }
+
+
+                        switch (alt260) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:11128:5: (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment )
+                    	    {
+                    	    // InternalUIGrammar.g:11128:5: (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment )
+                    	    // InternalUIGrammar.g:11129:6: lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newCompositeNode(grammarAccess.getUiTextAreaAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
+                    	      					
+                    	    }
+                    	    pushFollow(FOLLOW_42);
+                    	    lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						if (current==null) {
+                    	      							current = createModelElementForParent(grammarAccess.getUiTextAreaRule());
+                    	      						}
+                    	      						add(
+                    	      							current,
+                    	      							"processorAssignments",
+                    	      							lv_processorAssignments_13_0,
+                    	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+                    	      						afterParserOrEnumRuleCall();
+                    	      					
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop260;
+                        }
+                    } while (true);
+
+                    otherlv_14=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_14, grammarAccess.getUiTextAreaAccess().getRightCurlyBracketKeyword_4_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiTextArea"
+
+
+    // $ANTLR start "entryRuleUiDateField"
+    // InternalUIGrammar.g:11155:1: entryRuleUiDateField returns [EObject current=null] : iv_ruleUiDateField= ruleUiDateField EOF ;
+    public final EObject entryRuleUiDateField() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiDateField = null;
+
+
+        try {
+            // InternalUIGrammar.g:11155:52: (iv_ruleUiDateField= ruleUiDateField EOF )
+            // InternalUIGrammar.g:11156:2: iv_ruleUiDateField= ruleUiDateField EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiDateFieldRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiDateField=ruleUiDateField();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiDateField; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiDateField"
+
+
+    // $ANTLR start "ruleUiDateField"
+    // InternalUIGrammar.g:11162:1: ruleUiDateField returns [EObject current=null] : ( () otherlv_1= 'datefield' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_dateFormat_4_0= ruleUiDateFormat ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_resolution_5_0= ruleUiDateTimeResolution ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')' )? ( (lv_name_11_0= RULE_ID ) )? (otherlv_12= '{' ( ( (lv_validators_13_0= ruleUiValidator ) ) | ( (lv_bindings_14_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}' )? ) ;
+    public final EObject ruleUiDateField() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_6=null;
+        Token lv_styles_7_0=null;
+        Token lv_readonly_9_0=null;
+        Token otherlv_10=null;
+        Token lv_name_11_0=null;
+        Token otherlv_12=null;
+        Token otherlv_16=null;
+        Enumerator lv_dateFormat_4_0 = null;
+
+        Enumerator lv_resolution_5_0 = null;
+
+        EObject lv_i18nInfo_8_0 = null;
+
+        EObject lv_validators_13_0 = null;
+
+        EObject lv_bindings_14_0 = null;
+
+        EObject lv_processorAssignments_15_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:11168:2: ( ( () otherlv_1= 'datefield' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_dateFormat_4_0= ruleUiDateFormat ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_resolution_5_0= ruleUiDateTimeResolution ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')' )? ( (lv_name_11_0= RULE_ID ) )? (otherlv_12= '{' ( ( (lv_validators_13_0= ruleUiValidator ) ) | ( (lv_bindings_14_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}' )? ) )
+            // InternalUIGrammar.g:11169:2: ( () otherlv_1= 'datefield' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_dateFormat_4_0= ruleUiDateFormat ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_resolution_5_0= ruleUiDateTimeResolution ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')' )? ( (lv_name_11_0= RULE_ID ) )? (otherlv_12= '{' ( ( (lv_validators_13_0= ruleUiValidator ) ) | ( (lv_bindings_14_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}' )? )
+            {
+            // InternalUIGrammar.g:11169:2: ( () otherlv_1= 'datefield' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_dateFormat_4_0= ruleUiDateFormat ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_resolution_5_0= ruleUiDateTimeResolution ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')' )? ( (lv_name_11_0= RULE_ID ) )? (otherlv_12= '{' ( ( (lv_validators_13_0= ruleUiValidator ) ) | ( (lv_bindings_14_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}' )? )
+            // InternalUIGrammar.g:11170:3: () otherlv_1= 'datefield' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_dateFormat_4_0= ruleUiDateFormat ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_resolution_5_0= ruleUiDateTimeResolution ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')' )? ( (lv_name_11_0= RULE_ID ) )? (otherlv_12= '{' ( ( (lv_validators_13_0= ruleUiValidator ) ) | ( (lv_bindings_14_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}' )?
+            {
+            // InternalUIGrammar.g:11170:3: ()
+            // InternalUIGrammar.g:11171:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiDateFieldAccess().getUiDateFieldAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,119,FOLLOW_86); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiDateFieldAccess().getDatefieldKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:11181:3: (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_dateFormat_4_0= ruleUiDateFormat ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_resolution_5_0= ruleUiDateTimeResolution ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')' )?
+            int alt263=2;
+            int LA263_0 = input.LA(1);
+
+            if ( (LA263_0==45) ) {
+                alt263=1;
+            }
+            switch (alt263) {
+                case 1 :
+                    // InternalUIGrammar.g:11182:4: otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_dateFormat_4_0= ruleUiDateFormat ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_resolution_5_0= ruleUiDateTimeResolution ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')'
+                    {
+                    otherlv_2=(Token)match(input,45,FOLLOW_101); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getUiDateFieldAccess().getLeftParenthesisKeyword_2_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:11186:4: ( ( ( ( ({...}? => ( ({...}? => ( (lv_dateFormat_4_0= ruleUiDateFormat ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_resolution_5_0= ruleUiDateTimeResolution ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:11187:5: ( ( ( ({...}? => ( ({...}? => ( (lv_dateFormat_4_0= ruleUiDateFormat ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_resolution_5_0= ruleUiDateTimeResolution ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:11187:5: ( ( ( ({...}? => ( ({...}? => ( (lv_dateFormat_4_0= ruleUiDateFormat ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_resolution_5_0= ruleUiDateTimeResolution ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:11188:6: ( ( ({...}? => ( ({...}? => ( (lv_dateFormat_4_0= ruleUiDateFormat ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_resolution_5_0= ruleUiDateTimeResolution ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1());
+                    // InternalUIGrammar.g:11191:6: ( ( ({...}? => ( ({...}? => ( (lv_dateFormat_4_0= ruleUiDateFormat ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_resolution_5_0= ruleUiDateTimeResolution ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:11192:7: ( ({...}? => ( ({...}? => ( (lv_dateFormat_4_0= ruleUiDateFormat ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_resolution_5_0= ruleUiDateTimeResolution ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:11192:7: ( ({...}? => ( ({...}? => ( (lv_dateFormat_4_0= ruleUiDateFormat ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_resolution_5_0= ruleUiDateTimeResolution ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )*
+                    loop262:
+                    do {
+                        int alt262=6;
+                        int LA262_0 = input.LA(1);
+
+                        if ( LA262_0 >= 214 && LA262_0 <= 216 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), 0) ) {
+                            alt262=1;
+                        }
+                        else if ( ( LA262_0 == 82 || LA262_0 >= 217 && LA262_0 <= 222 ) && getUnorderedGroupHelper().canSelect(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), 1) ) {
+                            alt262=2;
+                        }
+                        else if ( LA262_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), 2) ) {
+                            alt262=3;
+                        }
+                        else if ( LA262_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), 3) ) {
+                            alt262=4;
+                        }
+                        else if ( LA262_0 == 65 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), 4) ) {
+                            alt262=5;
+                        }
+
+
+                        switch (alt262) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:11193:5: ({...}? => ( ({...}? => ( (lv_dateFormat_4_0= ruleUiDateFormat ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:11193:5: ({...}? => ( ({...}? => ( (lv_dateFormat_4_0= ruleUiDateFormat ) ) ) ) )
+                    	    // InternalUIGrammar.g:11194:6: {...}? => ( ({...}? => ( (lv_dateFormat_4_0= ruleUiDateFormat ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiDateField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:11194:111: ( ({...}? => ( (lv_dateFormat_4_0= ruleUiDateFormat ) ) ) )
+                    	    // InternalUIGrammar.g:11195:7: ({...}? => ( (lv_dateFormat_4_0= ruleUiDateFormat ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), 0);
+                    	    // InternalUIGrammar.g:11198:10: ({...}? => ( (lv_dateFormat_4_0= ruleUiDateFormat ) ) )
+                    	    // InternalUIGrammar.g:11198:11: {...}? => ( (lv_dateFormat_4_0= ruleUiDateFormat ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiDateField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:11198:20: ( (lv_dateFormat_4_0= ruleUiDateFormat ) )
+                    	    // InternalUIGrammar.g:11198:21: (lv_dateFormat_4_0= ruleUiDateFormat )
+                    	    {
+                    	    // InternalUIGrammar.g:11198:21: (lv_dateFormat_4_0= ruleUiDateFormat )
+                    	    // InternalUIGrammar.g:11199:11: lv_dateFormat_4_0= ruleUiDateFormat
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getUiDateFieldAccess().getDateFormatUiDateFormatEnumRuleCall_2_1_0_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_101);
+                    	    lv_dateFormat_4_0=ruleUiDateFormat();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getUiDateFieldRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"dateFormat",
+                    	      												lv_dateFormat_4_0,
+                    	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiDateFormat");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:11221:5: ({...}? => ( ({...}? => ( (lv_resolution_5_0= ruleUiDateTimeResolution ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:11221:5: ({...}? => ( ({...}? => ( (lv_resolution_5_0= ruleUiDateTimeResolution ) ) ) ) )
+                    	    // InternalUIGrammar.g:11222:6: {...}? => ( ({...}? => ( (lv_resolution_5_0= ruleUiDateTimeResolution ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiDateField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:11222:111: ( ({...}? => ( (lv_resolution_5_0= ruleUiDateTimeResolution ) ) ) )
+                    	    // InternalUIGrammar.g:11223:7: ({...}? => ( (lv_resolution_5_0= ruleUiDateTimeResolution ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), 1);
+                    	    // InternalUIGrammar.g:11226:10: ({...}? => ( (lv_resolution_5_0= ruleUiDateTimeResolution ) ) )
+                    	    // InternalUIGrammar.g:11226:11: {...}? => ( (lv_resolution_5_0= ruleUiDateTimeResolution ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiDateField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:11226:20: ( (lv_resolution_5_0= ruleUiDateTimeResolution ) )
+                    	    // InternalUIGrammar.g:11226:21: (lv_resolution_5_0= ruleUiDateTimeResolution )
+                    	    {
+                    	    // InternalUIGrammar.g:11226:21: (lv_resolution_5_0= ruleUiDateTimeResolution )
+                    	    // InternalUIGrammar.g:11227:11: lv_resolution_5_0= ruleUiDateTimeResolution
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getUiDateFieldAccess().getResolutionUiDateTimeResolutionEnumRuleCall_2_1_1_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_101);
+                    	    lv_resolution_5_0=ruleUiDateTimeResolution();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getUiDateFieldRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"resolution",
+                    	      												lv_resolution_5_0,
+                    	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiDateTimeResolution");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 3 :
+                    	    // InternalUIGrammar.g:11249:5: ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:11249:5: ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:11250:6: {...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), 2) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiDateField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), 2)");
+                    	    }
+                    	    // InternalUIGrammar.g:11250:111: ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:11251:7: ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), 2);
+                    	    // InternalUIGrammar.g:11254:10: ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:11254:11: {...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiDateField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:11254:20: (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:11254:21: otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_6=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_6, grammarAccess.getUiDateFieldAccess().getStylesKeyword_2_1_2_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:11258:10: ( (lv_styles_7_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:11259:11: (lv_styles_7_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:11259:11: (lv_styles_7_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:11260:12: lv_styles_7_0= RULE_STRING
+                    	    {
+                    	    lv_styles_7_0=(Token)match(input,RULE_STRING,FOLLOW_101); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_styles_7_0, grammarAccess.getUiDateFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_2_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiDateFieldRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"styles",
+                    	      													lv_styles_7_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 4 :
+                    	    // InternalUIGrammar.g:11282:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:11282:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) )
+                    	    // InternalUIGrammar.g:11283:6: {...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), 3) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiDateField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), 3)");
+                    	    }
+                    	    // InternalUIGrammar.g:11283:111: ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) )
+                    	    // InternalUIGrammar.g:11284:7: ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), 3);
+                    	    // InternalUIGrammar.g:11287:10: ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) )
+                    	    // InternalUIGrammar.g:11287:11: {...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiDateField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:11287:20: ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) )
+                    	    // InternalUIGrammar.g:11287:21: (lv_i18nInfo_8_0= ruleUiI18nInfo )
+                    	    {
+                    	    // InternalUIGrammar.g:11287:21: (lv_i18nInfo_8_0= ruleUiI18nInfo )
+                    	    // InternalUIGrammar.g:11288:11: lv_i18nInfo_8_0= ruleUiI18nInfo
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getUiDateFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_3_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_101);
+                    	    lv_i18nInfo_8_0=ruleUiI18nInfo();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getUiDateFieldRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"i18nInfo",
+                    	      												lv_i18nInfo_8_0,
+                    	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 5 :
+                    	    // InternalUIGrammar.g:11310:5: ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:11310:5: ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) )
+                    	    // InternalUIGrammar.g:11311:6: {...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), 4) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiDateField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), 4)");
+                    	    }
+                    	    // InternalUIGrammar.g:11311:111: ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) )
+                    	    // InternalUIGrammar.g:11312:7: ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), 4);
+                    	    // InternalUIGrammar.g:11315:10: ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) )
+                    	    // InternalUIGrammar.g:11315:11: {...}? => ( (lv_readonly_9_0= 'readonly' ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiDateField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:11315:20: ( (lv_readonly_9_0= 'readonly' ) )
+                    	    // InternalUIGrammar.g:11315:21: (lv_readonly_9_0= 'readonly' )
+                    	    {
+                    	    // InternalUIGrammar.g:11315:21: (lv_readonly_9_0= 'readonly' )
+                    	    // InternalUIGrammar.g:11316:11: lv_readonly_9_0= 'readonly'
+                    	    {
+                    	    lv_readonly_9_0=(Token)match(input,65,FOLLOW_101); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newLeafNode(lv_readonly_9_0, grammarAccess.getUiDateFieldAccess().getReadonlyReadonlyKeyword_2_1_4_0());
+                    	      										
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElement(grammarAccess.getUiDateFieldRule());
+                    	      											}
+                    	      											setWithLastConsumed(current, "readonly", true, "readonly");
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop262;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1());
+
+                    }
+
+                    otherlv_10=(Token)match(input,47,FOLLOW_88); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_10, grammarAccess.getUiDateFieldAccess().getRightParenthesisKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:11345:3: ( (lv_name_11_0= RULE_ID ) )?
+            int alt264=2;
+            int LA264_0 = input.LA(1);
+
+            if ( (LA264_0==RULE_ID) ) {
+                alt264=1;
+            }
+            switch (alt264) {
+                case 1 :
+                    // InternalUIGrammar.g:11346:4: (lv_name_11_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:11346:4: (lv_name_11_0= RULE_ID )
+                    // InternalUIGrammar.g:11347:5: lv_name_11_0= RULE_ID
+                    {
+                    lv_name_11_0=(Token)match(input,RULE_ID,FOLLOW_89); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_11_0, grammarAccess.getUiDateFieldAccess().getNameIDTerminalRuleCall_3_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiDateFieldRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_11_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:11363:3: (otherlv_12= '{' ( ( (lv_validators_13_0= ruleUiValidator ) ) | ( (lv_bindings_14_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}' )?
+            int alt267=2;
+            int LA267_0 = input.LA(1);
+
+            if ( (LA267_0==20) ) {
+                alt267=1;
+            }
+            switch (alt267) {
+                case 1 :
+                    // InternalUIGrammar.g:11364:4: otherlv_12= '{' ( ( (lv_validators_13_0= ruleUiValidator ) ) | ( (lv_bindings_14_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}'
+                    {
+                    otherlv_12=(Token)match(input,20,FOLLOW_90); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_12, grammarAccess.getUiDateFieldAccess().getLeftCurlyBracketKeyword_4_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:11368:4: ( ( (lv_validators_13_0= ruleUiValidator ) ) | ( (lv_bindings_14_0= ruleUiBinding ) ) )*
+                    loop265:
+                    do {
+                        int alt265=3;
+                        int LA265_0 = input.LA(1);
+
+                        if ( ((LA265_0>=147 && LA265_0<=151)) ) {
+                            alt265=1;
+                        }
+                        else if ( (LA265_0==26) ) {
+                            alt265=2;
+                        }
+
+
+                        switch (alt265) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:11369:5: ( (lv_validators_13_0= ruleUiValidator ) )
+                    	    {
+                    	    // InternalUIGrammar.g:11369:5: ( (lv_validators_13_0= ruleUiValidator ) )
+                    	    // InternalUIGrammar.g:11370:6: (lv_validators_13_0= ruleUiValidator )
+                    	    {
+                    	    // InternalUIGrammar.g:11370:6: (lv_validators_13_0= ruleUiValidator )
+                    	    // InternalUIGrammar.g:11371:7: lv_validators_13_0= ruleUiValidator
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiDateFieldAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_validators_13_0=ruleUiValidator();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiDateFieldRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"validators",
+                    	      								lv_validators_13_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:11389:5: ( (lv_bindings_14_0= ruleUiBinding ) )
+                    	    {
+                    	    // InternalUIGrammar.g:11389:5: ( (lv_bindings_14_0= ruleUiBinding ) )
+                    	    // InternalUIGrammar.g:11390:6: (lv_bindings_14_0= ruleUiBinding )
+                    	    {
+                    	    // InternalUIGrammar.g:11390:6: (lv_bindings_14_0= ruleUiBinding )
+                    	    // InternalUIGrammar.g:11391:7: lv_bindings_14_0= ruleUiBinding
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiDateFieldAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_bindings_14_0=ruleUiBinding();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiDateFieldRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"bindings",
+                    	      								lv_bindings_14_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop265;
+                        }
+                    } while (true);
+
+                    // InternalUIGrammar.g:11409:4: ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )*
+                    loop266:
+                    do {
+                        int alt266=2;
+                        int LA266_0 = input.LA(1);
+
+                        if ( (LA266_0==153) ) {
+                            alt266=1;
+                        }
+
+
+                        switch (alt266) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:11410:5: (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment )
+                    	    {
+                    	    // InternalUIGrammar.g:11410:5: (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment )
+                    	    // InternalUIGrammar.g:11411:6: lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newCompositeNode(grammarAccess.getUiDateFieldAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
+                    	      					
+                    	    }
+                    	    pushFollow(FOLLOW_42);
+                    	    lv_processorAssignments_15_0=ruleUiVisibilityProcessorAssignment();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						if (current==null) {
+                    	      							current = createModelElementForParent(grammarAccess.getUiDateFieldRule());
+                    	      						}
+                    	      						add(
+                    	      							current,
+                    	      							"processorAssignments",
+                    	      							lv_processorAssignments_15_0,
+                    	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+                    	      						afterParserOrEnumRuleCall();
+                    	      					
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop266;
+                        }
+                    } while (true);
+
+                    otherlv_16=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_16, grammarAccess.getUiDateFieldAccess().getRightCurlyBracketKeyword_4_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiDateField"
+
+
+    // $ANTLR start "entryRuleUiBrowser"
+    // InternalUIGrammar.g:11437:1: entryRuleUiBrowser returns [EObject current=null] : iv_ruleUiBrowser= ruleUiBrowser EOF ;
+    public final EObject entryRuleUiBrowser() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiBrowser = null;
+
+
+        try {
+            // InternalUIGrammar.g:11437:50: (iv_ruleUiBrowser= ruleUiBrowser EOF )
+            // InternalUIGrammar.g:11438:2: iv_ruleUiBrowser= ruleUiBrowser EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiBrowserRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiBrowser=ruleUiBrowser();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiBrowser; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiBrowser"
+
+
+    // $ANTLR start "ruleUiBrowser"
+    // InternalUIGrammar.g:11444:1: ruleUiBrowser returns [EObject current=null] : ( () otherlv_1= 'browser' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? (otherlv_10= '{' ( ( (lv_validators_11_0= ruleUiValidator ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )? ) ;
+    public final EObject ruleUiBrowser() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token lv_readonly_5_0=null;
+        Token otherlv_6=null;
+        Token lv_styles_7_0=null;
+        Token otherlv_8=null;
+        Token lv_name_9_0=null;
+        Token otherlv_10=null;
+        Token otherlv_14=null;
+        EObject lv_i18nInfo_4_0 = null;
+
+        EObject lv_validators_11_0 = null;
+
+        EObject lv_bindings_12_0 = null;
+
+        EObject lv_processorAssignments_13_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:11450:2: ( ( () otherlv_1= 'browser' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? (otherlv_10= '{' ( ( (lv_validators_11_0= ruleUiValidator ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )? ) )
+            // InternalUIGrammar.g:11451:2: ( () otherlv_1= 'browser' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? (otherlv_10= '{' ( ( (lv_validators_11_0= ruleUiValidator ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )? )
+            {
+            // InternalUIGrammar.g:11451:2: ( () otherlv_1= 'browser' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? (otherlv_10= '{' ( ( (lv_validators_11_0= ruleUiValidator ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )? )
+            // InternalUIGrammar.g:11452:3: () otherlv_1= 'browser' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? (otherlv_10= '{' ( ( (lv_validators_11_0= ruleUiValidator ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )?
+            {
+            // InternalUIGrammar.g:11452:3: ()
+            // InternalUIGrammar.g:11453:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiBrowserAccess().getUiBrowserAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,120,FOLLOW_86); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiBrowserAccess().getBrowserKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:11463:3: (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )?
+            int alt269=2;
+            int LA269_0 = input.LA(1);
+
+            if ( (LA269_0==45) ) {
+                alt269=1;
+            }
+            switch (alt269) {
+                case 1 :
+                    // InternalUIGrammar.g:11464:4: otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')'
+                    {
+                    otherlv_2=(Token)match(input,45,FOLLOW_62); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getUiBrowserAccess().getLeftParenthesisKeyword_2_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:11468:4: ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:11469:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:11469:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:11470:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiBrowserAccess().getUnorderedGroup_2_1());
+                    // InternalUIGrammar.g:11473:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:11474:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:11474:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )*
+                    loop268:
+                    do {
+                        int alt268=4;
+                        int LA268_0 = input.LA(1);
+
+                        if ( LA268_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiBrowserAccess().getUnorderedGroup_2_1(), 0) ) {
+                            alt268=1;
+                        }
+                        else if ( LA268_0 == 65 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiBrowserAccess().getUnorderedGroup_2_1(), 1) ) {
+                            alt268=2;
+                        }
+                        else if ( LA268_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiBrowserAccess().getUnorderedGroup_2_1(), 2) ) {
+                            alt268=3;
+                        }
+
+
+                        switch (alt268) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:11475:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:11475:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    // InternalUIGrammar.g:11476:6: {...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiBrowserAccess().getUnorderedGroup_2_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiBrowser", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiBrowserAccess().getUnorderedGroup_2_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:11476:109: ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    // InternalUIGrammar.g:11477:7: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiBrowserAccess().getUnorderedGroup_2_1(), 0);
+                    	    // InternalUIGrammar.g:11480:10: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    // InternalUIGrammar.g:11480:11: {...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiBrowser", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:11480:20: ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    // InternalUIGrammar.g:11480:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    {
+                    	    // InternalUIGrammar.g:11480:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    // InternalUIGrammar.g:11481:11: lv_i18nInfo_4_0= ruleUiI18nInfo
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getUiBrowserAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_62);
+                    	    lv_i18nInfo_4_0=ruleUiI18nInfo();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getUiBrowserRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"i18nInfo",
+                    	      												lv_i18nInfo_4_0,
+                    	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiBrowserAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:11503:5: ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:11503:5: ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) )
+                    	    // InternalUIGrammar.g:11504:6: {...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiBrowserAccess().getUnorderedGroup_2_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiBrowser", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiBrowserAccess().getUnorderedGroup_2_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:11504:109: ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) )
+                    	    // InternalUIGrammar.g:11505:7: ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiBrowserAccess().getUnorderedGroup_2_1(), 1);
+                    	    // InternalUIGrammar.g:11508:10: ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) )
+                    	    // InternalUIGrammar.g:11508:11: {...}? => ( (lv_readonly_5_0= 'readonly' ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiBrowser", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:11508:20: ( (lv_readonly_5_0= 'readonly' ) )
+                    	    // InternalUIGrammar.g:11508:21: (lv_readonly_5_0= 'readonly' )
+                    	    {
+                    	    // InternalUIGrammar.g:11508:21: (lv_readonly_5_0= 'readonly' )
+                    	    // InternalUIGrammar.g:11509:11: lv_readonly_5_0= 'readonly'
+                    	    {
+                    	    lv_readonly_5_0=(Token)match(input,65,FOLLOW_62); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newLeafNode(lv_readonly_5_0, grammarAccess.getUiBrowserAccess().getReadonlyReadonlyKeyword_2_1_1_0());
+                    	      										
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElement(grammarAccess.getUiBrowserRule());
+                    	      											}
+                    	      											setWithLastConsumed(current, "readonly", true, "readonly");
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiBrowserAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 3 :
+                    	    // InternalUIGrammar.g:11526:5: ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:11526:5: ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:11527:6: {...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiBrowserAccess().getUnorderedGroup_2_1(), 2) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiBrowser", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiBrowserAccess().getUnorderedGroup_2_1(), 2)");
+                    	    }
+                    	    // InternalUIGrammar.g:11527:109: ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:11528:7: ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiBrowserAccess().getUnorderedGroup_2_1(), 2);
+                    	    // InternalUIGrammar.g:11531:10: ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:11531:11: {...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiBrowser", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:11531:20: (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:11531:21: otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_6=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_6, grammarAccess.getUiBrowserAccess().getStylesKeyword_2_1_2_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:11535:10: ( (lv_styles_7_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:11536:11: (lv_styles_7_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:11536:11: (lv_styles_7_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:11537:12: lv_styles_7_0= RULE_STRING
+                    	    {
+                    	    lv_styles_7_0=(Token)match(input,RULE_STRING,FOLLOW_62); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_styles_7_0, grammarAccess.getUiBrowserAccess().getStylesSTRINGTerminalRuleCall_2_1_2_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiBrowserRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"styles",
+                    	      													lv_styles_7_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiBrowserAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop268;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiBrowserAccess().getUnorderedGroup_2_1());
+
+                    }
+
+                    otherlv_8=(Token)match(input,47,FOLLOW_88); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_8, grammarAccess.getUiBrowserAccess().getRightParenthesisKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:11571:3: ( (lv_name_9_0= RULE_ID ) )?
+            int alt270=2;
+            int LA270_0 = input.LA(1);
+
+            if ( (LA270_0==RULE_ID) ) {
+                alt270=1;
+            }
+            switch (alt270) {
+                case 1 :
+                    // InternalUIGrammar.g:11572:4: (lv_name_9_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:11572:4: (lv_name_9_0= RULE_ID )
+                    // InternalUIGrammar.g:11573:5: lv_name_9_0= RULE_ID
+                    {
+                    lv_name_9_0=(Token)match(input,RULE_ID,FOLLOW_89); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_9_0, grammarAccess.getUiBrowserAccess().getNameIDTerminalRuleCall_3_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiBrowserRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_9_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:11589:3: (otherlv_10= '{' ( ( (lv_validators_11_0= ruleUiValidator ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )?
+            int alt273=2;
+            int LA273_0 = input.LA(1);
+
+            if ( (LA273_0==20) ) {
+                alt273=1;
+            }
+            switch (alt273) {
+                case 1 :
+                    // InternalUIGrammar.g:11590:4: otherlv_10= '{' ( ( (lv_validators_11_0= ruleUiValidator ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}'
+                    {
+                    otherlv_10=(Token)match(input,20,FOLLOW_90); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_10, grammarAccess.getUiBrowserAccess().getLeftCurlyBracketKeyword_4_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:11594:4: ( ( (lv_validators_11_0= ruleUiValidator ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) )*
+                    loop271:
+                    do {
+                        int alt271=3;
+                        int LA271_0 = input.LA(1);
+
+                        if ( ((LA271_0>=147 && LA271_0<=151)) ) {
+                            alt271=1;
+                        }
+                        else if ( (LA271_0==26) ) {
+                            alt271=2;
+                        }
+
+
+                        switch (alt271) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:11595:5: ( (lv_validators_11_0= ruleUiValidator ) )
+                    	    {
+                    	    // InternalUIGrammar.g:11595:5: ( (lv_validators_11_0= ruleUiValidator ) )
+                    	    // InternalUIGrammar.g:11596:6: (lv_validators_11_0= ruleUiValidator )
+                    	    {
+                    	    // InternalUIGrammar.g:11596:6: (lv_validators_11_0= ruleUiValidator )
+                    	    // InternalUIGrammar.g:11597:7: lv_validators_11_0= ruleUiValidator
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiBrowserAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_validators_11_0=ruleUiValidator();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiBrowserRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"validators",
+                    	      								lv_validators_11_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:11615:5: ( (lv_bindings_12_0= ruleUiBinding ) )
+                    	    {
+                    	    // InternalUIGrammar.g:11615:5: ( (lv_bindings_12_0= ruleUiBinding ) )
+                    	    // InternalUIGrammar.g:11616:6: (lv_bindings_12_0= ruleUiBinding )
+                    	    {
+                    	    // InternalUIGrammar.g:11616:6: (lv_bindings_12_0= ruleUiBinding )
+                    	    // InternalUIGrammar.g:11617:7: lv_bindings_12_0= ruleUiBinding
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiBrowserAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_bindings_12_0=ruleUiBinding();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiBrowserRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"bindings",
+                    	      								lv_bindings_12_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop271;
+                        }
+                    } while (true);
+
+                    // InternalUIGrammar.g:11635:4: ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )*
+                    loop272:
+                    do {
+                        int alt272=2;
+                        int LA272_0 = input.LA(1);
+
+                        if ( (LA272_0==153) ) {
+                            alt272=1;
+                        }
+
+
+                        switch (alt272) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:11636:5: (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment )
+                    	    {
+                    	    // InternalUIGrammar.g:11636:5: (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment )
+                    	    // InternalUIGrammar.g:11637:6: lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newCompositeNode(grammarAccess.getUiBrowserAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
+                    	      					
+                    	    }
+                    	    pushFollow(FOLLOW_42);
+                    	    lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						if (current==null) {
+                    	      							current = createModelElementForParent(grammarAccess.getUiBrowserRule());
+                    	      						}
+                    	      						add(
+                    	      							current,
+                    	      							"processorAssignments",
+                    	      							lv_processorAssignments_13_0,
+                    	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+                    	      						afterParserOrEnumRuleCall();
+                    	      					
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop272;
+                        }
+                    } while (true);
+
+                    otherlv_14=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_14, grammarAccess.getUiBrowserAccess().getRightCurlyBracketKeyword_4_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiBrowser"
+
+
+    // $ANTLR start "entryRuleUiProgressBar"
+    // InternalUIGrammar.g:11663:1: entryRuleUiProgressBar returns [EObject current=null] : iv_ruleUiProgressBar= ruleUiProgressBar EOF ;
+    public final EObject entryRuleUiProgressBar() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiProgressBar = null;
+
+
+        try {
+            // InternalUIGrammar.g:11663:54: (iv_ruleUiProgressBar= ruleUiProgressBar EOF )
+            // InternalUIGrammar.g:11664:2: iv_ruleUiProgressBar= ruleUiProgressBar EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiProgressBarRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiProgressBar=ruleUiProgressBar();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiProgressBar; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiProgressBar"
+
+
+    // $ANTLR start "ruleUiProgressBar"
+    // InternalUIGrammar.g:11670:1: ruleUiProgressBar returns [EObject current=null] : ( () otherlv_1= 'progressbar' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' ( ( (lv_validators_10_0= ruleUiValidator ) ) | ( (lv_bindings_11_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_12_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_13= '}' )? ) ;
+    public final EObject ruleUiProgressBar() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_5=null;
+        Token lv_styles_6_0=null;
+        Token otherlv_7=null;
+        Token lv_name_8_0=null;
+        Token otherlv_9=null;
+        Token otherlv_13=null;
+        EObject lv_i18nInfo_4_0 = null;
+
+        EObject lv_validators_10_0 = null;
+
+        EObject lv_bindings_11_0 = null;
+
+        EObject lv_processorAssignments_12_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:11676:2: ( ( () otherlv_1= 'progressbar' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' ( ( (lv_validators_10_0= ruleUiValidator ) ) | ( (lv_bindings_11_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_12_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_13= '}' )? ) )
+            // InternalUIGrammar.g:11677:2: ( () otherlv_1= 'progressbar' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' ( ( (lv_validators_10_0= ruleUiValidator ) ) | ( (lv_bindings_11_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_12_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_13= '}' )? )
+            {
+            // InternalUIGrammar.g:11677:2: ( () otherlv_1= 'progressbar' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' ( ( (lv_validators_10_0= ruleUiValidator ) ) | ( (lv_bindings_11_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_12_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_13= '}' )? )
+            // InternalUIGrammar.g:11678:3: () otherlv_1= 'progressbar' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' ( ( (lv_validators_10_0= ruleUiValidator ) ) | ( (lv_bindings_11_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_12_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_13= '}' )?
+            {
+            // InternalUIGrammar.g:11678:3: ()
+            // InternalUIGrammar.g:11679:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiProgressBarAccess().getUiProgressBarAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,121,FOLLOW_86); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiProgressBarAccess().getProgressbarKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:11689:3: (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )?
+            int alt275=2;
+            int LA275_0 = input.LA(1);
+
+            if ( (LA275_0==45) ) {
+                alt275=1;
+            }
+            switch (alt275) {
+                case 1 :
+                    // InternalUIGrammar.g:11690:4: otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')'
+                    {
+                    otherlv_2=(Token)match(input,45,FOLLOW_63); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getUiProgressBarAccess().getLeftParenthesisKeyword_2_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:11694:4: ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:11695:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:11695:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:11696:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiProgressBarAccess().getUnorderedGroup_2_1());
+                    // InternalUIGrammar.g:11699:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:11700:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:11700:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )*
+                    loop274:
+                    do {
+                        int alt274=3;
+                        int LA274_0 = input.LA(1);
+
+                        if ( LA274_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiProgressBarAccess().getUnorderedGroup_2_1(), 0) ) {
+                            alt274=1;
+                        }
+                        else if ( LA274_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiProgressBarAccess().getUnorderedGroup_2_1(), 1) ) {
+                            alt274=2;
+                        }
+
+
+                        switch (alt274) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:11701:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:11701:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    // InternalUIGrammar.g:11702:6: {...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiProgressBarAccess().getUnorderedGroup_2_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiProgressBar", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiProgressBarAccess().getUnorderedGroup_2_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:11702:113: ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    // InternalUIGrammar.g:11703:7: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiProgressBarAccess().getUnorderedGroup_2_1(), 0);
+                    	    // InternalUIGrammar.g:11706:10: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    // InternalUIGrammar.g:11706:11: {...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiProgressBar", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:11706:20: ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    // InternalUIGrammar.g:11706:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    {
+                    	    // InternalUIGrammar.g:11706:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    // InternalUIGrammar.g:11707:11: lv_i18nInfo_4_0= ruleUiI18nInfo
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getUiProgressBarAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_63);
+                    	    lv_i18nInfo_4_0=ruleUiI18nInfo();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getUiProgressBarRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"i18nInfo",
+                    	      												lv_i18nInfo_4_0,
+                    	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiProgressBarAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:11729:5: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:11729:5: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:11730:6: {...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiProgressBarAccess().getUnorderedGroup_2_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiProgressBar", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiProgressBarAccess().getUnorderedGroup_2_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:11730:113: ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:11731:7: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiProgressBarAccess().getUnorderedGroup_2_1(), 1);
+                    	    // InternalUIGrammar.g:11734:10: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:11734:11: {...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiProgressBar", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:11734:20: (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:11734:21: otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_5=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_5, grammarAccess.getUiProgressBarAccess().getStylesKeyword_2_1_1_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:11738:10: ( (lv_styles_6_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:11739:11: (lv_styles_6_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:11739:11: (lv_styles_6_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:11740:12: lv_styles_6_0= RULE_STRING
+                    	    {
+                    	    lv_styles_6_0=(Token)match(input,RULE_STRING,FOLLOW_63); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_styles_6_0, grammarAccess.getUiProgressBarAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiProgressBarRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"styles",
+                    	      													lv_styles_6_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiProgressBarAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop274;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiProgressBarAccess().getUnorderedGroup_2_1());
+
+                    }
+
+                    otherlv_7=(Token)match(input,47,FOLLOW_88); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_7, grammarAccess.getUiProgressBarAccess().getRightParenthesisKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:11774:3: ( (lv_name_8_0= RULE_ID ) )?
+            int alt276=2;
+            int LA276_0 = input.LA(1);
+
+            if ( (LA276_0==RULE_ID) ) {
+                alt276=1;
+            }
+            switch (alt276) {
+                case 1 :
+                    // InternalUIGrammar.g:11775:4: (lv_name_8_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:11775:4: (lv_name_8_0= RULE_ID )
+                    // InternalUIGrammar.g:11776:5: lv_name_8_0= RULE_ID
+                    {
+                    lv_name_8_0=(Token)match(input,RULE_ID,FOLLOW_89); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_8_0, grammarAccess.getUiProgressBarAccess().getNameIDTerminalRuleCall_3_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiProgressBarRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_8_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:11792:3: (otherlv_9= '{' ( ( (lv_validators_10_0= ruleUiValidator ) ) | ( (lv_bindings_11_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_12_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_13= '}' )?
+            int alt279=2;
+            int LA279_0 = input.LA(1);
+
+            if ( (LA279_0==20) ) {
+                alt279=1;
+            }
+            switch (alt279) {
+                case 1 :
+                    // InternalUIGrammar.g:11793:4: otherlv_9= '{' ( ( (lv_validators_10_0= ruleUiValidator ) ) | ( (lv_bindings_11_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_12_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_13= '}'
+                    {
+                    otherlv_9=(Token)match(input,20,FOLLOW_90); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_9, grammarAccess.getUiProgressBarAccess().getLeftCurlyBracketKeyword_4_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:11797:4: ( ( (lv_validators_10_0= ruleUiValidator ) ) | ( (lv_bindings_11_0= ruleUiBinding ) ) )*
+                    loop277:
+                    do {
+                        int alt277=3;
+                        int LA277_0 = input.LA(1);
+
+                        if ( ((LA277_0>=147 && LA277_0<=151)) ) {
+                            alt277=1;
+                        }
+                        else if ( (LA277_0==26) ) {
+                            alt277=2;
+                        }
+
+
+                        switch (alt277) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:11798:5: ( (lv_validators_10_0= ruleUiValidator ) )
+                    	    {
+                    	    // InternalUIGrammar.g:11798:5: ( (lv_validators_10_0= ruleUiValidator ) )
+                    	    // InternalUIGrammar.g:11799:6: (lv_validators_10_0= ruleUiValidator )
+                    	    {
+                    	    // InternalUIGrammar.g:11799:6: (lv_validators_10_0= ruleUiValidator )
+                    	    // InternalUIGrammar.g:11800:7: lv_validators_10_0= ruleUiValidator
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiProgressBarAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_validators_10_0=ruleUiValidator();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiProgressBarRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"validators",
+                    	      								lv_validators_10_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:11818:5: ( (lv_bindings_11_0= ruleUiBinding ) )
+                    	    {
+                    	    // InternalUIGrammar.g:11818:5: ( (lv_bindings_11_0= ruleUiBinding ) )
+                    	    // InternalUIGrammar.g:11819:6: (lv_bindings_11_0= ruleUiBinding )
+                    	    {
+                    	    // InternalUIGrammar.g:11819:6: (lv_bindings_11_0= ruleUiBinding )
+                    	    // InternalUIGrammar.g:11820:7: lv_bindings_11_0= ruleUiBinding
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiProgressBarAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_bindings_11_0=ruleUiBinding();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiProgressBarRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"bindings",
+                    	      								lv_bindings_11_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop277;
+                        }
+                    } while (true);
+
+                    // InternalUIGrammar.g:11838:4: ( (lv_processorAssignments_12_0= ruleUiVisibilityProcessorAssignment ) )*
+                    loop278:
+                    do {
+                        int alt278=2;
+                        int LA278_0 = input.LA(1);
+
+                        if ( (LA278_0==153) ) {
+                            alt278=1;
+                        }
+
+
+                        switch (alt278) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:11839:5: (lv_processorAssignments_12_0= ruleUiVisibilityProcessorAssignment )
+                    	    {
+                    	    // InternalUIGrammar.g:11839:5: (lv_processorAssignments_12_0= ruleUiVisibilityProcessorAssignment )
+                    	    // InternalUIGrammar.g:11840:6: lv_processorAssignments_12_0= ruleUiVisibilityProcessorAssignment
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newCompositeNode(grammarAccess.getUiProgressBarAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
+                    	      					
+                    	    }
+                    	    pushFollow(FOLLOW_42);
+                    	    lv_processorAssignments_12_0=ruleUiVisibilityProcessorAssignment();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						if (current==null) {
+                    	      							current = createModelElementForParent(grammarAccess.getUiProgressBarRule());
+                    	      						}
+                    	      						add(
+                    	      							current,
+                    	      							"processorAssignments",
+                    	      							lv_processorAssignments_12_0,
+                    	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+                    	      						afterParserOrEnumRuleCall();
+                    	      					
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop278;
+                        }
+                    } while (true);
+
+                    otherlv_13=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_13, grammarAccess.getUiProgressBarAccess().getRightCurlyBracketKeyword_4_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiProgressBar"
+
+
+    // $ANTLR start "entryRuleUiImage"
+    // InternalUIGrammar.g:11866:1: entryRuleUiImage returns [EObject current=null] : iv_ruleUiImage= ruleUiImage EOF ;
+    public final EObject entryRuleUiImage() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiImage = null;
+
+
+        try {
+            // InternalUIGrammar.g:11866:48: (iv_ruleUiImage= ruleUiImage EOF )
+            // InternalUIGrammar.g:11867:2: iv_ruleUiImage= ruleUiImage EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiImageRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiImage=ruleUiImage();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiImage; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiImage"
+
+
+    // $ANTLR start "ruleUiImage"
+    // InternalUIGrammar.g:11873:1: ruleUiImage returns [EObject current=null] : ( () otherlv_1= 'image' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' (otherlv_10= 'iconPath' ( (lv_value_11_0= RULE_STRING ) ) (otherlv_12= ';' )? )? ( (lv_bindings_13_0= ruleUiBinding ) )* ( (lv_processorAssignments_14_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_15= '}' )? ) ;
+    public final EObject ruleUiImage() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_5=null;
+        Token lv_styles_6_0=null;
+        Token otherlv_7=null;
+        Token lv_name_8_0=null;
+        Token otherlv_9=null;
+        Token otherlv_10=null;
+        Token lv_value_11_0=null;
+        Token otherlv_12=null;
+        Token otherlv_15=null;
+        EObject lv_i18nInfo_4_0 = null;
+
+        EObject lv_bindings_13_0 = null;
+
+        EObject lv_processorAssignments_14_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:11879:2: ( ( () otherlv_1= 'image' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' (otherlv_10= 'iconPath' ( (lv_value_11_0= RULE_STRING ) ) (otherlv_12= ';' )? )? ( (lv_bindings_13_0= ruleUiBinding ) )* ( (lv_processorAssignments_14_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_15= '}' )? ) )
+            // InternalUIGrammar.g:11880:2: ( () otherlv_1= 'image' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' (otherlv_10= 'iconPath' ( (lv_value_11_0= RULE_STRING ) ) (otherlv_12= ';' )? )? ( (lv_bindings_13_0= ruleUiBinding ) )* ( (lv_processorAssignments_14_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_15= '}' )? )
+            {
+            // InternalUIGrammar.g:11880:2: ( () otherlv_1= 'image' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' (otherlv_10= 'iconPath' ( (lv_value_11_0= RULE_STRING ) ) (otherlv_12= ';' )? )? ( (lv_bindings_13_0= ruleUiBinding ) )* ( (lv_processorAssignments_14_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_15= '}' )? )
+            // InternalUIGrammar.g:11881:3: () otherlv_1= 'image' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' (otherlv_10= 'iconPath' ( (lv_value_11_0= RULE_STRING ) ) (otherlv_12= ';' )? )? ( (lv_bindings_13_0= ruleUiBinding ) )* ( (lv_processorAssignments_14_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_15= '}' )?
+            {
+            // InternalUIGrammar.g:11881:3: ()
+            // InternalUIGrammar.g:11882:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiImageAccess().getUiImageAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,122,FOLLOW_86); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiImageAccess().getImageKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:11892:3: (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )?
+            int alt281=2;
+            int LA281_0 = input.LA(1);
+
+            if ( (LA281_0==45) ) {
+                alt281=1;
+            }
+            switch (alt281) {
+                case 1 :
+                    // InternalUIGrammar.g:11893:4: otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')'
+                    {
+                    otherlv_2=(Token)match(input,45,FOLLOW_63); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getUiImageAccess().getLeftParenthesisKeyword_2_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:11897:4: ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:11898:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:11898:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:11899:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiImageAccess().getUnorderedGroup_2_1());
+                    // InternalUIGrammar.g:11902:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:11903:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:11903:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )*
+                    loop280:
+                    do {
+                        int alt280=3;
+                        int LA280_0 = input.LA(1);
+
+                        if ( LA280_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiImageAccess().getUnorderedGroup_2_1(), 0) ) {
+                            alt280=1;
+                        }
+                        else if ( LA280_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiImageAccess().getUnorderedGroup_2_1(), 1) ) {
+                            alt280=2;
+                        }
+
+
+                        switch (alt280) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:11904:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:11904:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    // InternalUIGrammar.g:11905:6: {...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiImageAccess().getUnorderedGroup_2_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiImage", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiImageAccess().getUnorderedGroup_2_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:11905:107: ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    // InternalUIGrammar.g:11906:7: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiImageAccess().getUnorderedGroup_2_1(), 0);
+                    	    // InternalUIGrammar.g:11909:10: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    // InternalUIGrammar.g:11909:11: {...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiImage", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:11909:20: ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    // InternalUIGrammar.g:11909:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    {
+                    	    // InternalUIGrammar.g:11909:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    // InternalUIGrammar.g:11910:11: lv_i18nInfo_4_0= ruleUiI18nInfo
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getUiImageAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_63);
+                    	    lv_i18nInfo_4_0=ruleUiI18nInfo();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getUiImageRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"i18nInfo",
+                    	      												lv_i18nInfo_4_0,
+                    	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiImageAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:11932:5: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:11932:5: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:11933:6: {...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiImageAccess().getUnorderedGroup_2_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiImage", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiImageAccess().getUnorderedGroup_2_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:11933:107: ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:11934:7: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiImageAccess().getUnorderedGroup_2_1(), 1);
+                    	    // InternalUIGrammar.g:11937:10: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:11937:11: {...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiImage", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:11937:20: (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:11937:21: otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_5=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_5, grammarAccess.getUiImageAccess().getStylesKeyword_2_1_1_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:11941:10: ( (lv_styles_6_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:11942:11: (lv_styles_6_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:11942:11: (lv_styles_6_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:11943:12: lv_styles_6_0= RULE_STRING
+                    	    {
+                    	    lv_styles_6_0=(Token)match(input,RULE_STRING,FOLLOW_63); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_styles_6_0, grammarAccess.getUiImageAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiImageRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"styles",
+                    	      													lv_styles_6_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiImageAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop280;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiImageAccess().getUnorderedGroup_2_1());
+
+                    }
+
+                    otherlv_7=(Token)match(input,47,FOLLOW_88); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_7, grammarAccess.getUiImageAccess().getRightParenthesisKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:11977:3: ( (lv_name_8_0= RULE_ID ) )?
+            int alt282=2;
+            int LA282_0 = input.LA(1);
+
+            if ( (LA282_0==RULE_ID) ) {
+                alt282=1;
+            }
+            switch (alt282) {
+                case 1 :
+                    // InternalUIGrammar.g:11978:4: (lv_name_8_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:11978:4: (lv_name_8_0= RULE_ID )
+                    // InternalUIGrammar.g:11979:5: lv_name_8_0= RULE_ID
+                    {
+                    lv_name_8_0=(Token)match(input,RULE_ID,FOLLOW_89); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_8_0, grammarAccess.getUiImageAccess().getNameIDTerminalRuleCall_3_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiImageRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_8_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:11995:3: (otherlv_9= '{' (otherlv_10= 'iconPath' ( (lv_value_11_0= RULE_STRING ) ) (otherlv_12= ';' )? )? ( (lv_bindings_13_0= ruleUiBinding ) )* ( (lv_processorAssignments_14_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_15= '}' )?
+            int alt287=2;
+            int LA287_0 = input.LA(1);
+
+            if ( (LA287_0==20) ) {
+                alt287=1;
+            }
+            switch (alt287) {
+                case 1 :
+                    // InternalUIGrammar.g:11996:4: otherlv_9= '{' (otherlv_10= 'iconPath' ( (lv_value_11_0= RULE_STRING ) ) (otherlv_12= ';' )? )? ( (lv_bindings_13_0= ruleUiBinding ) )* ( (lv_processorAssignments_14_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_15= '}'
+                    {
+                    otherlv_9=(Token)match(input,20,FOLLOW_102); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_9, grammarAccess.getUiImageAccess().getLeftCurlyBracketKeyword_4_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:12000:4: (otherlv_10= 'iconPath' ( (lv_value_11_0= RULE_STRING ) ) (otherlv_12= ';' )? )?
+                    int alt284=2;
+                    int LA284_0 = input.LA(1);
+
+                    if ( (LA284_0==123) ) {
+                        alt284=1;
+                    }
+                    switch (alt284) {
+                        case 1 :
+                            // InternalUIGrammar.g:12001:5: otherlv_10= 'iconPath' ( (lv_value_11_0= RULE_STRING ) ) (otherlv_12= ';' )?
+                            {
+                            otherlv_10=(Token)match(input,123,FOLLOW_18); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(otherlv_10, grammarAccess.getUiImageAccess().getIconPathKeyword_4_1_0());
+                              				
+                            }
+                            // InternalUIGrammar.g:12005:5: ( (lv_value_11_0= RULE_STRING ) )
+                            // InternalUIGrammar.g:12006:6: (lv_value_11_0= RULE_STRING )
+                            {
+                            // InternalUIGrammar.g:12006:6: (lv_value_11_0= RULE_STRING )
+                            // InternalUIGrammar.g:12007:7: lv_value_11_0= RULE_STRING
+                            {
+                            lv_value_11_0=(Token)match(input,RULE_STRING,FOLLOW_78); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							newLeafNode(lv_value_11_0, grammarAccess.getUiImageAccess().getValueSTRINGTerminalRuleCall_4_1_1_0());
+                              						
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElement(grammarAccess.getUiImageRule());
+                              							}
+                              							setWithLastConsumed(
+                              								current,
+                              								"value",
+                              								lv_value_11_0,
+                              								"org.eclipse.xtext.xbase.Xtype.STRING");
+                              						
+                            }
+
+                            }
+
+
+                            }
+
+                            // InternalUIGrammar.g:12023:5: (otherlv_12= ';' )?
+                            int alt283=2;
+                            int LA283_0 = input.LA(1);
+
+                            if ( (LA283_0==16) ) {
+                                alt283=1;
+                            }
+                            switch (alt283) {
+                                case 1 :
+                                    // InternalUIGrammar.g:12024:6: otherlv_12= ';'
+                                    {
+                                    otherlv_12=(Token)match(input,16,FOLLOW_42); if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      						newLeafNode(otherlv_12, grammarAccess.getUiImageAccess().getSemicolonKeyword_4_1_2());
+                                      					
+                                    }
+
+                                    }
+                                    break;
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    // InternalUIGrammar.g:12030:4: ( (lv_bindings_13_0= ruleUiBinding ) )*
+                    loop285:
+                    do {
+                        int alt285=2;
+                        int LA285_0 = input.LA(1);
+
+                        if ( (LA285_0==26) ) {
+                            alt285=1;
+                        }
+
+
+                        switch (alt285) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:12031:5: (lv_bindings_13_0= ruleUiBinding )
+                    	    {
+                    	    // InternalUIGrammar.g:12031:5: (lv_bindings_13_0= ruleUiBinding )
+                    	    // InternalUIGrammar.g:12032:6: lv_bindings_13_0= ruleUiBinding
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newCompositeNode(grammarAccess.getUiImageAccess().getBindingsUiBindingParserRuleCall_4_2_0());
+                    	      					
+                    	    }
+                    	    pushFollow(FOLLOW_42);
+                    	    lv_bindings_13_0=ruleUiBinding();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						if (current==null) {
+                    	      							current = createModelElementForParent(grammarAccess.getUiImageRule());
+                    	      						}
+                    	      						add(
+                    	      							current,
+                    	      							"bindings",
+                    	      							lv_bindings_13_0,
+                    	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+                    	      						afterParserOrEnumRuleCall();
+                    	      					
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop285;
+                        }
+                    } while (true);
+
+                    // InternalUIGrammar.g:12049:4: ( (lv_processorAssignments_14_0= ruleUiVisibilityProcessorAssignment ) )*
+                    loop286:
+                    do {
+                        int alt286=2;
+                        int LA286_0 = input.LA(1);
+
+                        if ( (LA286_0==153) ) {
+                            alt286=1;
+                        }
+
+
+                        switch (alt286) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:12050:5: (lv_processorAssignments_14_0= ruleUiVisibilityProcessorAssignment )
+                    	    {
+                    	    // InternalUIGrammar.g:12050:5: (lv_processorAssignments_14_0= ruleUiVisibilityProcessorAssignment )
+                    	    // InternalUIGrammar.g:12051:6: lv_processorAssignments_14_0= ruleUiVisibilityProcessorAssignment
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newCompositeNode(grammarAccess.getUiImageAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0());
+                    	      					
+                    	    }
+                    	    pushFollow(FOLLOW_42);
+                    	    lv_processorAssignments_14_0=ruleUiVisibilityProcessorAssignment();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						if (current==null) {
+                    	      							current = createModelElementForParent(grammarAccess.getUiImageRule());
+                    	      						}
+                    	      						add(
+                    	      							current,
+                    	      							"processorAssignments",
+                    	      							lv_processorAssignments_14_0,
+                    	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+                    	      						afterParserOrEnumRuleCall();
+                    	      					
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop286;
+                        }
+                    } while (true);
+
+                    otherlv_15=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_15, grammarAccess.getUiImageAccess().getRightCurlyBracketKeyword_4_4());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiImage"
+
+
+    // $ANTLR start "entryRuleUiTable"
+    // InternalUIGrammar.g:12077:1: entryRuleUiTable returns [EObject current=null] : iv_ruleUiTable= ruleUiTable EOF ;
+    public final EObject entryRuleUiTable() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiTable = null;
+
+
+        try {
+            // InternalUIGrammar.g:12077:48: (iv_ruleUiTable= ruleUiTable EOF )
+            // InternalUIGrammar.g:12078:2: iv_ruleUiTable= ruleUiTable EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiTableRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiTable=ruleUiTable();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiTable; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiTable"
+
+
+    // $ANTLR start "ruleUiTable"
+    // InternalUIGrammar.g:12084:1: ruleUiTable returns [EObject current=null] : ( () otherlv_1= 'table' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'selectionType' ( (lv_selectionType_15_0= ruleUiSelectionType ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'imageField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_20_0= 'useBeanService' ) ) (otherlv_21= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_scrollToBottom_22_0= 'scrollToBottom' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* ) ) ) ( (lv_columnAssignment_25_0= ruleUiColumnsAssignment ) )? ( (lv_sortOrderAssignment_26_0= ruleUiSortOrderAssignment ) )? ( ( (lv_validators_27_0= ruleUiValidator ) ) | ( (lv_bindings_28_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_29_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_30= '}' )? ) ;
+    public final EObject ruleUiTable() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_5=null;
+        Token lv_styles_6_0=null;
+        Token otherlv_7=null;
+        Token lv_name_8_0=null;
+        Token otherlv_9=null;
+        Token otherlv_11=null;
+        Token otherlv_13=null;
+        Token otherlv_14=null;
+        Token otherlv_16=null;
+        Token otherlv_17=null;
+        Token otherlv_18=null;
+        Token otherlv_19=null;
+        Token lv_consumeBeanService_20_0=null;
+        Token otherlv_21=null;
+        Token lv_scrollToBottom_22_0=null;
+        Token otherlv_23=null;
+        Token lv_readonly_24_0=null;
+        Token otherlv_30=null;
+        EObject lv_i18nInfo_4_0 = null;
+
+        EObject lv_jvmType_12_0 = null;
+
+        Enumerator lv_selectionType_15_0 = null;
+
+        EObject lv_columnAssignment_25_0 = null;
+
+        EObject lv_sortOrderAssignment_26_0 = null;
+
+        EObject lv_validators_27_0 = null;
+
+        EObject lv_bindings_28_0 = null;
+
+        EObject lv_processorAssignments_29_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:12090:2: ( ( () otherlv_1= 'table' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'selectionType' ( (lv_selectionType_15_0= ruleUiSelectionType ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'imageField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_20_0= 'useBeanService' ) ) (otherlv_21= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_scrollToBottom_22_0= 'scrollToBottom' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* ) ) ) ( (lv_columnAssignment_25_0= ruleUiColumnsAssignment ) )? ( (lv_sortOrderAssignment_26_0= ruleUiSortOrderAssignment ) )? ( ( (lv_validators_27_0= ruleUiValidator ) ) | ( (lv_bindings_28_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_29_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_30= '}' )? ) )
+            // InternalUIGrammar.g:12091:2: ( () otherlv_1= 'table' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'selectionType' ( (lv_selectionType_15_0= ruleUiSelectionType ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'imageField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_20_0= 'useBeanService' ) ) (otherlv_21= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_scrollToBottom_22_0= 'scrollToBottom' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* ) ) ) ( (lv_columnAssignment_25_0= ruleUiColumnsAssignment ) )? ( (lv_sortOrderAssignment_26_0= ruleUiSortOrderAssignment ) )? ( ( (lv_validators_27_0= ruleUiValidator ) ) | ( (lv_bindings_28_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_29_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_30= '}' )? )
+            {
+            // InternalUIGrammar.g:12091:2: ( () otherlv_1= 'table' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'selectionType' ( (lv_selectionType_15_0= ruleUiSelectionType ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'imageField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_20_0= 'useBeanService' ) ) (otherlv_21= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_scrollToBottom_22_0= 'scrollToBottom' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* ) ) ) ( (lv_columnAssignment_25_0= ruleUiColumnsAssignment ) )? ( (lv_sortOrderAssignment_26_0= ruleUiSortOrderAssignment ) )? ( ( (lv_validators_27_0= ruleUiValidator ) ) | ( (lv_bindings_28_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_29_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_30= '}' )? )
+            // InternalUIGrammar.g:12092:3: () otherlv_1= 'table' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'selectionType' ( (lv_selectionType_15_0= ruleUiSelectionType ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'imageField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_20_0= 'useBeanService' ) ) (otherlv_21= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_scrollToBottom_22_0= 'scrollToBottom' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* ) ) ) ( (lv_columnAssignment_25_0= ruleUiColumnsAssignment ) )? ( (lv_sortOrderAssignment_26_0= ruleUiSortOrderAssignment ) )? ( ( (lv_validators_27_0= ruleUiValidator ) ) | ( (lv_bindings_28_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_29_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_30= '}' )?
+            {
+            // InternalUIGrammar.g:12092:3: ()
+            // InternalUIGrammar.g:12093:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiTableAccess().getUiTableAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,124,FOLLOW_86); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiTableAccess().getTableKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:12103:3: (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )?
+            int alt289=2;
+            int LA289_0 = input.LA(1);
+
+            if ( (LA289_0==45) ) {
+                alt289=1;
+            }
+            switch (alt289) {
+                case 1 :
+                    // InternalUIGrammar.g:12104:4: otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')'
+                    {
+                    otherlv_2=(Token)match(input,45,FOLLOW_63); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getUiTableAccess().getLeftParenthesisKeyword_2_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:12108:4: ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:12109:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:12109:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:12110:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiTableAccess().getUnorderedGroup_2_1());
+                    // InternalUIGrammar.g:12113:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:12114:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:12114:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )*
+                    loop288:
+                    do {
+                        int alt288=3;
+                        int LA288_0 = input.LA(1);
+
+                        if ( LA288_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiTableAccess().getUnorderedGroup_2_1(), 0) ) {
+                            alt288=1;
+                        }
+                        else if ( LA288_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiTableAccess().getUnorderedGroup_2_1(), 1) ) {
+                            alt288=2;
+                        }
+
+
+                        switch (alt288) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:12115:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:12115:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    // InternalUIGrammar.g:12116:6: {...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiTableAccess().getUnorderedGroup_2_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiTable", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiTableAccess().getUnorderedGroup_2_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:12116:107: ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    // InternalUIGrammar.g:12117:7: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiTableAccess().getUnorderedGroup_2_1(), 0);
+                    	    // InternalUIGrammar.g:12120:10: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    // InternalUIGrammar.g:12120:11: {...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiTable", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:12120:20: ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    // InternalUIGrammar.g:12120:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    {
+                    	    // InternalUIGrammar.g:12120:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    // InternalUIGrammar.g:12121:11: lv_i18nInfo_4_0= ruleUiI18nInfo
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getUiTableAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_63);
+                    	    lv_i18nInfo_4_0=ruleUiI18nInfo();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getUiTableRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"i18nInfo",
+                    	      												lv_i18nInfo_4_0,
+                    	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTableAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:12143:5: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:12143:5: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:12144:6: {...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiTableAccess().getUnorderedGroup_2_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiTable", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiTableAccess().getUnorderedGroup_2_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:12144:107: ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:12145:7: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiTableAccess().getUnorderedGroup_2_1(), 1);
+                    	    // InternalUIGrammar.g:12148:10: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:12148:11: {...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiTable", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:12148:20: (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:12148:21: otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_5=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_5, grammarAccess.getUiTableAccess().getStylesKeyword_2_1_1_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:12152:10: ( (lv_styles_6_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:12153:11: (lv_styles_6_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:12153:11: (lv_styles_6_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:12154:12: lv_styles_6_0= RULE_STRING
+                    	    {
+                    	    lv_styles_6_0=(Token)match(input,RULE_STRING,FOLLOW_63); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_styles_6_0, grammarAccess.getUiTableAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiTableRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"styles",
+                    	      													lv_styles_6_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTableAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop288;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiTableAccess().getUnorderedGroup_2_1());
+
+                    }
+
+                    otherlv_7=(Token)match(input,47,FOLLOW_88); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_7, grammarAccess.getUiTableAccess().getRightParenthesisKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:12188:3: ( (lv_name_8_0= RULE_ID ) )?
+            int alt290=2;
+            int LA290_0 = input.LA(1);
+
+            if ( (LA290_0==RULE_ID) ) {
+                alt290=1;
+            }
+            switch (alt290) {
+                case 1 :
+                    // InternalUIGrammar.g:12189:4: (lv_name_8_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:12189:4: (lv_name_8_0= RULE_ID )
+                    // InternalUIGrammar.g:12190:5: lv_name_8_0= RULE_ID
+                    {
+                    lv_name_8_0=(Token)match(input,RULE_ID,FOLLOW_89); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_8_0, grammarAccess.getUiTableAccess().getNameIDTerminalRuleCall_3_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiTableRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_8_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:12206:3: (otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'selectionType' ( (lv_selectionType_15_0= ruleUiSelectionType ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'imageField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_20_0= 'useBeanService' ) ) (otherlv_21= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_scrollToBottom_22_0= 'scrollToBottom' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* ) ) ) ( (lv_columnAssignment_25_0= ruleUiColumnsAssignment ) )? ( (lv_sortOrderAssignment_26_0= ruleUiSortOrderAssignment ) )? ( ( (lv_validators_27_0= ruleUiValidator ) ) | ( (lv_bindings_28_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_29_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_30= '}' )?
+            int alt301=2;
+            int LA301_0 = input.LA(1);
+
+            if ( (LA301_0==20) ) {
+                alt301=1;
+            }
+            switch (alt301) {
+                case 1 :
+                    // InternalUIGrammar.g:12207:4: otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'selectionType' ( (lv_selectionType_15_0= ruleUiSelectionType ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'imageField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_20_0= 'useBeanService' ) ) (otherlv_21= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_scrollToBottom_22_0= 'scrollToBottom' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* ) ) ) ( (lv_columnAssignment_25_0= ruleUiColumnsAssignment ) )? ( (lv_sortOrderAssignment_26_0= ruleUiSortOrderAssignment ) )? ( ( (lv_validators_27_0= ruleUiValidator ) ) | ( (lv_bindings_28_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_29_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_30= '}'
+                    {
+                    otherlv_9=(Token)match(input,20,FOLLOW_103); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_9, grammarAccess.getUiTableAccess().getLeftCurlyBracketKeyword_4_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:12211:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'selectionType' ( (lv_selectionType_15_0= ruleUiSelectionType ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'imageField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_20_0= 'useBeanService' ) ) (otherlv_21= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_scrollToBottom_22_0= 'scrollToBottom' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:12212:5: ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'selectionType' ( (lv_selectionType_15_0= ruleUiSelectionType ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'imageField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_20_0= 'useBeanService' ) ) (otherlv_21= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_scrollToBottom_22_0= 'scrollToBottom' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:12212:5: ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'selectionType' ( (lv_selectionType_15_0= ruleUiSelectionType ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'imageField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_20_0= 'useBeanService' ) ) (otherlv_21= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_scrollToBottom_22_0= 'scrollToBottom' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:12213:6: ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'selectionType' ( (lv_selectionType_15_0= ruleUiSelectionType ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'imageField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_20_0= 'useBeanService' ) ) (otherlv_21= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_scrollToBottom_22_0= 'scrollToBottom' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1());
+                    // InternalUIGrammar.g:12216:6: ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'selectionType' ( (lv_selectionType_15_0= ruleUiSelectionType ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'imageField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_20_0= 'useBeanService' ) ) (otherlv_21= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_scrollToBottom_22_0= 'scrollToBottom' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:12217:7: ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'selectionType' ( (lv_selectionType_15_0= ruleUiSelectionType ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'imageField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_20_0= 'useBeanService' ) ) (otherlv_21= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_scrollToBottom_22_0= 'scrollToBottom' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:12217:7: ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'selectionType' ( (lv_selectionType_15_0= ruleUiSelectionType ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'imageField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_20_0= 'useBeanService' ) ) (otherlv_21= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_scrollToBottom_22_0= 'scrollToBottom' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )*
+                    loop296:
+                    do {
+                        int alt296=7;
+                        int LA296_0 = input.LA(1);
+
+                        if ( LA296_0 == 75 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 0) ) {
+                            alt296=1;
+                        }
+                        else if ( LA296_0 == 125 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 1) ) {
+                            alt296=2;
+                        }
+                        else if ( LA296_0 == 115 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 2) ) {
+                            alt296=3;
+                        }
+                        else if ( LA296_0 == 126 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 3) ) {
+                            alt296=4;
+                        }
+                        else if ( LA296_0 == 127 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 4) ) {
+                            alt296=5;
+                        }
+                        else if ( LA296_0 == 65 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 5) ) {
+                            alt296=6;
+                        }
+
+
+                        switch (alt296) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:12218:5: ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:12218:5: ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) )
+                    	    // InternalUIGrammar.g:12219:6: {...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiTable", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:12219:107: ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) )
+                    	    // InternalUIGrammar.g:12220:7: ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 0);
+                    	    // InternalUIGrammar.g:12223:10: ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) )
+                    	    // InternalUIGrammar.g:12223:11: {...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiTable", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:12223:20: (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? )
+                    	    // InternalUIGrammar.g:12223:21: otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )?
+                    	    {
+                    	    otherlv_11=(Token)match(input,75,FOLLOW_16); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_11, grammarAccess.getUiTableAccess().getTypeKeyword_4_1_0_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:12227:10: ( (lv_jvmType_12_0= ruleJvmTypeReference ) )
+                    	    // InternalUIGrammar.g:12228:11: (lv_jvmType_12_0= ruleJvmTypeReference )
+                    	    {
+                    	    // InternalUIGrammar.g:12228:11: (lv_jvmType_12_0= ruleJvmTypeReference )
+                    	    // InternalUIGrammar.g:12229:12: lv_jvmType_12_0= ruleJvmTypeReference
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newCompositeNode(grammarAccess.getUiTableAccess().getJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0());
+                    	      											
+                    	    }
+                    	    pushFollow(FOLLOW_104);
+                    	    lv_jvmType_12_0=ruleJvmTypeReference();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElementForParent(grammarAccess.getUiTableRule());
+                    	      												}
+                    	      												set(
+                    	      													current,
+                    	      													"jvmType",
+                    	      													lv_jvmType_12_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+                    	      												afterParserOrEnumRuleCall();
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    // InternalUIGrammar.g:12246:10: (otherlv_13= ';' )?
+                    	    int alt291=2;
+                    	    int LA291_0 = input.LA(1);
+
+                    	    if ( (LA291_0==16) ) {
+                    	        alt291=1;
+                    	    }
+                    	    switch (alt291) {
+                    	        case 1 :
+                    	            // InternalUIGrammar.g:12247:11: otherlv_13= ';'
+                    	            {
+                    	            otherlv_13=(Token)match(input,16,FOLLOW_103); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											newLeafNode(otherlv_13, grammarAccess.getUiTableAccess().getSemicolonKeyword_4_1_0_2());
+                    	              										
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:12258:5: ({...}? => ( ({...}? => (otherlv_14= 'selectionType' ( (lv_selectionType_15_0= ruleUiSelectionType ) ) (otherlv_16= ';' )? ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:12258:5: ({...}? => ( ({...}? => (otherlv_14= 'selectionType' ( (lv_selectionType_15_0= ruleUiSelectionType ) ) (otherlv_16= ';' )? ) ) ) )
+                    	    // InternalUIGrammar.g:12259:6: {...}? => ( ({...}? => (otherlv_14= 'selectionType' ( (lv_selectionType_15_0= ruleUiSelectionType ) ) (otherlv_16= ';' )? ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiTable", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:12259:107: ( ({...}? => (otherlv_14= 'selectionType' ( (lv_selectionType_15_0= ruleUiSelectionType ) ) (otherlv_16= ';' )? ) ) )
+                    	    // InternalUIGrammar.g:12260:7: ({...}? => (otherlv_14= 'selectionType' ( (lv_selectionType_15_0= ruleUiSelectionType ) ) (otherlv_16= ';' )? ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 1);
+                    	    // InternalUIGrammar.g:12263:10: ({...}? => (otherlv_14= 'selectionType' ( (lv_selectionType_15_0= ruleUiSelectionType ) ) (otherlv_16= ';' )? ) )
+                    	    // InternalUIGrammar.g:12263:11: {...}? => (otherlv_14= 'selectionType' ( (lv_selectionType_15_0= ruleUiSelectionType ) ) (otherlv_16= ';' )? )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiTable", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:12263:20: (otherlv_14= 'selectionType' ( (lv_selectionType_15_0= ruleUiSelectionType ) ) (otherlv_16= ';' )? )
+                    	    // InternalUIGrammar.g:12263:21: otherlv_14= 'selectionType' ( (lv_selectionType_15_0= ruleUiSelectionType ) ) (otherlv_16= ';' )?
+                    	    {
+                    	    otherlv_14=(Token)match(input,125,FOLLOW_105); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_14, grammarAccess.getUiTableAccess().getSelectionTypeKeyword_4_1_1_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:12267:10: ( (lv_selectionType_15_0= ruleUiSelectionType ) )
+                    	    // InternalUIGrammar.g:12268:11: (lv_selectionType_15_0= ruleUiSelectionType )
+                    	    {
+                    	    // InternalUIGrammar.g:12268:11: (lv_selectionType_15_0= ruleUiSelectionType )
+                    	    // InternalUIGrammar.g:12269:12: lv_selectionType_15_0= ruleUiSelectionType
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newCompositeNode(grammarAccess.getUiTableAccess().getSelectionTypeUiSelectionTypeEnumRuleCall_4_1_1_1_0());
+                    	      											
+                    	    }
+                    	    pushFollow(FOLLOW_104);
+                    	    lv_selectionType_15_0=ruleUiSelectionType();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElementForParent(grammarAccess.getUiTableRule());
+                    	      												}
+                    	      												set(
+                    	      													current,
+                    	      													"selectionType",
+                    	      													lv_selectionType_15_0,
+                    	      													"org.eclipse.osbp.ecview.dsl.UIGrammar.UiSelectionType");
+                    	      												afterParserOrEnumRuleCall();
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    // InternalUIGrammar.g:12286:10: (otherlv_16= ';' )?
+                    	    int alt292=2;
+                    	    int LA292_0 = input.LA(1);
+
+                    	    if ( (LA292_0==16) ) {
+                    	        alt292=1;
+                    	    }
+                    	    switch (alt292) {
+                    	        case 1 :
+                    	            // InternalUIGrammar.g:12287:11: otherlv_16= ';'
+                    	            {
+                    	            otherlv_16=(Token)match(input,16,FOLLOW_103); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											newLeafNode(otherlv_16, grammarAccess.getUiTableAccess().getSemicolonKeyword_4_1_1_2());
+                    	              										
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 3 :
+                    	    // InternalUIGrammar.g:12298:5: ({...}? => ( ({...}? => (otherlv_17= 'imageField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:12298:5: ({...}? => ( ({...}? => (otherlv_17= 'imageField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? ) ) ) )
+                    	    // InternalUIGrammar.g:12299:6: {...}? => ( ({...}? => (otherlv_17= 'imageField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 2) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiTable", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 2)");
+                    	    }
+                    	    // InternalUIGrammar.g:12299:107: ( ({...}? => (otherlv_17= 'imageField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? ) ) )
+                    	    // InternalUIGrammar.g:12300:7: ({...}? => (otherlv_17= 'imageField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 2);
+                    	    // InternalUIGrammar.g:12303:10: ({...}? => (otherlv_17= 'imageField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? ) )
+                    	    // InternalUIGrammar.g:12303:11: {...}? => (otherlv_17= 'imageField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiTable", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:12303:20: (otherlv_17= 'imageField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )? )
+                    	    // InternalUIGrammar.g:12303:21: otherlv_17= 'imageField' ( (otherlv_18= RULE_ID ) ) (otherlv_19= ';' )?
+                    	    {
+                    	    otherlv_17=(Token)match(input,115,FOLLOW_3); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_17, grammarAccess.getUiTableAccess().getImageFieldKeyword_4_1_2_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:12307:10: ( (otherlv_18= RULE_ID ) )
+                    	    // InternalUIGrammar.g:12308:11: (otherlv_18= RULE_ID )
+                    	    {
+                    	    // InternalUIGrammar.g:12308:11: (otherlv_18= RULE_ID )
+                    	    // InternalUIGrammar.g:12309:12: otherlv_18= RULE_ID
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiTableRule());
+                    	      												}
+                    	      											
+                    	    }
+                    	    otherlv_18=(Token)match(input,RULE_ID,FOLLOW_104); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(otherlv_18, grammarAccess.getUiTableAccess().getItemImagePropertyJvmOperationCrossReference_4_1_2_1_0());
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    // InternalUIGrammar.g:12320:10: (otherlv_19= ';' )?
+                    	    int alt293=2;
+                    	    int LA293_0 = input.LA(1);
+
+                    	    if ( (LA293_0==16) ) {
+                    	        alt293=1;
+                    	    }
+                    	    switch (alt293) {
+                    	        case 1 :
+                    	            // InternalUIGrammar.g:12321:11: otherlv_19= ';'
+                    	            {
+                    	            otherlv_19=(Token)match(input,16,FOLLOW_103); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											newLeafNode(otherlv_19, grammarAccess.getUiTableAccess().getSemicolonKeyword_4_1_2_2());
+                    	              										
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 4 :
+                    	    // InternalUIGrammar.g:12332:5: ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_20_0= 'useBeanService' ) ) (otherlv_21= ';' )? ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:12332:5: ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_20_0= 'useBeanService' ) ) (otherlv_21= ';' )? ) ) ) )
+                    	    // InternalUIGrammar.g:12333:6: {...}? => ( ({...}? => ( ( (lv_consumeBeanService_20_0= 'useBeanService' ) ) (otherlv_21= ';' )? ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 3) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiTable", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 3)");
+                    	    }
+                    	    // InternalUIGrammar.g:12333:107: ( ({...}? => ( ( (lv_consumeBeanService_20_0= 'useBeanService' ) ) (otherlv_21= ';' )? ) ) )
+                    	    // InternalUIGrammar.g:12334:7: ({...}? => ( ( (lv_consumeBeanService_20_0= 'useBeanService' ) ) (otherlv_21= ';' )? ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 3);
+                    	    // InternalUIGrammar.g:12337:10: ({...}? => ( ( (lv_consumeBeanService_20_0= 'useBeanService' ) ) (otherlv_21= ';' )? ) )
+                    	    // InternalUIGrammar.g:12337:11: {...}? => ( ( (lv_consumeBeanService_20_0= 'useBeanService' ) ) (otherlv_21= ';' )? )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiTable", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:12337:20: ( ( (lv_consumeBeanService_20_0= 'useBeanService' ) ) (otherlv_21= ';' )? )
+                    	    // InternalUIGrammar.g:12337:21: ( (lv_consumeBeanService_20_0= 'useBeanService' ) ) (otherlv_21= ';' )?
+                    	    {
+                    	    // InternalUIGrammar.g:12337:21: ( (lv_consumeBeanService_20_0= 'useBeanService' ) )
+                    	    // InternalUIGrammar.g:12338:11: (lv_consumeBeanService_20_0= 'useBeanService' )
+                    	    {
+                    	    // InternalUIGrammar.g:12338:11: (lv_consumeBeanService_20_0= 'useBeanService' )
+                    	    // InternalUIGrammar.g:12339:12: lv_consumeBeanService_20_0= 'useBeanService'
+                    	    {
+                    	    lv_consumeBeanService_20_0=(Token)match(input,126,FOLLOW_104); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_consumeBeanService_20_0, grammarAccess.getUiTableAccess().getConsumeBeanServiceUseBeanServiceKeyword_4_1_3_0_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiTableRule());
+                    	      												}
+                    	      												setWithLastConsumed(current, "consumeBeanService", true, "useBeanService");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    // InternalUIGrammar.g:12351:10: (otherlv_21= ';' )?
+                    	    int alt294=2;
+                    	    int LA294_0 = input.LA(1);
+
+                    	    if ( (LA294_0==16) ) {
+                    	        alt294=1;
+                    	    }
+                    	    switch (alt294) {
+                    	        case 1 :
+                    	            // InternalUIGrammar.g:12352:11: otherlv_21= ';'
+                    	            {
+                    	            otherlv_21=(Token)match(input,16,FOLLOW_103); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											newLeafNode(otherlv_21, grammarAccess.getUiTableAccess().getSemicolonKeyword_4_1_3_1());
+                    	              										
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 5 :
+                    	    // InternalUIGrammar.g:12363:5: ({...}? => ( ({...}? => ( ( (lv_scrollToBottom_22_0= 'scrollToBottom' ) ) (otherlv_23= ';' )? ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:12363:5: ({...}? => ( ({...}? => ( ( (lv_scrollToBottom_22_0= 'scrollToBottom' ) ) (otherlv_23= ';' )? ) ) ) )
+                    	    // InternalUIGrammar.g:12364:6: {...}? => ( ({...}? => ( ( (lv_scrollToBottom_22_0= 'scrollToBottom' ) ) (otherlv_23= ';' )? ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 4) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiTable", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 4)");
+                    	    }
+                    	    // InternalUIGrammar.g:12364:107: ( ({...}? => ( ( (lv_scrollToBottom_22_0= 'scrollToBottom' ) ) (otherlv_23= ';' )? ) ) )
+                    	    // InternalUIGrammar.g:12365:7: ({...}? => ( ( (lv_scrollToBottom_22_0= 'scrollToBottom' ) ) (otherlv_23= ';' )? ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 4);
+                    	    // InternalUIGrammar.g:12368:10: ({...}? => ( ( (lv_scrollToBottom_22_0= 'scrollToBottom' ) ) (otherlv_23= ';' )? ) )
+                    	    // InternalUIGrammar.g:12368:11: {...}? => ( ( (lv_scrollToBottom_22_0= 'scrollToBottom' ) ) (otherlv_23= ';' )? )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiTable", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:12368:20: ( ( (lv_scrollToBottom_22_0= 'scrollToBottom' ) ) (otherlv_23= ';' )? )
+                    	    // InternalUIGrammar.g:12368:21: ( (lv_scrollToBottom_22_0= 'scrollToBottom' ) ) (otherlv_23= ';' )?
+                    	    {
+                    	    // InternalUIGrammar.g:12368:21: ( (lv_scrollToBottom_22_0= 'scrollToBottom' ) )
+                    	    // InternalUIGrammar.g:12369:11: (lv_scrollToBottom_22_0= 'scrollToBottom' )
+                    	    {
+                    	    // InternalUIGrammar.g:12369:11: (lv_scrollToBottom_22_0= 'scrollToBottom' )
+                    	    // InternalUIGrammar.g:12370:12: lv_scrollToBottom_22_0= 'scrollToBottom'
+                    	    {
+                    	    lv_scrollToBottom_22_0=(Token)match(input,127,FOLLOW_104); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_scrollToBottom_22_0, grammarAccess.getUiTableAccess().getScrollToBottomScrollToBottomKeyword_4_1_4_0_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiTableRule());
+                    	      												}
+                    	      												setWithLastConsumed(current, "scrollToBottom", true, "scrollToBottom");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    // InternalUIGrammar.g:12382:10: (otherlv_23= ';' )?
+                    	    int alt295=2;
+                    	    int LA295_0 = input.LA(1);
+
+                    	    if ( (LA295_0==16) ) {
+                    	        alt295=1;
+                    	    }
+                    	    switch (alt295) {
+                    	        case 1 :
+                    	            // InternalUIGrammar.g:12383:11: otherlv_23= ';'
+                    	            {
+                    	            otherlv_23=(Token)match(input,16,FOLLOW_103); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											newLeafNode(otherlv_23, grammarAccess.getUiTableAccess().getSemicolonKeyword_4_1_4_1());
+                    	              										
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 6 :
+                    	    // InternalUIGrammar.g:12394:5: ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:12394:5: ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) )
+                    	    // InternalUIGrammar.g:12395:6: {...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 5) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiTable", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 5)");
+                    	    }
+                    	    // InternalUIGrammar.g:12395:107: ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) )
+                    	    // InternalUIGrammar.g:12396:7: ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 5);
+                    	    // InternalUIGrammar.g:12399:10: ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) )
+                    	    // InternalUIGrammar.g:12399:11: {...}? => ( (lv_readonly_24_0= 'readonly' ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiTable", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:12399:20: ( (lv_readonly_24_0= 'readonly' ) )
+                    	    // InternalUIGrammar.g:12399:21: (lv_readonly_24_0= 'readonly' )
+                    	    {
+                    	    // InternalUIGrammar.g:12399:21: (lv_readonly_24_0= 'readonly' )
+                    	    // InternalUIGrammar.g:12400:11: lv_readonly_24_0= 'readonly'
+                    	    {
+                    	    lv_readonly_24_0=(Token)match(input,65,FOLLOW_103); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newLeafNode(lv_readonly_24_0, grammarAccess.getUiTableAccess().getReadonlyReadonlyKeyword_4_1_5_0());
+                    	      										
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElement(grammarAccess.getUiTableRule());
+                    	      											}
+                    	      											setWithLastConsumed(current, "readonly", true, "readonly");
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop296;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1());
+
+                    }
+
+                    // InternalUIGrammar.g:12424:4: ( (lv_columnAssignment_25_0= ruleUiColumnsAssignment ) )?
+                    int alt297=2;
+                    int LA297_0 = input.LA(1);
+
+                    if ( (LA297_0==140) ) {
+                        alt297=1;
+                    }
+                    switch (alt297) {
+                        case 1 :
+                            // InternalUIGrammar.g:12425:5: (lv_columnAssignment_25_0= ruleUiColumnsAssignment )
+                            {
+                            // InternalUIGrammar.g:12425:5: (lv_columnAssignment_25_0= ruleUiColumnsAssignment )
+                            // InternalUIGrammar.g:12426:6: lv_columnAssignment_25_0= ruleUiColumnsAssignment
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              						newCompositeNode(grammarAccess.getUiTableAccess().getColumnAssignmentUiColumnsAssignmentParserRuleCall_4_2_0());
+                              					
+                            }
+                            pushFollow(FOLLOW_106);
+                            lv_columnAssignment_25_0=ruleUiColumnsAssignment();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						if (current==null) {
+                              							current = createModelElementForParent(grammarAccess.getUiTableRule());
+                              						}
+                              						set(
+                              							current,
+                              							"columnAssignment",
+                              							lv_columnAssignment_25_0,
+                              							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiColumnsAssignment");
+                              						afterParserOrEnumRuleCall();
+                              					
+                            }
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    // InternalUIGrammar.g:12443:4: ( (lv_sortOrderAssignment_26_0= ruleUiSortOrderAssignment ) )?
+                    int alt298=2;
+                    int LA298_0 = input.LA(1);
+
+                    if ( (LA298_0==141) ) {
+                        alt298=1;
+                    }
+                    switch (alt298) {
+                        case 1 :
+                            // InternalUIGrammar.g:12444:5: (lv_sortOrderAssignment_26_0= ruleUiSortOrderAssignment )
+                            {
+                            // InternalUIGrammar.g:12444:5: (lv_sortOrderAssignment_26_0= ruleUiSortOrderAssignment )
+                            // InternalUIGrammar.g:12445:6: lv_sortOrderAssignment_26_0= ruleUiSortOrderAssignment
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              						newCompositeNode(grammarAccess.getUiTableAccess().getSortOrderAssignmentUiSortOrderAssignmentParserRuleCall_4_3_0());
+                              					
+                            }
+                            pushFollow(FOLLOW_90);
+                            lv_sortOrderAssignment_26_0=ruleUiSortOrderAssignment();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						if (current==null) {
+                              							current = createModelElementForParent(grammarAccess.getUiTableRule());
+                              						}
+                              						set(
+                              							current,
+                              							"sortOrderAssignment",
+                              							lv_sortOrderAssignment_26_0,
+                              							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiSortOrderAssignment");
+                              						afterParserOrEnumRuleCall();
+                              					
+                            }
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    // InternalUIGrammar.g:12462:4: ( ( (lv_validators_27_0= ruleUiValidator ) ) | ( (lv_bindings_28_0= ruleUiBinding ) ) )*
+                    loop299:
+                    do {
+                        int alt299=3;
+                        int LA299_0 = input.LA(1);
+
+                        if ( ((LA299_0>=147 && LA299_0<=151)) ) {
+                            alt299=1;
+                        }
+                        else if ( (LA299_0==26) ) {
+                            alt299=2;
+                        }
+
+
+                        switch (alt299) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:12463:5: ( (lv_validators_27_0= ruleUiValidator ) )
+                    	    {
+                    	    // InternalUIGrammar.g:12463:5: ( (lv_validators_27_0= ruleUiValidator ) )
+                    	    // InternalUIGrammar.g:12464:6: (lv_validators_27_0= ruleUiValidator )
+                    	    {
+                    	    // InternalUIGrammar.g:12464:6: (lv_validators_27_0= ruleUiValidator )
+                    	    // InternalUIGrammar.g:12465:7: lv_validators_27_0= ruleUiValidator
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiTableAccess().getValidatorsUiValidatorParserRuleCall_4_4_0_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_validators_27_0=ruleUiValidator();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiTableRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"validators",
+                    	      								lv_validators_27_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:12483:5: ( (lv_bindings_28_0= ruleUiBinding ) )
+                    	    {
+                    	    // InternalUIGrammar.g:12483:5: ( (lv_bindings_28_0= ruleUiBinding ) )
+                    	    // InternalUIGrammar.g:12484:6: (lv_bindings_28_0= ruleUiBinding )
+                    	    {
+                    	    // InternalUIGrammar.g:12484:6: (lv_bindings_28_0= ruleUiBinding )
+                    	    // InternalUIGrammar.g:12485:7: lv_bindings_28_0= ruleUiBinding
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiTableAccess().getBindingsUiBindingParserRuleCall_4_4_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_bindings_28_0=ruleUiBinding();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiTableRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"bindings",
+                    	      								lv_bindings_28_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop299;
+                        }
+                    } while (true);
+
+                    // InternalUIGrammar.g:12503:4: ( (lv_processorAssignments_29_0= ruleUiVisibilityProcessorAssignment ) )*
+                    loop300:
+                    do {
+                        int alt300=2;
+                        int LA300_0 = input.LA(1);
+
+                        if ( (LA300_0==153) ) {
+                            alt300=1;
+                        }
+
+
+                        switch (alt300) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:12504:5: (lv_processorAssignments_29_0= ruleUiVisibilityProcessorAssignment )
+                    	    {
+                    	    // InternalUIGrammar.g:12504:5: (lv_processorAssignments_29_0= ruleUiVisibilityProcessorAssignment )
+                    	    // InternalUIGrammar.g:12505:6: lv_processorAssignments_29_0= ruleUiVisibilityProcessorAssignment
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newCompositeNode(grammarAccess.getUiTableAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_5_0());
+                    	      					
+                    	    }
+                    	    pushFollow(FOLLOW_42);
+                    	    lv_processorAssignments_29_0=ruleUiVisibilityProcessorAssignment();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						if (current==null) {
+                    	      							current = createModelElementForParent(grammarAccess.getUiTableRule());
+                    	      						}
+                    	      						add(
+                    	      							current,
+                    	      							"processorAssignments",
+                    	      							lv_processorAssignments_29_0,
+                    	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+                    	      						afterParserOrEnumRuleCall();
+                    	      					
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop300;
+                        }
+                    } while (true);
+
+                    otherlv_30=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_30, grammarAccess.getUiTableAccess().getRightCurlyBracketKeyword_4_6());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiTable"
+
+
+    // $ANTLR start "entryRuleUiComboBox"
+    // InternalUIGrammar.g:12531:1: entryRuleUiComboBox returns [EObject current=null] : iv_ruleUiComboBox= ruleUiComboBox EOF ;
+    public final EObject entryRuleUiComboBox() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiComboBox = null;
+
+
+        try {
+            // InternalUIGrammar.g:12531:51: (iv_ruleUiComboBox= ruleUiComboBox EOF )
+            // InternalUIGrammar.g:12532:2: iv_ruleUiComboBox= ruleUiComboBox EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiComboBoxRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiComboBox=ruleUiComboBox();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiComboBox; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiComboBox"
+
+
+    // $ANTLR start "ruleUiComboBox"
+    // InternalUIGrammar.g:12538:1: ruleUiComboBox returns [EObject current=null] : ( () otherlv_1= 'combo' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_23_0= 'useBeanService' ) ) (otherlv_24= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_25_0= 'readonly' ) ) ) ) ) )* ) ) ) ( ( (lv_validators_26_0= ruleUiValidator ) ) | ( (lv_bindings_27_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_28_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_29= '}' )? ) ;
+    public final EObject ruleUiComboBox() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_5=null;
+        Token lv_styles_6_0=null;
+        Token otherlv_7=null;
+        Token lv_name_8_0=null;
+        Token otherlv_9=null;
+        Token otherlv_11=null;
+        Token otherlv_13=null;
+        Token otherlv_14=null;
+        Token otherlv_15=null;
+        Token otherlv_16=null;
+        Token otherlv_17=null;
+        Token otherlv_19=null;
+        Token otherlv_20=null;
+        Token otherlv_21=null;
+        Token otherlv_22=null;
+        Token lv_consumeBeanService_23_0=null;
+        Token otherlv_24=null;
+        Token lv_readonly_25_0=null;
+        Token otherlv_29=null;
+        EObject lv_i18nInfo_4_0 = null;
+
+        EObject lv_jvmType_12_0 = null;
+
+        EObject lv_descriptionProperty_18_0 = null;
+
+        EObject lv_validators_26_0 = null;
+
+        EObject lv_bindings_27_0 = null;
+
+        EObject lv_processorAssignments_28_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:12544:2: ( ( () otherlv_1= 'combo' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_23_0= 'useBeanService' ) ) (otherlv_24= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_25_0= 'readonly' ) ) ) ) ) )* ) ) ) ( ( (lv_validators_26_0= ruleUiValidator ) ) | ( (lv_bindings_27_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_28_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_29= '}' )? ) )
+            // InternalUIGrammar.g:12545:2: ( () otherlv_1= 'combo' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_23_0= 'useBeanService' ) ) (otherlv_24= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_25_0= 'readonly' ) ) ) ) ) )* ) ) ) ( ( (lv_validators_26_0= ruleUiValidator ) ) | ( (lv_bindings_27_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_28_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_29= '}' )? )
+            {
+            // InternalUIGrammar.g:12545:2: ( () otherlv_1= 'combo' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_23_0= 'useBeanService' ) ) (otherlv_24= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_25_0= 'readonly' ) ) ) ) ) )* ) ) ) ( ( (lv_validators_26_0= ruleUiValidator ) ) | ( (lv_bindings_27_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_28_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_29= '}' )? )
+            // InternalUIGrammar.g:12546:3: () otherlv_1= 'combo' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_23_0= 'useBeanService' ) ) (otherlv_24= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_25_0= 'readonly' ) ) ) ) ) )* ) ) ) ( ( (lv_validators_26_0= ruleUiValidator ) ) | ( (lv_bindings_27_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_28_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_29= '}' )?
+            {
+            // InternalUIGrammar.g:12546:3: ()
+            // InternalUIGrammar.g:12547:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiComboBoxAccess().getUiComboBoxAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,128,FOLLOW_86); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiComboBoxAccess().getComboKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:12557:3: (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )?
+            int alt303=2;
+            int LA303_0 = input.LA(1);
+
+            if ( (LA303_0==45) ) {
+                alt303=1;
+            }
+            switch (alt303) {
+                case 1 :
+                    // InternalUIGrammar.g:12558:4: otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')'
+                    {
+                    otherlv_2=(Token)match(input,45,FOLLOW_63); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getUiComboBoxAccess().getLeftParenthesisKeyword_2_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:12562:4: ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:12563:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:12563:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:12564:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_2_1());
+                    // InternalUIGrammar.g:12567:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:12568:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:12568:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )*
+                    loop302:
+                    do {
+                        int alt302=3;
+                        int LA302_0 = input.LA(1);
+
+                        if ( LA302_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_2_1(), 0) ) {
+                            alt302=1;
+                        }
+                        else if ( LA302_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_2_1(), 1) ) {
+                            alt302=2;
+                        }
+
+
+                        switch (alt302) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:12569:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:12569:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    // InternalUIGrammar.g:12570:6: {...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_2_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiComboBox", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_2_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:12570:110: ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    // InternalUIGrammar.g:12571:7: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_2_1(), 0);
+                    	    // InternalUIGrammar.g:12574:10: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    // InternalUIGrammar.g:12574:11: {...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiComboBox", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:12574:20: ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    // InternalUIGrammar.g:12574:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    {
+                    	    // InternalUIGrammar.g:12574:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    // InternalUIGrammar.g:12575:11: lv_i18nInfo_4_0= ruleUiI18nInfo
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getUiComboBoxAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_63);
+                    	    lv_i18nInfo_4_0=ruleUiI18nInfo();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getUiComboBoxRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"i18nInfo",
+                    	      												lv_i18nInfo_4_0,
+                    	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:12597:5: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:12597:5: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:12598:6: {...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_2_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiComboBox", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_2_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:12598:110: ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:12599:7: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_2_1(), 1);
+                    	    // InternalUIGrammar.g:12602:10: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:12602:11: {...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiComboBox", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:12602:20: (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:12602:21: otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_5=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_5, grammarAccess.getUiComboBoxAccess().getStylesKeyword_2_1_1_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:12606:10: ( (lv_styles_6_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:12607:11: (lv_styles_6_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:12607:11: (lv_styles_6_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:12608:12: lv_styles_6_0= RULE_STRING
+                    	    {
+                    	    lv_styles_6_0=(Token)match(input,RULE_STRING,FOLLOW_63); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_styles_6_0, grammarAccess.getUiComboBoxAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiComboBoxRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"styles",
+                    	      													lv_styles_6_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop302;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_2_1());
+
+                    }
+
+                    otherlv_7=(Token)match(input,47,FOLLOW_88); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_7, grammarAccess.getUiComboBoxAccess().getRightParenthesisKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:12642:3: ( (lv_name_8_0= RULE_ID ) )?
+            int alt304=2;
+            int LA304_0 = input.LA(1);
+
+            if ( (LA304_0==RULE_ID) ) {
+                alt304=1;
+            }
+            switch (alt304) {
+                case 1 :
+                    // InternalUIGrammar.g:12643:4: (lv_name_8_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:12643:4: (lv_name_8_0= RULE_ID )
+                    // InternalUIGrammar.g:12644:5: lv_name_8_0= RULE_ID
+                    {
+                    lv_name_8_0=(Token)match(input,RULE_ID,FOLLOW_89); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_8_0, grammarAccess.getUiComboBoxAccess().getNameIDTerminalRuleCall_3_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiComboBoxRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_8_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:12660:3: (otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_23_0= 'useBeanService' ) ) (otherlv_24= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_25_0= 'readonly' ) ) ) ) ) )* ) ) ) ( ( (lv_validators_26_0= ruleUiValidator ) ) | ( (lv_bindings_27_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_28_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_29= '}' )?
+            int alt313=2;
+            int LA313_0 = input.LA(1);
+
+            if ( (LA313_0==20) ) {
+                alt313=1;
+            }
+            switch (alt313) {
+                case 1 :
+                    // InternalUIGrammar.g:12661:4: otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_23_0= 'useBeanService' ) ) (otherlv_24= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_25_0= 'readonly' ) ) ) ) ) )* ) ) ) ( ( (lv_validators_26_0= ruleUiValidator ) ) | ( (lv_bindings_27_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_28_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_29= '}'
+                    {
+                    otherlv_9=(Token)match(input,20,FOLLOW_107); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_9, grammarAccess.getUiComboBoxAccess().getLeftCurlyBracketKeyword_4_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:12665:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_23_0= 'useBeanService' ) ) (otherlv_24= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_25_0= 'readonly' ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:12666:5: ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_23_0= 'useBeanService' ) ) (otherlv_24= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_25_0= 'readonly' ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:12666:5: ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_23_0= 'useBeanService' ) ) (otherlv_24= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_25_0= 'readonly' ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:12667:6: ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_23_0= 'useBeanService' ) ) (otherlv_24= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_25_0= 'readonly' ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1());
+                    // InternalUIGrammar.g:12670:6: ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_23_0= 'useBeanService' ) ) (otherlv_24= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_25_0= 'readonly' ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:12671:7: ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_23_0= 'useBeanService' ) ) (otherlv_24= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_25_0= 'readonly' ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:12671:7: ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_23_0= 'useBeanService' ) ) (otherlv_24= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_25_0= 'readonly' ) ) ) ) ) )*
+                    loop310:
+                    do {
+                        int alt310=7;
+                        int LA310_0 = input.LA(1);
+
+                        if ( LA310_0 == 75 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 0) ) {
+                            alt310=1;
+                        }
+                        else if ( LA310_0 == 108 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 1) ) {
+                            alt310=2;
+                        }
+                        else if ( LA310_0 == 114 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 2) ) {
+                            alt310=3;
+                        }
+                        else if ( LA310_0 == 115 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 3) ) {
+                            alt310=4;
+                        }
+                        else if ( LA310_0 == 126 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 4) ) {
+                            alt310=5;
+                        }
+                        else if ( LA310_0 == 65 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 5) ) {
+                            alt310=6;
+                        }
+
+
+                        switch (alt310) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:12672:5: ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:12672:5: ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) ) )
+                    	    // InternalUIGrammar.g:12673:6: {...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiComboBox", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:12673:110: ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) ) )
+                    	    // InternalUIGrammar.g:12674:7: ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 0);
+                    	    // InternalUIGrammar.g:12677:10: ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? ) )
+                    	    // InternalUIGrammar.g:12677:11: {...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiComboBox", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:12677:20: (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )? )
+                    	    // InternalUIGrammar.g:12677:21: otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) (otherlv_13= ';' )?
+                    	    {
+                    	    otherlv_11=(Token)match(input,75,FOLLOW_16); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_11, grammarAccess.getUiComboBoxAccess().getTypeKeyword_4_1_0_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:12681:10: ( (lv_jvmType_12_0= ruleJvmTypeReference ) )
+                    	    // InternalUIGrammar.g:12682:11: (lv_jvmType_12_0= ruleJvmTypeReference )
+                    	    {
+                    	    // InternalUIGrammar.g:12682:11: (lv_jvmType_12_0= ruleJvmTypeReference )
+                    	    // InternalUIGrammar.g:12683:12: lv_jvmType_12_0= ruleJvmTypeReference
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newCompositeNode(grammarAccess.getUiComboBoxAccess().getJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0());
+                    	      											
+                    	    }
+                    	    pushFollow(FOLLOW_108);
+                    	    lv_jvmType_12_0=ruleJvmTypeReference();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElementForParent(grammarAccess.getUiComboBoxRule());
+                    	      												}
+                    	      												set(
+                    	      													current,
+                    	      													"jvmType",
+                    	      													lv_jvmType_12_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+                    	      												afterParserOrEnumRuleCall();
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    // InternalUIGrammar.g:12700:10: (otherlv_13= ';' )?
+                    	    int alt305=2;
+                    	    int LA305_0 = input.LA(1);
+
+                    	    if ( (LA305_0==16) ) {
+                    	        alt305=1;
+                    	    }
+                    	    switch (alt305) {
+                    	        case 1 :
+                    	            // InternalUIGrammar.g:12701:11: otherlv_13= ';'
+                    	            {
+                    	            otherlv_13=(Token)match(input,16,FOLLOW_107); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											newLeafNode(otherlv_13, grammarAccess.getUiComboBoxAccess().getSemicolonKeyword_4_1_0_2());
+                    	              										
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:12712:5: ({...}? => ( ({...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:12712:5: ({...}? => ( ({...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? ) ) ) )
+                    	    // InternalUIGrammar.g:12713:6: {...}? => ( ({...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiComboBox", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:12713:110: ( ({...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? ) ) )
+                    	    // InternalUIGrammar.g:12714:7: ({...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 1);
+                    	    // InternalUIGrammar.g:12717:10: ({...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? ) )
+                    	    // InternalUIGrammar.g:12717:11: {...}? => (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiComboBox", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:12717:20: (otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )? )
+                    	    // InternalUIGrammar.g:12717:21: otherlv_14= 'captionField' ( (otherlv_15= RULE_ID ) ) (otherlv_16= ';' )?
+                    	    {
+                    	    otherlv_14=(Token)match(input,108,FOLLOW_3); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_14, grammarAccess.getUiComboBoxAccess().getCaptionFieldKeyword_4_1_1_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:12721:10: ( (otherlv_15= RULE_ID ) )
+                    	    // InternalUIGrammar.g:12722:11: (otherlv_15= RULE_ID )
+                    	    {
+                    	    // InternalUIGrammar.g:12722:11: (otherlv_15= RULE_ID )
+                    	    // InternalUIGrammar.g:12723:12: otherlv_15= RULE_ID
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiComboBoxRule());
+                    	      												}
+                    	      											
+                    	    }
+                    	    otherlv_15=(Token)match(input,RULE_ID,FOLLOW_108); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(otherlv_15, grammarAccess.getUiComboBoxAccess().getItemCaptionPropertyJvmOperationCrossReference_4_1_1_1_0());
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    // InternalUIGrammar.g:12734:10: (otherlv_16= ';' )?
+                    	    int alt306=2;
+                    	    int LA306_0 = input.LA(1);
+
+                    	    if ( (LA306_0==16) ) {
+                    	        alt306=1;
+                    	    }
+                    	    switch (alt306) {
+                    	        case 1 :
+                    	            // InternalUIGrammar.g:12735:11: otherlv_16= ';'
+                    	            {
+                    	            otherlv_16=(Token)match(input,16,FOLLOW_107); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											newLeafNode(otherlv_16, grammarAccess.getUiComboBoxAccess().getSemicolonKeyword_4_1_1_2());
+                    	              										
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 3 :
+                    	    // InternalUIGrammar.g:12746:5: ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:12746:5: ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) )
+                    	    // InternalUIGrammar.g:12747:6: {...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 2) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiComboBox", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 2)");
+                    	    }
+                    	    // InternalUIGrammar.g:12747:110: ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) )
+                    	    // InternalUIGrammar.g:12748:7: ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 2);
+                    	    // InternalUIGrammar.g:12751:10: ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) )
+                    	    // InternalUIGrammar.g:12751:11: {...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiComboBox", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:12751:20: (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? )
+                    	    // InternalUIGrammar.g:12751:21: otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )?
+                    	    {
+                    	    otherlv_17=(Token)match(input,114,FOLLOW_3); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_17, grammarAccess.getUiComboBoxAccess().getDescriptionFieldKeyword_4_1_2_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:12755:10: ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) )
+                    	    // InternalUIGrammar.g:12756:11: (lv_descriptionProperty_18_0= ruleUiNestedProperty )
+                    	    {
+                    	    // InternalUIGrammar.g:12756:11: (lv_descriptionProperty_18_0= ruleUiNestedProperty )
+                    	    // InternalUIGrammar.g:12757:12: lv_descriptionProperty_18_0= ruleUiNestedProperty
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newCompositeNode(grammarAccess.getUiComboBoxAccess().getDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_2_1_0());
+                    	      											
+                    	    }
+                    	    pushFollow(FOLLOW_108);
+                    	    lv_descriptionProperty_18_0=ruleUiNestedProperty();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElementForParent(grammarAccess.getUiComboBoxRule());
+                    	      												}
+                    	      												set(
+                    	      													current,
+                    	      													"descriptionProperty",
+                    	      													lv_descriptionProperty_18_0,
+                    	      													"org.eclipse.osbp.ecview.dsl.UIGrammar.UiNestedProperty");
+                    	      												afterParserOrEnumRuleCall();
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    // InternalUIGrammar.g:12774:10: (otherlv_19= ';' )?
+                    	    int alt307=2;
+                    	    int LA307_0 = input.LA(1);
+
+                    	    if ( (LA307_0==16) ) {
+                    	        alt307=1;
+                    	    }
+                    	    switch (alt307) {
+                    	        case 1 :
+                    	            // InternalUIGrammar.g:12775:11: otherlv_19= ';'
+                    	            {
+                    	            otherlv_19=(Token)match(input,16,FOLLOW_107); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											newLeafNode(otherlv_19, grammarAccess.getUiComboBoxAccess().getSemicolonKeyword_4_1_2_2());
+                    	              										
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 4 :
+                    	    // InternalUIGrammar.g:12786:5: ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:12786:5: ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? ) ) ) )
+                    	    // InternalUIGrammar.g:12787:6: {...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 3) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiComboBox", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 3)");
+                    	    }
+                    	    // InternalUIGrammar.g:12787:110: ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? ) ) )
+                    	    // InternalUIGrammar.g:12788:7: ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 3);
+                    	    // InternalUIGrammar.g:12791:10: ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? ) )
+                    	    // InternalUIGrammar.g:12791:11: {...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiComboBox", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:12791:20: (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )? )
+                    	    // InternalUIGrammar.g:12791:21: otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) (otherlv_22= ';' )?
+                    	    {
+                    	    otherlv_20=(Token)match(input,115,FOLLOW_3); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_20, grammarAccess.getUiComboBoxAccess().getImageFieldKeyword_4_1_3_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:12795:10: ( (otherlv_21= RULE_ID ) )
+                    	    // InternalUIGrammar.g:12796:11: (otherlv_21= RULE_ID )
+                    	    {
+                    	    // InternalUIGrammar.g:12796:11: (otherlv_21= RULE_ID )
+                    	    // InternalUIGrammar.g:12797:12: otherlv_21= RULE_ID
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiComboBoxRule());
+                    	      												}
+                    	      											
+                    	    }
+                    	    otherlv_21=(Token)match(input,RULE_ID,FOLLOW_108); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(otherlv_21, grammarAccess.getUiComboBoxAccess().getItemImagePropertyJvmOperationCrossReference_4_1_3_1_0());
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    // InternalUIGrammar.g:12808:10: (otherlv_22= ';' )?
+                    	    int alt308=2;
+                    	    int LA308_0 = input.LA(1);
+
+                    	    if ( (LA308_0==16) ) {
+                    	        alt308=1;
+                    	    }
+                    	    switch (alt308) {
+                    	        case 1 :
+                    	            // InternalUIGrammar.g:12809:11: otherlv_22= ';'
+                    	            {
+                    	            otherlv_22=(Token)match(input,16,FOLLOW_107); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											newLeafNode(otherlv_22, grammarAccess.getUiComboBoxAccess().getSemicolonKeyword_4_1_3_2());
+                    	              										
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 5 :
+                    	    // InternalUIGrammar.g:12820:5: ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_23_0= 'useBeanService' ) ) (otherlv_24= ';' )? ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:12820:5: ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_23_0= 'useBeanService' ) ) (otherlv_24= ';' )? ) ) ) )
+                    	    // InternalUIGrammar.g:12821:6: {...}? => ( ({...}? => ( ( (lv_consumeBeanService_23_0= 'useBeanService' ) ) (otherlv_24= ';' )? ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 4) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiComboBox", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 4)");
+                    	    }
+                    	    // InternalUIGrammar.g:12821:110: ( ({...}? => ( ( (lv_consumeBeanService_23_0= 'useBeanService' ) ) (otherlv_24= ';' )? ) ) )
+                    	    // InternalUIGrammar.g:12822:7: ({...}? => ( ( (lv_consumeBeanService_23_0= 'useBeanService' ) ) (otherlv_24= ';' )? ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 4);
+                    	    // InternalUIGrammar.g:12825:10: ({...}? => ( ( (lv_consumeBeanService_23_0= 'useBeanService' ) ) (otherlv_24= ';' )? ) )
+                    	    // InternalUIGrammar.g:12825:11: {...}? => ( ( (lv_consumeBeanService_23_0= 'useBeanService' ) ) (otherlv_24= ';' )? )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiComboBox", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:12825:20: ( ( (lv_consumeBeanService_23_0= 'useBeanService' ) ) (otherlv_24= ';' )? )
+                    	    // InternalUIGrammar.g:12825:21: ( (lv_consumeBeanService_23_0= 'useBeanService' ) ) (otherlv_24= ';' )?
+                    	    {
+                    	    // InternalUIGrammar.g:12825:21: ( (lv_consumeBeanService_23_0= 'useBeanService' ) )
+                    	    // InternalUIGrammar.g:12826:11: (lv_consumeBeanService_23_0= 'useBeanService' )
+                    	    {
+                    	    // InternalUIGrammar.g:12826:11: (lv_consumeBeanService_23_0= 'useBeanService' )
+                    	    // InternalUIGrammar.g:12827:12: lv_consumeBeanService_23_0= 'useBeanService'
+                    	    {
+                    	    lv_consumeBeanService_23_0=(Token)match(input,126,FOLLOW_108); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_consumeBeanService_23_0, grammarAccess.getUiComboBoxAccess().getConsumeBeanServiceUseBeanServiceKeyword_4_1_4_0_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiComboBoxRule());
+                    	      												}
+                    	      												setWithLastConsumed(current, "consumeBeanService", true, "useBeanService");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    // InternalUIGrammar.g:12839:10: (otherlv_24= ';' )?
+                    	    int alt309=2;
+                    	    int LA309_0 = input.LA(1);
+
+                    	    if ( (LA309_0==16) ) {
+                    	        alt309=1;
+                    	    }
+                    	    switch (alt309) {
+                    	        case 1 :
+                    	            // InternalUIGrammar.g:12840:11: otherlv_24= ';'
+                    	            {
+                    	            otherlv_24=(Token)match(input,16,FOLLOW_107); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											newLeafNode(otherlv_24, grammarAccess.getUiComboBoxAccess().getSemicolonKeyword_4_1_4_1());
+                    	              										
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 6 :
+                    	    // InternalUIGrammar.g:12851:5: ({...}? => ( ({...}? => ( (lv_readonly_25_0= 'readonly' ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:12851:5: ({...}? => ( ({...}? => ( (lv_readonly_25_0= 'readonly' ) ) ) ) )
+                    	    // InternalUIGrammar.g:12852:6: {...}? => ( ({...}? => ( (lv_readonly_25_0= 'readonly' ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 5) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiComboBox", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 5)");
+                    	    }
+                    	    // InternalUIGrammar.g:12852:110: ( ({...}? => ( (lv_readonly_25_0= 'readonly' ) ) ) )
+                    	    // InternalUIGrammar.g:12853:7: ({...}? => ( (lv_readonly_25_0= 'readonly' ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 5);
+                    	    // InternalUIGrammar.g:12856:10: ({...}? => ( (lv_readonly_25_0= 'readonly' ) ) )
+                    	    // InternalUIGrammar.g:12856:11: {...}? => ( (lv_readonly_25_0= 'readonly' ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiComboBox", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:12856:20: ( (lv_readonly_25_0= 'readonly' ) )
+                    	    // InternalUIGrammar.g:12856:21: (lv_readonly_25_0= 'readonly' )
+                    	    {
+                    	    // InternalUIGrammar.g:12856:21: (lv_readonly_25_0= 'readonly' )
+                    	    // InternalUIGrammar.g:12857:11: lv_readonly_25_0= 'readonly'
+                    	    {
+                    	    lv_readonly_25_0=(Token)match(input,65,FOLLOW_107); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newLeafNode(lv_readonly_25_0, grammarAccess.getUiComboBoxAccess().getReadonlyReadonlyKeyword_4_1_5_0());
+                    	      										
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElement(grammarAccess.getUiComboBoxRule());
+                    	      											}
+                    	      											setWithLastConsumed(current, "readonly", true, "readonly");
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop310;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1());
+
+                    }
+
+                    // InternalUIGrammar.g:12881:4: ( ( (lv_validators_26_0= ruleUiValidator ) ) | ( (lv_bindings_27_0= ruleUiBinding ) ) )*
+                    loop311:
+                    do {
+                        int alt311=3;
+                        int LA311_0 = input.LA(1);
+
+                        if ( ((LA311_0>=147 && LA311_0<=151)) ) {
+                            alt311=1;
+                        }
+                        else if ( (LA311_0==26) ) {
+                            alt311=2;
+                        }
+
+
+                        switch (alt311) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:12882:5: ( (lv_validators_26_0= ruleUiValidator ) )
+                    	    {
+                    	    // InternalUIGrammar.g:12882:5: ( (lv_validators_26_0= ruleUiValidator ) )
+                    	    // InternalUIGrammar.g:12883:6: (lv_validators_26_0= ruleUiValidator )
+                    	    {
+                    	    // InternalUIGrammar.g:12883:6: (lv_validators_26_0= ruleUiValidator )
+                    	    // InternalUIGrammar.g:12884:7: lv_validators_26_0= ruleUiValidator
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiComboBoxAccess().getValidatorsUiValidatorParserRuleCall_4_2_0_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_validators_26_0=ruleUiValidator();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiComboBoxRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"validators",
+                    	      								lv_validators_26_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:12902:5: ( (lv_bindings_27_0= ruleUiBinding ) )
+                    	    {
+                    	    // InternalUIGrammar.g:12902:5: ( (lv_bindings_27_0= ruleUiBinding ) )
+                    	    // InternalUIGrammar.g:12903:6: (lv_bindings_27_0= ruleUiBinding )
+                    	    {
+                    	    // InternalUIGrammar.g:12903:6: (lv_bindings_27_0= ruleUiBinding )
+                    	    // InternalUIGrammar.g:12904:7: lv_bindings_27_0= ruleUiBinding
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiComboBoxAccess().getBindingsUiBindingParserRuleCall_4_2_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_bindings_27_0=ruleUiBinding();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiComboBoxRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"bindings",
+                    	      								lv_bindings_27_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop311;
+                        }
+                    } while (true);
+
+                    // InternalUIGrammar.g:12922:4: ( (lv_processorAssignments_28_0= ruleUiVisibilityProcessorAssignment ) )*
+                    loop312:
+                    do {
+                        int alt312=2;
+                        int LA312_0 = input.LA(1);
+
+                        if ( (LA312_0==153) ) {
+                            alt312=1;
+                        }
+
+
+                        switch (alt312) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:12923:5: (lv_processorAssignments_28_0= ruleUiVisibilityProcessorAssignment )
+                    	    {
+                    	    // InternalUIGrammar.g:12923:5: (lv_processorAssignments_28_0= ruleUiVisibilityProcessorAssignment )
+                    	    // InternalUIGrammar.g:12924:6: lv_processorAssignments_28_0= ruleUiVisibilityProcessorAssignment
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newCompositeNode(grammarAccess.getUiComboBoxAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0());
+                    	      					
+                    	    }
+                    	    pushFollow(FOLLOW_42);
+                    	    lv_processorAssignments_28_0=ruleUiVisibilityProcessorAssignment();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						if (current==null) {
+                    	      							current = createModelElementForParent(grammarAccess.getUiComboBoxRule());
+                    	      						}
+                    	      						add(
+                    	      							current,
+                    	      							"processorAssignments",
+                    	      							lv_processorAssignments_28_0,
+                    	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+                    	      						afterParserOrEnumRuleCall();
+                    	      					
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop312;
+                        }
+                    } while (true);
+
+                    otherlv_29=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_29, grammarAccess.getUiComboBoxAccess().getRightCurlyBracketKeyword_4_4());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiComboBox"
+
+
+    // $ANTLR start "entryRuleUiButton"
+    // InternalUIGrammar.g:12950:1: entryRuleUiButton returns [EObject current=null] : iv_ruleUiButton= ruleUiButton EOF ;
+    public final EObject entryRuleUiButton() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiButton = null;
+
+
+        try {
+            // InternalUIGrammar.g:12950:49: (iv_ruleUiButton= ruleUiButton EOF )
+            // InternalUIGrammar.g:12951:2: iv_ruleUiButton= ruleUiButton EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiButtonRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiButton=ruleUiButton();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiButton; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiButton"
+
+
+    // $ANTLR start "ruleUiButton"
+    // InternalUIGrammar.g:12957:1: ruleUiButton returns [EObject current=null] : ( () otherlv_1= 'button' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? ) ;
+    public final EObject ruleUiButton() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token lv_readonly_5_0=null;
+        Token otherlv_6=null;
+        Token lv_styles_7_0=null;
+        Token otherlv_8=null;
+        Token lv_name_9_0=null;
+        EObject lv_i18nInfo_4_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:12963:2: ( ( () otherlv_1= 'button' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? ) )
+            // InternalUIGrammar.g:12964:2: ( () otherlv_1= 'button' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? )
+            {
+            // InternalUIGrammar.g:12964:2: ( () otherlv_1= 'button' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? )
+            // InternalUIGrammar.g:12965:3: () otherlv_1= 'button' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )?
+            {
+            // InternalUIGrammar.g:12965:3: ()
+            // InternalUIGrammar.g:12966:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiButtonAccess().getUiButtonAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,129,FOLLOW_109); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiButtonAccess().getButtonKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:12976:3: (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )?
+            int alt315=2;
+            int LA315_0 = input.LA(1);
+
+            if ( (LA315_0==45) ) {
+                alt315=1;
+            }
+            switch (alt315) {
+                case 1 :
+                    // InternalUIGrammar.g:12977:4: otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')'
+                    {
+                    otherlv_2=(Token)match(input,45,FOLLOW_62); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getUiButtonAccess().getLeftParenthesisKeyword_2_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:12981:4: ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:12982:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:12982:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:12983:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiButtonAccess().getUnorderedGroup_2_1());
+                    // InternalUIGrammar.g:12986:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:12987:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:12987:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )*
+                    loop314:
+                    do {
+                        int alt314=4;
+                        int LA314_0 = input.LA(1);
+
+                        if ( LA314_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiButtonAccess().getUnorderedGroup_2_1(), 0) ) {
+                            alt314=1;
+                        }
+                        else if ( LA314_0 == 65 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiButtonAccess().getUnorderedGroup_2_1(), 1) ) {
+                            alt314=2;
+                        }
+                        else if ( LA314_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiButtonAccess().getUnorderedGroup_2_1(), 2) ) {
+                            alt314=3;
+                        }
+
+
+                        switch (alt314) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:12988:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:12988:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    // InternalUIGrammar.g:12989:6: {...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiButtonAccess().getUnorderedGroup_2_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiButton", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiButtonAccess().getUnorderedGroup_2_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:12989:108: ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    // InternalUIGrammar.g:12990:7: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiButtonAccess().getUnorderedGroup_2_1(), 0);
+                    	    // InternalUIGrammar.g:12993:10: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    // InternalUIGrammar.g:12993:11: {...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiButton", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:12993:20: ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    // InternalUIGrammar.g:12993:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    {
+                    	    // InternalUIGrammar.g:12993:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    // InternalUIGrammar.g:12994:11: lv_i18nInfo_4_0= ruleUiI18nInfo
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getUiButtonAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_62);
+                    	    lv_i18nInfo_4_0=ruleUiI18nInfo();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getUiButtonRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"i18nInfo",
+                    	      												lv_i18nInfo_4_0,
+                    	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiButtonAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:13016:5: ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:13016:5: ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) )
+                    	    // InternalUIGrammar.g:13017:6: {...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiButtonAccess().getUnorderedGroup_2_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiButton", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiButtonAccess().getUnorderedGroup_2_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:13017:108: ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) )
+                    	    // InternalUIGrammar.g:13018:7: ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiButtonAccess().getUnorderedGroup_2_1(), 1);
+                    	    // InternalUIGrammar.g:13021:10: ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) )
+                    	    // InternalUIGrammar.g:13021:11: {...}? => ( (lv_readonly_5_0= 'readonly' ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiButton", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:13021:20: ( (lv_readonly_5_0= 'readonly' ) )
+                    	    // InternalUIGrammar.g:13021:21: (lv_readonly_5_0= 'readonly' )
+                    	    {
+                    	    // InternalUIGrammar.g:13021:21: (lv_readonly_5_0= 'readonly' )
+                    	    // InternalUIGrammar.g:13022:11: lv_readonly_5_0= 'readonly'
+                    	    {
+                    	    lv_readonly_5_0=(Token)match(input,65,FOLLOW_62); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newLeafNode(lv_readonly_5_0, grammarAccess.getUiButtonAccess().getReadonlyReadonlyKeyword_2_1_1_0());
+                    	      										
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElement(grammarAccess.getUiButtonRule());
+                    	      											}
+                    	      											setWithLastConsumed(current, "readonly", true, "readonly");
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiButtonAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 3 :
+                    	    // InternalUIGrammar.g:13039:5: ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:13039:5: ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:13040:6: {...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiButtonAccess().getUnorderedGroup_2_1(), 2) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiButton", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiButtonAccess().getUnorderedGroup_2_1(), 2)");
+                    	    }
+                    	    // InternalUIGrammar.g:13040:108: ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:13041:7: ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiButtonAccess().getUnorderedGroup_2_1(), 2);
+                    	    // InternalUIGrammar.g:13044:10: ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:13044:11: {...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiButton", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:13044:20: (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:13044:21: otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_6=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_6, grammarAccess.getUiButtonAccess().getStylesKeyword_2_1_2_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:13048:10: ( (lv_styles_7_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:13049:11: (lv_styles_7_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:13049:11: (lv_styles_7_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:13050:12: lv_styles_7_0= RULE_STRING
+                    	    {
+                    	    lv_styles_7_0=(Token)match(input,RULE_STRING,FOLLOW_62); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_styles_7_0, grammarAccess.getUiButtonAccess().getStylesSTRINGTerminalRuleCall_2_1_2_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiButtonRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"styles",
+                    	      													lv_styles_7_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiButtonAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop314;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiButtonAccess().getUnorderedGroup_2_1());
+
+                    }
+
+                    otherlv_8=(Token)match(input,47,FOLLOW_110); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_8, grammarAccess.getUiButtonAccess().getRightParenthesisKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:13084:3: ( (lv_name_9_0= RULE_ID ) )?
+            int alt316=2;
+            int LA316_0 = input.LA(1);
+
+            if ( (LA316_0==RULE_ID) ) {
+                alt316=1;
+            }
+            switch (alt316) {
+                case 1 :
+                    // InternalUIGrammar.g:13085:4: (lv_name_9_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:13085:4: (lv_name_9_0= RULE_ID )
+                    // InternalUIGrammar.g:13086:5: lv_name_9_0= RULE_ID
+                    {
+                    lv_name_9_0=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_9_0, grammarAccess.getUiButtonAccess().getNameIDTerminalRuleCall_3_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiButtonRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_9_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiButton"
+
+
+    // $ANTLR start "entryRuleUiMobileNavigationButton"
+    // InternalUIGrammar.g:13106:1: entryRuleUiMobileNavigationButton returns [EObject current=null] : iv_ruleUiMobileNavigationButton= ruleUiMobileNavigationButton EOF ;
+    public final EObject entryRuleUiMobileNavigationButton() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiMobileNavigationButton = null;
+
+
+        try {
+            // InternalUIGrammar.g:13106:65: (iv_ruleUiMobileNavigationButton= ruleUiMobileNavigationButton EOF )
+            // InternalUIGrammar.g:13107:2: iv_ruleUiMobileNavigationButton= ruleUiMobileNavigationButton EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiMobileNavigationButtonRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiMobileNavigationButton=ruleUiMobileNavigationButton();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiMobileNavigationButton; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiMobileNavigationButton"
+
+
+    // $ANTLR start "ruleUiMobileNavigationButton"
+    // InternalUIGrammar.g:13113:1: ruleUiMobileNavigationButton returns [EObject current=null] : ( () otherlv_1= 'navButton' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? ( ( (lv_targetPage_10_0= ruleUiMobileNavigationPage ) ) | (otherlv_11= 'alias' ( (otherlv_12= RULE_ID ) ) ) ) ) ;
+    public final EObject ruleUiMobileNavigationButton() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token lv_readonly_5_0=null;
+        Token otherlv_6=null;
+        Token lv_styles_7_0=null;
+        Token otherlv_8=null;
+        Token lv_name_9_0=null;
+        Token otherlv_11=null;
+        Token otherlv_12=null;
+        EObject lv_i18nInfo_4_0 = null;
+
+        EObject lv_targetPage_10_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:13119:2: ( ( () otherlv_1= 'navButton' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? ( ( (lv_targetPage_10_0= ruleUiMobileNavigationPage ) ) | (otherlv_11= 'alias' ( (otherlv_12= RULE_ID ) ) ) ) ) )
+            // InternalUIGrammar.g:13120:2: ( () otherlv_1= 'navButton' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? ( ( (lv_targetPage_10_0= ruleUiMobileNavigationPage ) ) | (otherlv_11= 'alias' ( (otherlv_12= RULE_ID ) ) ) ) )
+            {
+            // InternalUIGrammar.g:13120:2: ( () otherlv_1= 'navButton' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? ( ( (lv_targetPage_10_0= ruleUiMobileNavigationPage ) ) | (otherlv_11= 'alias' ( (otherlv_12= RULE_ID ) ) ) ) )
+            // InternalUIGrammar.g:13121:3: () otherlv_1= 'navButton' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? ( ( (lv_targetPage_10_0= ruleUiMobileNavigationPage ) ) | (otherlv_11= 'alias' ( (otherlv_12= RULE_ID ) ) ) )
+            {
+            // InternalUIGrammar.g:13121:3: ()
+            // InternalUIGrammar.g:13122:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiMobileNavigationButtonAccess().getUiMobileNavigationButtonAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,130,FOLLOW_111); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiMobileNavigationButtonAccess().getNavButtonKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:13132:3: (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )?
+            int alt318=2;
+            int LA318_0 = input.LA(1);
+
+            if ( (LA318_0==45) ) {
+                alt318=1;
+            }
+            switch (alt318) {
+                case 1 :
+                    // InternalUIGrammar.g:13133:4: otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')'
+                    {
+                    otherlv_2=(Token)match(input,45,FOLLOW_62); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getUiMobileNavigationButtonAccess().getLeftParenthesisKeyword_2_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:13137:4: ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:13138:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:13138:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:13139:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiMobileNavigationButtonAccess().getUnorderedGroup_2_1());
+                    // InternalUIGrammar.g:13142:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:13143:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:13143:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )*
+                    loop317:
+                    do {
+                        int alt317=4;
+                        int LA317_0 = input.LA(1);
+
+                        if ( LA317_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileNavigationButtonAccess().getUnorderedGroup_2_1(), 0) ) {
+                            alt317=1;
+                        }
+                        else if ( LA317_0 == 65 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileNavigationButtonAccess().getUnorderedGroup_2_1(), 1) ) {
+                            alt317=2;
+                        }
+                        else if ( LA317_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileNavigationButtonAccess().getUnorderedGroup_2_1(), 2) ) {
+                            alt317=3;
+                        }
+
+
+                        switch (alt317) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:13144:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:13144:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    // InternalUIGrammar.g:13145:6: {...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileNavigationButtonAccess().getUnorderedGroup_2_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileNavigationButton", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileNavigationButtonAccess().getUnorderedGroup_2_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:13145:124: ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    // InternalUIGrammar.g:13146:7: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiMobileNavigationButtonAccess().getUnorderedGroup_2_1(), 0);
+                    	    // InternalUIGrammar.g:13149:10: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    // InternalUIGrammar.g:13149:11: {...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileNavigationButton", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:13149:20: ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    // InternalUIGrammar.g:13149:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    {
+                    	    // InternalUIGrammar.g:13149:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    // InternalUIGrammar.g:13150:11: lv_i18nInfo_4_0= ruleUiI18nInfo
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getUiMobileNavigationButtonAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_62);
+                    	    lv_i18nInfo_4_0=ruleUiI18nInfo();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getUiMobileNavigationButtonRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"i18nInfo",
+                    	      												lv_i18nInfo_4_0,
+                    	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileNavigationButtonAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:13172:5: ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:13172:5: ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) )
+                    	    // InternalUIGrammar.g:13173:6: {...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileNavigationButtonAccess().getUnorderedGroup_2_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileNavigationButton", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileNavigationButtonAccess().getUnorderedGroup_2_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:13173:124: ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) )
+                    	    // InternalUIGrammar.g:13174:7: ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiMobileNavigationButtonAccess().getUnorderedGroup_2_1(), 1);
+                    	    // InternalUIGrammar.g:13177:10: ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) )
+                    	    // InternalUIGrammar.g:13177:11: {...}? => ( (lv_readonly_5_0= 'readonly' ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileNavigationButton", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:13177:20: ( (lv_readonly_5_0= 'readonly' ) )
+                    	    // InternalUIGrammar.g:13177:21: (lv_readonly_5_0= 'readonly' )
+                    	    {
+                    	    // InternalUIGrammar.g:13177:21: (lv_readonly_5_0= 'readonly' )
+                    	    // InternalUIGrammar.g:13178:11: lv_readonly_5_0= 'readonly'
+                    	    {
+                    	    lv_readonly_5_0=(Token)match(input,65,FOLLOW_62); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newLeafNode(lv_readonly_5_0, grammarAccess.getUiMobileNavigationButtonAccess().getReadonlyReadonlyKeyword_2_1_1_0());
+                    	      										
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElement(grammarAccess.getUiMobileNavigationButtonRule());
+                    	      											}
+                    	      											setWithLastConsumed(current, "readonly", true, "readonly");
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileNavigationButtonAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 3 :
+                    	    // InternalUIGrammar.g:13195:5: ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:13195:5: ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:13196:6: {...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileNavigationButtonAccess().getUnorderedGroup_2_1(), 2) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileNavigationButton", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileNavigationButtonAccess().getUnorderedGroup_2_1(), 2)");
+                    	    }
+                    	    // InternalUIGrammar.g:13196:124: ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:13197:7: ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiMobileNavigationButtonAccess().getUnorderedGroup_2_1(), 2);
+                    	    // InternalUIGrammar.g:13200:10: ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:13200:11: {...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileNavigationButton", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:13200:20: (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:13200:21: otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_6=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_6, grammarAccess.getUiMobileNavigationButtonAccess().getStylesKeyword_2_1_2_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:13204:10: ( (lv_styles_7_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:13205:11: (lv_styles_7_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:13205:11: (lv_styles_7_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:13206:12: lv_styles_7_0= RULE_STRING
+                    	    {
+                    	    lv_styles_7_0=(Token)match(input,RULE_STRING,FOLLOW_62); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_styles_7_0, grammarAccess.getUiMobileNavigationButtonAccess().getStylesSTRINGTerminalRuleCall_2_1_2_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiMobileNavigationButtonRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"styles",
+                    	      													lv_styles_7_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileNavigationButtonAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop317;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiMobileNavigationButtonAccess().getUnorderedGroup_2_1());
+
+                    }
+
+                    otherlv_8=(Token)match(input,47,FOLLOW_112); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_8, grammarAccess.getUiMobileNavigationButtonAccess().getRightParenthesisKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:13240:3: ( (lv_name_9_0= RULE_ID ) )?
+            int alt319=2;
+            int LA319_0 = input.LA(1);
+
+            if ( (LA319_0==RULE_ID) ) {
+                alt319=1;
+            }
+            switch (alt319) {
+                case 1 :
+                    // InternalUIGrammar.g:13241:4: (lv_name_9_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:13241:4: (lv_name_9_0= RULE_ID )
+                    // InternalUIGrammar.g:13242:5: lv_name_9_0= RULE_ID
+                    {
+                    lv_name_9_0=(Token)match(input,RULE_ID,FOLLOW_113); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_9_0, grammarAccess.getUiMobileNavigationButtonAccess().getNameIDTerminalRuleCall_3_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiMobileNavigationButtonRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_9_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:13258:3: ( ( (lv_targetPage_10_0= ruleUiMobileNavigationPage ) ) | (otherlv_11= 'alias' ( (otherlv_12= RULE_ID ) ) ) )
+            int alt320=2;
+            int LA320_0 = input.LA(1);
+
+            if ( (LA320_0==89) ) {
+                alt320=1;
+            }
+            else if ( (LA320_0==131) ) {
+                alt320=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 320, 0, input);
+
+                throw nvae;
+            }
+            switch (alt320) {
+                case 1 :
+                    // InternalUIGrammar.g:13259:4: ( (lv_targetPage_10_0= ruleUiMobileNavigationPage ) )
+                    {
+                    // InternalUIGrammar.g:13259:4: ( (lv_targetPage_10_0= ruleUiMobileNavigationPage ) )
+                    // InternalUIGrammar.g:13260:5: (lv_targetPage_10_0= ruleUiMobileNavigationPage )
+                    {
+                    // InternalUIGrammar.g:13260:5: (lv_targetPage_10_0= ruleUiMobileNavigationPage )
+                    // InternalUIGrammar.g:13261:6: lv_targetPage_10_0= ruleUiMobileNavigationPage
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getUiMobileNavigationButtonAccess().getTargetPageUiMobileNavigationPageParserRuleCall_4_0_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_2);
+                    lv_targetPage_10_0=ruleUiMobileNavigationPage();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getUiMobileNavigationButtonRule());
+                      						}
+                      						set(
+                      							current,
+                      							"targetPage",
+                      							lv_targetPage_10_0,
+                      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileNavigationPage");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalUIGrammar.g:13279:4: (otherlv_11= 'alias' ( (otherlv_12= RULE_ID ) ) )
+                    {
+                    // InternalUIGrammar.g:13279:4: (otherlv_11= 'alias' ( (otherlv_12= RULE_ID ) ) )
+                    // InternalUIGrammar.g:13280:5: otherlv_11= 'alias' ( (otherlv_12= RULE_ID ) )
+                    {
+                    otherlv_11=(Token)match(input,131,FOLLOW_3); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_11, grammarAccess.getUiMobileNavigationButtonAccess().getAliasKeyword_4_1_0());
+                      				
+                    }
+                    // InternalUIGrammar.g:13284:5: ( (otherlv_12= RULE_ID ) )
+                    // InternalUIGrammar.g:13285:6: (otherlv_12= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:13285:6: (otherlv_12= RULE_ID )
+                    // InternalUIGrammar.g:13286:7: otherlv_12= RULE_ID
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElement(grammarAccess.getUiMobileNavigationButtonRule());
+                      							}
+                      						
+                    }
+                    otherlv_12=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							newLeafNode(otherlv_12, grammarAccess.getUiMobileNavigationButtonAccess().getTargetPageAliasUiMobileNavigationPageCrossReference_4_1_1_0());
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiMobileNavigationButton"
+
+
+    // $ANTLR start "entryRuleUiMobileSwitch"
+    // InternalUIGrammar.g:13303:1: entryRuleUiMobileSwitch returns [EObject current=null] : iv_ruleUiMobileSwitch= ruleUiMobileSwitch EOF ;
+    public final EObject entryRuleUiMobileSwitch() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiMobileSwitch = null;
+
+
+        try {
+            // InternalUIGrammar.g:13303:55: (iv_ruleUiMobileSwitch= ruleUiMobileSwitch EOF )
+            // InternalUIGrammar.g:13304:2: iv_ruleUiMobileSwitch= ruleUiMobileSwitch EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiMobileSwitchRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiMobileSwitch=ruleUiMobileSwitch();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiMobileSwitch; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiMobileSwitch"
+
+
+    // $ANTLR start "ruleUiMobileSwitch"
+    // InternalUIGrammar.g:13310:1: ruleUiMobileSwitch returns [EObject current=null] : ( () otherlv_1= 'switchIt' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? (otherlv_10= '{' ( (lv_processorAssignments_11_0= ruleUiVisibilityProcessorAssignment ) )* ( ( (lv_validators_12_0= ruleUiValidator ) ) | ( (lv_bindings_13_0= ruleUiBinding ) ) )* otherlv_14= '}' )? ) ;
+    public final EObject ruleUiMobileSwitch() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token lv_readonly_5_0=null;
+        Token otherlv_6=null;
+        Token lv_styles_7_0=null;
+        Token otherlv_8=null;
+        Token lv_name_9_0=null;
+        Token otherlv_10=null;
+        Token otherlv_14=null;
+        EObject lv_i18nInfo_4_0 = null;
+
+        EObject lv_processorAssignments_11_0 = null;
+
+        EObject lv_validators_12_0 = null;
+
+        EObject lv_bindings_13_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:13316:2: ( ( () otherlv_1= 'switchIt' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? (otherlv_10= '{' ( (lv_processorAssignments_11_0= ruleUiVisibilityProcessorAssignment ) )* ( ( (lv_validators_12_0= ruleUiValidator ) ) | ( (lv_bindings_13_0= ruleUiBinding ) ) )* otherlv_14= '}' )? ) )
+            // InternalUIGrammar.g:13317:2: ( () otherlv_1= 'switchIt' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? (otherlv_10= '{' ( (lv_processorAssignments_11_0= ruleUiVisibilityProcessorAssignment ) )* ( ( (lv_validators_12_0= ruleUiValidator ) ) | ( (lv_bindings_13_0= ruleUiBinding ) ) )* otherlv_14= '}' )? )
+            {
+            // InternalUIGrammar.g:13317:2: ( () otherlv_1= 'switchIt' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? (otherlv_10= '{' ( (lv_processorAssignments_11_0= ruleUiVisibilityProcessorAssignment ) )* ( ( (lv_validators_12_0= ruleUiValidator ) ) | ( (lv_bindings_13_0= ruleUiBinding ) ) )* otherlv_14= '}' )? )
+            // InternalUIGrammar.g:13318:3: () otherlv_1= 'switchIt' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? (otherlv_10= '{' ( (lv_processorAssignments_11_0= ruleUiVisibilityProcessorAssignment ) )* ( ( (lv_validators_12_0= ruleUiValidator ) ) | ( (lv_bindings_13_0= ruleUiBinding ) ) )* otherlv_14= '}' )?
+            {
+            // InternalUIGrammar.g:13318:3: ()
+            // InternalUIGrammar.g:13319:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiMobileSwitchAccess().getUiSwitchAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,132,FOLLOW_86); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiMobileSwitchAccess().getSwitchItKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:13329:3: (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )?
+            int alt322=2;
+            int LA322_0 = input.LA(1);
+
+            if ( (LA322_0==45) ) {
+                alt322=1;
+            }
+            switch (alt322) {
+                case 1 :
+                    // InternalUIGrammar.g:13330:4: otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')'
+                    {
+                    otherlv_2=(Token)match(input,45,FOLLOW_62); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getUiMobileSwitchAccess().getLeftParenthesisKeyword_2_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:13334:4: ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:13335:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:13335:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:13336:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiMobileSwitchAccess().getUnorderedGroup_2_1());
+                    // InternalUIGrammar.g:13339:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:13340:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:13340:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )*
+                    loop321:
+                    do {
+                        int alt321=4;
+                        int LA321_0 = input.LA(1);
+
+                        if ( LA321_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileSwitchAccess().getUnorderedGroup_2_1(), 0) ) {
+                            alt321=1;
+                        }
+                        else if ( LA321_0 == 65 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileSwitchAccess().getUnorderedGroup_2_1(), 1) ) {
+                            alt321=2;
+                        }
+                        else if ( LA321_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileSwitchAccess().getUnorderedGroup_2_1(), 2) ) {
+                            alt321=3;
+                        }
+
+
+                        switch (alt321) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:13341:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:13341:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    // InternalUIGrammar.g:13342:6: {...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileSwitchAccess().getUnorderedGroup_2_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileSwitch", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileSwitchAccess().getUnorderedGroup_2_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:13342:114: ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    // InternalUIGrammar.g:13343:7: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiMobileSwitchAccess().getUnorderedGroup_2_1(), 0);
+                    	    // InternalUIGrammar.g:13346:10: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    // InternalUIGrammar.g:13346:11: {...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileSwitch", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:13346:20: ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    // InternalUIGrammar.g:13346:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    {
+                    	    // InternalUIGrammar.g:13346:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    // InternalUIGrammar.g:13347:11: lv_i18nInfo_4_0= ruleUiI18nInfo
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getUiMobileSwitchAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_62);
+                    	    lv_i18nInfo_4_0=ruleUiI18nInfo();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getUiMobileSwitchRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"i18nInfo",
+                    	      												lv_i18nInfo_4_0,
+                    	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileSwitchAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:13369:5: ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:13369:5: ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) )
+                    	    // InternalUIGrammar.g:13370:6: {...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileSwitchAccess().getUnorderedGroup_2_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileSwitch", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileSwitchAccess().getUnorderedGroup_2_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:13370:114: ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) )
+                    	    // InternalUIGrammar.g:13371:7: ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiMobileSwitchAccess().getUnorderedGroup_2_1(), 1);
+                    	    // InternalUIGrammar.g:13374:10: ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) )
+                    	    // InternalUIGrammar.g:13374:11: {...}? => ( (lv_readonly_5_0= 'readonly' ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileSwitch", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:13374:20: ( (lv_readonly_5_0= 'readonly' ) )
+                    	    // InternalUIGrammar.g:13374:21: (lv_readonly_5_0= 'readonly' )
+                    	    {
+                    	    // InternalUIGrammar.g:13374:21: (lv_readonly_5_0= 'readonly' )
+                    	    // InternalUIGrammar.g:13375:11: lv_readonly_5_0= 'readonly'
+                    	    {
+                    	    lv_readonly_5_0=(Token)match(input,65,FOLLOW_62); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newLeafNode(lv_readonly_5_0, grammarAccess.getUiMobileSwitchAccess().getReadonlyReadonlyKeyword_2_1_1_0());
+                    	      										
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElement(grammarAccess.getUiMobileSwitchRule());
+                    	      											}
+                    	      											setWithLastConsumed(current, "readonly", true, "readonly");
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileSwitchAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 3 :
+                    	    // InternalUIGrammar.g:13392:5: ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:13392:5: ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:13393:6: {...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileSwitchAccess().getUnorderedGroup_2_1(), 2) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileSwitch", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileSwitchAccess().getUnorderedGroup_2_1(), 2)");
+                    	    }
+                    	    // InternalUIGrammar.g:13393:114: ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:13394:7: ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiMobileSwitchAccess().getUnorderedGroup_2_1(), 2);
+                    	    // InternalUIGrammar.g:13397:10: ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:13397:11: {...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiMobileSwitch", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:13397:20: (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:13397:21: otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_6=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_6, grammarAccess.getUiMobileSwitchAccess().getStylesKeyword_2_1_2_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:13401:10: ( (lv_styles_7_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:13402:11: (lv_styles_7_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:13402:11: (lv_styles_7_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:13403:12: lv_styles_7_0= RULE_STRING
+                    	    {
+                    	    lv_styles_7_0=(Token)match(input,RULE_STRING,FOLLOW_62); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_styles_7_0, grammarAccess.getUiMobileSwitchAccess().getStylesSTRINGTerminalRuleCall_2_1_2_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiMobileSwitchRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"styles",
+                    	      													lv_styles_7_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileSwitchAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop321;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiMobileSwitchAccess().getUnorderedGroup_2_1());
+
+                    }
+
+                    otherlv_8=(Token)match(input,47,FOLLOW_88); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_8, grammarAccess.getUiMobileSwitchAccess().getRightParenthesisKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:13437:3: ( (lv_name_9_0= RULE_ID ) )?
+            int alt323=2;
+            int LA323_0 = input.LA(1);
+
+            if ( (LA323_0==RULE_ID) ) {
+                alt323=1;
+            }
+            switch (alt323) {
+                case 1 :
+                    // InternalUIGrammar.g:13438:4: (lv_name_9_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:13438:4: (lv_name_9_0= RULE_ID )
+                    // InternalUIGrammar.g:13439:5: lv_name_9_0= RULE_ID
+                    {
+                    lv_name_9_0=(Token)match(input,RULE_ID,FOLLOW_89); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_9_0, grammarAccess.getUiMobileSwitchAccess().getNameIDTerminalRuleCall_3_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiMobileSwitchRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_9_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:13455:3: (otherlv_10= '{' ( (lv_processorAssignments_11_0= ruleUiVisibilityProcessorAssignment ) )* ( ( (lv_validators_12_0= ruleUiValidator ) ) | ( (lv_bindings_13_0= ruleUiBinding ) ) )* otherlv_14= '}' )?
+            int alt326=2;
+            int LA326_0 = input.LA(1);
+
+            if ( (LA326_0==20) ) {
+                alt326=1;
+            }
+            switch (alt326) {
+                case 1 :
+                    // InternalUIGrammar.g:13456:4: otherlv_10= '{' ( (lv_processorAssignments_11_0= ruleUiVisibilityProcessorAssignment ) )* ( ( (lv_validators_12_0= ruleUiValidator ) ) | ( (lv_bindings_13_0= ruleUiBinding ) ) )* otherlv_14= '}'
+                    {
+                    otherlv_10=(Token)match(input,20,FOLLOW_90); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_10, grammarAccess.getUiMobileSwitchAccess().getLeftCurlyBracketKeyword_4_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:13460:4: ( (lv_processorAssignments_11_0= ruleUiVisibilityProcessorAssignment ) )*
+                    loop324:
+                    do {
+                        int alt324=2;
+                        int LA324_0 = input.LA(1);
+
+                        if ( (LA324_0==153) ) {
+                            alt324=1;
+                        }
+
+
+                        switch (alt324) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:13461:5: (lv_processorAssignments_11_0= ruleUiVisibilityProcessorAssignment )
+                    	    {
+                    	    // InternalUIGrammar.g:13461:5: (lv_processorAssignments_11_0= ruleUiVisibilityProcessorAssignment )
+                    	    // InternalUIGrammar.g:13462:6: lv_processorAssignments_11_0= ruleUiVisibilityProcessorAssignment
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newCompositeNode(grammarAccess.getUiMobileSwitchAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_1_0());
+                    	      					
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_processorAssignments_11_0=ruleUiVisibilityProcessorAssignment();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						if (current==null) {
+                    	      							current = createModelElementForParent(grammarAccess.getUiMobileSwitchRule());
+                    	      						}
+                    	      						add(
+                    	      							current,
+                    	      							"processorAssignments",
+                    	      							lv_processorAssignments_11_0,
+                    	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+                    	      						afterParserOrEnumRuleCall();
+                    	      					
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop324;
+                        }
+                    } while (true);
+
+                    // InternalUIGrammar.g:13479:4: ( ( (lv_validators_12_0= ruleUiValidator ) ) | ( (lv_bindings_13_0= ruleUiBinding ) ) )*
+                    loop325:
+                    do {
+                        int alt325=3;
+                        int LA325_0 = input.LA(1);
+
+                        if ( ((LA325_0>=147 && LA325_0<=151)) ) {
+                            alt325=1;
+                        }
+                        else if ( (LA325_0==26) ) {
+                            alt325=2;
+                        }
+
+
+                        switch (alt325) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:13480:5: ( (lv_validators_12_0= ruleUiValidator ) )
+                    	    {
+                    	    // InternalUIGrammar.g:13480:5: ( (lv_validators_12_0= ruleUiValidator ) )
+                    	    // InternalUIGrammar.g:13481:6: (lv_validators_12_0= ruleUiValidator )
+                    	    {
+                    	    // InternalUIGrammar.g:13481:6: (lv_validators_12_0= ruleUiValidator )
+                    	    // InternalUIGrammar.g:13482:7: lv_validators_12_0= ruleUiValidator
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiMobileSwitchAccess().getValidatorsUiValidatorParserRuleCall_4_2_0_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_114);
+                    	    lv_validators_12_0=ruleUiValidator();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiMobileSwitchRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"validators",
+                    	      								lv_validators_12_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:13500:5: ( (lv_bindings_13_0= ruleUiBinding ) )
+                    	    {
+                    	    // InternalUIGrammar.g:13500:5: ( (lv_bindings_13_0= ruleUiBinding ) )
+                    	    // InternalUIGrammar.g:13501:6: (lv_bindings_13_0= ruleUiBinding )
+                    	    {
+                    	    // InternalUIGrammar.g:13501:6: (lv_bindings_13_0= ruleUiBinding )
+                    	    // InternalUIGrammar.g:13502:7: lv_bindings_13_0= ruleUiBinding
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiMobileSwitchAccess().getBindingsUiBindingParserRuleCall_4_2_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_114);
+                    	    lv_bindings_13_0=ruleUiBinding();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiMobileSwitchRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"bindings",
+                    	      								lv_bindings_13_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop325;
+                        }
+                    } while (true);
+
+                    otherlv_14=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_14, grammarAccess.getUiMobileSwitchAccess().getRightCurlyBracketKeyword_4_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiMobileSwitch"
+
+
+    // $ANTLR start "entryRuleUiLabel"
+    // InternalUIGrammar.g:13529:1: entryRuleUiLabel returns [EObject current=null] : iv_ruleUiLabel= ruleUiLabel EOF ;
+    public final EObject entryRuleUiLabel() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiLabel = null;
+
+
+        try {
+            // InternalUIGrammar.g:13529:48: (iv_ruleUiLabel= ruleUiLabel EOF )
+            // InternalUIGrammar.g:13530:2: iv_ruleUiLabel= ruleUiLabel EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiLabelRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiLabel=ruleUiLabel();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiLabel; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiLabel"
+
+
+    // $ANTLR start "ruleUiLabel"
+    // InternalUIGrammar.g:13536:1: ruleUiLabel returns [EObject current=null] : ( () otherlv_1= 'label' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' ( (lv_processorAssignments_10_0= ruleUiVisibilityProcessorAssignment ) )* ( (lv_bindings_11_0= ruleUiBinding ) )* otherlv_12= '}' )? ) ;
+    public final EObject ruleUiLabel() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_5=null;
+        Token lv_styles_6_0=null;
+        Token otherlv_7=null;
+        Token lv_name_8_0=null;
+        Token otherlv_9=null;
+        Token otherlv_12=null;
+        EObject lv_i18nInfo_4_0 = null;
+
+        EObject lv_processorAssignments_10_0 = null;
+
+        EObject lv_bindings_11_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:13542:2: ( ( () otherlv_1= 'label' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' ( (lv_processorAssignments_10_0= ruleUiVisibilityProcessorAssignment ) )* ( (lv_bindings_11_0= ruleUiBinding ) )* otherlv_12= '}' )? ) )
+            // InternalUIGrammar.g:13543:2: ( () otherlv_1= 'label' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' ( (lv_processorAssignments_10_0= ruleUiVisibilityProcessorAssignment ) )* ( (lv_bindings_11_0= ruleUiBinding ) )* otherlv_12= '}' )? )
+            {
+            // InternalUIGrammar.g:13543:2: ( () otherlv_1= 'label' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' ( (lv_processorAssignments_10_0= ruleUiVisibilityProcessorAssignment ) )* ( (lv_bindings_11_0= ruleUiBinding ) )* otherlv_12= '}' )? )
+            // InternalUIGrammar.g:13544:3: () otherlv_1= 'label' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' ( (lv_processorAssignments_10_0= ruleUiVisibilityProcessorAssignment ) )* ( (lv_bindings_11_0= ruleUiBinding ) )* otherlv_12= '}' )?
+            {
+            // InternalUIGrammar.g:13544:3: ()
+            // InternalUIGrammar.g:13545:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiLabelAccess().getUiLabelAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,133,FOLLOW_86); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiLabelAccess().getLabelKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:13555:3: (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )?
+            int alt328=2;
+            int LA328_0 = input.LA(1);
+
+            if ( (LA328_0==45) ) {
+                alt328=1;
+            }
+            switch (alt328) {
+                case 1 :
+                    // InternalUIGrammar.g:13556:4: otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')'
+                    {
+                    otherlv_2=(Token)match(input,45,FOLLOW_63); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getUiLabelAccess().getLeftParenthesisKeyword_2_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:13560:4: ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:13561:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:13561:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:13562:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiLabelAccess().getUnorderedGroup_2_1());
+                    // InternalUIGrammar.g:13565:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:13566:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:13566:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )*
+                    loop327:
+                    do {
+                        int alt327=3;
+                        int LA327_0 = input.LA(1);
+
+                        if ( LA327_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiLabelAccess().getUnorderedGroup_2_1(), 0) ) {
+                            alt327=1;
+                        }
+                        else if ( LA327_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiLabelAccess().getUnorderedGroup_2_1(), 1) ) {
+                            alt327=2;
+                        }
+
+
+                        switch (alt327) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:13567:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:13567:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    // InternalUIGrammar.g:13568:6: {...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiLabelAccess().getUnorderedGroup_2_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiLabel", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiLabelAccess().getUnorderedGroup_2_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:13568:107: ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    // InternalUIGrammar.g:13569:7: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiLabelAccess().getUnorderedGroup_2_1(), 0);
+                    	    // InternalUIGrammar.g:13572:10: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    // InternalUIGrammar.g:13572:11: {...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiLabel", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:13572:20: ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    // InternalUIGrammar.g:13572:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    {
+                    	    // InternalUIGrammar.g:13572:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    // InternalUIGrammar.g:13573:11: lv_i18nInfo_4_0= ruleUiI18nInfo
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getUiLabelAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_63);
+                    	    lv_i18nInfo_4_0=ruleUiI18nInfo();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getUiLabelRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"i18nInfo",
+                    	      												lv_i18nInfo_4_0,
+                    	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiLabelAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:13595:5: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:13595:5: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:13596:6: {...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiLabelAccess().getUnorderedGroup_2_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiLabel", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiLabelAccess().getUnorderedGroup_2_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:13596:107: ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:13597:7: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiLabelAccess().getUnorderedGroup_2_1(), 1);
+                    	    // InternalUIGrammar.g:13600:10: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:13600:11: {...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiLabel", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:13600:20: (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:13600:21: otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_5=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_5, grammarAccess.getUiLabelAccess().getStylesKeyword_2_1_1_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:13604:10: ( (lv_styles_6_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:13605:11: (lv_styles_6_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:13605:11: (lv_styles_6_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:13606:12: lv_styles_6_0= RULE_STRING
+                    	    {
+                    	    lv_styles_6_0=(Token)match(input,RULE_STRING,FOLLOW_63); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_styles_6_0, grammarAccess.getUiLabelAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiLabelRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"styles",
+                    	      													lv_styles_6_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiLabelAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop327;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiLabelAccess().getUnorderedGroup_2_1());
+
+                    }
+
+                    otherlv_7=(Token)match(input,47,FOLLOW_88); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_7, grammarAccess.getUiLabelAccess().getRightParenthesisKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:13640:3: ( (lv_name_8_0= RULE_ID ) )?
+            int alt329=2;
+            int LA329_0 = input.LA(1);
+
+            if ( (LA329_0==RULE_ID) ) {
+                alt329=1;
+            }
+            switch (alt329) {
+                case 1 :
+                    // InternalUIGrammar.g:13641:4: (lv_name_8_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:13641:4: (lv_name_8_0= RULE_ID )
+                    // InternalUIGrammar.g:13642:5: lv_name_8_0= RULE_ID
+                    {
+                    lv_name_8_0=(Token)match(input,RULE_ID,FOLLOW_89); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_8_0, grammarAccess.getUiLabelAccess().getNameIDTerminalRuleCall_3_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiLabelRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_8_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:13658:3: (otherlv_9= '{' ( (lv_processorAssignments_10_0= ruleUiVisibilityProcessorAssignment ) )* ( (lv_bindings_11_0= ruleUiBinding ) )* otherlv_12= '}' )?
+            int alt332=2;
+            int LA332_0 = input.LA(1);
+
+            if ( (LA332_0==20) ) {
+                alt332=1;
+            }
+            switch (alt332) {
+                case 1 :
+                    // InternalUIGrammar.g:13659:4: otherlv_9= '{' ( (lv_processorAssignments_10_0= ruleUiVisibilityProcessorAssignment ) )* ( (lv_bindings_11_0= ruleUiBinding ) )* otherlv_12= '}'
+                    {
+                    otherlv_9=(Token)match(input,20,FOLLOW_42); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_9, grammarAccess.getUiLabelAccess().getLeftCurlyBracketKeyword_4_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:13663:4: ( (lv_processorAssignments_10_0= ruleUiVisibilityProcessorAssignment ) )*
+                    loop330:
+                    do {
+                        int alt330=2;
+                        int LA330_0 = input.LA(1);
+
+                        if ( (LA330_0==153) ) {
+                            alt330=1;
+                        }
+
+
+                        switch (alt330) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:13664:5: (lv_processorAssignments_10_0= ruleUiVisibilityProcessorAssignment )
+                    	    {
+                    	    // InternalUIGrammar.g:13664:5: (lv_processorAssignments_10_0= ruleUiVisibilityProcessorAssignment )
+                    	    // InternalUIGrammar.g:13665:6: lv_processorAssignments_10_0= ruleUiVisibilityProcessorAssignment
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newCompositeNode(grammarAccess.getUiLabelAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_1_0());
+                    	      					
+                    	    }
+                    	    pushFollow(FOLLOW_42);
+                    	    lv_processorAssignments_10_0=ruleUiVisibilityProcessorAssignment();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						if (current==null) {
+                    	      							current = createModelElementForParent(grammarAccess.getUiLabelRule());
+                    	      						}
+                    	      						add(
+                    	      							current,
+                    	      							"processorAssignments",
+                    	      							lv_processorAssignments_10_0,
+                    	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+                    	      						afterParserOrEnumRuleCall();
+                    	      					
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop330;
+                        }
+                    } while (true);
+
+                    // InternalUIGrammar.g:13682:4: ( (lv_bindings_11_0= ruleUiBinding ) )*
+                    loop331:
+                    do {
+                        int alt331=2;
+                        int LA331_0 = input.LA(1);
+
+                        if ( (LA331_0==26) ) {
+                            alt331=1;
+                        }
+
+
+                        switch (alt331) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:13683:5: (lv_bindings_11_0= ruleUiBinding )
+                    	    {
+                    	    // InternalUIGrammar.g:13683:5: (lv_bindings_11_0= ruleUiBinding )
+                    	    // InternalUIGrammar.g:13684:6: lv_bindings_11_0= ruleUiBinding
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newCompositeNode(grammarAccess.getUiLabelAccess().getBindingsUiBindingParserRuleCall_4_2_0());
+                    	      					
+                    	    }
+                    	    pushFollow(FOLLOW_115);
+                    	    lv_bindings_11_0=ruleUiBinding();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						if (current==null) {
+                    	      							current = createModelElementForParent(grammarAccess.getUiLabelRule());
+                    	      						}
+                    	      						add(
+                    	      							current,
+                    	      							"bindings",
+                    	      							lv_bindings_11_0,
+                    	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+                    	      						afterParserOrEnumRuleCall();
+                    	      					
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop331;
+                        }
+                    } while (true);
+
+                    otherlv_12=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_12, grammarAccess.getUiLabelAccess().getRightCurlyBracketKeyword_4_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiLabel"
+
+
+    // $ANTLR start "entryRuleUiDecimalField"
+    // InternalUIGrammar.g:13710:1: entryRuleUiDecimalField returns [EObject current=null] : iv_ruleUiDecimalField= ruleUiDecimalField EOF ;
+    public final EObject entryRuleUiDecimalField() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiDecimalField = null;
+
+
+        try {
+            // InternalUIGrammar.g:13710:55: (iv_ruleUiDecimalField= ruleUiDecimalField EOF )
+            // InternalUIGrammar.g:13711:2: iv_ruleUiDecimalField= ruleUiDecimalField EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiDecimalFieldRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiDecimalField=ruleUiDecimalField();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiDecimalField; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiDecimalField"
+
+
+    // $ANTLR start "ruleUiDecimalField"
+    // InternalUIGrammar.g:13717:1: ruleUiDecimalField returns [EObject current=null] : ( () otherlv_1= 'decimalField' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_noMarkNegative_5_0= 'noMarkNegative' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'precision=' ( (lv_precision_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_10_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_11_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_12= ')' )? ( (lv_name_13_0= RULE_ID ) )? (otherlv_14= '{' ( ( (lv_validators_15_0= ruleUiValidator ) ) | ( (lv_bindings_16_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_17_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_18= '}' )? ) ;
+    public final EObject ruleUiDecimalField() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token lv_noGrouping_4_0=null;
+        Token lv_noMarkNegative_5_0=null;
+        Token otherlv_6=null;
+        Token lv_styles_7_0=null;
+        Token otherlv_8=null;
+        Token lv_precision_9_0=null;
+        Token lv_readonly_11_0=null;
+        Token otherlv_12=null;
+        Token lv_name_13_0=null;
+        Token otherlv_14=null;
+        Token otherlv_18=null;
+        EObject lv_i18nInfo_10_0 = null;
+
+        EObject lv_validators_15_0 = null;
+
+        EObject lv_bindings_16_0 = null;
+
+        EObject lv_processorAssignments_17_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:13723:2: ( ( () otherlv_1= 'decimalField' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_noMarkNegative_5_0= 'noMarkNegative' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'precision=' ( (lv_precision_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_10_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_11_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_12= ')' )? ( (lv_name_13_0= RULE_ID ) )? (otherlv_14= '{' ( ( (lv_validators_15_0= ruleUiValidator ) ) | ( (lv_bindings_16_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_17_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_18= '}' )? ) )
+            // InternalUIGrammar.g:13724:2: ( () otherlv_1= 'decimalField' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_noMarkNegative_5_0= 'noMarkNegative' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'precision=' ( (lv_precision_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_10_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_11_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_12= ')' )? ( (lv_name_13_0= RULE_ID ) )? (otherlv_14= '{' ( ( (lv_validators_15_0= ruleUiValidator ) ) | ( (lv_bindings_16_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_17_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_18= '}' )? )
+            {
+            // InternalUIGrammar.g:13724:2: ( () otherlv_1= 'decimalField' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_noMarkNegative_5_0= 'noMarkNegative' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'precision=' ( (lv_precision_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_10_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_11_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_12= ')' )? ( (lv_name_13_0= RULE_ID ) )? (otherlv_14= '{' ( ( (lv_validators_15_0= ruleUiValidator ) ) | ( (lv_bindings_16_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_17_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_18= '}' )? )
+            // InternalUIGrammar.g:13725:3: () otherlv_1= 'decimalField' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_noMarkNegative_5_0= 'noMarkNegative' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'precision=' ( (lv_precision_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_10_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_11_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_12= ')' )? ( (lv_name_13_0= RULE_ID ) )? (otherlv_14= '{' ( ( (lv_validators_15_0= ruleUiValidator ) ) | ( (lv_bindings_16_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_17_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_18= '}' )?
+            {
+            // InternalUIGrammar.g:13725:3: ()
+            // InternalUIGrammar.g:13726:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiDecimalFieldAccess().getUiDecimalFieldAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,134,FOLLOW_86); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiDecimalFieldAccess().getDecimalFieldKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:13736:3: (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_noMarkNegative_5_0= 'noMarkNegative' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'precision=' ( (lv_precision_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_10_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_11_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_12= ')' )?
+            int alt334=2;
+            int LA334_0 = input.LA(1);
+
+            if ( (LA334_0==45) ) {
+                alt334=1;
+            }
+            switch (alt334) {
+                case 1 :
+                    // InternalUIGrammar.g:13737:4: otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_noMarkNegative_5_0= 'noMarkNegative' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'precision=' ( (lv_precision_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_10_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_11_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_12= ')'
+                    {
+                    otherlv_2=(Token)match(input,45,FOLLOW_116); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getUiDecimalFieldAccess().getLeftParenthesisKeyword_2_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:13741:4: ( ( ( ( ({...}? => ( ({...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_noMarkNegative_5_0= 'noMarkNegative' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'precision=' ( (lv_precision_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_10_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_11_0= 'readonly' ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:13742:5: ( ( ( ({...}? => ( ({...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_noMarkNegative_5_0= 'noMarkNegative' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'precision=' ( (lv_precision_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_10_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_11_0= 'readonly' ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:13742:5: ( ( ( ({...}? => ( ({...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_noMarkNegative_5_0= 'noMarkNegative' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'precision=' ( (lv_precision_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_10_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_11_0= 'readonly' ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:13743:6: ( ( ({...}? => ( ({...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_noMarkNegative_5_0= 'noMarkNegative' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'precision=' ( (lv_precision_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_10_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_11_0= 'readonly' ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1());
+                    // InternalUIGrammar.g:13746:6: ( ( ({...}? => ( ({...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_noMarkNegative_5_0= 'noMarkNegative' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'precision=' ( (lv_precision_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_10_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_11_0= 'readonly' ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:13747:7: ( ({...}? => ( ({...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_noMarkNegative_5_0= 'noMarkNegative' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'precision=' ( (lv_precision_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_10_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_11_0= 'readonly' ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:13747:7: ( ({...}? => ( ({...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_noMarkNegative_5_0= 'noMarkNegative' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'precision=' ( (lv_precision_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_10_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_11_0= 'readonly' ) ) ) ) ) )*
+                    loop333:
+                    do {
+                        int alt333=7;
+                        int LA333_0 = input.LA(1);
+
+                        if ( LA333_0 == 135 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 0) ) {
+                            alt333=1;
+                        }
+                        else if ( LA333_0 == 136 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 1) ) {
+                            alt333=2;
+                        }
+                        else if ( LA333_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 2) ) {
+                            alt333=3;
+                        }
+                        else if ( LA333_0 == 137 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 3) ) {
+                            alt333=4;
+                        }
+                        else if ( LA333_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 4) ) {
+                            alt333=5;
+                        }
+                        else if ( LA333_0 == 65 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 5) ) {
+                            alt333=6;
+                        }
+
+
+                        switch (alt333) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:13748:5: ({...}? => ( ({...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:13748:5: ({...}? => ( ({...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) ) ) ) )
+                    	    // InternalUIGrammar.g:13749:6: {...}? => ( ({...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiDecimalField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:13749:114: ( ({...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) ) ) )
+                    	    // InternalUIGrammar.g:13750:7: ({...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 0);
+                    	    // InternalUIGrammar.g:13753:10: ({...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) ) )
+                    	    // InternalUIGrammar.g:13753:11: {...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiDecimalField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:13753:20: ( (lv_noGrouping_4_0= 'noGrouping' ) )
+                    	    // InternalUIGrammar.g:13753:21: (lv_noGrouping_4_0= 'noGrouping' )
+                    	    {
+                    	    // InternalUIGrammar.g:13753:21: (lv_noGrouping_4_0= 'noGrouping' )
+                    	    // InternalUIGrammar.g:13754:11: lv_noGrouping_4_0= 'noGrouping'
+                    	    {
+                    	    lv_noGrouping_4_0=(Token)match(input,135,FOLLOW_116); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newLeafNode(lv_noGrouping_4_0, grammarAccess.getUiDecimalFieldAccess().getNoGroupingNoGroupingKeyword_2_1_0_0());
+                    	      										
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElement(grammarAccess.getUiDecimalFieldRule());
+                    	      											}
+                    	      											setWithLastConsumed(current, "noGrouping", true, "noGrouping");
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:13771:5: ({...}? => ( ({...}? => ( (lv_noMarkNegative_5_0= 'noMarkNegative' ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:13771:5: ({...}? => ( ({...}? => ( (lv_noMarkNegative_5_0= 'noMarkNegative' ) ) ) ) )
+                    	    // InternalUIGrammar.g:13772:6: {...}? => ( ({...}? => ( (lv_noMarkNegative_5_0= 'noMarkNegative' ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiDecimalField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:13772:114: ( ({...}? => ( (lv_noMarkNegative_5_0= 'noMarkNegative' ) ) ) )
+                    	    // InternalUIGrammar.g:13773:7: ({...}? => ( (lv_noMarkNegative_5_0= 'noMarkNegative' ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 1);
+                    	    // InternalUIGrammar.g:13776:10: ({...}? => ( (lv_noMarkNegative_5_0= 'noMarkNegative' ) ) )
+                    	    // InternalUIGrammar.g:13776:11: {...}? => ( (lv_noMarkNegative_5_0= 'noMarkNegative' ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiDecimalField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:13776:20: ( (lv_noMarkNegative_5_0= 'noMarkNegative' ) )
+                    	    // InternalUIGrammar.g:13776:21: (lv_noMarkNegative_5_0= 'noMarkNegative' )
+                    	    {
+                    	    // InternalUIGrammar.g:13776:21: (lv_noMarkNegative_5_0= 'noMarkNegative' )
+                    	    // InternalUIGrammar.g:13777:11: lv_noMarkNegative_5_0= 'noMarkNegative'
+                    	    {
+                    	    lv_noMarkNegative_5_0=(Token)match(input,136,FOLLOW_116); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newLeafNode(lv_noMarkNegative_5_0, grammarAccess.getUiDecimalFieldAccess().getNoMarkNegativeNoMarkNegativeKeyword_2_1_1_0());
+                    	      										
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElement(grammarAccess.getUiDecimalFieldRule());
+                    	      											}
+                    	      											setWithLastConsumed(current, "noMarkNegative", true, "noMarkNegative");
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 3 :
+                    	    // InternalUIGrammar.g:13794:5: ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:13794:5: ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:13795:6: {...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 2) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiDecimalField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 2)");
+                    	    }
+                    	    // InternalUIGrammar.g:13795:114: ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:13796:7: ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 2);
+                    	    // InternalUIGrammar.g:13799:10: ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:13799:11: {...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiDecimalField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:13799:20: (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:13799:21: otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_6=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_6, grammarAccess.getUiDecimalFieldAccess().getStylesKeyword_2_1_2_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:13803:10: ( (lv_styles_7_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:13804:11: (lv_styles_7_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:13804:11: (lv_styles_7_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:13805:12: lv_styles_7_0= RULE_STRING
+                    	    {
+                    	    lv_styles_7_0=(Token)match(input,RULE_STRING,FOLLOW_116); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_styles_7_0, grammarAccess.getUiDecimalFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_2_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiDecimalFieldRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"styles",
+                    	      													lv_styles_7_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 4 :
+                    	    // InternalUIGrammar.g:13827:5: ({...}? => ( ({...}? => (otherlv_8= 'precision=' ( (lv_precision_9_0= RULE_INT ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:13827:5: ({...}? => ( ({...}? => (otherlv_8= 'precision=' ( (lv_precision_9_0= RULE_INT ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:13828:6: {...}? => ( ({...}? => (otherlv_8= 'precision=' ( (lv_precision_9_0= RULE_INT ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 3) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiDecimalField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 3)");
+                    	    }
+                    	    // InternalUIGrammar.g:13828:114: ( ({...}? => (otherlv_8= 'precision=' ( (lv_precision_9_0= RULE_INT ) ) ) ) )
+                    	    // InternalUIGrammar.g:13829:7: ({...}? => (otherlv_8= 'precision=' ( (lv_precision_9_0= RULE_INT ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 3);
+                    	    // InternalUIGrammar.g:13832:10: ({...}? => (otherlv_8= 'precision=' ( (lv_precision_9_0= RULE_INT ) ) ) )
+                    	    // InternalUIGrammar.g:13832:11: {...}? => (otherlv_8= 'precision=' ( (lv_precision_9_0= RULE_INT ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiDecimalField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:13832:20: (otherlv_8= 'precision=' ( (lv_precision_9_0= RULE_INT ) ) )
+                    	    // InternalUIGrammar.g:13832:21: otherlv_8= 'precision=' ( (lv_precision_9_0= RULE_INT ) )
+                    	    {
+                    	    otherlv_8=(Token)match(input,137,FOLLOW_54); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_8, grammarAccess.getUiDecimalFieldAccess().getPrecisionKeyword_2_1_3_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:13836:10: ( (lv_precision_9_0= RULE_INT ) )
+                    	    // InternalUIGrammar.g:13837:11: (lv_precision_9_0= RULE_INT )
+                    	    {
+                    	    // InternalUIGrammar.g:13837:11: (lv_precision_9_0= RULE_INT )
+                    	    // InternalUIGrammar.g:13838:12: lv_precision_9_0= RULE_INT
+                    	    {
+                    	    lv_precision_9_0=(Token)match(input,RULE_INT,FOLLOW_116); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_precision_9_0, grammarAccess.getUiDecimalFieldAccess().getPrecisionINTTerminalRuleCall_2_1_3_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiDecimalFieldRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"precision",
+                    	      													lv_precision_9_0,
+                    	      													"org.eclipse.xtext.xbase.Xbase.INT");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 5 :
+                    	    // InternalUIGrammar.g:13860:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_10_0= ruleUiI18nInfo ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:13860:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_10_0= ruleUiI18nInfo ) ) ) ) )
+                    	    // InternalUIGrammar.g:13861:6: {...}? => ( ({...}? => ( (lv_i18nInfo_10_0= ruleUiI18nInfo ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 4) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiDecimalField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 4)");
+                    	    }
+                    	    // InternalUIGrammar.g:13861:114: ( ({...}? => ( (lv_i18nInfo_10_0= ruleUiI18nInfo ) ) ) )
+                    	    // InternalUIGrammar.g:13862:7: ({...}? => ( (lv_i18nInfo_10_0= ruleUiI18nInfo ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 4);
+                    	    // InternalUIGrammar.g:13865:10: ({...}? => ( (lv_i18nInfo_10_0= ruleUiI18nInfo ) ) )
+                    	    // InternalUIGrammar.g:13865:11: {...}? => ( (lv_i18nInfo_10_0= ruleUiI18nInfo ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiDecimalField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:13865:20: ( (lv_i18nInfo_10_0= ruleUiI18nInfo ) )
+                    	    // InternalUIGrammar.g:13865:21: (lv_i18nInfo_10_0= ruleUiI18nInfo )
+                    	    {
+                    	    // InternalUIGrammar.g:13865:21: (lv_i18nInfo_10_0= ruleUiI18nInfo )
+                    	    // InternalUIGrammar.g:13866:11: lv_i18nInfo_10_0= ruleUiI18nInfo
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getUiDecimalFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_4_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_116);
+                    	    lv_i18nInfo_10_0=ruleUiI18nInfo();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getUiDecimalFieldRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"i18nInfo",
+                    	      												lv_i18nInfo_10_0,
+                    	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 6 :
+                    	    // InternalUIGrammar.g:13888:5: ({...}? => ( ({...}? => ( (lv_readonly_11_0= 'readonly' ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:13888:5: ({...}? => ( ({...}? => ( (lv_readonly_11_0= 'readonly' ) ) ) ) )
+                    	    // InternalUIGrammar.g:13889:6: {...}? => ( ({...}? => ( (lv_readonly_11_0= 'readonly' ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 5) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiDecimalField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 5)");
+                    	    }
+                    	    // InternalUIGrammar.g:13889:114: ( ({...}? => ( (lv_readonly_11_0= 'readonly' ) ) ) )
+                    	    // InternalUIGrammar.g:13890:7: ({...}? => ( (lv_readonly_11_0= 'readonly' ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 5);
+                    	    // InternalUIGrammar.g:13893:10: ({...}? => ( (lv_readonly_11_0= 'readonly' ) ) )
+                    	    // InternalUIGrammar.g:13893:11: {...}? => ( (lv_readonly_11_0= 'readonly' ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiDecimalField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:13893:20: ( (lv_readonly_11_0= 'readonly' ) )
+                    	    // InternalUIGrammar.g:13893:21: (lv_readonly_11_0= 'readonly' )
+                    	    {
+                    	    // InternalUIGrammar.g:13893:21: (lv_readonly_11_0= 'readonly' )
+                    	    // InternalUIGrammar.g:13894:11: lv_readonly_11_0= 'readonly'
+                    	    {
+                    	    lv_readonly_11_0=(Token)match(input,65,FOLLOW_116); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newLeafNode(lv_readonly_11_0, grammarAccess.getUiDecimalFieldAccess().getReadonlyReadonlyKeyword_2_1_5_0());
+                    	      										
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElement(grammarAccess.getUiDecimalFieldRule());
+                    	      											}
+                    	      											setWithLastConsumed(current, "readonly", true, "readonly");
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop333;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1());
+
+                    }
+
+                    otherlv_12=(Token)match(input,47,FOLLOW_88); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_12, grammarAccess.getUiDecimalFieldAccess().getRightParenthesisKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:13923:3: ( (lv_name_13_0= RULE_ID ) )?
+            int alt335=2;
+            int LA335_0 = input.LA(1);
+
+            if ( (LA335_0==RULE_ID) ) {
+                alt335=1;
+            }
+            switch (alt335) {
+                case 1 :
+                    // InternalUIGrammar.g:13924:4: (lv_name_13_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:13924:4: (lv_name_13_0= RULE_ID )
+                    // InternalUIGrammar.g:13925:5: lv_name_13_0= RULE_ID
+                    {
+                    lv_name_13_0=(Token)match(input,RULE_ID,FOLLOW_89); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_13_0, grammarAccess.getUiDecimalFieldAccess().getNameIDTerminalRuleCall_3_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiDecimalFieldRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_13_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:13941:3: (otherlv_14= '{' ( ( (lv_validators_15_0= ruleUiValidator ) ) | ( (lv_bindings_16_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_17_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_18= '}' )?
+            int alt338=2;
+            int LA338_0 = input.LA(1);
+
+            if ( (LA338_0==20) ) {
+                alt338=1;
+            }
+            switch (alt338) {
+                case 1 :
+                    // InternalUIGrammar.g:13942:4: otherlv_14= '{' ( ( (lv_validators_15_0= ruleUiValidator ) ) | ( (lv_bindings_16_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_17_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_18= '}'
+                    {
+                    otherlv_14=(Token)match(input,20,FOLLOW_90); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_14, grammarAccess.getUiDecimalFieldAccess().getLeftCurlyBracketKeyword_4_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:13946:4: ( ( (lv_validators_15_0= ruleUiValidator ) ) | ( (lv_bindings_16_0= ruleUiBinding ) ) )*
+                    loop336:
+                    do {
+                        int alt336=3;
+                        int LA336_0 = input.LA(1);
+
+                        if ( ((LA336_0>=147 && LA336_0<=151)) ) {
+                            alt336=1;
+                        }
+                        else if ( (LA336_0==26) ) {
+                            alt336=2;
+                        }
+
+
+                        switch (alt336) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:13947:5: ( (lv_validators_15_0= ruleUiValidator ) )
+                    	    {
+                    	    // InternalUIGrammar.g:13947:5: ( (lv_validators_15_0= ruleUiValidator ) )
+                    	    // InternalUIGrammar.g:13948:6: (lv_validators_15_0= ruleUiValidator )
+                    	    {
+                    	    // InternalUIGrammar.g:13948:6: (lv_validators_15_0= ruleUiValidator )
+                    	    // InternalUIGrammar.g:13949:7: lv_validators_15_0= ruleUiValidator
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiDecimalFieldAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_validators_15_0=ruleUiValidator();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiDecimalFieldRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"validators",
+                    	      								lv_validators_15_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:13967:5: ( (lv_bindings_16_0= ruleUiBinding ) )
+                    	    {
+                    	    // InternalUIGrammar.g:13967:5: ( (lv_bindings_16_0= ruleUiBinding ) )
+                    	    // InternalUIGrammar.g:13968:6: (lv_bindings_16_0= ruleUiBinding )
+                    	    {
+                    	    // InternalUIGrammar.g:13968:6: (lv_bindings_16_0= ruleUiBinding )
+                    	    // InternalUIGrammar.g:13969:7: lv_bindings_16_0= ruleUiBinding
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiDecimalFieldAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_bindings_16_0=ruleUiBinding();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiDecimalFieldRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"bindings",
+                    	      								lv_bindings_16_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop336;
+                        }
+                    } while (true);
+
+                    // InternalUIGrammar.g:13987:4: ( (lv_processorAssignments_17_0= ruleUiVisibilityProcessorAssignment ) )*
+                    loop337:
+                    do {
+                        int alt337=2;
+                        int LA337_0 = input.LA(1);
+
+                        if ( (LA337_0==153) ) {
+                            alt337=1;
+                        }
+
+
+                        switch (alt337) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:13988:5: (lv_processorAssignments_17_0= ruleUiVisibilityProcessorAssignment )
+                    	    {
+                    	    // InternalUIGrammar.g:13988:5: (lv_processorAssignments_17_0= ruleUiVisibilityProcessorAssignment )
+                    	    // InternalUIGrammar.g:13989:6: lv_processorAssignments_17_0= ruleUiVisibilityProcessorAssignment
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newCompositeNode(grammarAccess.getUiDecimalFieldAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
+                    	      					
+                    	    }
+                    	    pushFollow(FOLLOW_42);
+                    	    lv_processorAssignments_17_0=ruleUiVisibilityProcessorAssignment();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						if (current==null) {
+                    	      							current = createModelElementForParent(grammarAccess.getUiDecimalFieldRule());
+                    	      						}
+                    	      						add(
+                    	      							current,
+                    	      							"processorAssignments",
+                    	      							lv_processorAssignments_17_0,
+                    	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+                    	      						afterParserOrEnumRuleCall();
+                    	      					
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop337;
+                        }
+                    } while (true);
+
+                    otherlv_18=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_18, grammarAccess.getUiDecimalFieldAccess().getRightCurlyBracketKeyword_4_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiDecimalField"
+
+
+    // $ANTLR start "entryRuleUiOptionsGroup"
+    // InternalUIGrammar.g:14015:1: entryRuleUiOptionsGroup returns [EObject current=null] : iv_ruleUiOptionsGroup= ruleUiOptionsGroup EOF ;
+    public final EObject entryRuleUiOptionsGroup() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiOptionsGroup = null;
+
+
+        try {
+            // InternalUIGrammar.g:14015:55: (iv_ruleUiOptionsGroup= ruleUiOptionsGroup EOF )
+            // InternalUIGrammar.g:14016:2: iv_ruleUiOptionsGroup= ruleUiOptionsGroup EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiOptionsGroupRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiOptionsGroup=ruleUiOptionsGroup();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiOptionsGroup; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiOptionsGroup"
+
+
+    // $ANTLR start "ruleUiOptionsGroup"
+    // InternalUIGrammar.g:14022:1: ruleUiOptionsGroup returns [EObject current=null] : ( () otherlv_1= 'optionsgroup' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* ) ) ) ( ( (lv_validators_25_0= ruleUiValidator ) ) | ( (lv_bindings_26_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_27_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_28= '}' )? ) ;
+    public final EObject ruleUiOptionsGroup() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_5=null;
+        Token lv_styles_6_0=null;
+        Token otherlv_7=null;
+        Token lv_name_8_0=null;
+        Token otherlv_9=null;
+        Token otherlv_11=null;
+        Token otherlv_13=null;
+        Token otherlv_15=null;
+        Token otherlv_16=null;
+        Token otherlv_17=null;
+        Token otherlv_19=null;
+        Token otherlv_20=null;
+        Token otherlv_21=null;
+        Token lv_consumeBeanService_22_0=null;
+        Token otherlv_23=null;
+        Token lv_readonly_24_0=null;
+        Token otherlv_28=null;
+        EObject lv_i18nInfo_4_0 = null;
+
+        EObject lv_jvmType_12_0 = null;
+
+        Enumerator lv_selectionType_14_0 = null;
+
+        EObject lv_descriptionProperty_18_0 = null;
+
+        EObject lv_validators_25_0 = null;
+
+        EObject lv_bindings_26_0 = null;
+
+        EObject lv_processorAssignments_27_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:14028:2: ( ( () otherlv_1= 'optionsgroup' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* ) ) ) ( ( (lv_validators_25_0= ruleUiValidator ) ) | ( (lv_bindings_26_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_27_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_28= '}' )? ) )
+            // InternalUIGrammar.g:14029:2: ( () otherlv_1= 'optionsgroup' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* ) ) ) ( ( (lv_validators_25_0= ruleUiValidator ) ) | ( (lv_bindings_26_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_27_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_28= '}' )? )
+            {
+            // InternalUIGrammar.g:14029:2: ( () otherlv_1= 'optionsgroup' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* ) ) ) ( ( (lv_validators_25_0= ruleUiValidator ) ) | ( (lv_bindings_26_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_27_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_28= '}' )? )
+            // InternalUIGrammar.g:14030:3: () otherlv_1= 'optionsgroup' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* ) ) ) ( ( (lv_validators_25_0= ruleUiValidator ) ) | ( (lv_bindings_26_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_27_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_28= '}' )?
+            {
+            // InternalUIGrammar.g:14030:3: ()
+            // InternalUIGrammar.g:14031:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiOptionsGroupAccess().getUiOptionsGroupAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,138,FOLLOW_86); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiOptionsGroupAccess().getOptionsgroupKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:14041:3: (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )?
+            int alt340=2;
+            int LA340_0 = input.LA(1);
+
+            if ( (LA340_0==45) ) {
+                alt340=1;
+            }
+            switch (alt340) {
+                case 1 :
+                    // InternalUIGrammar.g:14042:4: otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')'
+                    {
+                    otherlv_2=(Token)match(input,45,FOLLOW_63); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getUiOptionsGroupAccess().getLeftParenthesisKeyword_2_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:14046:4: ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:14047:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:14047:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:14048:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_2_1());
+                    // InternalUIGrammar.g:14051:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:14052:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:14052:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )*
+                    loop339:
+                    do {
+                        int alt339=3;
+                        int LA339_0 = input.LA(1);
+
+                        if ( LA339_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_2_1(), 0) ) {
+                            alt339=1;
+                        }
+                        else if ( LA339_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_2_1(), 1) ) {
+                            alt339=2;
+                        }
+
+
+                        switch (alt339) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:14053:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:14053:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    // InternalUIGrammar.g:14054:6: {...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_2_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiOptionsGroup", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_2_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:14054:114: ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    // InternalUIGrammar.g:14055:7: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_2_1(), 0);
+                    	    // InternalUIGrammar.g:14058:10: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    // InternalUIGrammar.g:14058:11: {...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiOptionsGroup", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:14058:20: ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    // InternalUIGrammar.g:14058:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    {
+                    	    // InternalUIGrammar.g:14058:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    // InternalUIGrammar.g:14059:11: lv_i18nInfo_4_0= ruleUiI18nInfo
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getUiOptionsGroupAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_63);
+                    	    lv_i18nInfo_4_0=ruleUiI18nInfo();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getUiOptionsGroupRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"i18nInfo",
+                    	      												lv_i18nInfo_4_0,
+                    	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:14081:5: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:14081:5: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:14082:6: {...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_2_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiOptionsGroup", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_2_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:14082:114: ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:14083:7: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_2_1(), 1);
+                    	    // InternalUIGrammar.g:14086:10: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:14086:11: {...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiOptionsGroup", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:14086:20: (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:14086:21: otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_5=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_5, grammarAccess.getUiOptionsGroupAccess().getStylesKeyword_2_1_1_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:14090:10: ( (lv_styles_6_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:14091:11: (lv_styles_6_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:14091:11: (lv_styles_6_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:14092:12: lv_styles_6_0= RULE_STRING
+                    	    {
+                    	    lv_styles_6_0=(Token)match(input,RULE_STRING,FOLLOW_63); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_styles_6_0, grammarAccess.getUiOptionsGroupAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiOptionsGroupRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"styles",
+                    	      													lv_styles_6_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop339;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_2_1());
+
+                    }
+
+                    otherlv_7=(Token)match(input,47,FOLLOW_88); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_7, grammarAccess.getUiOptionsGroupAccess().getRightParenthesisKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:14126:3: ( (lv_name_8_0= RULE_ID ) )?
+            int alt341=2;
+            int LA341_0 = input.LA(1);
+
+            if ( (LA341_0==RULE_ID) ) {
+                alt341=1;
+            }
+            switch (alt341) {
+                case 1 :
+                    // InternalUIGrammar.g:14127:4: (lv_name_8_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:14127:4: (lv_name_8_0= RULE_ID )
+                    // InternalUIGrammar.g:14128:5: lv_name_8_0= RULE_ID
+                    {
+                    lv_name_8_0=(Token)match(input,RULE_ID,FOLLOW_89); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_8_0, grammarAccess.getUiOptionsGroupAccess().getNameIDTerminalRuleCall_3_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiOptionsGroupRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_8_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:14144:3: (otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* ) ) ) ( ( (lv_validators_25_0= ruleUiValidator ) ) | ( (lv_bindings_26_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_27_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_28= '}' )?
+            int alt347=2;
+            int LA347_0 = input.LA(1);
+
+            if ( (LA347_0==20) ) {
+                alt347=1;
+            }
+            switch (alt347) {
+                case 1 :
+                    // InternalUIGrammar.g:14145:4: otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* ) ) ) ( ( (lv_validators_25_0= ruleUiValidator ) ) | ( (lv_bindings_26_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_27_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_28= '}'
+                    {
+                    otherlv_9=(Token)match(input,20,FOLLOW_117); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_9, grammarAccess.getUiOptionsGroupAccess().getLeftCurlyBracketKeyword_4_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:14149:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:14150:5: ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:14150:5: ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:14151:6: ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1());
+                    // InternalUIGrammar.g:14154:6: ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:14155:7: ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:14155:7: ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )*
+                    loop344:
+                    do {
+                        int alt344=8;
+                        int LA344_0 = input.LA(1);
+
+                        if ( LA344_0 == 75 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 0) ) {
+                            alt344=1;
+                        }
+                        else if ( LA344_0 == 125 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 1) ) {
+                            alt344=2;
+                        }
+                        else if ( LA344_0 == 108 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 2) ) {
+                            alt344=3;
+                        }
+                        else if ( LA344_0 == 114 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 3) ) {
+                            alt344=4;
+                        }
+                        else if ( LA344_0 == 115 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 4) ) {
+                            alt344=5;
+                        }
+                        else if ( LA344_0 == 126 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 5) ) {
+                            alt344=6;
+                        }
+                        else if ( LA344_0 == 65 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 6) ) {
+                            alt344=7;
+                        }
+
+
+                        switch (alt344) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:14156:5: ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:14156:5: ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:14157:6: {...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiOptionsGroup", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:14157:114: ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) ) ) )
+                    	    // InternalUIGrammar.g:14158:7: ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 0);
+                    	    // InternalUIGrammar.g:14161:10: ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) ) )
+                    	    // InternalUIGrammar.g:14161:11: {...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiOptionsGroup", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:14161:20: (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) )
+                    	    // InternalUIGrammar.g:14161:21: otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) )
+                    	    {
+                    	    otherlv_11=(Token)match(input,75,FOLLOW_16); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_11, grammarAccess.getUiOptionsGroupAccess().getTypeKeyword_4_1_0_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:14165:10: ( (lv_jvmType_12_0= ruleJvmTypeReference ) )
+                    	    // InternalUIGrammar.g:14166:11: (lv_jvmType_12_0= ruleJvmTypeReference )
+                    	    {
+                    	    // InternalUIGrammar.g:14166:11: (lv_jvmType_12_0= ruleJvmTypeReference )
+                    	    // InternalUIGrammar.g:14167:12: lv_jvmType_12_0= ruleJvmTypeReference
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newCompositeNode(grammarAccess.getUiOptionsGroupAccess().getJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0());
+                    	      											
+                    	    }
+                    	    pushFollow(FOLLOW_117);
+                    	    lv_jvmType_12_0=ruleJvmTypeReference();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElementForParent(grammarAccess.getUiOptionsGroupRule());
+                    	      												}
+                    	      												set(
+                    	      													current,
+                    	      													"jvmType",
+                    	      													lv_jvmType_12_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+                    	      												afterParserOrEnumRuleCall();
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:14190:5: ({...}? => ( ({...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:14190:5: ({...}? => ( ({...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:14191:6: {...}? => ( ({...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiOptionsGroup", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:14191:114: ( ({...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) ) ) )
+                    	    // InternalUIGrammar.g:14192:7: ({...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 1);
+                    	    // InternalUIGrammar.g:14195:10: ({...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) ) )
+                    	    // InternalUIGrammar.g:14195:11: {...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiOptionsGroup", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:14195:20: (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) )
+                    	    // InternalUIGrammar.g:14195:21: otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) )
+                    	    {
+                    	    otherlv_13=(Token)match(input,125,FOLLOW_105); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_13, grammarAccess.getUiOptionsGroupAccess().getSelectionTypeKeyword_4_1_1_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:14199:10: ( (lv_selectionType_14_0= ruleUiSelectionType ) )
+                    	    // InternalUIGrammar.g:14200:11: (lv_selectionType_14_0= ruleUiSelectionType )
+                    	    {
+                    	    // InternalUIGrammar.g:14200:11: (lv_selectionType_14_0= ruleUiSelectionType )
+                    	    // InternalUIGrammar.g:14201:12: lv_selectionType_14_0= ruleUiSelectionType
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newCompositeNode(grammarAccess.getUiOptionsGroupAccess().getSelectionTypeUiSelectionTypeEnumRuleCall_4_1_1_1_0());
+                    	      											
+                    	    }
+                    	    pushFollow(FOLLOW_117);
+                    	    lv_selectionType_14_0=ruleUiSelectionType();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElementForParent(grammarAccess.getUiOptionsGroupRule());
+                    	      												}
+                    	      												set(
+                    	      													current,
+                    	      													"selectionType",
+                    	      													lv_selectionType_14_0,
+                    	      													"org.eclipse.osbp.ecview.dsl.UIGrammar.UiSelectionType");
+                    	      												afterParserOrEnumRuleCall();
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 3 :
+                    	    // InternalUIGrammar.g:14224:5: ({...}? => ( ({...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:14224:5: ({...}? => ( ({...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:14225:6: {...}? => ( ({...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 2) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiOptionsGroup", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 2)");
+                    	    }
+                    	    // InternalUIGrammar.g:14225:114: ( ({...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) ) ) )
+                    	    // InternalUIGrammar.g:14226:7: ({...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 2);
+                    	    // InternalUIGrammar.g:14229:10: ({...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) ) )
+                    	    // InternalUIGrammar.g:14229:11: {...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiOptionsGroup", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:14229:20: (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) )
+                    	    // InternalUIGrammar.g:14229:21: otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) )
+                    	    {
+                    	    otherlv_15=(Token)match(input,108,FOLLOW_3); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_15, grammarAccess.getUiOptionsGroupAccess().getCaptionFieldKeyword_4_1_2_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:14233:10: ( (otherlv_16= RULE_ID ) )
+                    	    // InternalUIGrammar.g:14234:11: (otherlv_16= RULE_ID )
+                    	    {
+                    	    // InternalUIGrammar.g:14234:11: (otherlv_16= RULE_ID )
+                    	    // InternalUIGrammar.g:14235:12: otherlv_16= RULE_ID
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiOptionsGroupRule());
+                    	      												}
+                    	      											
+                    	    }
+                    	    otherlv_16=(Token)match(input,RULE_ID,FOLLOW_117); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(otherlv_16, grammarAccess.getUiOptionsGroupAccess().getItemCaptionPropertyJvmOperationCrossReference_4_1_2_1_0());
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 4 :
+                    	    // InternalUIGrammar.g:14252:5: ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:14252:5: ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) )
+                    	    // InternalUIGrammar.g:14253:6: {...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 3) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiOptionsGroup", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 3)");
+                    	    }
+                    	    // InternalUIGrammar.g:14253:114: ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) )
+                    	    // InternalUIGrammar.g:14254:7: ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 3);
+                    	    // InternalUIGrammar.g:14257:10: ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) )
+                    	    // InternalUIGrammar.g:14257:11: {...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiOptionsGroup", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:14257:20: (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? )
+                    	    // InternalUIGrammar.g:14257:21: otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )?
+                    	    {
+                    	    otherlv_17=(Token)match(input,114,FOLLOW_3); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_17, grammarAccess.getUiOptionsGroupAccess().getDescriptionFieldKeyword_4_1_3_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:14261:10: ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) )
+                    	    // InternalUIGrammar.g:14262:11: (lv_descriptionProperty_18_0= ruleUiNestedProperty )
+                    	    {
+                    	    // InternalUIGrammar.g:14262:11: (lv_descriptionProperty_18_0= ruleUiNestedProperty )
+                    	    // InternalUIGrammar.g:14263:12: lv_descriptionProperty_18_0= ruleUiNestedProperty
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newCompositeNode(grammarAccess.getUiOptionsGroupAccess().getDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_3_1_0());
+                    	      											
+                    	    }
+                    	    pushFollow(FOLLOW_118);
+                    	    lv_descriptionProperty_18_0=ruleUiNestedProperty();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElementForParent(grammarAccess.getUiOptionsGroupRule());
+                    	      												}
+                    	      												set(
+                    	      													current,
+                    	      													"descriptionProperty",
+                    	      													lv_descriptionProperty_18_0,
+                    	      													"org.eclipse.osbp.ecview.dsl.UIGrammar.UiNestedProperty");
+                    	      												afterParserOrEnumRuleCall();
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    // InternalUIGrammar.g:14280:10: (otherlv_19= ';' )?
+                    	    int alt342=2;
+                    	    int LA342_0 = input.LA(1);
+
+                    	    if ( (LA342_0==16) ) {
+                    	        alt342=1;
+                    	    }
+                    	    switch (alt342) {
+                    	        case 1 :
+                    	            // InternalUIGrammar.g:14281:11: otherlv_19= ';'
+                    	            {
+                    	            otherlv_19=(Token)match(input,16,FOLLOW_117); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											newLeafNode(otherlv_19, grammarAccess.getUiOptionsGroupAccess().getSemicolonKeyword_4_1_3_2());
+                    	              										
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 5 :
+                    	    // InternalUIGrammar.g:14292:5: ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:14292:5: ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:14293:6: {...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 4) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiOptionsGroup", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 4)");
+                    	    }
+                    	    // InternalUIGrammar.g:14293:114: ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) ) ) )
+                    	    // InternalUIGrammar.g:14294:7: ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 4);
+                    	    // InternalUIGrammar.g:14297:10: ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) ) )
+                    	    // InternalUIGrammar.g:14297:11: {...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiOptionsGroup", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:14297:20: (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) )
+                    	    // InternalUIGrammar.g:14297:21: otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) )
+                    	    {
+                    	    otherlv_20=(Token)match(input,115,FOLLOW_3); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_20, grammarAccess.getUiOptionsGroupAccess().getImageFieldKeyword_4_1_4_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:14301:10: ( (otherlv_21= RULE_ID ) )
+                    	    // InternalUIGrammar.g:14302:11: (otherlv_21= RULE_ID )
+                    	    {
+                    	    // InternalUIGrammar.g:14302:11: (otherlv_21= RULE_ID )
+                    	    // InternalUIGrammar.g:14303:12: otherlv_21= RULE_ID
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiOptionsGroupRule());
+                    	      												}
+                    	      											
+                    	    }
+                    	    otherlv_21=(Token)match(input,RULE_ID,FOLLOW_117); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(otherlv_21, grammarAccess.getUiOptionsGroupAccess().getItemImagePropertyJvmOperationCrossReference_4_1_4_1_0());
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 6 :
+                    	    // InternalUIGrammar.g:14320:5: ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:14320:5: ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? ) ) ) )
+                    	    // InternalUIGrammar.g:14321:6: {...}? => ( ({...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 5) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiOptionsGroup", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 5)");
+                    	    }
+                    	    // InternalUIGrammar.g:14321:114: ( ({...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? ) ) )
+                    	    // InternalUIGrammar.g:14322:7: ({...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 5);
+                    	    // InternalUIGrammar.g:14325:10: ({...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? ) )
+                    	    // InternalUIGrammar.g:14325:11: {...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiOptionsGroup", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:14325:20: ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? )
+                    	    // InternalUIGrammar.g:14325:21: ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )?
+                    	    {
+                    	    // InternalUIGrammar.g:14325:21: ( (lv_consumeBeanService_22_0= 'useBeanService' ) )
+                    	    // InternalUIGrammar.g:14326:11: (lv_consumeBeanService_22_0= 'useBeanService' )
+                    	    {
+                    	    // InternalUIGrammar.g:14326:11: (lv_consumeBeanService_22_0= 'useBeanService' )
+                    	    // InternalUIGrammar.g:14327:12: lv_consumeBeanService_22_0= 'useBeanService'
+                    	    {
+                    	    lv_consumeBeanService_22_0=(Token)match(input,126,FOLLOW_118); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_consumeBeanService_22_0, grammarAccess.getUiOptionsGroupAccess().getConsumeBeanServiceUseBeanServiceKeyword_4_1_5_0_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiOptionsGroupRule());
+                    	      												}
+                    	      												setWithLastConsumed(current, "consumeBeanService", true, "useBeanService");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    // InternalUIGrammar.g:14339:10: (otherlv_23= ';' )?
+                    	    int alt343=2;
+                    	    int LA343_0 = input.LA(1);
+
+                    	    if ( (LA343_0==16) ) {
+                    	        alt343=1;
+                    	    }
+                    	    switch (alt343) {
+                    	        case 1 :
+                    	            // InternalUIGrammar.g:14340:11: otherlv_23= ';'
+                    	            {
+                    	            otherlv_23=(Token)match(input,16,FOLLOW_117); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											newLeafNode(otherlv_23, grammarAccess.getUiOptionsGroupAccess().getSemicolonKeyword_4_1_5_1());
+                    	              										
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 7 :
+                    	    // InternalUIGrammar.g:14351:5: ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:14351:5: ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) )
+                    	    // InternalUIGrammar.g:14352:6: {...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 6) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiOptionsGroup", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 6)");
+                    	    }
+                    	    // InternalUIGrammar.g:14352:114: ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) )
+                    	    // InternalUIGrammar.g:14353:7: ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 6);
+                    	    // InternalUIGrammar.g:14356:10: ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) )
+                    	    // InternalUIGrammar.g:14356:11: {...}? => ( (lv_readonly_24_0= 'readonly' ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiOptionsGroup", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:14356:20: ( (lv_readonly_24_0= 'readonly' ) )
+                    	    // InternalUIGrammar.g:14356:21: (lv_readonly_24_0= 'readonly' )
+                    	    {
+                    	    // InternalUIGrammar.g:14356:21: (lv_readonly_24_0= 'readonly' )
+                    	    // InternalUIGrammar.g:14357:11: lv_readonly_24_0= 'readonly'
+                    	    {
+                    	    lv_readonly_24_0=(Token)match(input,65,FOLLOW_117); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newLeafNode(lv_readonly_24_0, grammarAccess.getUiOptionsGroupAccess().getReadonlyReadonlyKeyword_4_1_6_0());
+                    	      										
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElement(grammarAccess.getUiOptionsGroupRule());
+                    	      											}
+                    	      											setWithLastConsumed(current, "readonly", true, "readonly");
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop344;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1());
+
+                    }
+
+                    // InternalUIGrammar.g:14381:4: ( ( (lv_validators_25_0= ruleUiValidator ) ) | ( (lv_bindings_26_0= ruleUiBinding ) ) )*
+                    loop345:
+                    do {
+                        int alt345=3;
+                        int LA345_0 = input.LA(1);
+
+                        if ( ((LA345_0>=147 && LA345_0<=151)) ) {
+                            alt345=1;
+                        }
+                        else if ( (LA345_0==26) ) {
+                            alt345=2;
+                        }
+
+
+                        switch (alt345) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:14382:5: ( (lv_validators_25_0= ruleUiValidator ) )
+                    	    {
+                    	    // InternalUIGrammar.g:14382:5: ( (lv_validators_25_0= ruleUiValidator ) )
+                    	    // InternalUIGrammar.g:14383:6: (lv_validators_25_0= ruleUiValidator )
+                    	    {
+                    	    // InternalUIGrammar.g:14383:6: (lv_validators_25_0= ruleUiValidator )
+                    	    // InternalUIGrammar.g:14384:7: lv_validators_25_0= ruleUiValidator
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiOptionsGroupAccess().getValidatorsUiValidatorParserRuleCall_4_2_0_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_validators_25_0=ruleUiValidator();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiOptionsGroupRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"validators",
+                    	      								lv_validators_25_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:14402:5: ( (lv_bindings_26_0= ruleUiBinding ) )
+                    	    {
+                    	    // InternalUIGrammar.g:14402:5: ( (lv_bindings_26_0= ruleUiBinding ) )
+                    	    // InternalUIGrammar.g:14403:6: (lv_bindings_26_0= ruleUiBinding )
+                    	    {
+                    	    // InternalUIGrammar.g:14403:6: (lv_bindings_26_0= ruleUiBinding )
+                    	    // InternalUIGrammar.g:14404:7: lv_bindings_26_0= ruleUiBinding
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiOptionsGroupAccess().getBindingsUiBindingParserRuleCall_4_2_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_bindings_26_0=ruleUiBinding();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiOptionsGroupRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"bindings",
+                    	      								lv_bindings_26_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop345;
+                        }
+                    } while (true);
+
+                    // InternalUIGrammar.g:14422:4: ( (lv_processorAssignments_27_0= ruleUiVisibilityProcessorAssignment ) )*
+                    loop346:
+                    do {
+                        int alt346=2;
+                        int LA346_0 = input.LA(1);
+
+                        if ( (LA346_0==153) ) {
+                            alt346=1;
+                        }
+
+
+                        switch (alt346) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:14423:5: (lv_processorAssignments_27_0= ruleUiVisibilityProcessorAssignment )
+                    	    {
+                    	    // InternalUIGrammar.g:14423:5: (lv_processorAssignments_27_0= ruleUiVisibilityProcessorAssignment )
+                    	    // InternalUIGrammar.g:14424:6: lv_processorAssignments_27_0= ruleUiVisibilityProcessorAssignment
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newCompositeNode(grammarAccess.getUiOptionsGroupAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0());
+                    	      					
+                    	    }
+                    	    pushFollow(FOLLOW_42);
+                    	    lv_processorAssignments_27_0=ruleUiVisibilityProcessorAssignment();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						if (current==null) {
+                    	      							current = createModelElementForParent(grammarAccess.getUiOptionsGroupRule());
+                    	      						}
+                    	      						add(
+                    	      							current,
+                    	      							"processorAssignments",
+                    	      							lv_processorAssignments_27_0,
+                    	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+                    	      						afterParserOrEnumRuleCall();
+                    	      					
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop346;
+                        }
+                    } while (true);
+
+                    otherlv_28=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_28, grammarAccess.getUiOptionsGroupAccess().getRightCurlyBracketKeyword_4_4());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiOptionsGroup"
+
+
+    // $ANTLR start "entryRuleUiList"
+    // InternalUIGrammar.g:14450:1: entryRuleUiList returns [EObject current=null] : iv_ruleUiList= ruleUiList EOF ;
+    public final EObject entryRuleUiList() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiList = null;
+
+
+        try {
+            // InternalUIGrammar.g:14450:47: (iv_ruleUiList= ruleUiList EOF )
+            // InternalUIGrammar.g:14451:2: iv_ruleUiList= ruleUiList EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiListRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiList=ruleUiList();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiList; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiList"
+
+
+    // $ANTLR start "ruleUiList"
+    // InternalUIGrammar.g:14457:1: ruleUiList returns [EObject current=null] : ( () otherlv_1= 'listSelect' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* ) ) ) ( ( (lv_validators_25_0= ruleUiValidator ) ) | ( (lv_bindings_26_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_27_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_28= '}' )? ) ;
+    public final EObject ruleUiList() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_5=null;
+        Token lv_styles_6_0=null;
+        Token otherlv_7=null;
+        Token lv_name_8_0=null;
+        Token otherlv_9=null;
+        Token otherlv_11=null;
+        Token otherlv_13=null;
+        Token otherlv_15=null;
+        Token otherlv_16=null;
+        Token otherlv_17=null;
+        Token otherlv_19=null;
+        Token otherlv_20=null;
+        Token otherlv_21=null;
+        Token lv_consumeBeanService_22_0=null;
+        Token otherlv_23=null;
+        Token lv_readonly_24_0=null;
+        Token otherlv_28=null;
+        EObject lv_i18nInfo_4_0 = null;
+
+        EObject lv_jvmType_12_0 = null;
+
+        Enumerator lv_selectionType_14_0 = null;
+
+        EObject lv_descriptionProperty_18_0 = null;
+
+        EObject lv_validators_25_0 = null;
+
+        EObject lv_bindings_26_0 = null;
+
+        EObject lv_processorAssignments_27_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:14463:2: ( ( () otherlv_1= 'listSelect' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* ) ) ) ( ( (lv_validators_25_0= ruleUiValidator ) ) | ( (lv_bindings_26_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_27_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_28= '}' )? ) )
+            // InternalUIGrammar.g:14464:2: ( () otherlv_1= 'listSelect' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* ) ) ) ( ( (lv_validators_25_0= ruleUiValidator ) ) | ( (lv_bindings_26_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_27_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_28= '}' )? )
+            {
+            // InternalUIGrammar.g:14464:2: ( () otherlv_1= 'listSelect' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* ) ) ) ( ( (lv_validators_25_0= ruleUiValidator ) ) | ( (lv_bindings_26_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_27_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_28= '}' )? )
+            // InternalUIGrammar.g:14465:3: () otherlv_1= 'listSelect' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )? ( (lv_name_8_0= RULE_ID ) )? (otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* ) ) ) ( ( (lv_validators_25_0= ruleUiValidator ) ) | ( (lv_bindings_26_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_27_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_28= '}' )?
+            {
+            // InternalUIGrammar.g:14465:3: ()
+            // InternalUIGrammar.g:14466:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiListAccess().getUiListAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,139,FOLLOW_86); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiListAccess().getListSelectKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:14476:3: (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')' )?
+            int alt349=2;
+            int LA349_0 = input.LA(1);
+
+            if ( (LA349_0==45) ) {
+                alt349=1;
+            }
+            switch (alt349) {
+                case 1 :
+                    // InternalUIGrammar.g:14477:4: otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_7= ')'
+                    {
+                    otherlv_2=(Token)match(input,45,FOLLOW_63); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getUiListAccess().getLeftParenthesisKeyword_2_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:14481:4: ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:14482:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:14482:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:14483:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiListAccess().getUnorderedGroup_2_1());
+                    // InternalUIGrammar.g:14486:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:14487:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:14487:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) )*
+                    loop348:
+                    do {
+                        int alt348=3;
+                        int LA348_0 = input.LA(1);
+
+                        if ( LA348_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_2_1(), 0) ) {
+                            alt348=1;
+                        }
+                        else if ( LA348_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_2_1(), 1) ) {
+                            alt348=2;
+                        }
+
+
+                        switch (alt348) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:14488:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:14488:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    // InternalUIGrammar.g:14489:6: {...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_2_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiList", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_2_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:14489:106: ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    // InternalUIGrammar.g:14490:7: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiListAccess().getUnorderedGroup_2_1(), 0);
+                    	    // InternalUIGrammar.g:14493:10: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    // InternalUIGrammar.g:14493:11: {...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiList", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:14493:20: ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    // InternalUIGrammar.g:14493:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    {
+                    	    // InternalUIGrammar.g:14493:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    // InternalUIGrammar.g:14494:11: lv_i18nInfo_4_0= ruleUiI18nInfo
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getUiListAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_63);
+                    	    lv_i18nInfo_4_0=ruleUiI18nInfo();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getUiListRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"i18nInfo",
+                    	      												lv_i18nInfo_4_0,
+                    	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiListAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:14516:5: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:14516:5: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:14517:6: {...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_2_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiList", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_2_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:14517:106: ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:14518:7: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiListAccess().getUnorderedGroup_2_1(), 1);
+                    	    // InternalUIGrammar.g:14521:10: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:14521:11: {...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiList", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:14521:20: (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:14521:21: otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_5=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_5, grammarAccess.getUiListAccess().getStylesKeyword_2_1_1_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:14525:10: ( (lv_styles_6_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:14526:11: (lv_styles_6_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:14526:11: (lv_styles_6_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:14527:12: lv_styles_6_0= RULE_STRING
+                    	    {
+                    	    lv_styles_6_0=(Token)match(input,RULE_STRING,FOLLOW_63); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_styles_6_0, grammarAccess.getUiListAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiListRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"styles",
+                    	      													lv_styles_6_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiListAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop348;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiListAccess().getUnorderedGroup_2_1());
+
+                    }
+
+                    otherlv_7=(Token)match(input,47,FOLLOW_88); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_7, grammarAccess.getUiListAccess().getRightParenthesisKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:14561:3: ( (lv_name_8_0= RULE_ID ) )?
+            int alt350=2;
+            int LA350_0 = input.LA(1);
+
+            if ( (LA350_0==RULE_ID) ) {
+                alt350=1;
+            }
+            switch (alt350) {
+                case 1 :
+                    // InternalUIGrammar.g:14562:4: (lv_name_8_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:14562:4: (lv_name_8_0= RULE_ID )
+                    // InternalUIGrammar.g:14563:5: lv_name_8_0= RULE_ID
+                    {
+                    lv_name_8_0=(Token)match(input,RULE_ID,FOLLOW_89); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_8_0, grammarAccess.getUiListAccess().getNameIDTerminalRuleCall_3_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiListRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_8_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:14579:3: (otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* ) ) ) ( ( (lv_validators_25_0= ruleUiValidator ) ) | ( (lv_bindings_26_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_27_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_28= '}' )?
+            int alt356=2;
+            int LA356_0 = input.LA(1);
+
+            if ( (LA356_0==20) ) {
+                alt356=1;
+            }
+            switch (alt356) {
+                case 1 :
+                    // InternalUIGrammar.g:14580:4: otherlv_9= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* ) ) ) ( ( (lv_validators_25_0= ruleUiValidator ) ) | ( (lv_bindings_26_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_27_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_28= '}'
+                    {
+                    otherlv_9=(Token)match(input,20,FOLLOW_117); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_9, grammarAccess.getUiListAccess().getLeftCurlyBracketKeyword_4_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:14584:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:14585:5: ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:14585:5: ( ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:14586:6: ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiListAccess().getUnorderedGroup_4_1());
+                    // InternalUIGrammar.g:14589:6: ( ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:14590:7: ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:14590:7: ( ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) ) )*
+                    loop353:
+                    do {
+                        int alt353=8;
+                        int LA353_0 = input.LA(1);
+
+                        if ( LA353_0 == 75 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 0) ) {
+                            alt353=1;
+                        }
+                        else if ( LA353_0 == 125 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 1) ) {
+                            alt353=2;
+                        }
+                        else if ( LA353_0 == 108 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 2) ) {
+                            alt353=3;
+                        }
+                        else if ( LA353_0 == 114 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 3) ) {
+                            alt353=4;
+                        }
+                        else if ( LA353_0 == 115 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 4) ) {
+                            alt353=5;
+                        }
+                        else if ( LA353_0 == 126 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 5) ) {
+                            alt353=6;
+                        }
+                        else if ( LA353_0 == 65 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 6) ) {
+                            alt353=7;
+                        }
+
+
+                        switch (alt353) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:14591:5: ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:14591:5: ({...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:14592:6: {...}? => ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiList", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:14592:106: ( ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) ) ) )
+                    	    // InternalUIGrammar.g:14593:7: ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 0);
+                    	    // InternalUIGrammar.g:14596:10: ({...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) ) )
+                    	    // InternalUIGrammar.g:14596:11: {...}? => (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiList", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:14596:20: (otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) ) )
+                    	    // InternalUIGrammar.g:14596:21: otherlv_11= 'type' ( (lv_jvmType_12_0= ruleJvmTypeReference ) )
+                    	    {
+                    	    otherlv_11=(Token)match(input,75,FOLLOW_16); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_11, grammarAccess.getUiListAccess().getTypeKeyword_4_1_0_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:14600:10: ( (lv_jvmType_12_0= ruleJvmTypeReference ) )
+                    	    // InternalUIGrammar.g:14601:11: (lv_jvmType_12_0= ruleJvmTypeReference )
+                    	    {
+                    	    // InternalUIGrammar.g:14601:11: (lv_jvmType_12_0= ruleJvmTypeReference )
+                    	    // InternalUIGrammar.g:14602:12: lv_jvmType_12_0= ruleJvmTypeReference
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newCompositeNode(grammarAccess.getUiListAccess().getJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0());
+                    	      											
+                    	    }
+                    	    pushFollow(FOLLOW_117);
+                    	    lv_jvmType_12_0=ruleJvmTypeReference();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElementForParent(grammarAccess.getUiListRule());
+                    	      												}
+                    	      												set(
+                    	      													current,
+                    	      													"jvmType",
+                    	      													lv_jvmType_12_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+                    	      												afterParserOrEnumRuleCall();
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiListAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:14625:5: ({...}? => ( ({...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:14625:5: ({...}? => ( ({...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:14626:6: {...}? => ( ({...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiList", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:14626:106: ( ({...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) ) ) )
+                    	    // InternalUIGrammar.g:14627:7: ({...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 1);
+                    	    // InternalUIGrammar.g:14630:10: ({...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) ) )
+                    	    // InternalUIGrammar.g:14630:11: {...}? => (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiList", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:14630:20: (otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) ) )
+                    	    // InternalUIGrammar.g:14630:21: otherlv_13= 'selectionType' ( (lv_selectionType_14_0= ruleUiSelectionType ) )
+                    	    {
+                    	    otherlv_13=(Token)match(input,125,FOLLOW_105); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_13, grammarAccess.getUiListAccess().getSelectionTypeKeyword_4_1_1_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:14634:10: ( (lv_selectionType_14_0= ruleUiSelectionType ) )
+                    	    // InternalUIGrammar.g:14635:11: (lv_selectionType_14_0= ruleUiSelectionType )
+                    	    {
+                    	    // InternalUIGrammar.g:14635:11: (lv_selectionType_14_0= ruleUiSelectionType )
+                    	    // InternalUIGrammar.g:14636:12: lv_selectionType_14_0= ruleUiSelectionType
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newCompositeNode(grammarAccess.getUiListAccess().getSelectionTypeUiSelectionTypeEnumRuleCall_4_1_1_1_0());
+                    	      											
+                    	    }
+                    	    pushFollow(FOLLOW_117);
+                    	    lv_selectionType_14_0=ruleUiSelectionType();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElementForParent(grammarAccess.getUiListRule());
+                    	      												}
+                    	      												set(
+                    	      													current,
+                    	      													"selectionType",
+                    	      													lv_selectionType_14_0,
+                    	      													"org.eclipse.osbp.ecview.dsl.UIGrammar.UiSelectionType");
+                    	      												afterParserOrEnumRuleCall();
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiListAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 3 :
+                    	    // InternalUIGrammar.g:14659:5: ({...}? => ( ({...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:14659:5: ({...}? => ( ({...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:14660:6: {...}? => ( ({...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 2) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiList", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 2)");
+                    	    }
+                    	    // InternalUIGrammar.g:14660:106: ( ({...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) ) ) )
+                    	    // InternalUIGrammar.g:14661:7: ({...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 2);
+                    	    // InternalUIGrammar.g:14664:10: ({...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) ) )
+                    	    // InternalUIGrammar.g:14664:11: {...}? => (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiList", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:14664:20: (otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) ) )
+                    	    // InternalUIGrammar.g:14664:21: otherlv_15= 'captionField' ( (otherlv_16= RULE_ID ) )
+                    	    {
+                    	    otherlv_15=(Token)match(input,108,FOLLOW_3); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_15, grammarAccess.getUiListAccess().getCaptionFieldKeyword_4_1_2_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:14668:10: ( (otherlv_16= RULE_ID ) )
+                    	    // InternalUIGrammar.g:14669:11: (otherlv_16= RULE_ID )
+                    	    {
+                    	    // InternalUIGrammar.g:14669:11: (otherlv_16= RULE_ID )
+                    	    // InternalUIGrammar.g:14670:12: otherlv_16= RULE_ID
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiListRule());
+                    	      												}
+                    	      											
+                    	    }
+                    	    otherlv_16=(Token)match(input,RULE_ID,FOLLOW_117); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(otherlv_16, grammarAccess.getUiListAccess().getItemCaptionPropertyJvmOperationCrossReference_4_1_2_1_0());
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiListAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 4 :
+                    	    // InternalUIGrammar.g:14687:5: ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:14687:5: ({...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) ) )
+                    	    // InternalUIGrammar.g:14688:6: {...}? => ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 3) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiList", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 3)");
+                    	    }
+                    	    // InternalUIGrammar.g:14688:106: ( ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) ) )
+                    	    // InternalUIGrammar.g:14689:7: ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 3);
+                    	    // InternalUIGrammar.g:14692:10: ({...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? ) )
+                    	    // InternalUIGrammar.g:14692:11: {...}? => (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiList", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:14692:20: (otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )? )
+                    	    // InternalUIGrammar.g:14692:21: otherlv_17= 'descriptionField' ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) ) (otherlv_19= ';' )?
+                    	    {
+                    	    otherlv_17=(Token)match(input,114,FOLLOW_3); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_17, grammarAccess.getUiListAccess().getDescriptionFieldKeyword_4_1_3_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:14696:10: ( (lv_descriptionProperty_18_0= ruleUiNestedProperty ) )
+                    	    // InternalUIGrammar.g:14697:11: (lv_descriptionProperty_18_0= ruleUiNestedProperty )
+                    	    {
+                    	    // InternalUIGrammar.g:14697:11: (lv_descriptionProperty_18_0= ruleUiNestedProperty )
+                    	    // InternalUIGrammar.g:14698:12: lv_descriptionProperty_18_0= ruleUiNestedProperty
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newCompositeNode(grammarAccess.getUiListAccess().getDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_3_1_0());
+                    	      											
+                    	    }
+                    	    pushFollow(FOLLOW_118);
+                    	    lv_descriptionProperty_18_0=ruleUiNestedProperty();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElementForParent(grammarAccess.getUiListRule());
+                    	      												}
+                    	      												set(
+                    	      													current,
+                    	      													"descriptionProperty",
+                    	      													lv_descriptionProperty_18_0,
+                    	      													"org.eclipse.osbp.ecview.dsl.UIGrammar.UiNestedProperty");
+                    	      												afterParserOrEnumRuleCall();
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    // InternalUIGrammar.g:14715:10: (otherlv_19= ';' )?
+                    	    int alt351=2;
+                    	    int LA351_0 = input.LA(1);
+
+                    	    if ( (LA351_0==16) ) {
+                    	        alt351=1;
+                    	    }
+                    	    switch (alt351) {
+                    	        case 1 :
+                    	            // InternalUIGrammar.g:14716:11: otherlv_19= ';'
+                    	            {
+                    	            otherlv_19=(Token)match(input,16,FOLLOW_117); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											newLeafNode(otherlv_19, grammarAccess.getUiListAccess().getSemicolonKeyword_4_1_3_2());
+                    	              										
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiListAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 5 :
+                    	    // InternalUIGrammar.g:14727:5: ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:14727:5: ({...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:14728:6: {...}? => ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 4) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiList", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 4)");
+                    	    }
+                    	    // InternalUIGrammar.g:14728:106: ( ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) ) ) )
+                    	    // InternalUIGrammar.g:14729:7: ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 4);
+                    	    // InternalUIGrammar.g:14732:10: ({...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) ) )
+                    	    // InternalUIGrammar.g:14732:11: {...}? => (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiList", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:14732:20: (otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) ) )
+                    	    // InternalUIGrammar.g:14732:21: otherlv_20= 'imageField' ( (otherlv_21= RULE_ID ) )
+                    	    {
+                    	    otherlv_20=(Token)match(input,115,FOLLOW_3); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_20, grammarAccess.getUiListAccess().getImageFieldKeyword_4_1_4_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:14736:10: ( (otherlv_21= RULE_ID ) )
+                    	    // InternalUIGrammar.g:14737:11: (otherlv_21= RULE_ID )
+                    	    {
+                    	    // InternalUIGrammar.g:14737:11: (otherlv_21= RULE_ID )
+                    	    // InternalUIGrammar.g:14738:12: otherlv_21= RULE_ID
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiListRule());
+                    	      												}
+                    	      											
+                    	    }
+                    	    otherlv_21=(Token)match(input,RULE_ID,FOLLOW_117); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(otherlv_21, grammarAccess.getUiListAccess().getItemImagePropertyJvmOperationCrossReference_4_1_4_1_0());
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiListAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 6 :
+                    	    // InternalUIGrammar.g:14755:5: ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:14755:5: ({...}? => ( ({...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? ) ) ) )
+                    	    // InternalUIGrammar.g:14756:6: {...}? => ( ({...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 5) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiList", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 5)");
+                    	    }
+                    	    // InternalUIGrammar.g:14756:106: ( ({...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? ) ) )
+                    	    // InternalUIGrammar.g:14757:7: ({...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 5);
+                    	    // InternalUIGrammar.g:14760:10: ({...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? ) )
+                    	    // InternalUIGrammar.g:14760:11: {...}? => ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiList", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:14760:20: ( ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )? )
+                    	    // InternalUIGrammar.g:14760:21: ( (lv_consumeBeanService_22_0= 'useBeanService' ) ) (otherlv_23= ';' )?
+                    	    {
+                    	    // InternalUIGrammar.g:14760:21: ( (lv_consumeBeanService_22_0= 'useBeanService' ) )
+                    	    // InternalUIGrammar.g:14761:11: (lv_consumeBeanService_22_0= 'useBeanService' )
+                    	    {
+                    	    // InternalUIGrammar.g:14761:11: (lv_consumeBeanService_22_0= 'useBeanService' )
+                    	    // InternalUIGrammar.g:14762:12: lv_consumeBeanService_22_0= 'useBeanService'
+                    	    {
+                    	    lv_consumeBeanService_22_0=(Token)match(input,126,FOLLOW_118); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_consumeBeanService_22_0, grammarAccess.getUiListAccess().getConsumeBeanServiceUseBeanServiceKeyword_4_1_5_0_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiListRule());
+                    	      												}
+                    	      												setWithLastConsumed(current, "consumeBeanService", true, "useBeanService");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    // InternalUIGrammar.g:14774:10: (otherlv_23= ';' )?
+                    	    int alt352=2;
+                    	    int LA352_0 = input.LA(1);
+
+                    	    if ( (LA352_0==16) ) {
+                    	        alt352=1;
+                    	    }
+                    	    switch (alt352) {
+                    	        case 1 :
+                    	            // InternalUIGrammar.g:14775:11: otherlv_23= ';'
+                    	            {
+                    	            otherlv_23=(Token)match(input,16,FOLLOW_117); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											newLeafNode(otherlv_23, grammarAccess.getUiListAccess().getSemicolonKeyword_4_1_5_1());
+                    	              										
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiListAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 7 :
+                    	    // InternalUIGrammar.g:14786:5: ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:14786:5: ({...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) ) )
+                    	    // InternalUIGrammar.g:14787:6: {...}? => ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 6) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiList", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 6)");
+                    	    }
+                    	    // InternalUIGrammar.g:14787:106: ( ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) ) )
+                    	    // InternalUIGrammar.g:14788:7: ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 6);
+                    	    // InternalUIGrammar.g:14791:10: ({...}? => ( (lv_readonly_24_0= 'readonly' ) ) )
+                    	    // InternalUIGrammar.g:14791:11: {...}? => ( (lv_readonly_24_0= 'readonly' ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiList", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:14791:20: ( (lv_readonly_24_0= 'readonly' ) )
+                    	    // InternalUIGrammar.g:14791:21: (lv_readonly_24_0= 'readonly' )
+                    	    {
+                    	    // InternalUIGrammar.g:14791:21: (lv_readonly_24_0= 'readonly' )
+                    	    // InternalUIGrammar.g:14792:11: lv_readonly_24_0= 'readonly'
+                    	    {
+                    	    lv_readonly_24_0=(Token)match(input,65,FOLLOW_117); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newLeafNode(lv_readonly_24_0, grammarAccess.getUiListAccess().getReadonlyReadonlyKeyword_4_1_6_0());
+                    	      										
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElement(grammarAccess.getUiListRule());
+                    	      											}
+                    	      											setWithLastConsumed(current, "readonly", true, "readonly");
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiListAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop353;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiListAccess().getUnorderedGroup_4_1());
+
+                    }
+
+                    // InternalUIGrammar.g:14816:4: ( ( (lv_validators_25_0= ruleUiValidator ) ) | ( (lv_bindings_26_0= ruleUiBinding ) ) )*
+                    loop354:
+                    do {
+                        int alt354=3;
+                        int LA354_0 = input.LA(1);
+
+                        if ( ((LA354_0>=147 && LA354_0<=151)) ) {
+                            alt354=1;
+                        }
+                        else if ( (LA354_0==26) ) {
+                            alt354=2;
+                        }
+
+
+                        switch (alt354) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:14817:5: ( (lv_validators_25_0= ruleUiValidator ) )
+                    	    {
+                    	    // InternalUIGrammar.g:14817:5: ( (lv_validators_25_0= ruleUiValidator ) )
+                    	    // InternalUIGrammar.g:14818:6: (lv_validators_25_0= ruleUiValidator )
+                    	    {
+                    	    // InternalUIGrammar.g:14818:6: (lv_validators_25_0= ruleUiValidator )
+                    	    // InternalUIGrammar.g:14819:7: lv_validators_25_0= ruleUiValidator
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiListAccess().getValidatorsUiValidatorParserRuleCall_4_2_0_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_validators_25_0=ruleUiValidator();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiListRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"validators",
+                    	      								lv_validators_25_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:14837:5: ( (lv_bindings_26_0= ruleUiBinding ) )
+                    	    {
+                    	    // InternalUIGrammar.g:14837:5: ( (lv_bindings_26_0= ruleUiBinding ) )
+                    	    // InternalUIGrammar.g:14838:6: (lv_bindings_26_0= ruleUiBinding )
+                    	    {
+                    	    // InternalUIGrammar.g:14838:6: (lv_bindings_26_0= ruleUiBinding )
+                    	    // InternalUIGrammar.g:14839:7: lv_bindings_26_0= ruleUiBinding
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiListAccess().getBindingsUiBindingParserRuleCall_4_2_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_bindings_26_0=ruleUiBinding();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiListRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"bindings",
+                    	      								lv_bindings_26_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop354;
+                        }
+                    } while (true);
+
+                    // InternalUIGrammar.g:14857:4: ( (lv_processorAssignments_27_0= ruleUiVisibilityProcessorAssignment ) )*
+                    loop355:
+                    do {
+                        int alt355=2;
+                        int LA355_0 = input.LA(1);
+
+                        if ( (LA355_0==153) ) {
+                            alt355=1;
+                        }
+
+
+                        switch (alt355) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:14858:5: (lv_processorAssignments_27_0= ruleUiVisibilityProcessorAssignment )
+                    	    {
+                    	    // InternalUIGrammar.g:14858:5: (lv_processorAssignments_27_0= ruleUiVisibilityProcessorAssignment )
+                    	    // InternalUIGrammar.g:14859:6: lv_processorAssignments_27_0= ruleUiVisibilityProcessorAssignment
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newCompositeNode(grammarAccess.getUiListAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0());
+                    	      					
+                    	    }
+                    	    pushFollow(FOLLOW_42);
+                    	    lv_processorAssignments_27_0=ruleUiVisibilityProcessorAssignment();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						if (current==null) {
+                    	      							current = createModelElementForParent(grammarAccess.getUiListRule());
+                    	      						}
+                    	      						add(
+                    	      							current,
+                    	      							"processorAssignments",
+                    	      							lv_processorAssignments_27_0,
+                    	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+                    	      						afterParserOrEnumRuleCall();
+                    	      					
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop355;
+                        }
+                    } while (true);
+
+                    otherlv_28=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_28, grammarAccess.getUiListAccess().getRightCurlyBracketKeyword_4_4());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiList"
+
+
+    // $ANTLR start "entryRuleUiColumnsAssignment"
+    // InternalUIGrammar.g:14885:1: entryRuleUiColumnsAssignment returns [EObject current=null] : iv_ruleUiColumnsAssignment= ruleUiColumnsAssignment EOF ;
+    public final EObject entryRuleUiColumnsAssignment() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiColumnsAssignment = null;
+
+
+        try {
+            // InternalUIGrammar.g:14885:60: (iv_ruleUiColumnsAssignment= ruleUiColumnsAssignment EOF )
+            // InternalUIGrammar.g:14886:2: iv_ruleUiColumnsAssignment= ruleUiColumnsAssignment EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiColumnsAssignmentRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiColumnsAssignment=ruleUiColumnsAssignment();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiColumnsAssignment; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiColumnsAssignment"
+
+
+    // $ANTLR start "ruleUiColumnsAssignment"
+    // InternalUIGrammar.g:14892:1: ruleUiColumnsAssignment returns [EObject current=null] : ( () otherlv_1= 'columns' otherlv_2= '{' ( (lv_columns_3_0= ruleUiColumn ) )* otherlv_4= '}' ) ;
+    public final EObject ruleUiColumnsAssignment() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        EObject lv_columns_3_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:14898:2: ( ( () otherlv_1= 'columns' otherlv_2= '{' ( (lv_columns_3_0= ruleUiColumn ) )* otherlv_4= '}' ) )
+            // InternalUIGrammar.g:14899:2: ( () otherlv_1= 'columns' otherlv_2= '{' ( (lv_columns_3_0= ruleUiColumn ) )* otherlv_4= '}' )
+            {
+            // InternalUIGrammar.g:14899:2: ( () otherlv_1= 'columns' otherlv_2= '{' ( (lv_columns_3_0= ruleUiColumn ) )* otherlv_4= '}' )
+            // InternalUIGrammar.g:14900:3: () otherlv_1= 'columns' otherlv_2= '{' ( (lv_columns_3_0= ruleUiColumn ) )* otherlv_4= '}'
+            {
+            // InternalUIGrammar.g:14900:3: ()
+            // InternalUIGrammar.g:14901:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiColumnsAssignmentAccess().getUiColumnsAssignmentAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,140,FOLLOW_11); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiColumnsAssignmentAccess().getColumnsKeyword_1());
+              		
+            }
+            otherlv_2=(Token)match(input,20,FOLLOW_119); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getUiColumnsAssignmentAccess().getLeftCurlyBracketKeyword_2());
+              		
+            }
+            // InternalUIGrammar.g:14915:3: ( (lv_columns_3_0= ruleUiColumn ) )*
+            loop357:
+            do {
+                int alt357=2;
+                int LA357_0 = input.LA(1);
+
+                if ( (LA357_0==142) ) {
+                    alt357=1;
+                }
+
+
+                switch (alt357) {
+            	case 1 :
+            	    // InternalUIGrammar.g:14916:4: (lv_columns_3_0= ruleUiColumn )
+            	    {
+            	    // InternalUIGrammar.g:14916:4: (lv_columns_3_0= ruleUiColumn )
+            	    // InternalUIGrammar.g:14917:5: lv_columns_3_0= ruleUiColumn
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiColumnsAssignmentAccess().getColumnsUiColumnParserRuleCall_3_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_119);
+            	    lv_columns_3_0=ruleUiColumn();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiColumnsAssignmentRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"columns",
+            	      						lv_columns_3_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiColumn");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop357;
+                }
+            } while (true);
+
+            otherlv_4=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_4, grammarAccess.getUiColumnsAssignmentAccess().getRightCurlyBracketKeyword_4());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiColumnsAssignment"
+
+
+    // $ANTLR start "entryRuleUiSortOrderAssignment"
+    // InternalUIGrammar.g:14942:1: entryRuleUiSortOrderAssignment returns [EObject current=null] : iv_ruleUiSortOrderAssignment= ruleUiSortOrderAssignment EOF ;
+    public final EObject entryRuleUiSortOrderAssignment() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiSortOrderAssignment = null;
+
+
+        try {
+            // InternalUIGrammar.g:14942:62: (iv_ruleUiSortOrderAssignment= ruleUiSortOrderAssignment EOF )
+            // InternalUIGrammar.g:14943:2: iv_ruleUiSortOrderAssignment= ruleUiSortOrderAssignment EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiSortOrderAssignmentRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiSortOrderAssignment=ruleUiSortOrderAssignment();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiSortOrderAssignment; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiSortOrderAssignment"
+
+
+    // $ANTLR start "ruleUiSortOrderAssignment"
+    // InternalUIGrammar.g:14949:1: ruleUiSortOrderAssignment returns [EObject current=null] : ( () otherlv_1= 'sort' otherlv_2= '{' ( (lv_columns_3_0= ruleUiSortOrder ) )* otherlv_4= '}' ) ;
+    public final EObject ruleUiSortOrderAssignment() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        EObject lv_columns_3_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:14955:2: ( ( () otherlv_1= 'sort' otherlv_2= '{' ( (lv_columns_3_0= ruleUiSortOrder ) )* otherlv_4= '}' ) )
+            // InternalUIGrammar.g:14956:2: ( () otherlv_1= 'sort' otherlv_2= '{' ( (lv_columns_3_0= ruleUiSortOrder ) )* otherlv_4= '}' )
+            {
+            // InternalUIGrammar.g:14956:2: ( () otherlv_1= 'sort' otherlv_2= '{' ( (lv_columns_3_0= ruleUiSortOrder ) )* otherlv_4= '}' )
+            // InternalUIGrammar.g:14957:3: () otherlv_1= 'sort' otherlv_2= '{' ( (lv_columns_3_0= ruleUiSortOrder ) )* otherlv_4= '}'
+            {
+            // InternalUIGrammar.g:14957:3: ()
+            // InternalUIGrammar.g:14958:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiSortOrderAssignmentAccess().getUiSortOrderAssignmentAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,141,FOLLOW_11); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiSortOrderAssignmentAccess().getSortKeyword_1());
+              		
+            }
+            otherlv_2=(Token)match(input,20,FOLLOW_119); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getUiSortOrderAssignmentAccess().getLeftCurlyBracketKeyword_2());
+              		
+            }
+            // InternalUIGrammar.g:14972:3: ( (lv_columns_3_0= ruleUiSortOrder ) )*
+            loop358:
+            do {
+                int alt358=2;
+                int LA358_0 = input.LA(1);
+
+                if ( (LA358_0==142) ) {
+                    alt358=1;
+                }
+
+
+                switch (alt358) {
+            	case 1 :
+            	    // InternalUIGrammar.g:14973:4: (lv_columns_3_0= ruleUiSortOrder )
+            	    {
+            	    // InternalUIGrammar.g:14973:4: (lv_columns_3_0= ruleUiSortOrder )
+            	    // InternalUIGrammar.g:14974:5: lv_columns_3_0= ruleUiSortOrder
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiSortOrderAssignmentAccess().getColumnsUiSortOrderParserRuleCall_3_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_119);
+            	    lv_columns_3_0=ruleUiSortOrder();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiSortOrderAssignmentRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"columns",
+            	      						lv_columns_3_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiSortOrder");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop358;
+                }
+            } while (true);
+
+            otherlv_4=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_4, grammarAccess.getUiSortOrderAssignmentAccess().getRightCurlyBracketKeyword_4());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiSortOrderAssignment"
+
+
+    // $ANTLR start "entryRuleUiSortOrder"
+    // InternalUIGrammar.g:14999:1: entryRuleUiSortOrder returns [EObject current=null] : iv_ruleUiSortOrder= ruleUiSortOrder EOF ;
+    public final EObject entryRuleUiSortOrder() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiSortOrder = null;
+
+
+        try {
+            // InternalUIGrammar.g:14999:52: (iv_ruleUiSortOrder= ruleUiSortOrder EOF )
+            // InternalUIGrammar.g:15000:2: iv_ruleUiSortOrder= ruleUiSortOrder EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiSortOrderRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiSortOrder=ruleUiSortOrder();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiSortOrder; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiSortOrder"
+
+
+    // $ANTLR start "ruleUiSortOrder"
+    // InternalUIGrammar.g:15006:1: ruleUiSortOrder returns [EObject current=null] : (otherlv_0= 'column' ( (lv_property_1_0= ruleUiNestedProperty ) ) (otherlv_2= 'desc' | ( (lv_asc_3_0= 'asc' ) ) )? (otherlv_4= ';' )? ) ;
+    public final EObject ruleUiSortOrder() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_2=null;
+        Token lv_asc_3_0=null;
+        Token otherlv_4=null;
+        EObject lv_property_1_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:15012:2: ( (otherlv_0= 'column' ( (lv_property_1_0= ruleUiNestedProperty ) ) (otherlv_2= 'desc' | ( (lv_asc_3_0= 'asc' ) ) )? (otherlv_4= ';' )? ) )
+            // InternalUIGrammar.g:15013:2: (otherlv_0= 'column' ( (lv_property_1_0= ruleUiNestedProperty ) ) (otherlv_2= 'desc' | ( (lv_asc_3_0= 'asc' ) ) )? (otherlv_4= ';' )? )
+            {
+            // InternalUIGrammar.g:15013:2: (otherlv_0= 'column' ( (lv_property_1_0= ruleUiNestedProperty ) ) (otherlv_2= 'desc' | ( (lv_asc_3_0= 'asc' ) ) )? (otherlv_4= ';' )? )
+            // InternalUIGrammar.g:15014:3: otherlv_0= 'column' ( (lv_property_1_0= ruleUiNestedProperty ) ) (otherlv_2= 'desc' | ( (lv_asc_3_0= 'asc' ) ) )? (otherlv_4= ';' )?
+            {
+            otherlv_0=(Token)match(input,142,FOLLOW_3); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getUiSortOrderAccess().getColumnKeyword_0());
+              		
+            }
+            // InternalUIGrammar.g:15018:3: ( (lv_property_1_0= ruleUiNestedProperty ) )
+            // InternalUIGrammar.g:15019:4: (lv_property_1_0= ruleUiNestedProperty )
+            {
+            // InternalUIGrammar.g:15019:4: (lv_property_1_0= ruleUiNestedProperty )
+            // InternalUIGrammar.g:15020:5: lv_property_1_0= ruleUiNestedProperty
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getUiSortOrderAccess().getPropertyUiNestedPropertyParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FOLLOW_120);
+            lv_property_1_0=ruleUiNestedProperty();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getUiSortOrderRule());
+              					}
+              					set(
+              						current,
+              						"property",
+              						lv_property_1_0,
+              						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiNestedProperty");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalUIGrammar.g:15037:3: (otherlv_2= 'desc' | ( (lv_asc_3_0= 'asc' ) ) )?
+            int alt359=3;
+            int LA359_0 = input.LA(1);
+
+            if ( (LA359_0==143) ) {
+                alt359=1;
+            }
+            else if ( (LA359_0==144) ) {
+                alt359=2;
+            }
+            switch (alt359) {
+                case 1 :
+                    // InternalUIGrammar.g:15038:4: otherlv_2= 'desc'
+                    {
+                    otherlv_2=(Token)match(input,143,FOLLOW_8); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getUiSortOrderAccess().getDescKeyword_2_0());
+                      			
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalUIGrammar.g:15043:4: ( (lv_asc_3_0= 'asc' ) )
+                    {
+                    // InternalUIGrammar.g:15043:4: ( (lv_asc_3_0= 'asc' ) )
+                    // InternalUIGrammar.g:15044:5: (lv_asc_3_0= 'asc' )
+                    {
+                    // InternalUIGrammar.g:15044:5: (lv_asc_3_0= 'asc' )
+                    // InternalUIGrammar.g:15045:6: lv_asc_3_0= 'asc'
+                    {
+                    lv_asc_3_0=(Token)match(input,144,FOLLOW_8); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_asc_3_0, grammarAccess.getUiSortOrderAccess().getAscAscKeyword_2_1_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getUiSortOrderRule());
+                      						}
+                      						setWithLastConsumed(current, "asc", true, "asc");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:15058:3: (otherlv_4= ';' )?
+            int alt360=2;
+            int LA360_0 = input.LA(1);
+
+            if ( (LA360_0==16) ) {
+                alt360=1;
+            }
+            switch (alt360) {
+                case 1 :
+                    // InternalUIGrammar.g:15059:4: otherlv_4= ';'
+                    {
+                    otherlv_4=(Token)match(input,16,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getUiSortOrderAccess().getSemicolonKeyword_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiSortOrder"
+
+
+    // $ANTLR start "entryRuleUiColumn"
+    // InternalUIGrammar.g:15068:1: entryRuleUiColumn returns [EObject current=null] : iv_ruleUiColumn= ruleUiColumn EOF ;
+    public final EObject entryRuleUiColumn() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiColumn = null;
+
+
+        try {
+            // InternalUIGrammar.g:15068:49: (iv_ruleUiColumn= ruleUiColumn EOF )
+            // InternalUIGrammar.g:15069:2: iv_ruleUiColumn= ruleUiColumn EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiColumnRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiColumn=ruleUiColumn();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiColumn; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiColumn"
+
+
+    // $ANTLR start "ruleUiColumn"
+    // InternalUIGrammar.g:15075:1: ruleUiColumn returns [EObject current=null] : ( () otherlv_1= 'column' ( (lv_property_2_0= ruleUiNestedProperty ) ) (otherlv_3= 'icon' ( (lv_iconName_4_0= RULE_STRING ) ) )? (otherlv_5= ';' )? ) ;
+    public final EObject ruleUiColumn() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        Token lv_iconName_4_0=null;
+        Token otherlv_5=null;
+        EObject lv_property_2_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:15081:2: ( ( () otherlv_1= 'column' ( (lv_property_2_0= ruleUiNestedProperty ) ) (otherlv_3= 'icon' ( (lv_iconName_4_0= RULE_STRING ) ) )? (otherlv_5= ';' )? ) )
+            // InternalUIGrammar.g:15082:2: ( () otherlv_1= 'column' ( (lv_property_2_0= ruleUiNestedProperty ) ) (otherlv_3= 'icon' ( (lv_iconName_4_0= RULE_STRING ) ) )? (otherlv_5= ';' )? )
+            {
+            // InternalUIGrammar.g:15082:2: ( () otherlv_1= 'column' ( (lv_property_2_0= ruleUiNestedProperty ) ) (otherlv_3= 'icon' ( (lv_iconName_4_0= RULE_STRING ) ) )? (otherlv_5= ';' )? )
+            // InternalUIGrammar.g:15083:3: () otherlv_1= 'column' ( (lv_property_2_0= ruleUiNestedProperty ) ) (otherlv_3= 'icon' ( (lv_iconName_4_0= RULE_STRING ) ) )? (otherlv_5= ';' )?
+            {
+            // InternalUIGrammar.g:15083:3: ()
+            // InternalUIGrammar.g:15084:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiColumnAccess().getUiColumnAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,142,FOLLOW_3); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiColumnAccess().getColumnKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:15094:3: ( (lv_property_2_0= ruleUiNestedProperty ) )
+            // InternalUIGrammar.g:15095:4: (lv_property_2_0= ruleUiNestedProperty )
+            {
+            // InternalUIGrammar.g:15095:4: (lv_property_2_0= ruleUiNestedProperty )
+            // InternalUIGrammar.g:15096:5: lv_property_2_0= ruleUiNestedProperty
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getUiColumnAccess().getPropertyUiNestedPropertyParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FOLLOW_121);
+            lv_property_2_0=ruleUiNestedProperty();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getUiColumnRule());
+              					}
+              					set(
+              						current,
+              						"property",
+              						lv_property_2_0,
+              						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiNestedProperty");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalUIGrammar.g:15113:3: (otherlv_3= 'icon' ( (lv_iconName_4_0= RULE_STRING ) ) )?
+            int alt361=2;
+            int LA361_0 = input.LA(1);
+
+            if ( (LA361_0==55) ) {
+                alt361=1;
+            }
+            switch (alt361) {
+                case 1 :
+                    // InternalUIGrammar.g:15114:4: otherlv_3= 'icon' ( (lv_iconName_4_0= RULE_STRING ) )
+                    {
+                    otherlv_3=(Token)match(input,55,FOLLOW_18); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_3, grammarAccess.getUiColumnAccess().getIconKeyword_3_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:15118:4: ( (lv_iconName_4_0= RULE_STRING ) )
+                    // InternalUIGrammar.g:15119:5: (lv_iconName_4_0= RULE_STRING )
+                    {
+                    // InternalUIGrammar.g:15119:5: (lv_iconName_4_0= RULE_STRING )
+                    // InternalUIGrammar.g:15120:6: lv_iconName_4_0= RULE_STRING
+                    {
+                    lv_iconName_4_0=(Token)match(input,RULE_STRING,FOLLOW_8); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_iconName_4_0, grammarAccess.getUiColumnAccess().getIconNameSTRINGTerminalRuleCall_3_1_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getUiColumnRule());
+                      						}
+                      						setWithLastConsumed(
+                      							current,
+                      							"iconName",
+                      							lv_iconName_4_0,
+                      							"org.eclipse.xtext.xbase.Xtype.STRING");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:15137:3: (otherlv_5= ';' )?
+            int alt362=2;
+            int LA362_0 = input.LA(1);
+
+            if ( (LA362_0==16) ) {
+                alt362=1;
+            }
+            switch (alt362) {
+                case 1 :
+                    // InternalUIGrammar.g:15138:4: otherlv_5= ';'
+                    {
+                    otherlv_5=(Token)match(input,16,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_5, grammarAccess.getUiColumnAccess().getSemicolonKeyword_4());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiColumn"
+
+
+    // $ANTLR start "entryRuleUiEmbeddable"
+    // InternalUIGrammar.g:15147:1: entryRuleUiEmbeddable returns [EObject current=null] : iv_ruleUiEmbeddable= ruleUiEmbeddable EOF ;
+    public final EObject entryRuleUiEmbeddable() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiEmbeddable = null;
+
+
+        try {
+            // InternalUIGrammar.g:15147:53: (iv_ruleUiEmbeddable= ruleUiEmbeddable EOF )
+            // InternalUIGrammar.g:15148:2: iv_ruleUiEmbeddable= ruleUiEmbeddable EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiEmbeddableRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiEmbeddable=ruleUiEmbeddable();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiEmbeddable; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiEmbeddable"
+
+
+    // $ANTLR start "ruleUiEmbeddable"
+    // InternalUIGrammar.g:15154:1: ruleUiEmbeddable returns [EObject current=null] : (this_UiLayout_0= ruleUiLayout | this_UiField_1= ruleUiField | this_UiAction_2= ruleUiAction | this_UiTabSheet_3= ruleUiTabSheet ) ;
+    public final EObject ruleUiEmbeddable() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_UiLayout_0 = null;
+
+        EObject this_UiField_1 = null;
+
+        EObject this_UiAction_2 = null;
+
+        EObject this_UiTabSheet_3 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:15160:2: ( (this_UiLayout_0= ruleUiLayout | this_UiField_1= ruleUiField | this_UiAction_2= ruleUiAction | this_UiTabSheet_3= ruleUiTabSheet ) )
+            // InternalUIGrammar.g:15161:2: (this_UiLayout_0= ruleUiLayout | this_UiField_1= ruleUiField | this_UiAction_2= ruleUiAction | this_UiTabSheet_3= ruleUiTabSheet )
+            {
+            // InternalUIGrammar.g:15161:2: (this_UiLayout_0= ruleUiLayout | this_UiField_1= ruleUiField | this_UiAction_2= ruleUiAction | this_UiTabSheet_3= ruleUiTabSheet )
+            int alt363=4;
+            switch ( input.LA(1) ) {
+            case 62:
+            case 66:
+            case 67:
+            case 70:
+            case 74:
+            case 80:
+            case 84:
+                {
+                alt363=1;
+                }
+                break;
+            case 91:
+            case 95:
+            case 96:
+            case 98:
+            case 99:
+            case 100:
+            case 105:
+            case 107:
+            case 112:
+            case 117:
+            case 118:
+            case 119:
+            case 120:
+            case 121:
+            case 122:
+            case 124:
+            case 128:
+            case 133:
+            case 134:
+            case 138:
+            case 139:
+            case 145:
+            case 146:
+                {
+                alt363=2;
+                }
+                break;
+            case 129:
+                {
+                alt363=3;
+                }
+                break;
+            case 79:
+                {
+                alt363=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 363, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt363) {
+                case 1 :
+                    // InternalUIGrammar.g:15162:3: this_UiLayout_0= ruleUiLayout
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiEmbeddableAccess().getUiLayoutParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiLayout_0=ruleUiLayout();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiLayout_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalUIGrammar.g:15171:3: this_UiField_1= ruleUiField
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiEmbeddableAccess().getUiFieldParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiField_1=ruleUiField();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiField_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalUIGrammar.g:15180:3: this_UiAction_2= ruleUiAction
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiEmbeddableAccess().getUiActionParserRuleCall_2());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiAction_2=ruleUiAction();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiAction_2;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalUIGrammar.g:15189:3: this_UiTabSheet_3= ruleUiTabSheet
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiEmbeddableAccess().getUiTabSheetParserRuleCall_3());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiTabSheet_3=ruleUiTabSheet();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiTabSheet_3;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiEmbeddable"
+
+
+    // $ANTLR start "entryRuleUiMobileEmbeddable"
+    // InternalUIGrammar.g:15201:1: entryRuleUiMobileEmbeddable returns [EObject current=null] : iv_ruleUiMobileEmbeddable= ruleUiMobileEmbeddable EOF ;
+    public final EObject entryRuleUiMobileEmbeddable() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiMobileEmbeddable = null;
+
+
+        try {
+            // InternalUIGrammar.g:15201:59: (iv_ruleUiMobileEmbeddable= ruleUiMobileEmbeddable EOF )
+            // InternalUIGrammar.g:15202:2: iv_ruleUiMobileEmbeddable= ruleUiMobileEmbeddable EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiMobileEmbeddableRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiMobileEmbeddable=ruleUiMobileEmbeddable();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiMobileEmbeddable; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiMobileEmbeddable"
+
+
+    // $ANTLR start "ruleUiMobileEmbeddable"
+    // InternalUIGrammar.g:15208:1: ruleUiMobileEmbeddable returns [EObject current=null] : (this_UiMobileLayout_0= ruleUiMobileLayout | this_UiMobileField_1= ruleUiMobileField | this_UiMobileTabSheet_2= ruleUiMobileTabSheet | this_UiMobileAction_3= ruleUiMobileAction ) ;
+    public final EObject ruleUiMobileEmbeddable() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_UiMobileLayout_0 = null;
+
+        EObject this_UiMobileField_1 = null;
+
+        EObject this_UiMobileTabSheet_2 = null;
+
+        EObject this_UiMobileAction_3 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:15214:2: ( (this_UiMobileLayout_0= ruleUiMobileLayout | this_UiMobileField_1= ruleUiMobileField | this_UiMobileTabSheet_2= ruleUiMobileTabSheet | this_UiMobileAction_3= ruleUiMobileAction ) )
+            // InternalUIGrammar.g:15215:2: (this_UiMobileLayout_0= ruleUiMobileLayout | this_UiMobileField_1= ruleUiMobileField | this_UiMobileTabSheet_2= ruleUiMobileTabSheet | this_UiMobileAction_3= ruleUiMobileAction )
+            {
+            // InternalUIGrammar.g:15215:2: (this_UiMobileLayout_0= ruleUiMobileLayout | this_UiMobileField_1= ruleUiMobileField | this_UiMobileTabSheet_2= ruleUiMobileTabSheet | this_UiMobileAction_3= ruleUiMobileAction )
+            int alt364=4;
+            switch ( input.LA(1) ) {
+            case 68:
+            case 69:
+            case 71:
+            case 72:
+            case 73:
+            case 76:
+            case 89:
+                {
+                alt364=1;
+                }
+                break;
+            case 91:
+            case 95:
+            case 96:
+            case 98:
+            case 99:
+            case 100:
+            case 105:
+            case 107:
+            case 117:
+            case 118:
+            case 119:
+            case 120:
+            case 121:
+            case 122:
+            case 124:
+            case 128:
+            case 132:
+            case 133:
+            case 134:
+            case 138:
+            case 145:
+                {
+                alt364=2;
+                }
+                break;
+            case 77:
+                {
+                alt364=3;
+                }
+                break;
+            case 129:
+            case 130:
+                {
+                alt364=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 364, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt364) {
+                case 1 :
+                    // InternalUIGrammar.g:15216:3: this_UiMobileLayout_0= ruleUiMobileLayout
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiMobileEmbeddableAccess().getUiMobileLayoutParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiMobileLayout_0=ruleUiMobileLayout();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiMobileLayout_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalUIGrammar.g:15225:3: this_UiMobileField_1= ruleUiMobileField
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiMobileEmbeddableAccess().getUiMobileFieldParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiMobileField_1=ruleUiMobileField();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiMobileField_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalUIGrammar.g:15234:3: this_UiMobileTabSheet_2= ruleUiMobileTabSheet
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiMobileEmbeddableAccess().getUiMobileTabSheetParserRuleCall_2());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiMobileTabSheet_2=ruleUiMobileTabSheet();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiMobileTabSheet_2;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalUIGrammar.g:15243:3: this_UiMobileAction_3= ruleUiMobileAction
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiMobileEmbeddableAccess().getUiMobileActionParserRuleCall_3());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiMobileAction_3=ruleUiMobileAction();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiMobileAction_3;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiMobileEmbeddable"
+
+
+    // $ANTLR start "entryRuleUiMobileLayout"
+    // InternalUIGrammar.g:15255:1: entryRuleUiMobileLayout returns [EObject current=null] : iv_ruleUiMobileLayout= ruleUiMobileLayout EOF ;
+    public final EObject entryRuleUiMobileLayout() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiMobileLayout = null;
+
+
+        try {
+            // InternalUIGrammar.g:15255:55: (iv_ruleUiMobileLayout= ruleUiMobileLayout EOF )
+            // InternalUIGrammar.g:15256:2: iv_ruleUiMobileLayout= ruleUiMobileLayout EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiMobileLayoutRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiMobileLayout=ruleUiMobileLayout();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiMobileLayout; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiMobileLayout"
+
+
+    // $ANTLR start "ruleUiMobileLayout"
+    // InternalUIGrammar.g:15262:1: ruleUiMobileLayout returns [EObject current=null] : (this_UiMobileHorizontalButtonGroup_0= ruleUiMobileHorizontalButtonGroup | this_UiMobileVerticalComponentGroup_1= ruleUiMobileVerticalComponentGroup | this_UiMobileNavigationPage_2= ruleUiMobileNavigationPage | this_UiMobileHorizontalLayout_3= ruleUiMobileHorizontalLayout | this_UiMobileVerticalLayout_4= ruleUiMobileVerticalLayout | this_UiMobileSearchPanel_5= ruleUiMobileSearchPanel | this_UiMobileNavigationRoot_6= ruleUiMobileNavigationRoot ) ;
+    public final EObject ruleUiMobileLayout() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_UiMobileHorizontalButtonGroup_0 = null;
+
+        EObject this_UiMobileVerticalComponentGroup_1 = null;
+
+        EObject this_UiMobileNavigationPage_2 = null;
+
+        EObject this_UiMobileHorizontalLayout_3 = null;
+
+        EObject this_UiMobileVerticalLayout_4 = null;
+
+        EObject this_UiMobileSearchPanel_5 = null;
+
+        EObject this_UiMobileNavigationRoot_6 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:15268:2: ( (this_UiMobileHorizontalButtonGroup_0= ruleUiMobileHorizontalButtonGroup | this_UiMobileVerticalComponentGroup_1= ruleUiMobileVerticalComponentGroup | this_UiMobileNavigationPage_2= ruleUiMobileNavigationPage | this_UiMobileHorizontalLayout_3= ruleUiMobileHorizontalLayout | this_UiMobileVerticalLayout_4= ruleUiMobileVerticalLayout | this_UiMobileSearchPanel_5= ruleUiMobileSearchPanel | this_UiMobileNavigationRoot_6= ruleUiMobileNavigationRoot ) )
+            // InternalUIGrammar.g:15269:2: (this_UiMobileHorizontalButtonGroup_0= ruleUiMobileHorizontalButtonGroup | this_UiMobileVerticalComponentGroup_1= ruleUiMobileVerticalComponentGroup | this_UiMobileNavigationPage_2= ruleUiMobileNavigationPage | this_UiMobileHorizontalLayout_3= ruleUiMobileHorizontalLayout | this_UiMobileVerticalLayout_4= ruleUiMobileVerticalLayout | this_UiMobileSearchPanel_5= ruleUiMobileSearchPanel | this_UiMobileNavigationRoot_6= ruleUiMobileNavigationRoot )
+            {
+            // InternalUIGrammar.g:15269:2: (this_UiMobileHorizontalButtonGroup_0= ruleUiMobileHorizontalButtonGroup | this_UiMobileVerticalComponentGroup_1= ruleUiMobileVerticalComponentGroup | this_UiMobileNavigationPage_2= ruleUiMobileNavigationPage | this_UiMobileHorizontalLayout_3= ruleUiMobileHorizontalLayout | this_UiMobileVerticalLayout_4= ruleUiMobileVerticalLayout | this_UiMobileSearchPanel_5= ruleUiMobileSearchPanel | this_UiMobileNavigationRoot_6= ruleUiMobileNavigationRoot )
+            int alt365=7;
+            switch ( input.LA(1) ) {
+            case 72:
+                {
+                alt365=1;
+                }
+                break;
+            case 73:
+                {
+                alt365=2;
+                }
+                break;
+            case 89:
+                {
+                alt365=3;
+                }
+                break;
+            case 71:
+                {
+                alt365=4;
+                }
+                break;
+            case 68:
+                {
+                alt365=5;
+                }
+                break;
+            case 76:
+                {
+                alt365=6;
+                }
+                break;
+            case 69:
+                {
+                alt365=7;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 365, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt365) {
+                case 1 :
+                    // InternalUIGrammar.g:15270:3: this_UiMobileHorizontalButtonGroup_0= ruleUiMobileHorizontalButtonGroup
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiMobileLayoutAccess().getUiMobileHorizontalButtonGroupParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiMobileHorizontalButtonGroup_0=ruleUiMobileHorizontalButtonGroup();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiMobileHorizontalButtonGroup_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalUIGrammar.g:15279:3: this_UiMobileVerticalComponentGroup_1= ruleUiMobileVerticalComponentGroup
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiMobileLayoutAccess().getUiMobileVerticalComponentGroupParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiMobileVerticalComponentGroup_1=ruleUiMobileVerticalComponentGroup();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiMobileVerticalComponentGroup_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalUIGrammar.g:15288:3: this_UiMobileNavigationPage_2= ruleUiMobileNavigationPage
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiMobileLayoutAccess().getUiMobileNavigationPageParserRuleCall_2());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiMobileNavigationPage_2=ruleUiMobileNavigationPage();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiMobileNavigationPage_2;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalUIGrammar.g:15297:3: this_UiMobileHorizontalLayout_3= ruleUiMobileHorizontalLayout
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiMobileLayoutAccess().getUiMobileHorizontalLayoutParserRuleCall_3());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiMobileHorizontalLayout_3=ruleUiMobileHorizontalLayout();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiMobileHorizontalLayout_3;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 5 :
+                    // InternalUIGrammar.g:15306:3: this_UiMobileVerticalLayout_4= ruleUiMobileVerticalLayout
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiMobileLayoutAccess().getUiMobileVerticalLayoutParserRuleCall_4());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiMobileVerticalLayout_4=ruleUiMobileVerticalLayout();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiMobileVerticalLayout_4;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 6 :
+                    // InternalUIGrammar.g:15315:3: this_UiMobileSearchPanel_5= ruleUiMobileSearchPanel
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiMobileLayoutAccess().getUiMobileSearchPanelParserRuleCall_5());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiMobileSearchPanel_5=ruleUiMobileSearchPanel();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiMobileSearchPanel_5;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 7 :
+                    // InternalUIGrammar.g:15324:3: this_UiMobileNavigationRoot_6= ruleUiMobileNavigationRoot
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiMobileLayoutAccess().getUiMobileNavigationRootParserRuleCall_6());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiMobileNavigationRoot_6=ruleUiMobileNavigationRoot();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiMobileNavigationRoot_6;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiMobileLayout"
+
+
+    // $ANTLR start "entryRuleUiMobileField"
+    // InternalUIGrammar.g:15336:1: entryRuleUiMobileField returns [EObject current=null] : iv_ruleUiMobileField= ruleUiMobileField EOF ;
+    public final EObject entryRuleUiMobileField() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiMobileField = null;
+
+
+        try {
+            // InternalUIGrammar.g:15336:54: (iv_ruleUiMobileField= ruleUiMobileField EOF )
+            // InternalUIGrammar.g:15337:2: iv_ruleUiMobileField= ruleUiMobileField EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiMobileFieldRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiMobileField=ruleUiMobileField();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiMobileField; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiMobileField"
+
+
+    // $ANTLR start "ruleUiMobileField"
+    // InternalUIGrammar.g:15343:1: ruleUiMobileField returns [EObject current=null] : (this_UiMobileSwitch_0= ruleUiMobileSwitch | this_UiTextField_1= ruleUiTextField | this_UiMaskedTextField_2= ruleUiMaskedTextField | this_UiMaskedNumericField_3= ruleUiMaskedNumericField | this_UiMaskedDecimalField_4= ruleUiMaskedDecimalField | this_UiPrefixedMaskedTextField_5= ruleUiPrefixedMaskedTextField | this_UiRichTextArea_6= ruleUiRichTextArea | this_UiPasswordField_7= ruleUiPasswordField | this_UiSuggestTextField_8= ruleUiSuggestTextField | this_UiNumericField_9= ruleUiNumericField | this_UiTable_10= ruleUiTable | this_UiComboBox_11= ruleUiComboBox | this_UiImage_12= ruleUiImage | this_UiSearchField_13= ruleUiSearchField | this_UiLabel_14= ruleUiLabel | this_UiDecimalField_15= ruleUiDecimalField | this_UiTextArea_16= ruleUiTextArea | this_UiDateField_17= ruleUiDateField | this_UiBrowser_18= ruleUiBrowser | this_UiProgressBar_19= ruleUiProgressBar | this_UiOptionsGroup_20= ruleUiOptionsGroup ) ;
+    public final EObject ruleUiMobileField() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_UiMobileSwitch_0 = null;
+
+        EObject this_UiTextField_1 = null;
+
+        EObject this_UiMaskedTextField_2 = null;
+
+        EObject this_UiMaskedNumericField_3 = null;
+
+        EObject this_UiMaskedDecimalField_4 = null;
+
+        EObject this_UiPrefixedMaskedTextField_5 = null;
+
+        EObject this_UiRichTextArea_6 = null;
+
+        EObject this_UiPasswordField_7 = null;
+
+        EObject this_UiSuggestTextField_8 = null;
+
+        EObject this_UiNumericField_9 = null;
+
+        EObject this_UiTable_10 = null;
+
+        EObject this_UiComboBox_11 = null;
+
+        EObject this_UiImage_12 = null;
+
+        EObject this_UiSearchField_13 = null;
+
+        EObject this_UiLabel_14 = null;
+
+        EObject this_UiDecimalField_15 = null;
+
+        EObject this_UiTextArea_16 = null;
+
+        EObject this_UiDateField_17 = null;
+
+        EObject this_UiBrowser_18 = null;
+
+        EObject this_UiProgressBar_19 = null;
+
+        EObject this_UiOptionsGroup_20 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:15349:2: ( (this_UiMobileSwitch_0= ruleUiMobileSwitch | this_UiTextField_1= ruleUiTextField | this_UiMaskedTextField_2= ruleUiMaskedTextField | this_UiMaskedNumericField_3= ruleUiMaskedNumericField | this_UiMaskedDecimalField_4= ruleUiMaskedDecimalField | this_UiPrefixedMaskedTextField_5= ruleUiPrefixedMaskedTextField | this_UiRichTextArea_6= ruleUiRichTextArea | this_UiPasswordField_7= ruleUiPasswordField | this_UiSuggestTextField_8= ruleUiSuggestTextField | this_UiNumericField_9= ruleUiNumericField | this_UiTable_10= ruleUiTable | this_UiComboBox_11= ruleUiComboBox | this_UiImage_12= ruleUiImage | this_UiSearchField_13= ruleUiSearchField | this_UiLabel_14= ruleUiLabel | this_UiDecimalField_15= ruleUiDecimalField | this_UiTextArea_16= ruleUiTextArea | this_UiDateField_17= ruleUiDateField | this_UiBrowser_18= ruleUiBrowser | this_UiProgressBar_19= ruleUiProgressBar | this_UiOptionsGroup_20= ruleUiOptionsGroup ) )
+            // InternalUIGrammar.g:15350:2: (this_UiMobileSwitch_0= ruleUiMobileSwitch | this_UiTextField_1= ruleUiTextField | this_UiMaskedTextField_2= ruleUiMaskedTextField | this_UiMaskedNumericField_3= ruleUiMaskedNumericField | this_UiMaskedDecimalField_4= ruleUiMaskedDecimalField | this_UiPrefixedMaskedTextField_5= ruleUiPrefixedMaskedTextField | this_UiRichTextArea_6= ruleUiRichTextArea | this_UiPasswordField_7= ruleUiPasswordField | this_UiSuggestTextField_8= ruleUiSuggestTextField | this_UiNumericField_9= ruleUiNumericField | this_UiTable_10= ruleUiTable | this_UiComboBox_11= ruleUiComboBox | this_UiImage_12= ruleUiImage | this_UiSearchField_13= ruleUiSearchField | this_UiLabel_14= ruleUiLabel | this_UiDecimalField_15= ruleUiDecimalField | this_UiTextArea_16= ruleUiTextArea | this_UiDateField_17= ruleUiDateField | this_UiBrowser_18= ruleUiBrowser | this_UiProgressBar_19= ruleUiProgressBar | this_UiOptionsGroup_20= ruleUiOptionsGroup )
+            {
+            // InternalUIGrammar.g:15350:2: (this_UiMobileSwitch_0= ruleUiMobileSwitch | this_UiTextField_1= ruleUiTextField | this_UiMaskedTextField_2= ruleUiMaskedTextField | this_UiMaskedNumericField_3= ruleUiMaskedNumericField | this_UiMaskedDecimalField_4= ruleUiMaskedDecimalField | this_UiPrefixedMaskedTextField_5= ruleUiPrefixedMaskedTextField | this_UiRichTextArea_6= ruleUiRichTextArea | this_UiPasswordField_7= ruleUiPasswordField | this_UiSuggestTextField_8= ruleUiSuggestTextField | this_UiNumericField_9= ruleUiNumericField | this_UiTable_10= ruleUiTable | this_UiComboBox_11= ruleUiComboBox | this_UiImage_12= ruleUiImage | this_UiSearchField_13= ruleUiSearchField | this_UiLabel_14= ruleUiLabel | this_UiDecimalField_15= ruleUiDecimalField | this_UiTextArea_16= ruleUiTextArea | this_UiDateField_17= ruleUiDateField | this_UiBrowser_18= ruleUiBrowser | this_UiProgressBar_19= ruleUiProgressBar | this_UiOptionsGroup_20= ruleUiOptionsGroup )
+            int alt366=21;
+            switch ( input.LA(1) ) {
+            case 132:
+                {
+                alt366=1;
+                }
+                break;
+            case 91:
+                {
+                alt366=2;
+                }
+                break;
+            case 96:
+                {
+                alt366=3;
+                }
+                break;
+            case 98:
+                {
+                alt366=4;
+                }
+                break;
+            case 99:
+                {
+                alt366=5;
+                }
+                break;
+            case 100:
+                {
+                alt366=6;
+                }
+                break;
+            case 105:
+                {
+                alt366=7;
+                }
+                break;
+            case 95:
+                {
+                alt366=8;
+                }
+                break;
+            case 107:
+                {
+                alt366=9;
+                }
+                break;
+            case 145:
+                {
+                alt366=10;
+                }
+                break;
+            case 124:
+                {
+                alt366=11;
+                }
+                break;
+            case 128:
+                {
+                alt366=12;
+                }
+                break;
+            case 122:
+                {
+                alt366=13;
+                }
+                break;
+            case 117:
+                {
+                alt366=14;
+                }
+                break;
+            case 133:
+                {
+                alt366=15;
+                }
+                break;
+            case 134:
+                {
+                alt366=16;
+                }
+                break;
+            case 118:
+                {
+                alt366=17;
+                }
+                break;
+            case 119:
+                {
+                alt366=18;
+                }
+                break;
+            case 120:
+                {
+                alt366=19;
+                }
+                break;
+            case 121:
+                {
+                alt366=20;
+                }
+                break;
+            case 138:
+                {
+                alt366=21;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 366, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt366) {
+                case 1 :
+                    // InternalUIGrammar.g:15351:3: this_UiMobileSwitch_0= ruleUiMobileSwitch
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiMobileSwitchParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiMobileSwitch_0=ruleUiMobileSwitch();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiMobileSwitch_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalUIGrammar.g:15360:3: this_UiTextField_1= ruleUiTextField
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiTextFieldParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiTextField_1=ruleUiTextField();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiTextField_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalUIGrammar.g:15369:3: this_UiMaskedTextField_2= ruleUiMaskedTextField
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiMaskedTextFieldParserRuleCall_2());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiMaskedTextField_2=ruleUiMaskedTextField();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiMaskedTextField_2;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalUIGrammar.g:15378:3: this_UiMaskedNumericField_3= ruleUiMaskedNumericField
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiMaskedNumericFieldParserRuleCall_3());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiMaskedNumericField_3=ruleUiMaskedNumericField();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiMaskedNumericField_3;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 5 :
+                    // InternalUIGrammar.g:15387:3: this_UiMaskedDecimalField_4= ruleUiMaskedDecimalField
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiMaskedDecimalFieldParserRuleCall_4());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiMaskedDecimalField_4=ruleUiMaskedDecimalField();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiMaskedDecimalField_4;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 6 :
+                    // InternalUIGrammar.g:15396:3: this_UiPrefixedMaskedTextField_5= ruleUiPrefixedMaskedTextField
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiPrefixedMaskedTextFieldParserRuleCall_5());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiPrefixedMaskedTextField_5=ruleUiPrefixedMaskedTextField();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiPrefixedMaskedTextField_5;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 7 :
+                    // InternalUIGrammar.g:15405:3: this_UiRichTextArea_6= ruleUiRichTextArea
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiRichTextAreaParserRuleCall_6());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiRichTextArea_6=ruleUiRichTextArea();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiRichTextArea_6;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 8 :
+                    // InternalUIGrammar.g:15414:3: this_UiPasswordField_7= ruleUiPasswordField
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiPasswordFieldParserRuleCall_7());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiPasswordField_7=ruleUiPasswordField();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiPasswordField_7;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 9 :
+                    // InternalUIGrammar.g:15423:3: this_UiSuggestTextField_8= ruleUiSuggestTextField
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiSuggestTextFieldParserRuleCall_8());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiSuggestTextField_8=ruleUiSuggestTextField();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiSuggestTextField_8;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 10 :
+                    // InternalUIGrammar.g:15432:3: this_UiNumericField_9= ruleUiNumericField
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiNumericFieldParserRuleCall_9());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiNumericField_9=ruleUiNumericField();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiNumericField_9;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 11 :
+                    // InternalUIGrammar.g:15441:3: this_UiTable_10= ruleUiTable
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiTableParserRuleCall_10());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiTable_10=ruleUiTable();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiTable_10;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 12 :
+                    // InternalUIGrammar.g:15450:3: this_UiComboBox_11= ruleUiComboBox
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiComboBoxParserRuleCall_11());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiComboBox_11=ruleUiComboBox();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiComboBox_11;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 13 :
+                    // InternalUIGrammar.g:15459:3: this_UiImage_12= ruleUiImage
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiImageParserRuleCall_12());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiImage_12=ruleUiImage();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiImage_12;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 14 :
+                    // InternalUIGrammar.g:15468:3: this_UiSearchField_13= ruleUiSearchField
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiSearchFieldParserRuleCall_13());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiSearchField_13=ruleUiSearchField();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiSearchField_13;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 15 :
+                    // InternalUIGrammar.g:15477:3: this_UiLabel_14= ruleUiLabel
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiLabelParserRuleCall_14());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiLabel_14=ruleUiLabel();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiLabel_14;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 16 :
+                    // InternalUIGrammar.g:15486:3: this_UiDecimalField_15= ruleUiDecimalField
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiDecimalFieldParserRuleCall_15());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiDecimalField_15=ruleUiDecimalField();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiDecimalField_15;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 17 :
+                    // InternalUIGrammar.g:15495:3: this_UiTextArea_16= ruleUiTextArea
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiTextAreaParserRuleCall_16());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiTextArea_16=ruleUiTextArea();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiTextArea_16;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 18 :
+                    // InternalUIGrammar.g:15504:3: this_UiDateField_17= ruleUiDateField
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiDateFieldParserRuleCall_17());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiDateField_17=ruleUiDateField();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiDateField_17;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 19 :
+                    // InternalUIGrammar.g:15513:3: this_UiBrowser_18= ruleUiBrowser
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiBrowserParserRuleCall_18());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiBrowser_18=ruleUiBrowser();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiBrowser_18;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 20 :
+                    // InternalUIGrammar.g:15522:3: this_UiProgressBar_19= ruleUiProgressBar
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiProgressBarParserRuleCall_19());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiProgressBar_19=ruleUiProgressBar();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiProgressBar_19;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 21 :
+                    // InternalUIGrammar.g:15531:3: this_UiOptionsGroup_20= ruleUiOptionsGroup
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiOptionsGroupParserRuleCall_20());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiOptionsGroup_20=ruleUiOptionsGroup();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiOptionsGroup_20;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiMobileField"
+
+
+    // $ANTLR start "entryRuleUiLayout"
+    // InternalUIGrammar.g:15543:1: entryRuleUiLayout returns [EObject current=null] : iv_ruleUiLayout= ruleUiLayout EOF ;
+    public final EObject entryRuleUiLayout() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiLayout = null;
+
+
+        try {
+            // InternalUIGrammar.g:15543:49: (iv_ruleUiLayout= ruleUiLayout EOF )
+            // InternalUIGrammar.g:15544:2: iv_ruleUiLayout= ruleUiLayout EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiLayoutRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiLayout=ruleUiLayout();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiLayout; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiLayout"
+
+
+    // $ANTLR start "ruleUiLayout"
+    // InternalUIGrammar.g:15550:1: ruleUiLayout returns [EObject current=null] : (this_UiGridLayout_0= ruleUiGridLayout | this_UiFormLayout_1= ruleUiFormLayout | this_UiHorizontalLayout_2= ruleUiHorizontalLayout | this_UiVerticalLayout_3= ruleUiVerticalLayout | this_UiSplitpanel_4= ruleUiSplitpanel | this_UiPanel_5= ruleUiPanel | this_UiSearchPanel_6= ruleUiSearchPanel ) ;
+    public final EObject ruleUiLayout() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_UiGridLayout_0 = null;
+
+        EObject this_UiFormLayout_1 = null;
+
+        EObject this_UiHorizontalLayout_2 = null;
+
+        EObject this_UiVerticalLayout_3 = null;
+
+        EObject this_UiSplitpanel_4 = null;
+
+        EObject this_UiPanel_5 = null;
+
+        EObject this_UiSearchPanel_6 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:15556:2: ( (this_UiGridLayout_0= ruleUiGridLayout | this_UiFormLayout_1= ruleUiFormLayout | this_UiHorizontalLayout_2= ruleUiHorizontalLayout | this_UiVerticalLayout_3= ruleUiVerticalLayout | this_UiSplitpanel_4= ruleUiSplitpanel | this_UiPanel_5= ruleUiPanel | this_UiSearchPanel_6= ruleUiSearchPanel ) )
+            // InternalUIGrammar.g:15557:2: (this_UiGridLayout_0= ruleUiGridLayout | this_UiFormLayout_1= ruleUiFormLayout | this_UiHorizontalLayout_2= ruleUiHorizontalLayout | this_UiVerticalLayout_3= ruleUiVerticalLayout | this_UiSplitpanel_4= ruleUiSplitpanel | this_UiPanel_5= ruleUiPanel | this_UiSearchPanel_6= ruleUiSearchPanel )
+            {
+            // InternalUIGrammar.g:15557:2: (this_UiGridLayout_0= ruleUiGridLayout | this_UiFormLayout_1= ruleUiFormLayout | this_UiHorizontalLayout_2= ruleUiHorizontalLayout | this_UiVerticalLayout_3= ruleUiVerticalLayout | this_UiSplitpanel_4= ruleUiSplitpanel | this_UiPanel_5= ruleUiPanel | this_UiSearchPanel_6= ruleUiSearchPanel )
+            int alt367=7;
+            switch ( input.LA(1) ) {
+            case 62:
+                {
+                alt367=1;
+                }
+                break;
+            case 66:
+                {
+                alt367=2;
+                }
+                break;
+            case 70:
+                {
+                alt367=3;
+                }
+                break;
+            case 67:
+                {
+                alt367=4;
+                }
+                break;
+            case 80:
+                {
+                alt367=5;
+                }
+                break;
+            case 84:
+                {
+                alt367=6;
+                }
+                break;
+            case 74:
+                {
+                alt367=7;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 367, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt367) {
+                case 1 :
+                    // InternalUIGrammar.g:15558:3: this_UiGridLayout_0= ruleUiGridLayout
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiLayoutAccess().getUiGridLayoutParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiGridLayout_0=ruleUiGridLayout();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiGridLayout_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalUIGrammar.g:15567:3: this_UiFormLayout_1= ruleUiFormLayout
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiLayoutAccess().getUiFormLayoutParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiFormLayout_1=ruleUiFormLayout();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiFormLayout_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalUIGrammar.g:15576:3: this_UiHorizontalLayout_2= ruleUiHorizontalLayout
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiLayoutAccess().getUiHorizontalLayoutParserRuleCall_2());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiHorizontalLayout_2=ruleUiHorizontalLayout();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiHorizontalLayout_2;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalUIGrammar.g:15585:3: this_UiVerticalLayout_3= ruleUiVerticalLayout
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiLayoutAccess().getUiVerticalLayoutParserRuleCall_3());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiVerticalLayout_3=ruleUiVerticalLayout();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiVerticalLayout_3;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 5 :
+                    // InternalUIGrammar.g:15594:3: this_UiSplitpanel_4= ruleUiSplitpanel
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiLayoutAccess().getUiSplitpanelParserRuleCall_4());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiSplitpanel_4=ruleUiSplitpanel();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiSplitpanel_4;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 6 :
+                    // InternalUIGrammar.g:15603:3: this_UiPanel_5= ruleUiPanel
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiLayoutAccess().getUiPanelParserRuleCall_5());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiPanel_5=ruleUiPanel();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiPanel_5;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 7 :
+                    // InternalUIGrammar.g:15612:3: this_UiSearchPanel_6= ruleUiSearchPanel
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiLayoutAccess().getUiSearchPanelParserRuleCall_6());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiSearchPanel_6=ruleUiSearchPanel();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiSearchPanel_6;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiLayout"
+
+
+    // $ANTLR start "entryRuleUiField"
+    // InternalUIGrammar.g:15624:1: entryRuleUiField returns [EObject current=null] : iv_ruleUiField= ruleUiField EOF ;
+    public final EObject entryRuleUiField() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiField = null;
+
+
+        try {
+            // InternalUIGrammar.g:15624:48: (iv_ruleUiField= ruleUiField EOF )
+            // InternalUIGrammar.g:15625:2: iv_ruleUiField= ruleUiField EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiFieldRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiField=ruleUiField();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiField; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiField"
+
+
+    // $ANTLR start "ruleUiField"
+    // InternalUIGrammar.g:15631:1: ruleUiField returns [EObject current=null] : (this_UiTextField_0= ruleUiTextField | this_UiMaskedTextField_1= ruleUiMaskedTextField | this_UiMaskedNumericField_2= ruleUiMaskedNumericField | this_UiMaskedDecimalField_3= ruleUiMaskedDecimalField | this_UiPrefixedMaskedTextField_4= ruleUiPrefixedMaskedTextField | this_UiRichTextArea_5= ruleUiRichTextArea | this_UiPasswordField_6= ruleUiPasswordField | this_UiSuggestTextField_7= ruleUiSuggestTextField | this_UiList_8= ruleUiList | this_UiNumericField_9= ruleUiNumericField | this_UiCheckBox_10= ruleUiCheckBox | this_UiTable_11= ruleUiTable | this_UiComboBox_12= ruleUiComboBox | this_UiImage_13= ruleUiImage | this_UiSearchField_14= ruleUiSearchField | this_UiLabel_15= ruleUiLabel | this_UiDecimalField_16= ruleUiDecimalField | this_UiTextArea_17= ruleUiTextArea | this_UiDateField_18= ruleUiDateField | this_UiBrowser_19= ruleUiBrowser | this_UiProgressBar_20= ruleUiProgressBar | this_UiOptionsGroup_21= ruleUiOptionsGroup | this_UiBeanReferenceField_22= ruleUiBeanReferenceField ) ;
+    public final EObject ruleUiField() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_UiTextField_0 = null;
+
+        EObject this_UiMaskedTextField_1 = null;
+
+        EObject this_UiMaskedNumericField_2 = null;
+
+        EObject this_UiMaskedDecimalField_3 = null;
+
+        EObject this_UiPrefixedMaskedTextField_4 = null;
+
+        EObject this_UiRichTextArea_5 = null;
+
+        EObject this_UiPasswordField_6 = null;
+
+        EObject this_UiSuggestTextField_7 = null;
+
+        EObject this_UiList_8 = null;
+
+        EObject this_UiNumericField_9 = null;
+
+        EObject this_UiCheckBox_10 = null;
+
+        EObject this_UiTable_11 = null;
+
+        EObject this_UiComboBox_12 = null;
+
+        EObject this_UiImage_13 = null;
+
+        EObject this_UiSearchField_14 = null;
+
+        EObject this_UiLabel_15 = null;
+
+        EObject this_UiDecimalField_16 = null;
+
+        EObject this_UiTextArea_17 = null;
+
+        EObject this_UiDateField_18 = null;
+
+        EObject this_UiBrowser_19 = null;
+
+        EObject this_UiProgressBar_20 = null;
+
+        EObject this_UiOptionsGroup_21 = null;
+
+        EObject this_UiBeanReferenceField_22 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:15637:2: ( (this_UiTextField_0= ruleUiTextField | this_UiMaskedTextField_1= ruleUiMaskedTextField | this_UiMaskedNumericField_2= ruleUiMaskedNumericField | this_UiMaskedDecimalField_3= ruleUiMaskedDecimalField | this_UiPrefixedMaskedTextField_4= ruleUiPrefixedMaskedTextField | this_UiRichTextArea_5= ruleUiRichTextArea | this_UiPasswordField_6= ruleUiPasswordField | this_UiSuggestTextField_7= ruleUiSuggestTextField | this_UiList_8= ruleUiList | this_UiNumericField_9= ruleUiNumericField | this_UiCheckBox_10= ruleUiCheckBox | this_UiTable_11= ruleUiTable | this_UiComboBox_12= ruleUiComboBox | this_UiImage_13= ruleUiImage | this_UiSearchField_14= ruleUiSearchField | this_UiLabel_15= ruleUiLabel | this_UiDecimalField_16= ruleUiDecimalField | this_UiTextArea_17= ruleUiTextArea | this_UiDateField_18= ruleUiDateField | this_UiBrowser_19= ruleUiBrowser | this_UiProgressBar_20= ruleUiProgressBar | this_UiOptionsGroup_21= ruleUiOptionsGroup | this_UiBeanReferenceField_22= ruleUiBeanReferenceField ) )
+            // InternalUIGrammar.g:15638:2: (this_UiTextField_0= ruleUiTextField | this_UiMaskedTextField_1= ruleUiMaskedTextField | this_UiMaskedNumericField_2= ruleUiMaskedNumericField | this_UiMaskedDecimalField_3= ruleUiMaskedDecimalField | this_UiPrefixedMaskedTextField_4= ruleUiPrefixedMaskedTextField | this_UiRichTextArea_5= ruleUiRichTextArea | this_UiPasswordField_6= ruleUiPasswordField | this_UiSuggestTextField_7= ruleUiSuggestTextField | this_UiList_8= ruleUiList | this_UiNumericField_9= ruleUiNumericField | this_UiCheckBox_10= ruleUiCheckBox | this_UiTable_11= ruleUiTable | this_UiComboBox_12= ruleUiComboBox | this_UiImage_13= ruleUiImage | this_UiSearchField_14= ruleUiSearchField | this_UiLabel_15= ruleUiLabel | this_UiDecimalField_16= ruleUiDecimalField | this_UiTextArea_17= ruleUiTextArea | this_UiDateField_18= ruleUiDateField | this_UiBrowser_19= ruleUiBrowser | this_UiProgressBar_20= ruleUiProgressBar | this_UiOptionsGroup_21= ruleUiOptionsGroup | this_UiBeanReferenceField_22= ruleUiBeanReferenceField )
+            {
+            // InternalUIGrammar.g:15638:2: (this_UiTextField_0= ruleUiTextField | this_UiMaskedTextField_1= ruleUiMaskedTextField | this_UiMaskedNumericField_2= ruleUiMaskedNumericField | this_UiMaskedDecimalField_3= ruleUiMaskedDecimalField | this_UiPrefixedMaskedTextField_4= ruleUiPrefixedMaskedTextField | this_UiRichTextArea_5= ruleUiRichTextArea | this_UiPasswordField_6= ruleUiPasswordField | this_UiSuggestTextField_7= ruleUiSuggestTextField | this_UiList_8= ruleUiList | this_UiNumericField_9= ruleUiNumericField | this_UiCheckBox_10= ruleUiCheckBox | this_UiTable_11= ruleUiTable | this_UiComboBox_12= ruleUiComboBox | this_UiImage_13= ruleUiImage | this_UiSearchField_14= ruleUiSearchField | this_UiLabel_15= ruleUiLabel | this_UiDecimalField_16= ruleUiDecimalField | this_UiTextArea_17= ruleUiTextArea | this_UiDateField_18= ruleUiDateField | this_UiBrowser_19= ruleUiBrowser | this_UiProgressBar_20= ruleUiProgressBar | this_UiOptionsGroup_21= ruleUiOptionsGroup | this_UiBeanReferenceField_22= ruleUiBeanReferenceField )
+            int alt368=23;
+            switch ( input.LA(1) ) {
+            case 91:
+                {
+                alt368=1;
+                }
+                break;
+            case 96:
+                {
+                alt368=2;
+                }
+                break;
+            case 98:
+                {
+                alt368=3;
+                }
+                break;
+            case 99:
+                {
+                alt368=4;
+                }
+                break;
+            case 100:
+                {
+                alt368=5;
+                }
+                break;
+            case 105:
+                {
+                alt368=6;
+                }
+                break;
+            case 95:
+                {
+                alt368=7;
+                }
+                break;
+            case 107:
+                {
+                alt368=8;
+                }
+                break;
+            case 139:
+                {
+                alt368=9;
+                }
+                break;
+            case 145:
+                {
+                alt368=10;
+                }
+                break;
+            case 146:
+                {
+                alt368=11;
+                }
+                break;
+            case 124:
+                {
+                alt368=12;
+                }
+                break;
+            case 128:
+                {
+                alt368=13;
+                }
+                break;
+            case 122:
+                {
+                alt368=14;
+                }
+                break;
+            case 117:
+                {
+                alt368=15;
+                }
+                break;
+            case 133:
+                {
+                alt368=16;
+                }
+                break;
+            case 134:
+                {
+                alt368=17;
+                }
+                break;
+            case 118:
+                {
+                alt368=18;
+                }
+                break;
+            case 119:
+                {
+                alt368=19;
+                }
+                break;
+            case 120:
+                {
+                alt368=20;
+                }
+                break;
+            case 121:
+                {
+                alt368=21;
+                }
+                break;
+            case 138:
+                {
+                alt368=22;
+                }
+                break;
+            case 112:
+                {
+                alt368=23;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 368, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt368) {
+                case 1 :
+                    // InternalUIGrammar.g:15639:3: this_UiTextField_0= ruleUiTextField
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiFieldAccess().getUiTextFieldParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiTextField_0=ruleUiTextField();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiTextField_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalUIGrammar.g:15648:3: this_UiMaskedTextField_1= ruleUiMaskedTextField
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiFieldAccess().getUiMaskedTextFieldParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiMaskedTextField_1=ruleUiMaskedTextField();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiMaskedTextField_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalUIGrammar.g:15657:3: this_UiMaskedNumericField_2= ruleUiMaskedNumericField
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiFieldAccess().getUiMaskedNumericFieldParserRuleCall_2());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiMaskedNumericField_2=ruleUiMaskedNumericField();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiMaskedNumericField_2;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalUIGrammar.g:15666:3: this_UiMaskedDecimalField_3= ruleUiMaskedDecimalField
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiFieldAccess().getUiMaskedDecimalFieldParserRuleCall_3());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiMaskedDecimalField_3=ruleUiMaskedDecimalField();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiMaskedDecimalField_3;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 5 :
+                    // InternalUIGrammar.g:15675:3: this_UiPrefixedMaskedTextField_4= ruleUiPrefixedMaskedTextField
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiFieldAccess().getUiPrefixedMaskedTextFieldParserRuleCall_4());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiPrefixedMaskedTextField_4=ruleUiPrefixedMaskedTextField();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiPrefixedMaskedTextField_4;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 6 :
+                    // InternalUIGrammar.g:15684:3: this_UiRichTextArea_5= ruleUiRichTextArea
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiFieldAccess().getUiRichTextAreaParserRuleCall_5());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiRichTextArea_5=ruleUiRichTextArea();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiRichTextArea_5;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 7 :
+                    // InternalUIGrammar.g:15693:3: this_UiPasswordField_6= ruleUiPasswordField
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiFieldAccess().getUiPasswordFieldParserRuleCall_6());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiPasswordField_6=ruleUiPasswordField();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiPasswordField_6;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 8 :
+                    // InternalUIGrammar.g:15702:3: this_UiSuggestTextField_7= ruleUiSuggestTextField
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiFieldAccess().getUiSuggestTextFieldParserRuleCall_7());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiSuggestTextField_7=ruleUiSuggestTextField();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiSuggestTextField_7;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 9 :
+                    // InternalUIGrammar.g:15711:3: this_UiList_8= ruleUiList
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiFieldAccess().getUiListParserRuleCall_8());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiList_8=ruleUiList();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiList_8;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 10 :
+                    // InternalUIGrammar.g:15720:3: this_UiNumericField_9= ruleUiNumericField
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiFieldAccess().getUiNumericFieldParserRuleCall_9());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiNumericField_9=ruleUiNumericField();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiNumericField_9;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 11 :
+                    // InternalUIGrammar.g:15729:3: this_UiCheckBox_10= ruleUiCheckBox
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiFieldAccess().getUiCheckBoxParserRuleCall_10());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiCheckBox_10=ruleUiCheckBox();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiCheckBox_10;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 12 :
+                    // InternalUIGrammar.g:15738:3: this_UiTable_11= ruleUiTable
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiFieldAccess().getUiTableParserRuleCall_11());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiTable_11=ruleUiTable();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiTable_11;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 13 :
+                    // InternalUIGrammar.g:15747:3: this_UiComboBox_12= ruleUiComboBox
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiFieldAccess().getUiComboBoxParserRuleCall_12());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiComboBox_12=ruleUiComboBox();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiComboBox_12;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 14 :
+                    // InternalUIGrammar.g:15756:3: this_UiImage_13= ruleUiImage
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiFieldAccess().getUiImageParserRuleCall_13());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiImage_13=ruleUiImage();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiImage_13;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 15 :
+                    // InternalUIGrammar.g:15765:3: this_UiSearchField_14= ruleUiSearchField
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiFieldAccess().getUiSearchFieldParserRuleCall_14());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiSearchField_14=ruleUiSearchField();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiSearchField_14;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 16 :
+                    // InternalUIGrammar.g:15774:3: this_UiLabel_15= ruleUiLabel
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiFieldAccess().getUiLabelParserRuleCall_15());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiLabel_15=ruleUiLabel();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiLabel_15;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 17 :
+                    // InternalUIGrammar.g:15783:3: this_UiDecimalField_16= ruleUiDecimalField
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiFieldAccess().getUiDecimalFieldParserRuleCall_16());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiDecimalField_16=ruleUiDecimalField();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiDecimalField_16;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 18 :
+                    // InternalUIGrammar.g:15792:3: this_UiTextArea_17= ruleUiTextArea
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiFieldAccess().getUiTextAreaParserRuleCall_17());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiTextArea_17=ruleUiTextArea();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiTextArea_17;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 19 :
+                    // InternalUIGrammar.g:15801:3: this_UiDateField_18= ruleUiDateField
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiFieldAccess().getUiDateFieldParserRuleCall_18());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiDateField_18=ruleUiDateField();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiDateField_18;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 20 :
+                    // InternalUIGrammar.g:15810:3: this_UiBrowser_19= ruleUiBrowser
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiFieldAccess().getUiBrowserParserRuleCall_19());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiBrowser_19=ruleUiBrowser();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiBrowser_19;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 21 :
+                    // InternalUIGrammar.g:15819:3: this_UiProgressBar_20= ruleUiProgressBar
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiFieldAccess().getUiProgressBarParserRuleCall_20());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiProgressBar_20=ruleUiProgressBar();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiProgressBar_20;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 22 :
+                    // InternalUIGrammar.g:15828:3: this_UiOptionsGroup_21= ruleUiOptionsGroup
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiFieldAccess().getUiOptionsGroupParserRuleCall_21());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiOptionsGroup_21=ruleUiOptionsGroup();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiOptionsGroup_21;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 23 :
+                    // InternalUIGrammar.g:15837:3: this_UiBeanReferenceField_22= ruleUiBeanReferenceField
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiFieldAccess().getUiBeanReferenceFieldParserRuleCall_22());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiBeanReferenceField_22=ruleUiBeanReferenceField();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiBeanReferenceField_22;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiField"
+
+
+    // $ANTLR start "entryRuleUiAction"
+    // InternalUIGrammar.g:15849:1: entryRuleUiAction returns [EObject current=null] : iv_ruleUiAction= ruleUiAction EOF ;
+    public final EObject entryRuleUiAction() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiAction = null;
+
+
+        try {
+            // InternalUIGrammar.g:15849:49: (iv_ruleUiAction= ruleUiAction EOF )
+            // InternalUIGrammar.g:15850:2: iv_ruleUiAction= ruleUiAction EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiActionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiAction=ruleUiAction();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiAction; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiAction"
+
+
+    // $ANTLR start "ruleUiAction"
+    // InternalUIGrammar.g:15856:1: ruleUiAction returns [EObject current=null] : this_UiButton_0= ruleUiButton ;
+    public final EObject ruleUiAction() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_UiButton_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:15862:2: (this_UiButton_0= ruleUiButton )
+            // InternalUIGrammar.g:15863:2: this_UiButton_0= ruleUiButton
+            {
+            if ( state.backtracking==0 ) {
+
+              		newCompositeNode(grammarAccess.getUiActionAccess().getUiButtonParserRuleCall());
+              	
+            }
+            pushFollow(FOLLOW_2);
+            this_UiButton_0=ruleUiButton();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		current = this_UiButton_0;
+              		afterParserOrEnumRuleCall();
+              	
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiAction"
+
+
+    // $ANTLR start "entryRuleUiMobileAction"
+    // InternalUIGrammar.g:15874:1: entryRuleUiMobileAction returns [EObject current=null] : iv_ruleUiMobileAction= ruleUiMobileAction EOF ;
+    public final EObject entryRuleUiMobileAction() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiMobileAction = null;
+
+
+        try {
+            // InternalUIGrammar.g:15874:55: (iv_ruleUiMobileAction= ruleUiMobileAction EOF )
+            // InternalUIGrammar.g:15875:2: iv_ruleUiMobileAction= ruleUiMobileAction EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiMobileActionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiMobileAction=ruleUiMobileAction();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiMobileAction; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiMobileAction"
+
+
+    // $ANTLR start "ruleUiMobileAction"
+    // InternalUIGrammar.g:15881:1: ruleUiMobileAction returns [EObject current=null] : (this_UiMobileNavigationButton_0= ruleUiMobileNavigationButton | this_UiButton_1= ruleUiButton ) ;
+    public final EObject ruleUiMobileAction() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_UiMobileNavigationButton_0 = null;
+
+        EObject this_UiButton_1 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:15887:2: ( (this_UiMobileNavigationButton_0= ruleUiMobileNavigationButton | this_UiButton_1= ruleUiButton ) )
+            // InternalUIGrammar.g:15888:2: (this_UiMobileNavigationButton_0= ruleUiMobileNavigationButton | this_UiButton_1= ruleUiButton )
+            {
+            // InternalUIGrammar.g:15888:2: (this_UiMobileNavigationButton_0= ruleUiMobileNavigationButton | this_UiButton_1= ruleUiButton )
+            int alt369=2;
+            int LA369_0 = input.LA(1);
+
+            if ( (LA369_0==130) ) {
+                alt369=1;
+            }
+            else if ( (LA369_0==129) ) {
+                alt369=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 369, 0, input);
+
+                throw nvae;
+            }
+            switch (alt369) {
+                case 1 :
+                    // InternalUIGrammar.g:15889:3: this_UiMobileNavigationButton_0= ruleUiMobileNavigationButton
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiMobileActionAccess().getUiMobileNavigationButtonParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiMobileNavigationButton_0=ruleUiMobileNavigationButton();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiMobileNavigationButton_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalUIGrammar.g:15898:3: this_UiButton_1= ruleUiButton
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiMobileActionAccess().getUiButtonParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiButton_1=ruleUiButton();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiButton_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiMobileAction"
+
+
+    // $ANTLR start "entryRuleUiNumericField"
+    // InternalUIGrammar.g:15910:1: entryRuleUiNumericField returns [EObject current=null] : iv_ruleUiNumericField= ruleUiNumericField EOF ;
+    public final EObject entryRuleUiNumericField() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiNumericField = null;
+
+
+        try {
+            // InternalUIGrammar.g:15910:55: (iv_ruleUiNumericField= ruleUiNumericField EOF )
+            // InternalUIGrammar.g:15911:2: iv_ruleUiNumericField= ruleUiNumericField EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiNumericFieldRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiNumericField=ruleUiNumericField();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiNumericField; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiNumericField"
+
+
+    // $ANTLR start "ruleUiNumericField"
+    // InternalUIGrammar.g:15917:1: ruleUiNumericField returns [EObject current=null] : ( () otherlv_1= 'numericField' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_noMarkNegative_7_0= 'noMarkNegative' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')' )? ( (lv_name_11_0= RULE_ID ) )? (otherlv_12= '{' ( ( (lv_validators_13_0= ruleUiValidator ) ) | ( (lv_bindings_14_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}' )? ) ;
+    public final EObject ruleUiNumericField() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token lv_noGrouping_4_0=null;
+        Token otherlv_5=null;
+        Token lv_styles_6_0=null;
+        Token lv_noMarkNegative_7_0=null;
+        Token lv_readonly_9_0=null;
+        Token otherlv_10=null;
+        Token lv_name_11_0=null;
+        Token otherlv_12=null;
+        Token otherlv_16=null;
+        EObject lv_i18nInfo_8_0 = null;
+
+        EObject lv_validators_13_0 = null;
+
+        EObject lv_bindings_14_0 = null;
+
+        EObject lv_processorAssignments_15_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:15923:2: ( ( () otherlv_1= 'numericField' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_noMarkNegative_7_0= 'noMarkNegative' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')' )? ( (lv_name_11_0= RULE_ID ) )? (otherlv_12= '{' ( ( (lv_validators_13_0= ruleUiValidator ) ) | ( (lv_bindings_14_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}' )? ) )
+            // InternalUIGrammar.g:15924:2: ( () otherlv_1= 'numericField' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_noMarkNegative_7_0= 'noMarkNegative' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')' )? ( (lv_name_11_0= RULE_ID ) )? (otherlv_12= '{' ( ( (lv_validators_13_0= ruleUiValidator ) ) | ( (lv_bindings_14_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}' )? )
+            {
+            // InternalUIGrammar.g:15924:2: ( () otherlv_1= 'numericField' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_noMarkNegative_7_0= 'noMarkNegative' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')' )? ( (lv_name_11_0= RULE_ID ) )? (otherlv_12= '{' ( ( (lv_validators_13_0= ruleUiValidator ) ) | ( (lv_bindings_14_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}' )? )
+            // InternalUIGrammar.g:15925:3: () otherlv_1= 'numericField' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_noMarkNegative_7_0= 'noMarkNegative' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')' )? ( (lv_name_11_0= RULE_ID ) )? (otherlv_12= '{' ( ( (lv_validators_13_0= ruleUiValidator ) ) | ( (lv_bindings_14_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}' )?
+            {
+            // InternalUIGrammar.g:15925:3: ()
+            // InternalUIGrammar.g:15926:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiNumericFieldAccess().getUiNumericFieldAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,145,FOLLOW_86); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiNumericFieldAccess().getNumericFieldKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:15936:3: (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_noMarkNegative_7_0= 'noMarkNegative' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')' )?
+            int alt371=2;
+            int LA371_0 = input.LA(1);
+
+            if ( (LA371_0==45) ) {
+                alt371=1;
+            }
+            switch (alt371) {
+                case 1 :
+                    // InternalUIGrammar.g:15937:4: otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_noMarkNegative_7_0= 'noMarkNegative' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) ) otherlv_10= ')'
+                    {
+                    otherlv_2=(Token)match(input,45,FOLLOW_122); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getUiNumericFieldAccess().getLeftParenthesisKeyword_2_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:15941:4: ( ( ( ( ({...}? => ( ({...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_noMarkNegative_7_0= 'noMarkNegative' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:15942:5: ( ( ( ({...}? => ( ({...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_noMarkNegative_7_0= 'noMarkNegative' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:15942:5: ( ( ( ({...}? => ( ({...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_noMarkNegative_7_0= 'noMarkNegative' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:15943:6: ( ( ({...}? => ( ({...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_noMarkNegative_7_0= 'noMarkNegative' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1());
+                    // InternalUIGrammar.g:15946:6: ( ( ({...}? => ( ({...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_noMarkNegative_7_0= 'noMarkNegative' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:15947:7: ( ({...}? => ( ({...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_noMarkNegative_7_0= 'noMarkNegative' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:15947:7: ( ({...}? => ( ({...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_noMarkNegative_7_0= 'noMarkNegative' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) ) )*
+                    loop370:
+                    do {
+                        int alt370=6;
+                        int LA370_0 = input.LA(1);
+
+                        if ( LA370_0 == 135 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), 0) ) {
+                            alt370=1;
+                        }
+                        else if ( LA370_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), 1) ) {
+                            alt370=2;
+                        }
+                        else if ( LA370_0 == 136 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), 2) ) {
+                            alt370=3;
+                        }
+                        else if ( LA370_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), 3) ) {
+                            alt370=4;
+                        }
+                        else if ( LA370_0 == 65 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), 4) ) {
+                            alt370=5;
+                        }
+
+
+                        switch (alt370) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:15948:5: ({...}? => ( ({...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:15948:5: ({...}? => ( ({...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) ) ) ) )
+                    	    // InternalUIGrammar.g:15949:6: {...}? => ( ({...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiNumericField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:15949:114: ( ({...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) ) ) )
+                    	    // InternalUIGrammar.g:15950:7: ({...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), 0);
+                    	    // InternalUIGrammar.g:15953:10: ({...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) ) )
+                    	    // InternalUIGrammar.g:15953:11: {...}? => ( (lv_noGrouping_4_0= 'noGrouping' ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiNumericField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:15953:20: ( (lv_noGrouping_4_0= 'noGrouping' ) )
+                    	    // InternalUIGrammar.g:15953:21: (lv_noGrouping_4_0= 'noGrouping' )
+                    	    {
+                    	    // InternalUIGrammar.g:15953:21: (lv_noGrouping_4_0= 'noGrouping' )
+                    	    // InternalUIGrammar.g:15954:11: lv_noGrouping_4_0= 'noGrouping'
+                    	    {
+                    	    lv_noGrouping_4_0=(Token)match(input,135,FOLLOW_122); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newLeafNode(lv_noGrouping_4_0, grammarAccess.getUiNumericFieldAccess().getNoGroupingNoGroupingKeyword_2_1_0_0());
+                    	      										
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElement(grammarAccess.getUiNumericFieldRule());
+                    	      											}
+                    	      											setWithLastConsumed(current, "noGrouping", true, "noGrouping");
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:15971:5: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:15971:5: ({...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:15972:6: {...}? => ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiNumericField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:15972:114: ( ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:15973:7: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), 1);
+                    	    // InternalUIGrammar.g:15976:10: ({...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:15976:11: {...}? => (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiNumericField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:15976:20: (otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:15976:21: otherlv_5= 'styles' ( (lv_styles_6_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_5=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_5, grammarAccess.getUiNumericFieldAccess().getStylesKeyword_2_1_1_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:15980:10: ( (lv_styles_6_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:15981:11: (lv_styles_6_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:15981:11: (lv_styles_6_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:15982:12: lv_styles_6_0= RULE_STRING
+                    	    {
+                    	    lv_styles_6_0=(Token)match(input,RULE_STRING,FOLLOW_122); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_styles_6_0, grammarAccess.getUiNumericFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiNumericFieldRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"styles",
+                    	      													lv_styles_6_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 3 :
+                    	    // InternalUIGrammar.g:16004:5: ({...}? => ( ({...}? => ( (lv_noMarkNegative_7_0= 'noMarkNegative' ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:16004:5: ({...}? => ( ({...}? => ( (lv_noMarkNegative_7_0= 'noMarkNegative' ) ) ) ) )
+                    	    // InternalUIGrammar.g:16005:6: {...}? => ( ({...}? => ( (lv_noMarkNegative_7_0= 'noMarkNegative' ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), 2) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiNumericField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), 2)");
+                    	    }
+                    	    // InternalUIGrammar.g:16005:114: ( ({...}? => ( (lv_noMarkNegative_7_0= 'noMarkNegative' ) ) ) )
+                    	    // InternalUIGrammar.g:16006:7: ({...}? => ( (lv_noMarkNegative_7_0= 'noMarkNegative' ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), 2);
+                    	    // InternalUIGrammar.g:16009:10: ({...}? => ( (lv_noMarkNegative_7_0= 'noMarkNegative' ) ) )
+                    	    // InternalUIGrammar.g:16009:11: {...}? => ( (lv_noMarkNegative_7_0= 'noMarkNegative' ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiNumericField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:16009:20: ( (lv_noMarkNegative_7_0= 'noMarkNegative' ) )
+                    	    // InternalUIGrammar.g:16009:21: (lv_noMarkNegative_7_0= 'noMarkNegative' )
+                    	    {
+                    	    // InternalUIGrammar.g:16009:21: (lv_noMarkNegative_7_0= 'noMarkNegative' )
+                    	    // InternalUIGrammar.g:16010:11: lv_noMarkNegative_7_0= 'noMarkNegative'
+                    	    {
+                    	    lv_noMarkNegative_7_0=(Token)match(input,136,FOLLOW_122); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newLeafNode(lv_noMarkNegative_7_0, grammarAccess.getUiNumericFieldAccess().getNoMarkNegativeNoMarkNegativeKeyword_2_1_2_0());
+                    	      										
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElement(grammarAccess.getUiNumericFieldRule());
+                    	      											}
+                    	      											setWithLastConsumed(current, "noMarkNegative", true, "noMarkNegative");
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 4 :
+                    	    // InternalUIGrammar.g:16027:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:16027:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) ) )
+                    	    // InternalUIGrammar.g:16028:6: {...}? => ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), 3) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiNumericField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), 3)");
+                    	    }
+                    	    // InternalUIGrammar.g:16028:114: ( ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) ) )
+                    	    // InternalUIGrammar.g:16029:7: ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), 3);
+                    	    // InternalUIGrammar.g:16032:10: ({...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) ) )
+                    	    // InternalUIGrammar.g:16032:11: {...}? => ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiNumericField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:16032:20: ( (lv_i18nInfo_8_0= ruleUiI18nInfo ) )
+                    	    // InternalUIGrammar.g:16032:21: (lv_i18nInfo_8_0= ruleUiI18nInfo )
+                    	    {
+                    	    // InternalUIGrammar.g:16032:21: (lv_i18nInfo_8_0= ruleUiI18nInfo )
+                    	    // InternalUIGrammar.g:16033:11: lv_i18nInfo_8_0= ruleUiI18nInfo
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getUiNumericFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_3_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_122);
+                    	    lv_i18nInfo_8_0=ruleUiI18nInfo();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getUiNumericFieldRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"i18nInfo",
+                    	      												lv_i18nInfo_8_0,
+                    	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 5 :
+                    	    // InternalUIGrammar.g:16055:5: ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:16055:5: ({...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) ) )
+                    	    // InternalUIGrammar.g:16056:6: {...}? => ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), 4) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiNumericField", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), 4)");
+                    	    }
+                    	    // InternalUIGrammar.g:16056:114: ( ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) ) )
+                    	    // InternalUIGrammar.g:16057:7: ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), 4);
+                    	    // InternalUIGrammar.g:16060:10: ({...}? => ( (lv_readonly_9_0= 'readonly' ) ) )
+                    	    // InternalUIGrammar.g:16060:11: {...}? => ( (lv_readonly_9_0= 'readonly' ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiNumericField", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:16060:20: ( (lv_readonly_9_0= 'readonly' ) )
+                    	    // InternalUIGrammar.g:16060:21: (lv_readonly_9_0= 'readonly' )
+                    	    {
+                    	    // InternalUIGrammar.g:16060:21: (lv_readonly_9_0= 'readonly' )
+                    	    // InternalUIGrammar.g:16061:11: lv_readonly_9_0= 'readonly'
+                    	    {
+                    	    lv_readonly_9_0=(Token)match(input,65,FOLLOW_122); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newLeafNode(lv_readonly_9_0, grammarAccess.getUiNumericFieldAccess().getReadonlyReadonlyKeyword_2_1_4_0());
+                    	      										
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElement(grammarAccess.getUiNumericFieldRule());
+                    	      											}
+                    	      											setWithLastConsumed(current, "readonly", true, "readonly");
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop370;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1());
+
+                    }
+
+                    otherlv_10=(Token)match(input,47,FOLLOW_88); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_10, grammarAccess.getUiNumericFieldAccess().getRightParenthesisKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:16090:3: ( (lv_name_11_0= RULE_ID ) )?
+            int alt372=2;
+            int LA372_0 = input.LA(1);
+
+            if ( (LA372_0==RULE_ID) ) {
+                alt372=1;
+            }
+            switch (alt372) {
+                case 1 :
+                    // InternalUIGrammar.g:16091:4: (lv_name_11_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:16091:4: (lv_name_11_0= RULE_ID )
+                    // InternalUIGrammar.g:16092:5: lv_name_11_0= RULE_ID
+                    {
+                    lv_name_11_0=(Token)match(input,RULE_ID,FOLLOW_89); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_11_0, grammarAccess.getUiNumericFieldAccess().getNameIDTerminalRuleCall_3_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiNumericFieldRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_11_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:16108:3: (otherlv_12= '{' ( ( (lv_validators_13_0= ruleUiValidator ) ) | ( (lv_bindings_14_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}' )?
+            int alt375=2;
+            int LA375_0 = input.LA(1);
+
+            if ( (LA375_0==20) ) {
+                alt375=1;
+            }
+            switch (alt375) {
+                case 1 :
+                    // InternalUIGrammar.g:16109:4: otherlv_12= '{' ( ( (lv_validators_13_0= ruleUiValidator ) ) | ( (lv_bindings_14_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_16= '}'
+                    {
+                    otherlv_12=(Token)match(input,20,FOLLOW_90); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_12, grammarAccess.getUiNumericFieldAccess().getLeftCurlyBracketKeyword_4_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:16113:4: ( ( (lv_validators_13_0= ruleUiValidator ) ) | ( (lv_bindings_14_0= ruleUiBinding ) ) )*
+                    loop373:
+                    do {
+                        int alt373=3;
+                        int LA373_0 = input.LA(1);
+
+                        if ( ((LA373_0>=147 && LA373_0<=151)) ) {
+                            alt373=1;
+                        }
+                        else if ( (LA373_0==26) ) {
+                            alt373=2;
+                        }
+
+
+                        switch (alt373) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:16114:5: ( (lv_validators_13_0= ruleUiValidator ) )
+                    	    {
+                    	    // InternalUIGrammar.g:16114:5: ( (lv_validators_13_0= ruleUiValidator ) )
+                    	    // InternalUIGrammar.g:16115:6: (lv_validators_13_0= ruleUiValidator )
+                    	    {
+                    	    // InternalUIGrammar.g:16115:6: (lv_validators_13_0= ruleUiValidator )
+                    	    // InternalUIGrammar.g:16116:7: lv_validators_13_0= ruleUiValidator
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiNumericFieldAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_validators_13_0=ruleUiValidator();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiNumericFieldRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"validators",
+                    	      								lv_validators_13_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:16134:5: ( (lv_bindings_14_0= ruleUiBinding ) )
+                    	    {
+                    	    // InternalUIGrammar.g:16134:5: ( (lv_bindings_14_0= ruleUiBinding ) )
+                    	    // InternalUIGrammar.g:16135:6: (lv_bindings_14_0= ruleUiBinding )
+                    	    {
+                    	    // InternalUIGrammar.g:16135:6: (lv_bindings_14_0= ruleUiBinding )
+                    	    // InternalUIGrammar.g:16136:7: lv_bindings_14_0= ruleUiBinding
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiNumericFieldAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_bindings_14_0=ruleUiBinding();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiNumericFieldRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"bindings",
+                    	      								lv_bindings_14_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop373;
+                        }
+                    } while (true);
+
+                    // InternalUIGrammar.g:16154:4: ( (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment ) )*
+                    loop374:
+                    do {
+                        int alt374=2;
+                        int LA374_0 = input.LA(1);
+
+                        if ( (LA374_0==153) ) {
+                            alt374=1;
+                        }
+
+
+                        switch (alt374) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:16155:5: (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment )
+                    	    {
+                    	    // InternalUIGrammar.g:16155:5: (lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment )
+                    	    // InternalUIGrammar.g:16156:6: lv_processorAssignments_15_0= ruleUiVisibilityProcessorAssignment
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newCompositeNode(grammarAccess.getUiNumericFieldAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
+                    	      					
+                    	    }
+                    	    pushFollow(FOLLOW_42);
+                    	    lv_processorAssignments_15_0=ruleUiVisibilityProcessorAssignment();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						if (current==null) {
+                    	      							current = createModelElementForParent(grammarAccess.getUiNumericFieldRule());
+                    	      						}
+                    	      						add(
+                    	      							current,
+                    	      							"processorAssignments",
+                    	      							lv_processorAssignments_15_0,
+                    	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+                    	      						afterParserOrEnumRuleCall();
+                    	      					
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop374;
+                        }
+                    } while (true);
+
+                    otherlv_16=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_16, grammarAccess.getUiNumericFieldAccess().getRightCurlyBracketKeyword_4_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiNumericField"
+
+
+    // $ANTLR start "entryRuleUiCheckBox"
+    // InternalUIGrammar.g:16182:1: entryRuleUiCheckBox returns [EObject current=null] : iv_ruleUiCheckBox= ruleUiCheckBox EOF ;
+    public final EObject entryRuleUiCheckBox() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiCheckBox = null;
+
+
+        try {
+            // InternalUIGrammar.g:16182:51: (iv_ruleUiCheckBox= ruleUiCheckBox EOF )
+            // InternalUIGrammar.g:16183:2: iv_ruleUiCheckBox= ruleUiCheckBox EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiCheckBoxRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiCheckBox=ruleUiCheckBox();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiCheckBox; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiCheckBox"
+
+
+    // $ANTLR start "ruleUiCheckBox"
+    // InternalUIGrammar.g:16189:1: ruleUiCheckBox returns [EObject current=null] : ( () otherlv_1= 'checkbox' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? (otherlv_10= '{' ( ( (lv_validators_11_0= ruleUiValidator ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )? ) ;
+    public final EObject ruleUiCheckBox() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token lv_readonly_5_0=null;
+        Token otherlv_6=null;
+        Token lv_styles_7_0=null;
+        Token otherlv_8=null;
+        Token lv_name_9_0=null;
+        Token otherlv_10=null;
+        Token otherlv_14=null;
+        EObject lv_i18nInfo_4_0 = null;
+
+        EObject lv_validators_11_0 = null;
+
+        EObject lv_bindings_12_0 = null;
+
+        EObject lv_processorAssignments_13_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:16195:2: ( ( () otherlv_1= 'checkbox' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? (otherlv_10= '{' ( ( (lv_validators_11_0= ruleUiValidator ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )? ) )
+            // InternalUIGrammar.g:16196:2: ( () otherlv_1= 'checkbox' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? (otherlv_10= '{' ( ( (lv_validators_11_0= ruleUiValidator ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )? )
+            {
+            // InternalUIGrammar.g:16196:2: ( () otherlv_1= 'checkbox' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? (otherlv_10= '{' ( ( (lv_validators_11_0= ruleUiValidator ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )? )
+            // InternalUIGrammar.g:16197:3: () otherlv_1= 'checkbox' (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )? ( (lv_name_9_0= RULE_ID ) )? (otherlv_10= '{' ( ( (lv_validators_11_0= ruleUiValidator ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )?
+            {
+            // InternalUIGrammar.g:16197:3: ()
+            // InternalUIGrammar.g:16198:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiCheckBoxAccess().getUiCheckBoxAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,146,FOLLOW_86); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiCheckBoxAccess().getCheckboxKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:16208:3: (otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')' )?
+            int alt377=2;
+            int LA377_0 = input.LA(1);
+
+            if ( (LA377_0==45) ) {
+                alt377=1;
+            }
+            switch (alt377) {
+                case 1 :
+                    // InternalUIGrammar.g:16209:4: otherlv_2= '(' ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= ')'
+                    {
+                    otherlv_2=(Token)match(input,45,FOLLOW_62); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getUiCheckBoxAccess().getLeftParenthesisKeyword_2_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:16213:4: ( ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
+                    // InternalUIGrammar.g:16214:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    {
+                    // InternalUIGrammar.g:16214:5: ( ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* ) )
+                    // InternalUIGrammar.g:16215:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getUiCheckBoxAccess().getUnorderedGroup_2_1());
+                    // InternalUIGrammar.g:16218:6: ( ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )* )
+                    // InternalUIGrammar.g:16219:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )*
+                    {
+                    // InternalUIGrammar.g:16219:7: ( ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) ) )*
+                    loop376:
+                    do {
+                        int alt376=4;
+                        int LA376_0 = input.LA(1);
+
+                        if ( LA376_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiCheckBoxAccess().getUnorderedGroup_2_1(), 0) ) {
+                            alt376=1;
+                        }
+                        else if ( LA376_0 == 65 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiCheckBoxAccess().getUnorderedGroup_2_1(), 1) ) {
+                            alt376=2;
+                        }
+                        else if ( LA376_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getUiCheckBoxAccess().getUnorderedGroup_2_1(), 2) ) {
+                            alt376=3;
+                        }
+
+
+                        switch (alt376) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:16220:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:16220:5: ({...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) ) )
+                    	    // InternalUIGrammar.g:16221:6: {...}? => ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiCheckBoxAccess().getUnorderedGroup_2_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiCheckBox", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiCheckBoxAccess().getUnorderedGroup_2_1(), 0)");
+                    	    }
+                    	    // InternalUIGrammar.g:16221:110: ( ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) ) )
+                    	    // InternalUIGrammar.g:16222:7: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiCheckBoxAccess().getUnorderedGroup_2_1(), 0);
+                    	    // InternalUIGrammar.g:16225:10: ({...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) ) )
+                    	    // InternalUIGrammar.g:16225:11: {...}? => ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiCheckBox", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:16225:20: ( (lv_i18nInfo_4_0= ruleUiI18nInfo ) )
+                    	    // InternalUIGrammar.g:16225:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    {
+                    	    // InternalUIGrammar.g:16225:21: (lv_i18nInfo_4_0= ruleUiI18nInfo )
+                    	    // InternalUIGrammar.g:16226:11: lv_i18nInfo_4_0= ruleUiI18nInfo
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getUiCheckBoxAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_62);
+                    	    lv_i18nInfo_4_0=ruleUiI18nInfo();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getUiCheckBoxRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"i18nInfo",
+                    	      												lv_i18nInfo_4_0,
+                    	      												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiCheckBoxAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:16248:5: ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:16248:5: ({...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) ) )
+                    	    // InternalUIGrammar.g:16249:6: {...}? => ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiCheckBoxAccess().getUnorderedGroup_2_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiCheckBox", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiCheckBoxAccess().getUnorderedGroup_2_1(), 1)");
+                    	    }
+                    	    // InternalUIGrammar.g:16249:110: ( ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) ) )
+                    	    // InternalUIGrammar.g:16250:7: ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiCheckBoxAccess().getUnorderedGroup_2_1(), 1);
+                    	    // InternalUIGrammar.g:16253:10: ({...}? => ( (lv_readonly_5_0= 'readonly' ) ) )
+                    	    // InternalUIGrammar.g:16253:11: {...}? => ( (lv_readonly_5_0= 'readonly' ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiCheckBox", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:16253:20: ( (lv_readonly_5_0= 'readonly' ) )
+                    	    // InternalUIGrammar.g:16253:21: (lv_readonly_5_0= 'readonly' )
+                    	    {
+                    	    // InternalUIGrammar.g:16253:21: (lv_readonly_5_0= 'readonly' )
+                    	    // InternalUIGrammar.g:16254:11: lv_readonly_5_0= 'readonly'
+                    	    {
+                    	    lv_readonly_5_0=(Token)match(input,65,FOLLOW_62); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newLeafNode(lv_readonly_5_0, grammarAccess.getUiCheckBoxAccess().getReadonlyReadonlyKeyword_2_1_1_0());
+                    	      										
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElement(grammarAccess.getUiCheckBoxRule());
+                    	      											}
+                    	      											setWithLastConsumed(current, "readonly", true, "readonly");
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiCheckBoxAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 3 :
+                    	    // InternalUIGrammar.g:16271:5: ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) )
+                    	    {
+                    	    // InternalUIGrammar.g:16271:5: ({...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) ) )
+                    	    // InternalUIGrammar.g:16272:6: {...}? => ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getUiCheckBoxAccess().getUnorderedGroup_2_1(), 2) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiCheckBox", "getUnorderedGroupHelper().canSelect(grammarAccess.getUiCheckBoxAccess().getUnorderedGroup_2_1(), 2)");
+                    	    }
+                    	    // InternalUIGrammar.g:16272:110: ( ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) ) )
+                    	    // InternalUIGrammar.g:16273:7: ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getUiCheckBoxAccess().getUnorderedGroup_2_1(), 2);
+                    	    // InternalUIGrammar.g:16276:10: ({...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) ) )
+                    	    // InternalUIGrammar.g:16276:11: {...}? => (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleUiCheckBox", "true");
+                    	    }
+                    	    // InternalUIGrammar.g:16276:20: (otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) ) )
+                    	    // InternalUIGrammar.g:16276:21: otherlv_6= 'styles' ( (lv_styles_7_0= RULE_STRING ) )
+                    	    {
+                    	    otherlv_6=(Token)match(input,64,FOLLOW_18); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_6, grammarAccess.getUiCheckBoxAccess().getStylesKeyword_2_1_2_0());
+                    	      									
+                    	    }
+                    	    // InternalUIGrammar.g:16280:10: ( (lv_styles_7_0= RULE_STRING ) )
+                    	    // InternalUIGrammar.g:16281:11: (lv_styles_7_0= RULE_STRING )
+                    	    {
+                    	    // InternalUIGrammar.g:16281:11: (lv_styles_7_0= RULE_STRING )
+                    	    // InternalUIGrammar.g:16282:12: lv_styles_7_0= RULE_STRING
+                    	    {
+                    	    lv_styles_7_0=(Token)match(input,RULE_STRING,FOLLOW_62); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_styles_7_0, grammarAccess.getUiCheckBoxAccess().getStylesSTRINGTerminalRuleCall_2_1_2_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getUiCheckBoxRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"styles",
+                    	      													lv_styles_7_0,
+                    	      													"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiCheckBoxAccess().getUnorderedGroup_2_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop376;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getUiCheckBoxAccess().getUnorderedGroup_2_1());
+
+                    }
+
+                    otherlv_8=(Token)match(input,47,FOLLOW_88); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_8, grammarAccess.getUiCheckBoxAccess().getRightParenthesisKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:16316:3: ( (lv_name_9_0= RULE_ID ) )?
+            int alt378=2;
+            int LA378_0 = input.LA(1);
+
+            if ( (LA378_0==RULE_ID) ) {
+                alt378=1;
+            }
+            switch (alt378) {
+                case 1 :
+                    // InternalUIGrammar.g:16317:4: (lv_name_9_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:16317:4: (lv_name_9_0= RULE_ID )
+                    // InternalUIGrammar.g:16318:5: lv_name_9_0= RULE_ID
+                    {
+                    lv_name_9_0=(Token)match(input,RULE_ID,FOLLOW_89); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_9_0, grammarAccess.getUiCheckBoxAccess().getNameIDTerminalRuleCall_3_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiCheckBoxRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_9_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:16334:3: (otherlv_10= '{' ( ( (lv_validators_11_0= ruleUiValidator ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}' )?
+            int alt381=2;
+            int LA381_0 = input.LA(1);
+
+            if ( (LA381_0==20) ) {
+                alt381=1;
+            }
+            switch (alt381) {
+                case 1 :
+                    // InternalUIGrammar.g:16335:4: otherlv_10= '{' ( ( (lv_validators_11_0= ruleUiValidator ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) )* ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )* otherlv_14= '}'
+                    {
+                    otherlv_10=(Token)match(input,20,FOLLOW_90); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_10, grammarAccess.getUiCheckBoxAccess().getLeftCurlyBracketKeyword_4_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:16339:4: ( ( (lv_validators_11_0= ruleUiValidator ) ) | ( (lv_bindings_12_0= ruleUiBinding ) ) )*
+                    loop379:
+                    do {
+                        int alt379=3;
+                        int LA379_0 = input.LA(1);
+
+                        if ( ((LA379_0>=147 && LA379_0<=151)) ) {
+                            alt379=1;
+                        }
+                        else if ( (LA379_0==26) ) {
+                            alt379=2;
+                        }
+
+
+                        switch (alt379) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:16340:5: ( (lv_validators_11_0= ruleUiValidator ) )
+                    	    {
+                    	    // InternalUIGrammar.g:16340:5: ( (lv_validators_11_0= ruleUiValidator ) )
+                    	    // InternalUIGrammar.g:16341:6: (lv_validators_11_0= ruleUiValidator )
+                    	    {
+                    	    // InternalUIGrammar.g:16341:6: (lv_validators_11_0= ruleUiValidator )
+                    	    // InternalUIGrammar.g:16342:7: lv_validators_11_0= ruleUiValidator
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiCheckBoxAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_validators_11_0=ruleUiValidator();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiCheckBoxRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"validators",
+                    	      								lv_validators_11_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalUIGrammar.g:16360:5: ( (lv_bindings_12_0= ruleUiBinding ) )
+                    	    {
+                    	    // InternalUIGrammar.g:16360:5: ( (lv_bindings_12_0= ruleUiBinding ) )
+                    	    // InternalUIGrammar.g:16361:6: (lv_bindings_12_0= ruleUiBinding )
+                    	    {
+                    	    // InternalUIGrammar.g:16361:6: (lv_bindings_12_0= ruleUiBinding )
+                    	    // InternalUIGrammar.g:16362:7: lv_bindings_12_0= ruleUiBinding
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getUiCheckBoxAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_90);
+                    	    lv_bindings_12_0=ruleUiBinding();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getUiCheckBoxRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"bindings",
+                    	      								lv_bindings_12_0,
+                    	      								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop379;
+                        }
+                    } while (true);
+
+                    // InternalUIGrammar.g:16380:4: ( (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment ) )*
+                    loop380:
+                    do {
+                        int alt380=2;
+                        int LA380_0 = input.LA(1);
+
+                        if ( (LA380_0==153) ) {
+                            alt380=1;
+                        }
+
+
+                        switch (alt380) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:16381:5: (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment )
+                    	    {
+                    	    // InternalUIGrammar.g:16381:5: (lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment )
+                    	    // InternalUIGrammar.g:16382:6: lv_processorAssignments_13_0= ruleUiVisibilityProcessorAssignment
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newCompositeNode(grammarAccess.getUiCheckBoxAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
+                    	      					
+                    	    }
+                    	    pushFollow(FOLLOW_42);
+                    	    lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						if (current==null) {
+                    	      							current = createModelElementForParent(grammarAccess.getUiCheckBoxRule());
+                    	      						}
+                    	      						add(
+                    	      							current,
+                    	      							"processorAssignments",
+                    	      							lv_processorAssignments_13_0,
+                    	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
+                    	      						afterParserOrEnumRuleCall();
+                    	      					
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop380;
+                        }
+                    } while (true);
+
+                    otherlv_14=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_14, grammarAccess.getUiCheckBoxAccess().getRightCurlyBracketKeyword_4_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiCheckBox"
+
+
+    // $ANTLR start "entryRuleUiValidator"
+    // InternalUIGrammar.g:16408:1: entryRuleUiValidator returns [EObject current=null] : iv_ruleUiValidator= ruleUiValidator EOF ;
+    public final EObject entryRuleUiValidator() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiValidator = null;
+
+
+        try {
+            // InternalUIGrammar.g:16408:52: (iv_ruleUiValidator= ruleUiValidator EOF )
+            // InternalUIGrammar.g:16409:2: iv_ruleUiValidator= ruleUiValidator EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiValidatorRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiValidator=ruleUiValidator();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiValidator; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiValidator"
+
+
+    // $ANTLR start "ruleUiValidator"
+    // InternalUIGrammar.g:16415:1: ruleUiValidator returns [EObject current=null] : (this_UiMaxLengthValidator_0= ruleUiMaxLengthValidator | this_UiMinLengthValidator_1= ruleUiMinLengthValidator | this_UiRegexpValidator_2= ruleUiRegexpValidator | this_UiXbaseValidator_3= ruleUiXbaseValidator | this_UiBeanValidationValidator_4= ruleUiBeanValidationValidator ) ;
+    public final EObject ruleUiValidator() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_UiMaxLengthValidator_0 = null;
+
+        EObject this_UiMinLengthValidator_1 = null;
+
+        EObject this_UiRegexpValidator_2 = null;
+
+        EObject this_UiXbaseValidator_3 = null;
+
+        EObject this_UiBeanValidationValidator_4 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:16421:2: ( (this_UiMaxLengthValidator_0= ruleUiMaxLengthValidator | this_UiMinLengthValidator_1= ruleUiMinLengthValidator | this_UiRegexpValidator_2= ruleUiRegexpValidator | this_UiXbaseValidator_3= ruleUiXbaseValidator | this_UiBeanValidationValidator_4= ruleUiBeanValidationValidator ) )
+            // InternalUIGrammar.g:16422:2: (this_UiMaxLengthValidator_0= ruleUiMaxLengthValidator | this_UiMinLengthValidator_1= ruleUiMinLengthValidator | this_UiRegexpValidator_2= ruleUiRegexpValidator | this_UiXbaseValidator_3= ruleUiXbaseValidator | this_UiBeanValidationValidator_4= ruleUiBeanValidationValidator )
+            {
+            // InternalUIGrammar.g:16422:2: (this_UiMaxLengthValidator_0= ruleUiMaxLengthValidator | this_UiMinLengthValidator_1= ruleUiMinLengthValidator | this_UiRegexpValidator_2= ruleUiRegexpValidator | this_UiXbaseValidator_3= ruleUiXbaseValidator | this_UiBeanValidationValidator_4= ruleUiBeanValidationValidator )
+            int alt382=5;
+            switch ( input.LA(1) ) {
+            case 147:
+                {
+                alt382=1;
+                }
+                break;
+            case 148:
+                {
+                alt382=2;
+                }
+                break;
+            case 149:
+                {
+                alt382=3;
+                }
+                break;
+            case 150:
+                {
+                alt382=4;
+                }
+                break;
+            case 151:
+                {
+                alt382=5;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 382, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt382) {
+                case 1 :
+                    // InternalUIGrammar.g:16423:3: this_UiMaxLengthValidator_0= ruleUiMaxLengthValidator
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiValidatorAccess().getUiMaxLengthValidatorParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiMaxLengthValidator_0=ruleUiMaxLengthValidator();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiMaxLengthValidator_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalUIGrammar.g:16432:3: this_UiMinLengthValidator_1= ruleUiMinLengthValidator
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiValidatorAccess().getUiMinLengthValidatorParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiMinLengthValidator_1=ruleUiMinLengthValidator();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiMinLengthValidator_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalUIGrammar.g:16441:3: this_UiRegexpValidator_2= ruleUiRegexpValidator
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiValidatorAccess().getUiRegexpValidatorParserRuleCall_2());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiRegexpValidator_2=ruleUiRegexpValidator();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiRegexpValidator_2;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalUIGrammar.g:16450:3: this_UiXbaseValidator_3= ruleUiXbaseValidator
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiValidatorAccess().getUiXbaseValidatorParserRuleCall_3());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiXbaseValidator_3=ruleUiXbaseValidator();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiXbaseValidator_3;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 5 :
+                    // InternalUIGrammar.g:16459:3: this_UiBeanValidationValidator_4= ruleUiBeanValidationValidator
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUiValidatorAccess().getUiBeanValidationValidatorParserRuleCall_4());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_UiBeanValidationValidator_4=ruleUiBeanValidationValidator();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UiBeanValidationValidator_4;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiValidator"
+
+
+    // $ANTLR start "entryRuleUiMaxLengthValidator"
+    // InternalUIGrammar.g:16471:1: entryRuleUiMaxLengthValidator returns [EObject current=null] : iv_ruleUiMaxLengthValidator= ruleUiMaxLengthValidator EOF ;
+    public final EObject entryRuleUiMaxLengthValidator() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiMaxLengthValidator = null;
+
+
+        try {
+            // InternalUIGrammar.g:16471:61: (iv_ruleUiMaxLengthValidator= ruleUiMaxLengthValidator EOF )
+            // InternalUIGrammar.g:16472:2: iv_ruleUiMaxLengthValidator= ruleUiMaxLengthValidator EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiMaxLengthValidatorRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiMaxLengthValidator=ruleUiMaxLengthValidator();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiMaxLengthValidator; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiMaxLengthValidator"
+
+
+    // $ANTLR start "ruleUiMaxLengthValidator"
+    // InternalUIGrammar.g:16478:1: ruleUiMaxLengthValidator returns [EObject current=null] : ( () otherlv_1= 'MaxLengthValidator' ( (lv_name_2_0= RULE_ID ) )? otherlv_3= '(' ( (lv_maxLength_4_0= RULE_INT ) ) otherlv_5= ')' ( (lv_errorCode_6_0= ruleUiErrorCode ) )? ) ;
+    public final EObject ruleUiMaxLengthValidator() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token lv_name_2_0=null;
+        Token otherlv_3=null;
+        Token lv_maxLength_4_0=null;
+        Token otherlv_5=null;
+        EObject lv_errorCode_6_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:16484:2: ( ( () otherlv_1= 'MaxLengthValidator' ( (lv_name_2_0= RULE_ID ) )? otherlv_3= '(' ( (lv_maxLength_4_0= RULE_INT ) ) otherlv_5= ')' ( (lv_errorCode_6_0= ruleUiErrorCode ) )? ) )
+            // InternalUIGrammar.g:16485:2: ( () otherlv_1= 'MaxLengthValidator' ( (lv_name_2_0= RULE_ID ) )? otherlv_3= '(' ( (lv_maxLength_4_0= RULE_INT ) ) otherlv_5= ')' ( (lv_errorCode_6_0= ruleUiErrorCode ) )? )
+            {
+            // InternalUIGrammar.g:16485:2: ( () otherlv_1= 'MaxLengthValidator' ( (lv_name_2_0= RULE_ID ) )? otherlv_3= '(' ( (lv_maxLength_4_0= RULE_INT ) ) otherlv_5= ')' ( (lv_errorCode_6_0= ruleUiErrorCode ) )? )
+            // InternalUIGrammar.g:16486:3: () otherlv_1= 'MaxLengthValidator' ( (lv_name_2_0= RULE_ID ) )? otherlv_3= '(' ( (lv_maxLength_4_0= RULE_INT ) ) otherlv_5= ')' ( (lv_errorCode_6_0= ruleUiErrorCode ) )?
+            {
+            // InternalUIGrammar.g:16486:3: ()
+            // InternalUIGrammar.g:16487:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiMaxLengthValidatorAccess().getUiMaxLengthValidatorAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,147,FOLLOW_74); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiMaxLengthValidatorAccess().getMaxLengthValidatorKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:16497:3: ( (lv_name_2_0= RULE_ID ) )?
+            int alt383=2;
+            int LA383_0 = input.LA(1);
+
+            if ( (LA383_0==RULE_ID) ) {
+                alt383=1;
+            }
+            switch (alt383) {
+                case 1 :
+                    // InternalUIGrammar.g:16498:4: (lv_name_2_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:16498:4: (lv_name_2_0= RULE_ID )
+                    // InternalUIGrammar.g:16499:5: lv_name_2_0= RULE_ID
+                    {
+                    lv_name_2_0=(Token)match(input,RULE_ID,FOLLOW_34); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_2_0, grammarAccess.getUiMaxLengthValidatorAccess().getNameIDTerminalRuleCall_2_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiMaxLengthValidatorRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_2_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_3=(Token)match(input,45,FOLLOW_54); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_3, grammarAccess.getUiMaxLengthValidatorAccess().getLeftParenthesisKeyword_3());
+              		
+            }
+            // InternalUIGrammar.g:16519:3: ( (lv_maxLength_4_0= RULE_INT ) )
+            // InternalUIGrammar.g:16520:4: (lv_maxLength_4_0= RULE_INT )
+            {
+            // InternalUIGrammar.g:16520:4: (lv_maxLength_4_0= RULE_INT )
+            // InternalUIGrammar.g:16521:5: lv_maxLength_4_0= RULE_INT
+            {
+            lv_maxLength_4_0=(Token)match(input,RULE_INT,FOLLOW_36); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_maxLength_4_0, grammarAccess.getUiMaxLengthValidatorAccess().getMaxLengthINTTerminalRuleCall_4_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getUiMaxLengthValidatorRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"maxLength",
+              						lv_maxLength_4_0,
+              						"org.eclipse.xtext.xbase.Xbase.INT");
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_5=(Token)match(input,47,FOLLOW_123); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_5, grammarAccess.getUiMaxLengthValidatorAccess().getRightParenthesisKeyword_5());
+              		
+            }
+            // InternalUIGrammar.g:16541:3: ( (lv_errorCode_6_0= ruleUiErrorCode ) )?
+            int alt384=2;
+            int LA384_0 = input.LA(1);
+
+            if ( (LA384_0==152) ) {
+                alt384=1;
+            }
+            switch (alt384) {
+                case 1 :
+                    // InternalUIGrammar.g:16542:4: (lv_errorCode_6_0= ruleUiErrorCode )
+                    {
+                    // InternalUIGrammar.g:16542:4: (lv_errorCode_6_0= ruleUiErrorCode )
+                    // InternalUIGrammar.g:16543:5: lv_errorCode_6_0= ruleUiErrorCode
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getUiMaxLengthValidatorAccess().getErrorCodeUiErrorCodeParserRuleCall_6_0());
+                      				
+                    }
+                    pushFollow(FOLLOW_2);
+                    lv_errorCode_6_0=ruleUiErrorCode();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getUiMaxLengthValidatorRule());
+                      					}
+                      					set(
+                      						current,
+                      						"errorCode",
+                      						lv_errorCode_6_0,
+                      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiErrorCode");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiMaxLengthValidator"
+
+
+    // $ANTLR start "entryRuleUiMinLengthValidator"
+    // InternalUIGrammar.g:16564:1: entryRuleUiMinLengthValidator returns [EObject current=null] : iv_ruleUiMinLengthValidator= ruleUiMinLengthValidator EOF ;
+    public final EObject entryRuleUiMinLengthValidator() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiMinLengthValidator = null;
+
+
+        try {
+            // InternalUIGrammar.g:16564:61: (iv_ruleUiMinLengthValidator= ruleUiMinLengthValidator EOF )
+            // InternalUIGrammar.g:16565:2: iv_ruleUiMinLengthValidator= ruleUiMinLengthValidator EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiMinLengthValidatorRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiMinLengthValidator=ruleUiMinLengthValidator();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiMinLengthValidator; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiMinLengthValidator"
+
+
+    // $ANTLR start "ruleUiMinLengthValidator"
+    // InternalUIGrammar.g:16571:1: ruleUiMinLengthValidator returns [EObject current=null] : ( () otherlv_1= 'MinLengthValidator' ( (lv_name_2_0= RULE_ID ) )? otherlv_3= '(' ( (lv_minLength_4_0= RULE_INT ) ) otherlv_5= ')' ( (lv_errorCode_6_0= ruleUiErrorCode ) )? ) ;
+    public final EObject ruleUiMinLengthValidator() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token lv_name_2_0=null;
+        Token otherlv_3=null;
+        Token lv_minLength_4_0=null;
+        Token otherlv_5=null;
+        EObject lv_errorCode_6_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:16577:2: ( ( () otherlv_1= 'MinLengthValidator' ( (lv_name_2_0= RULE_ID ) )? otherlv_3= '(' ( (lv_minLength_4_0= RULE_INT ) ) otherlv_5= ')' ( (lv_errorCode_6_0= ruleUiErrorCode ) )? ) )
+            // InternalUIGrammar.g:16578:2: ( () otherlv_1= 'MinLengthValidator' ( (lv_name_2_0= RULE_ID ) )? otherlv_3= '(' ( (lv_minLength_4_0= RULE_INT ) ) otherlv_5= ')' ( (lv_errorCode_6_0= ruleUiErrorCode ) )? )
+            {
+            // InternalUIGrammar.g:16578:2: ( () otherlv_1= 'MinLengthValidator' ( (lv_name_2_0= RULE_ID ) )? otherlv_3= '(' ( (lv_minLength_4_0= RULE_INT ) ) otherlv_5= ')' ( (lv_errorCode_6_0= ruleUiErrorCode ) )? )
+            // InternalUIGrammar.g:16579:3: () otherlv_1= 'MinLengthValidator' ( (lv_name_2_0= RULE_ID ) )? otherlv_3= '(' ( (lv_minLength_4_0= RULE_INT ) ) otherlv_5= ')' ( (lv_errorCode_6_0= ruleUiErrorCode ) )?
+            {
+            // InternalUIGrammar.g:16579:3: ()
+            // InternalUIGrammar.g:16580:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiMinLengthValidatorAccess().getUiMinLengthValidatorAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,148,FOLLOW_74); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiMinLengthValidatorAccess().getMinLengthValidatorKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:16590:3: ( (lv_name_2_0= RULE_ID ) )?
+            int alt385=2;
+            int LA385_0 = input.LA(1);
+
+            if ( (LA385_0==RULE_ID) ) {
+                alt385=1;
+            }
+            switch (alt385) {
+                case 1 :
+                    // InternalUIGrammar.g:16591:4: (lv_name_2_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:16591:4: (lv_name_2_0= RULE_ID )
+                    // InternalUIGrammar.g:16592:5: lv_name_2_0= RULE_ID
+                    {
+                    lv_name_2_0=(Token)match(input,RULE_ID,FOLLOW_34); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_2_0, grammarAccess.getUiMinLengthValidatorAccess().getNameIDTerminalRuleCall_2_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiMinLengthValidatorRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_2_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_3=(Token)match(input,45,FOLLOW_54); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_3, grammarAccess.getUiMinLengthValidatorAccess().getLeftParenthesisKeyword_3());
+              		
+            }
+            // InternalUIGrammar.g:16612:3: ( (lv_minLength_4_0= RULE_INT ) )
+            // InternalUIGrammar.g:16613:4: (lv_minLength_4_0= RULE_INT )
+            {
+            // InternalUIGrammar.g:16613:4: (lv_minLength_4_0= RULE_INT )
+            // InternalUIGrammar.g:16614:5: lv_minLength_4_0= RULE_INT
+            {
+            lv_minLength_4_0=(Token)match(input,RULE_INT,FOLLOW_36); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_minLength_4_0, grammarAccess.getUiMinLengthValidatorAccess().getMinLengthINTTerminalRuleCall_4_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getUiMinLengthValidatorRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"minLength",
+              						lv_minLength_4_0,
+              						"org.eclipse.xtext.xbase.Xbase.INT");
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_5=(Token)match(input,47,FOLLOW_123); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_5, grammarAccess.getUiMinLengthValidatorAccess().getRightParenthesisKeyword_5());
+              		
+            }
+            // InternalUIGrammar.g:16634:3: ( (lv_errorCode_6_0= ruleUiErrorCode ) )?
+            int alt386=2;
+            int LA386_0 = input.LA(1);
+
+            if ( (LA386_0==152) ) {
+                alt386=1;
+            }
+            switch (alt386) {
+                case 1 :
+                    // InternalUIGrammar.g:16635:4: (lv_errorCode_6_0= ruleUiErrorCode )
+                    {
+                    // InternalUIGrammar.g:16635:4: (lv_errorCode_6_0= ruleUiErrorCode )
+                    // InternalUIGrammar.g:16636:5: lv_errorCode_6_0= ruleUiErrorCode
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getUiMinLengthValidatorAccess().getErrorCodeUiErrorCodeParserRuleCall_6_0());
+                      				
+                    }
+                    pushFollow(FOLLOW_2);
+                    lv_errorCode_6_0=ruleUiErrorCode();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getUiMinLengthValidatorRule());
+                      					}
+                      					set(
+                      						current,
+                      						"errorCode",
+                      						lv_errorCode_6_0,
+                      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiErrorCode");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiMinLengthValidator"
+
+
+    // $ANTLR start "entryRuleUiRegexpValidator"
+    // InternalUIGrammar.g:16657:1: entryRuleUiRegexpValidator returns [EObject current=null] : iv_ruleUiRegexpValidator= ruleUiRegexpValidator EOF ;
+    public final EObject entryRuleUiRegexpValidator() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiRegexpValidator = null;
+
+
+        try {
+            // InternalUIGrammar.g:16657:58: (iv_ruleUiRegexpValidator= ruleUiRegexpValidator EOF )
+            // InternalUIGrammar.g:16658:2: iv_ruleUiRegexpValidator= ruleUiRegexpValidator EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiRegexpValidatorRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiRegexpValidator=ruleUiRegexpValidator();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiRegexpValidator; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiRegexpValidator"
+
+
+    // $ANTLR start "ruleUiRegexpValidator"
+    // InternalUIGrammar.g:16664:1: ruleUiRegexpValidator returns [EObject current=null] : ( () otherlv_1= 'RegexValidator' ( (lv_name_2_0= RULE_ID ) )? otherlv_3= '(' ( (lv_regExpression_4_0= RULE_STRING ) ) otherlv_5= ')' ( (lv_errorCode_6_0= ruleUiErrorCode ) )? ) ;
+    public final EObject ruleUiRegexpValidator() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token lv_name_2_0=null;
+        Token otherlv_3=null;
+        Token lv_regExpression_4_0=null;
+        Token otherlv_5=null;
+        EObject lv_errorCode_6_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:16670:2: ( ( () otherlv_1= 'RegexValidator' ( (lv_name_2_0= RULE_ID ) )? otherlv_3= '(' ( (lv_regExpression_4_0= RULE_STRING ) ) otherlv_5= ')' ( (lv_errorCode_6_0= ruleUiErrorCode ) )? ) )
+            // InternalUIGrammar.g:16671:2: ( () otherlv_1= 'RegexValidator' ( (lv_name_2_0= RULE_ID ) )? otherlv_3= '(' ( (lv_regExpression_4_0= RULE_STRING ) ) otherlv_5= ')' ( (lv_errorCode_6_0= ruleUiErrorCode ) )? )
+            {
+            // InternalUIGrammar.g:16671:2: ( () otherlv_1= 'RegexValidator' ( (lv_name_2_0= RULE_ID ) )? otherlv_3= '(' ( (lv_regExpression_4_0= RULE_STRING ) ) otherlv_5= ')' ( (lv_errorCode_6_0= ruleUiErrorCode ) )? )
+            // InternalUIGrammar.g:16672:3: () otherlv_1= 'RegexValidator' ( (lv_name_2_0= RULE_ID ) )? otherlv_3= '(' ( (lv_regExpression_4_0= RULE_STRING ) ) otherlv_5= ')' ( (lv_errorCode_6_0= ruleUiErrorCode ) )?
+            {
+            // InternalUIGrammar.g:16672:3: ()
+            // InternalUIGrammar.g:16673:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiRegexpValidatorAccess().getUiRegexpValidatorAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,149,FOLLOW_74); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiRegexpValidatorAccess().getRegexValidatorKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:16683:3: ( (lv_name_2_0= RULE_ID ) )?
+            int alt387=2;
+            int LA387_0 = input.LA(1);
+
+            if ( (LA387_0==RULE_ID) ) {
+                alt387=1;
+            }
+            switch (alt387) {
+                case 1 :
+                    // InternalUIGrammar.g:16684:4: (lv_name_2_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:16684:4: (lv_name_2_0= RULE_ID )
+                    // InternalUIGrammar.g:16685:5: lv_name_2_0= RULE_ID
+                    {
+                    lv_name_2_0=(Token)match(input,RULE_ID,FOLLOW_34); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_2_0, grammarAccess.getUiRegexpValidatorAccess().getNameIDTerminalRuleCall_2_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiRegexpValidatorRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_2_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_3=(Token)match(input,45,FOLLOW_18); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_3, grammarAccess.getUiRegexpValidatorAccess().getLeftParenthesisKeyword_3());
+              		
+            }
+            // InternalUIGrammar.g:16705:3: ( (lv_regExpression_4_0= RULE_STRING ) )
+            // InternalUIGrammar.g:16706:4: (lv_regExpression_4_0= RULE_STRING )
+            {
+            // InternalUIGrammar.g:16706:4: (lv_regExpression_4_0= RULE_STRING )
+            // InternalUIGrammar.g:16707:5: lv_regExpression_4_0= RULE_STRING
+            {
+            lv_regExpression_4_0=(Token)match(input,RULE_STRING,FOLLOW_36); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_regExpression_4_0, grammarAccess.getUiRegexpValidatorAccess().getRegExpressionSTRINGTerminalRuleCall_4_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getUiRegexpValidatorRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"regExpression",
+              						lv_regExpression_4_0,
+              						"org.eclipse.xtext.xbase.Xtype.STRING");
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_5=(Token)match(input,47,FOLLOW_123); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_5, grammarAccess.getUiRegexpValidatorAccess().getRightParenthesisKeyword_5());
+              		
+            }
+            // InternalUIGrammar.g:16727:3: ( (lv_errorCode_6_0= ruleUiErrorCode ) )?
+            int alt388=2;
+            int LA388_0 = input.LA(1);
+
+            if ( (LA388_0==152) ) {
+                alt388=1;
+            }
+            switch (alt388) {
+                case 1 :
+                    // InternalUIGrammar.g:16728:4: (lv_errorCode_6_0= ruleUiErrorCode )
+                    {
+                    // InternalUIGrammar.g:16728:4: (lv_errorCode_6_0= ruleUiErrorCode )
+                    // InternalUIGrammar.g:16729:5: lv_errorCode_6_0= ruleUiErrorCode
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getUiRegexpValidatorAccess().getErrorCodeUiErrorCodeParserRuleCall_6_0());
+                      				
+                    }
+                    pushFollow(FOLLOW_2);
+                    lv_errorCode_6_0=ruleUiErrorCode();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getUiRegexpValidatorRule());
+                      					}
+                      					set(
+                      						current,
+                      						"errorCode",
+                      						lv_errorCode_6_0,
+                      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiErrorCode");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiRegexpValidator"
+
+
+    // $ANTLR start "entryRuleUiXbaseValidator"
+    // InternalUIGrammar.g:16750:1: entryRuleUiXbaseValidator returns [EObject current=null] : iv_ruleUiXbaseValidator= ruleUiXbaseValidator EOF ;
+    public final EObject entryRuleUiXbaseValidator() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiXbaseValidator = null;
+
+
+        try {
+            // InternalUIGrammar.g:16750:57: (iv_ruleUiXbaseValidator= ruleUiXbaseValidator EOF )
+            // InternalUIGrammar.g:16751:2: iv_ruleUiXbaseValidator= ruleUiXbaseValidator EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiXbaseValidatorRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiXbaseValidator=ruleUiXbaseValidator();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiXbaseValidator; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiXbaseValidator"
+
+
+    // $ANTLR start "ruleUiXbaseValidator"
+    // InternalUIGrammar.g:16757:1: ruleUiXbaseValidator returns [EObject current=null] : ( () otherlv_1= 'Expression' ( (lv_name_2_0= RULE_ID ) ) otherlv_3= '(' ( (lv_jvmType_4_0= ruleJvmTypeReference ) ) otherlv_5= ')' ( (lv_errorCodes_6_0= ruleUiErrorCode ) )* ( (lv_expression_7_0= ruleXBlockExpression ) )? ) ;
+    public final EObject ruleUiXbaseValidator() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token lv_name_2_0=null;
+        Token otherlv_3=null;
+        Token otherlv_5=null;
+        EObject lv_jvmType_4_0 = null;
+
+        EObject lv_errorCodes_6_0 = null;
+
+        EObject lv_expression_7_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:16763:2: ( ( () otherlv_1= 'Expression' ( (lv_name_2_0= RULE_ID ) ) otherlv_3= '(' ( (lv_jvmType_4_0= ruleJvmTypeReference ) ) otherlv_5= ')' ( (lv_errorCodes_6_0= ruleUiErrorCode ) )* ( (lv_expression_7_0= ruleXBlockExpression ) )? ) )
+            // InternalUIGrammar.g:16764:2: ( () otherlv_1= 'Expression' ( (lv_name_2_0= RULE_ID ) ) otherlv_3= '(' ( (lv_jvmType_4_0= ruleJvmTypeReference ) ) otherlv_5= ')' ( (lv_errorCodes_6_0= ruleUiErrorCode ) )* ( (lv_expression_7_0= ruleXBlockExpression ) )? )
+            {
+            // InternalUIGrammar.g:16764:2: ( () otherlv_1= 'Expression' ( (lv_name_2_0= RULE_ID ) ) otherlv_3= '(' ( (lv_jvmType_4_0= ruleJvmTypeReference ) ) otherlv_5= ')' ( (lv_errorCodes_6_0= ruleUiErrorCode ) )* ( (lv_expression_7_0= ruleXBlockExpression ) )? )
+            // InternalUIGrammar.g:16765:3: () otherlv_1= 'Expression' ( (lv_name_2_0= RULE_ID ) ) otherlv_3= '(' ( (lv_jvmType_4_0= ruleJvmTypeReference ) ) otherlv_5= ')' ( (lv_errorCodes_6_0= ruleUiErrorCode ) )* ( (lv_expression_7_0= ruleXBlockExpression ) )?
+            {
+            // InternalUIGrammar.g:16765:3: ()
+            // InternalUIGrammar.g:16766:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiXbaseValidatorAccess().getUiXbaseValidatorAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,150,FOLLOW_3); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiXbaseValidatorAccess().getExpressionKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:16776:3: ( (lv_name_2_0= RULE_ID ) )
+            // InternalUIGrammar.g:16777:4: (lv_name_2_0= RULE_ID )
+            {
+            // InternalUIGrammar.g:16777:4: (lv_name_2_0= RULE_ID )
+            // InternalUIGrammar.g:16778:5: lv_name_2_0= RULE_ID
+            {
+            lv_name_2_0=(Token)match(input,RULE_ID,FOLLOW_34); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_name_2_0, grammarAccess.getUiXbaseValidatorAccess().getNameIDTerminalRuleCall_2_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getUiXbaseValidatorRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"name",
+              						lv_name_2_0,
+              						"org.eclipse.xtext.xbase.Xtype.ID");
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_3=(Token)match(input,45,FOLLOW_16); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_3, grammarAccess.getUiXbaseValidatorAccess().getLeftParenthesisKeyword_3());
+              		
+            }
+            // InternalUIGrammar.g:16798:3: ( (lv_jvmType_4_0= ruleJvmTypeReference ) )
+            // InternalUIGrammar.g:16799:4: (lv_jvmType_4_0= ruleJvmTypeReference )
+            {
+            // InternalUIGrammar.g:16799:4: (lv_jvmType_4_0= ruleJvmTypeReference )
+            // InternalUIGrammar.g:16800:5: lv_jvmType_4_0= ruleJvmTypeReference
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getUiXbaseValidatorAccess().getJvmTypeJvmTypeReferenceParserRuleCall_4_0());
+              				
+            }
+            pushFollow(FOLLOW_36);
+            lv_jvmType_4_0=ruleJvmTypeReference();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getUiXbaseValidatorRule());
+              					}
+              					set(
+              						current,
+              						"jvmType",
+              						lv_jvmType_4_0,
+              						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_5=(Token)match(input,47,FOLLOW_124); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_5, grammarAccess.getUiXbaseValidatorAccess().getRightParenthesisKeyword_5());
+              		
+            }
+            // InternalUIGrammar.g:16821:3: ( (lv_errorCodes_6_0= ruleUiErrorCode ) )*
+            loop389:
+            do {
+                int alt389=2;
+                int LA389_0 = input.LA(1);
+
+                if ( (LA389_0==152) ) {
+                    alt389=1;
+                }
+
+
+                switch (alt389) {
+            	case 1 :
+            	    // InternalUIGrammar.g:16822:4: (lv_errorCodes_6_0= ruleUiErrorCode )
+            	    {
+            	    // InternalUIGrammar.g:16822:4: (lv_errorCodes_6_0= ruleUiErrorCode )
+            	    // InternalUIGrammar.g:16823:5: lv_errorCodes_6_0= ruleUiErrorCode
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUiXbaseValidatorAccess().getErrorCodesUiErrorCodeParserRuleCall_6_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_124);
+            	    lv_errorCodes_6_0=ruleUiErrorCode();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUiXbaseValidatorRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"errorCodes",
+            	      						lv_errorCodes_6_0,
+            	      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiErrorCode");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop389;
+                }
+            } while (true);
+
+            // InternalUIGrammar.g:16840:3: ( (lv_expression_7_0= ruleXBlockExpression ) )?
+            int alt390=2;
+            int LA390_0 = input.LA(1);
+
+            if ( (LA390_0==20) ) {
+                alt390=1;
+            }
+            switch (alt390) {
+                case 1 :
+                    // InternalUIGrammar.g:16841:4: (lv_expression_7_0= ruleXBlockExpression )
+                    {
+                    // InternalUIGrammar.g:16841:4: (lv_expression_7_0= ruleXBlockExpression )
+                    // InternalUIGrammar.g:16842:5: lv_expression_7_0= ruleXBlockExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getUiXbaseValidatorAccess().getExpressionXBlockExpressionParserRuleCall_7_0());
+                      				
+                    }
+                    pushFollow(FOLLOW_2);
+                    lv_expression_7_0=ruleXBlockExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getUiXbaseValidatorRule());
+                      					}
+                      					set(
+                      						current,
+                      						"expression",
+                      						lv_expression_7_0,
+                      						"org.eclipse.xtext.xbase.Xbase.XBlockExpression");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiXbaseValidator"
+
+
+    // $ANTLR start "entryRuleUiBeanValidationValidator"
+    // InternalUIGrammar.g:16863:1: entryRuleUiBeanValidationValidator returns [EObject current=null] : iv_ruleUiBeanValidationValidator= ruleUiBeanValidationValidator EOF ;
+    public final EObject entryRuleUiBeanValidationValidator() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiBeanValidationValidator = null;
+
+
+        try {
+            // InternalUIGrammar.g:16863:66: (iv_ruleUiBeanValidationValidator= ruleUiBeanValidationValidator EOF )
+            // InternalUIGrammar.g:16864:2: iv_ruleUiBeanValidationValidator= ruleUiBeanValidationValidator EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiBeanValidationValidatorRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiBeanValidationValidator=ruleUiBeanValidationValidator();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiBeanValidationValidator; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiBeanValidationValidator"
+
+
+    // $ANTLR start "ruleUiBeanValidationValidator"
+    // InternalUIGrammar.g:16870:1: ruleUiBeanValidationValidator returns [EObject current=null] : ( () otherlv_1= 'BeanValidationValidator' ( (lv_name_2_0= RULE_ID ) )? ) ;
+    public final EObject ruleUiBeanValidationValidator() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token lv_name_2_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:16876:2: ( ( () otherlv_1= 'BeanValidationValidator' ( (lv_name_2_0= RULE_ID ) )? ) )
+            // InternalUIGrammar.g:16877:2: ( () otherlv_1= 'BeanValidationValidator' ( (lv_name_2_0= RULE_ID ) )? )
+            {
+            // InternalUIGrammar.g:16877:2: ( () otherlv_1= 'BeanValidationValidator' ( (lv_name_2_0= RULE_ID ) )? )
+            // InternalUIGrammar.g:16878:3: () otherlv_1= 'BeanValidationValidator' ( (lv_name_2_0= RULE_ID ) )?
+            {
+            // InternalUIGrammar.g:16878:3: ()
+            // InternalUIGrammar.g:16879:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiBeanValidationValidatorAccess().getUiBeanValidationValidatorAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,151,FOLLOW_110); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiBeanValidationValidatorAccess().getBeanValidationValidatorKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:16889:3: ( (lv_name_2_0= RULE_ID ) )?
+            int alt391=2;
+            int LA391_0 = input.LA(1);
+
+            if ( (LA391_0==RULE_ID) ) {
+                alt391=1;
+            }
+            switch (alt391) {
+                case 1 :
+                    // InternalUIGrammar.g:16890:4: (lv_name_2_0= RULE_ID )
+                    {
+                    // InternalUIGrammar.g:16890:4: (lv_name_2_0= RULE_ID )
+                    // InternalUIGrammar.g:16891:5: lv_name_2_0= RULE_ID
+                    {
+                    lv_name_2_0=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_name_2_0, grammarAccess.getUiBeanValidationValidatorAccess().getNameIDTerminalRuleCall_2_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiBeanValidationValidatorRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"name",
+                      						lv_name_2_0,
+                      						"org.eclipse.xtext.xbase.Xtype.ID");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiBeanValidationValidator"
+
+
+    // $ANTLR start "entryRuleUiErrorCode"
+    // InternalUIGrammar.g:16911:1: entryRuleUiErrorCode returns [EObject current=null] : iv_ruleUiErrorCode= ruleUiErrorCode EOF ;
+    public final EObject entryRuleUiErrorCode() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiErrorCode = null;
+
+
+        try {
+            // InternalUIGrammar.g:16911:52: (iv_ruleUiErrorCode= ruleUiErrorCode EOF )
+            // InternalUIGrammar.g:16912:2: iv_ruleUiErrorCode= ruleUiErrorCode EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiErrorCodeRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiErrorCode=ruleUiErrorCode();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiErrorCode; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiErrorCode"
+
+
+    // $ANTLR start "ruleUiErrorCode"
+    // InternalUIGrammar.g:16918:1: ruleUiErrorCode returns [EObject current=null] : (otherlv_0= 'code' ( (lv_name_1_0= RULE_ID ) ) ( (lv_defaultMessage_2_0= RULE_STRING ) )? ) ;
+    public final EObject ruleUiErrorCode() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token lv_name_1_0=null;
+        Token lv_defaultMessage_2_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:16924:2: ( (otherlv_0= 'code' ( (lv_name_1_0= RULE_ID ) ) ( (lv_defaultMessage_2_0= RULE_STRING ) )? ) )
+            // InternalUIGrammar.g:16925:2: (otherlv_0= 'code' ( (lv_name_1_0= RULE_ID ) ) ( (lv_defaultMessage_2_0= RULE_STRING ) )? )
+            {
+            // InternalUIGrammar.g:16925:2: (otherlv_0= 'code' ( (lv_name_1_0= RULE_ID ) ) ( (lv_defaultMessage_2_0= RULE_STRING ) )? )
+            // InternalUIGrammar.g:16926:3: otherlv_0= 'code' ( (lv_name_1_0= RULE_ID ) ) ( (lv_defaultMessage_2_0= RULE_STRING ) )?
+            {
+            otherlv_0=(Token)match(input,152,FOLLOW_3); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getUiErrorCodeAccess().getCodeKeyword_0());
+              		
+            }
+            // InternalUIGrammar.g:16930:3: ( (lv_name_1_0= RULE_ID ) )
+            // InternalUIGrammar.g:16931:4: (lv_name_1_0= RULE_ID )
+            {
+            // InternalUIGrammar.g:16931:4: (lv_name_1_0= RULE_ID )
+            // InternalUIGrammar.g:16932:5: lv_name_1_0= RULE_ID
+            {
+            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_125); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_name_1_0, grammarAccess.getUiErrorCodeAccess().getNameIDTerminalRuleCall_1_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getUiErrorCodeRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"name",
+              						lv_name_1_0,
+              						"org.eclipse.xtext.xbase.Xtype.ID");
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalUIGrammar.g:16948:3: ( (lv_defaultMessage_2_0= RULE_STRING ) )?
+            int alt392=2;
+            int LA392_0 = input.LA(1);
+
+            if ( (LA392_0==RULE_STRING) ) {
+                alt392=1;
+            }
+            switch (alt392) {
+                case 1 :
+                    // InternalUIGrammar.g:16949:4: (lv_defaultMessage_2_0= RULE_STRING )
+                    {
+                    // InternalUIGrammar.g:16949:4: (lv_defaultMessage_2_0= RULE_STRING )
+                    // InternalUIGrammar.g:16950:5: lv_defaultMessage_2_0= RULE_STRING
+                    {
+                    lv_defaultMessage_2_0=(Token)match(input,RULE_STRING,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_defaultMessage_2_0, grammarAccess.getUiErrorCodeAccess().getDefaultMessageSTRINGTerminalRuleCall_2_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUiErrorCodeRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"defaultMessage",
+                      						lv_defaultMessage_2_0,
+                      						"org.eclipse.xtext.xbase.Xtype.STRING");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiErrorCode"
+
+
+    // $ANTLR start "entryRuleUiVisibilityProcessor"
+    // InternalUIGrammar.g:16970:1: entryRuleUiVisibilityProcessor returns [EObject current=null] : iv_ruleUiVisibilityProcessor= ruleUiVisibilityProcessor EOF ;
+    public final EObject entryRuleUiVisibilityProcessor() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiVisibilityProcessor = null;
+
+
+        try {
+            // InternalUIGrammar.g:16970:62: (iv_ruleUiVisibilityProcessor= ruleUiVisibilityProcessor EOF )
+            // InternalUIGrammar.g:16971:2: iv_ruleUiVisibilityProcessor= ruleUiVisibilityProcessor EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiVisibilityProcessorRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiVisibilityProcessor=ruleUiVisibilityProcessor();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiVisibilityProcessor; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiVisibilityProcessor"
+
+
+    // $ANTLR start "ruleUiVisibilityProcessor"
+    // InternalUIGrammar.g:16977:1: ruleUiVisibilityProcessor returns [EObject current=null] : ( () otherlv_1= 'visibility' ( (lv_name_2_0= RULE_ID ) ) otherlv_3= '{' ( ( (lv_dataUsed_4_0= ruleUiBindingEndpointAlias ) ) | ( (lv_changeTriggers_5_0= ruleUiChangeTrigger ) ) | ( (lv_importedElements_6_0= ruleUiTypedBindableRawTypeAlias ) ) )* ( (lv_rule_7_0= ruleUiXbaseVisibilityRule ) )? otherlv_8= '}' ) ;
+    public final EObject ruleUiVisibilityProcessor() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token lv_name_2_0=null;
+        Token otherlv_3=null;
+        Token otherlv_8=null;
+        EObject lv_dataUsed_4_0 = null;
+
+        EObject lv_changeTriggers_5_0 = null;
+
+        EObject lv_importedElements_6_0 = null;
+
+        EObject lv_rule_7_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:16983:2: ( ( () otherlv_1= 'visibility' ( (lv_name_2_0= RULE_ID ) ) otherlv_3= '{' ( ( (lv_dataUsed_4_0= ruleUiBindingEndpointAlias ) ) | ( (lv_changeTriggers_5_0= ruleUiChangeTrigger ) ) | ( (lv_importedElements_6_0= ruleUiTypedBindableRawTypeAlias ) ) )* ( (lv_rule_7_0= ruleUiXbaseVisibilityRule ) )? otherlv_8= '}' ) )
+            // InternalUIGrammar.g:16984:2: ( () otherlv_1= 'visibility' ( (lv_name_2_0= RULE_ID ) ) otherlv_3= '{' ( ( (lv_dataUsed_4_0= ruleUiBindingEndpointAlias ) ) | ( (lv_changeTriggers_5_0= ruleUiChangeTrigger ) ) | ( (lv_importedElements_6_0= ruleUiTypedBindableRawTypeAlias ) ) )* ( (lv_rule_7_0= ruleUiXbaseVisibilityRule ) )? otherlv_8= '}' )
+            {
+            // InternalUIGrammar.g:16984:2: ( () otherlv_1= 'visibility' ( (lv_name_2_0= RULE_ID ) ) otherlv_3= '{' ( ( (lv_dataUsed_4_0= ruleUiBindingEndpointAlias ) ) | ( (lv_changeTriggers_5_0= ruleUiChangeTrigger ) ) | ( (lv_importedElements_6_0= ruleUiTypedBindableRawTypeAlias ) ) )* ( (lv_rule_7_0= ruleUiXbaseVisibilityRule ) )? otherlv_8= '}' )
+            // InternalUIGrammar.g:16985:3: () otherlv_1= 'visibility' ( (lv_name_2_0= RULE_ID ) ) otherlv_3= '{' ( ( (lv_dataUsed_4_0= ruleUiBindingEndpointAlias ) ) | ( (lv_changeTriggers_5_0= ruleUiChangeTrigger ) ) | ( (lv_importedElements_6_0= ruleUiTypedBindableRawTypeAlias ) ) )* ( (lv_rule_7_0= ruleUiXbaseVisibilityRule ) )? otherlv_8= '}'
+            {
+            // InternalUIGrammar.g:16985:3: ()
+            // InternalUIGrammar.g:16986:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUiVisibilityProcessorAccess().getUiVisibilityProcessorAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,153,FOLLOW_3); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUiVisibilityProcessorAccess().getVisibilityKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:16996:3: ( (lv_name_2_0= RULE_ID ) )
+            // InternalUIGrammar.g:16997:4: (lv_name_2_0= RULE_ID )
+            {
+            // InternalUIGrammar.g:16997:4: (lv_name_2_0= RULE_ID )
+            // InternalUIGrammar.g:16998:5: lv_name_2_0= RULE_ID
+            {
+            lv_name_2_0=(Token)match(input,RULE_ID,FOLLOW_11); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_name_2_0, grammarAccess.getUiVisibilityProcessorAccess().getNameIDTerminalRuleCall_2_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getUiVisibilityProcessorRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"name",
+              						lv_name_2_0,
+              						"org.eclipse.xtext.xbase.Xtype.ID");
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_3=(Token)match(input,20,FOLLOW_126); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_3, grammarAccess.getUiVisibilityProcessorAccess().getLeftCurlyBracketKeyword_3());
+              		
+            }
+            // InternalUIGrammar.g:17018:3: ( ( (lv_dataUsed_4_0= ruleUiBindingEndpointAlias ) ) | ( (lv_changeTriggers_5_0= ruleUiChangeTrigger ) ) | ( (lv_importedElements_6_0= ruleUiTypedBindableRawTypeAlias ) ) )*
+            loop393:
+            do {
+                int alt393=4;
+                switch ( input.LA(1) ) {
+                case 22:
+                    {
+                    alt393=1;
+                    }
+                    break;
+                case 154:
+                    {
+                    alt393=2;
+                    }
+                    break;
+                case 34:
+                    {
+                    alt393=3;
+                    }
+                    break;
+
+                }
+
+                switch (alt393) {
+            	case 1 :
+            	    // InternalUIGrammar.g:17019:4: ( (lv_dataUsed_4_0= ruleUiBindingEndpointAlias ) )
+            	    {
+            	    // InternalUIGrammar.g:17019:4: ( (lv_dataUsed_4_0= ruleUiBindingEndpointAlias ) )
+            	    // InternalUIGrammar.g:17020:5: (lv_dataUsed_4_0= ruleUiBindingEndpointAlias )
+            	    {
+            	    // InternalUIGrammar.g:17020:5: (lv_dataUsed_4_0= ruleUiBindingEndpointAlias )
+            	    // InternalUIGrammar.g:17021:6: lv_dataUsed_4_0= ruleUiBindingEndpointAlias
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getUiVisibilityProcessorAccess().getDataUsedUiBindingEndpointAliasParserRuleCall_4_0_0());
+            	      					
+            	    }
+            	    pushFollow(FOLLOW_126);
+            	    lv_dataUsed_4_0=ruleUiBindingEndpointAlias();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getUiVisibilityProcessorRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"dataUsed",
+            	      							lv_dataUsed_4_0,
+            	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAlias");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // InternalUIGrammar.g:17039:4: ( (lv_changeTriggers_5_0= ruleUiChangeTrigger ) )
+            	    {
+            	    // InternalUIGrammar.g:17039:4: ( (lv_changeTriggers_5_0= ruleUiChangeTrigger ) )
+            	    // InternalUIGrammar.g:17040:5: (lv_changeTriggers_5_0= ruleUiChangeTrigger )
+            	    {
+            	    // InternalUIGrammar.g:17040:5: (lv_changeTriggers_5_0= ruleUiChangeTrigger )
+            	    // InternalUIGrammar.g:17041:6: lv_changeTriggers_5_0= ruleUiChangeTrigger
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getUiVisibilityProcessorAccess().getChangeTriggersUiChangeTriggerParserRuleCall_4_1_0());
+            	      					
+            	    }
+            	    pushFollow(FOLLOW_126);
+            	    lv_changeTriggers_5_0=ruleUiChangeTrigger();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getUiVisibilityProcessorRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"changeTriggers",
+            	      							lv_changeTriggers_5_0,
+            	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiChangeTrigger");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 3 :
+            	    // InternalUIGrammar.g:17059:4: ( (lv_importedElements_6_0= ruleUiTypedBindableRawTypeAlias ) )
+            	    {
+            	    // InternalUIGrammar.g:17059:4: ( (lv_importedElements_6_0= ruleUiTypedBindableRawTypeAlias ) )
+            	    // InternalUIGrammar.g:17060:5: (lv_importedElements_6_0= ruleUiTypedBindableRawTypeAlias )
+            	    {
+            	    // InternalUIGrammar.g:17060:5: (lv_importedElements_6_0= ruleUiTypedBindableRawTypeAlias )
+            	    // InternalUIGrammar.g:17061:6: lv_importedElements_6_0= ruleUiTypedBindableRawTypeAlias
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getUiVisibilityProcessorAccess().getImportedElementsUiTypedBindableRawTypeAliasParserRuleCall_4_2_0());
+            	      					
+            	    }
+            	    pushFollow(FOLLOW_126);
+            	    lv_importedElements_6_0=ruleUiTypedBindableRawTypeAlias();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getUiVisibilityProcessorRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"importedElements",
+            	      							lv_importedElements_6_0,
+            	      							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiTypedBindableRawTypeAlias");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop393;
+                }
+            } while (true);
+
+            // InternalUIGrammar.g:17079:3: ( (lv_rule_7_0= ruleUiXbaseVisibilityRule ) )?
+            int alt394=2;
+            int LA394_0 = input.LA(1);
+
+            if ( (LA394_0==20) ) {
+                alt394=1;
+            }
+            switch (alt394) {
+                case 1 :
+                    // InternalUIGrammar.g:17080:4: (lv_rule_7_0= ruleUiXbaseVisibilityRule )
+                    {
+                    // InternalUIGrammar.g:17080:4: (lv_rule_7_0= ruleUiXbaseVisibilityRule )
+                    // InternalUIGrammar.g:17081:5: lv_rule_7_0= ruleUiXbaseVisibilityRule
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getUiVisibilityProcessorAccess().getRuleUiXbaseVisibilityRuleParserRuleCall_5_0());
+                      				
+                    }
+                    pushFollow(FOLLOW_61);
+                    lv_rule_7_0=ruleUiXbaseVisibilityRule();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getUiVisibilityProcessorRule());
+                      					}
+                      					set(
+                      						current,
+                      						"rule",
+                      						lv_rule_7_0,
+                      						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiXbaseVisibilityRule");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_8=(Token)match(input,21,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_8, grammarAccess.getUiVisibilityProcessorAccess().getRightCurlyBracketKeyword_6());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiVisibilityProcessor"
+
+
+    // $ANTLR start "entryRuleUiXbaseVisibilityRule"
+    // InternalUIGrammar.g:17106:1: entryRuleUiXbaseVisibilityRule returns [EObject current=null] : iv_ruleUiXbaseVisibilityRule= ruleUiXbaseVisibilityRule EOF ;
+    public final EObject entryRuleUiXbaseVisibilityRule() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiXbaseVisibilityRule = null;
+
+
+        try {
+            // InternalUIGrammar.g:17106:62: (iv_ruleUiXbaseVisibilityRule= ruleUiXbaseVisibilityRule EOF )
+            // InternalUIGrammar.g:17107:2: iv_ruleUiXbaseVisibilityRule= ruleUiXbaseVisibilityRule EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiXbaseVisibilityRuleRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiXbaseVisibilityRule=ruleUiXbaseVisibilityRule();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiXbaseVisibilityRule; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiXbaseVisibilityRule"
+
+
+    // $ANTLR start "ruleUiXbaseVisibilityRule"
+    // InternalUIGrammar.g:17113:1: ruleUiXbaseVisibilityRule returns [EObject current=null] : ( (lv_expression_0_0= ruleXBlockExpression ) ) ;
+    public final EObject ruleUiXbaseVisibilityRule() throws RecognitionException {
+        EObject current = null;
+
+        EObject lv_expression_0_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:17119:2: ( ( (lv_expression_0_0= ruleXBlockExpression ) ) )
+            // InternalUIGrammar.g:17120:2: ( (lv_expression_0_0= ruleXBlockExpression ) )
+            {
+            // InternalUIGrammar.g:17120:2: ( (lv_expression_0_0= ruleXBlockExpression ) )
+            // InternalUIGrammar.g:17121:3: (lv_expression_0_0= ruleXBlockExpression )
+            {
+            // InternalUIGrammar.g:17121:3: (lv_expression_0_0= ruleXBlockExpression )
+            // InternalUIGrammar.g:17122:4: lv_expression_0_0= ruleXBlockExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              				newCompositeNode(grammarAccess.getUiXbaseVisibilityRuleAccess().getExpressionXBlockExpressionParserRuleCall_0());
+              			
+            }
+            pushFollow(FOLLOW_2);
+            lv_expression_0_0=ruleXBlockExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              				if (current==null) {
+              					current = createModelElementForParent(grammarAccess.getUiXbaseVisibilityRuleRule());
+              				}
+              				set(
+              					current,
+              					"expression",
+              					lv_expression_0_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 "ruleUiXbaseVisibilityRule"
+
+
+    // $ANTLR start "entryRuleUiChangeTrigger"
+    // InternalUIGrammar.g:17142:1: entryRuleUiChangeTrigger returns [EObject current=null] : iv_ruleUiChangeTrigger= ruleUiChangeTrigger EOF ;
+    public final EObject entryRuleUiChangeTrigger() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUiChangeTrigger = null;
+
+
+        try {
+            // InternalUIGrammar.g:17142:56: (iv_ruleUiChangeTrigger= ruleUiChangeTrigger EOF )
+            // InternalUIGrammar.g:17143:2: iv_ruleUiChangeTrigger= ruleUiChangeTrigger EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUiChangeTriggerRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUiChangeTrigger=ruleUiChangeTrigger();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUiChangeTrigger; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUiChangeTrigger"
+
+
+    // $ANTLR start "ruleUiChangeTrigger"
+    // InternalUIGrammar.g:17149:1: ruleUiChangeTrigger returns [EObject current=null] : (otherlv_0= 'fireOn' ( (lv_endpoint_1_0= ruleUiBindingEndpointAssignment ) ) otherlv_2= 'as' ( (lv_alias_3_0= RULE_ID ) ) (otherlv_4= ';' )? ) ;
+    public final EObject ruleUiChangeTrigger() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_2=null;
+        Token lv_alias_3_0=null;
+        Token otherlv_4=null;
+        EObject lv_endpoint_1_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:17155:2: ( (otherlv_0= 'fireOn' ( (lv_endpoint_1_0= ruleUiBindingEndpointAssignment ) ) otherlv_2= 'as' ( (lv_alias_3_0= RULE_ID ) ) (otherlv_4= ';' )? ) )
+            // InternalUIGrammar.g:17156:2: (otherlv_0= 'fireOn' ( (lv_endpoint_1_0= ruleUiBindingEndpointAssignment ) ) otherlv_2= 'as' ( (lv_alias_3_0= RULE_ID ) ) (otherlv_4= ';' )? )
+            {
+            // InternalUIGrammar.g:17156:2: (otherlv_0= 'fireOn' ( (lv_endpoint_1_0= ruleUiBindingEndpointAssignment ) ) otherlv_2= 'as' ( (lv_alias_3_0= RULE_ID ) ) (otherlv_4= ';' )? )
+            // InternalUIGrammar.g:17157:3: otherlv_0= 'fireOn' ( (lv_endpoint_1_0= ruleUiBindingEndpointAssignment ) ) otherlv_2= 'as' ( (lv_alias_3_0= RULE_ID ) ) (otherlv_4= ';' )?
+            {
+            otherlv_0=(Token)match(input,154,FOLLOW_14); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getUiChangeTriggerAccess().getFireOnKeyword_0());
+              		
+            }
+            // InternalUIGrammar.g:17161:3: ( (lv_endpoint_1_0= ruleUiBindingEndpointAssignment ) )
+            // InternalUIGrammar.g:17162:4: (lv_endpoint_1_0= ruleUiBindingEndpointAssignment )
+            {
+            // InternalUIGrammar.g:17162:4: (lv_endpoint_1_0= ruleUiBindingEndpointAssignment )
+            // InternalUIGrammar.g:17163:5: lv_endpoint_1_0= ruleUiBindingEndpointAssignment
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getUiChangeTriggerAccess().getEndpointUiBindingEndpointAssignmentParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FOLLOW_7);
+            lv_endpoint_1_0=ruleUiBindingEndpointAssignment();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getUiChangeTriggerRule());
+              					}
+              					set(
+              						current,
+              						"endpoint",
+              						lv_endpoint_1_0,
+              						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAssignment");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,15,FOLLOW_3); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getUiChangeTriggerAccess().getAsKeyword_2());
+              		
+            }
+            // InternalUIGrammar.g:17184:3: ( (lv_alias_3_0= RULE_ID ) )
+            // InternalUIGrammar.g:17185:4: (lv_alias_3_0= RULE_ID )
+            {
+            // InternalUIGrammar.g:17185:4: (lv_alias_3_0= RULE_ID )
+            // InternalUIGrammar.g:17186:5: lv_alias_3_0= RULE_ID
+            {
+            lv_alias_3_0=(Token)match(input,RULE_ID,FOLLOW_8); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_alias_3_0, grammarAccess.getUiChangeTriggerAccess().getAliasIDTerminalRuleCall_3_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getUiChangeTriggerRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"alias",
+              						lv_alias_3_0,
+              						"org.eclipse.xtext.xbase.Xtype.ID");
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalUIGrammar.g:17202:3: (otherlv_4= ';' )?
+            int alt395=2;
+            int LA395_0 = input.LA(1);
+
+            if ( (LA395_0==16) ) {
+                alt395=1;
+            }
+            switch (alt395) {
+                case 1 :
+                    // InternalUIGrammar.g:17203:4: otherlv_4= ';'
+                    {
+                    otherlv_4=(Token)match(input,16,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getUiChangeTriggerAccess().getSemicolonKeyword_4());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiChangeTrigger"
+
+
+    // $ANTLR start "entryRuleXImportDeclaration"
+    // InternalUIGrammar.g:17212:1: entryRuleXImportDeclaration returns [EObject current=null] : iv_ruleXImportDeclaration= ruleXImportDeclaration EOF ;
+    public final EObject entryRuleXImportDeclaration() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXImportDeclaration = null;
+
+
+        try {
+            // InternalUIGrammar.g:17212:59: (iv_ruleXImportDeclaration= ruleXImportDeclaration EOF )
+            // InternalUIGrammar.g:17213: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"
+    // InternalUIGrammar.g:17219: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 {
+            // InternalUIGrammar.g:17225: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= ';' )? ) )
+            // InternalUIGrammar.g:17226: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= ';' )? )
+            {
+            // InternalUIGrammar.g:17226: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= ';' )? )
+            // InternalUIGrammar.g:17227: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= ';' )?
+            {
+            // InternalUIGrammar.g:17227:3: ()
+            // InternalUIGrammar.g:17228:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXImportDeclarationAccess().getOXImportDeclarationAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,155,FOLLOW_127); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXImportDeclarationAccess().getImportKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:17238: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 alt398=4;
+            alt398 = dfa398.predict(input);
+            switch (alt398) {
+                case 1 :
+                    // InternalUIGrammar.g:17239:4: ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) )
+                    {
+                    // InternalUIGrammar.g:17239:4: ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) )
+                    // InternalUIGrammar.g:17240:5: ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) )
+                    {
+                    // InternalUIGrammar.g:17240:5: ( (lv_static_2_0= 'static' ) )
+                    // InternalUIGrammar.g:17241:6: (lv_static_2_0= 'static' )
+                    {
+                    // InternalUIGrammar.g:17241:6: (lv_static_2_0= 'static' )
+                    // InternalUIGrammar.g:17242:7: lv_static_2_0= 'static'
+                    {
+                    lv_static_2_0=(Token)match(input,156,FOLLOW_128); 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");
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalUIGrammar.g:17254:5: ( (lv_extension_3_0= 'extension' ) )?
+                    int alt396=2;
+                    int LA396_0 = input.LA(1);
+
+                    if ( (LA396_0==157) ) {
+                        alt396=1;
+                    }
+                    switch (alt396) {
+                        case 1 :
+                            // InternalUIGrammar.g:17255:6: (lv_extension_3_0= 'extension' )
+                            {
+                            // InternalUIGrammar.g:17255:6: (lv_extension_3_0= 'extension' )
+                            // InternalUIGrammar.g:17256:7: lv_extension_3_0= 'extension'
+                            {
+                            lv_extension_3_0=(Token)match(input,157,FOLLOW_128); 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;
+
+                    }
+
+                    // InternalUIGrammar.g:17268:5: ( ( ruleQualifiedNameInStaticImport ) )
+                    // InternalUIGrammar.g:17269:6: ( ruleQualifiedNameInStaticImport )
+                    {
+                    // InternalUIGrammar.g:17269:6: ( ruleQualifiedNameInStaticImport )
+                    // InternalUIGrammar.g:17270: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_129);
+                    ruleQualifiedNameInStaticImport();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalUIGrammar.g:17284:5: ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) )
+                    int alt397=2;
+                    int LA397_0 = input.LA(1);
+
+                    if ( (LA397_0==158) ) {
+                        alt397=1;
+                    }
+                    else if ( (LA397_0==RULE_ID) ) {
+                        alt397=2;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 397, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt397) {
+                        case 1 :
+                            // InternalUIGrammar.g:17285:6: ( (lv_wildcard_5_0= '*' ) )
+                            {
+                            // InternalUIGrammar.g:17285:6: ( (lv_wildcard_5_0= '*' ) )
+                            // InternalUIGrammar.g:17286:7: (lv_wildcard_5_0= '*' )
+                            {
+                            // InternalUIGrammar.g:17286:7: (lv_wildcard_5_0= '*' )
+                            // InternalUIGrammar.g:17287:8: lv_wildcard_5_0= '*'
+                            {
+                            lv_wildcard_5_0=(Token)match(input,158,FOLLOW_8); 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 :
+                            // InternalUIGrammar.g:17300:6: ( (lv_memberName_6_0= ruleValidID ) )
+                            {
+                            // InternalUIGrammar.g:17300:6: ( (lv_memberName_6_0= ruleValidID ) )
+                            // InternalUIGrammar.g:17301:7: (lv_memberName_6_0= ruleValidID )
+                            {
+                            // InternalUIGrammar.g:17301:7: (lv_memberName_6_0= ruleValidID )
+                            // InternalUIGrammar.g:17302:8: lv_memberName_6_0= ruleValidID
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              								newCompositeNode(grammarAccess.getXImportDeclarationAccess().getMemberNameValidIDParserRuleCall_2_0_3_1_0());
+                              							
+                            }
+                            pushFollow(FOLLOW_8);
+                            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 :
+                    // InternalUIGrammar.g:17322:4: ( ( ruleQualifiedName ) )
+                    {
+                    // InternalUIGrammar.g:17322:4: ( ( ruleQualifiedName ) )
+                    // InternalUIGrammar.g:17323:5: ( ruleQualifiedName )
+                    {
+                    // InternalUIGrammar.g:17323:5: ( ruleQualifiedName )
+                    // InternalUIGrammar.g:17324: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_8);
+                    ruleQualifiedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalUIGrammar.g:17339:4: ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) )
+                    {
+                    // InternalUIGrammar.g:17339:4: ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) )
+                    // InternalUIGrammar.g:17340:5: (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard )
+                    {
+                    // InternalUIGrammar.g:17340:5: (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard )
+                    // InternalUIGrammar.g:17341:6: lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceQualifiedNameWithWildcardParserRuleCall_2_2_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_8);
+                    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 :
+                    // InternalUIGrammar.g:17359:4: ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) )
+                    {
+                    // InternalUIGrammar.g:17359:4: ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) )
+                    // InternalUIGrammar.g:17360:5: ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) )
+                    {
+                    // InternalUIGrammar.g:17360:5: ( (lv_fqnImport_9_0= 'ns' ) )
+                    // InternalUIGrammar.g:17361:6: (lv_fqnImport_9_0= 'ns' )
+                    {
+                    // InternalUIGrammar.g:17361:6: (lv_fqnImport_9_0= 'ns' )
+                    // InternalUIGrammar.g:17362:7: lv_fqnImport_9_0= 'ns'
+                    {
+                    lv_fqnImport_9_0=(Token)match(input,159,FOLLOW_3); 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");
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalUIGrammar.g:17374:5: ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) )
+                    // InternalUIGrammar.g:17375:6: (lv_importedFullyQualifiedName_10_0= ruleQualifiedName )
+                    {
+                    // InternalUIGrammar.g:17375:6: (lv_importedFullyQualifiedName_10_0= ruleQualifiedName )
+                    // InternalUIGrammar.g:17376:7: lv_importedFullyQualifiedName_10_0= ruleQualifiedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedFullyQualifiedNameQualifiedNameParserRuleCall_2_3_1_0());
+                      						
+                    }
+                    pushFollow(FOLLOW_8);
+                    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;
+
+            }
+
+            // InternalUIGrammar.g:17395:3: (otherlv_11= ';' )?
+            int alt399=2;
+            int LA399_0 = input.LA(1);
+
+            if ( (LA399_0==16) ) {
+                alt399=1;
+            }
+            switch (alt399) {
+                case 1 :
+                    // InternalUIGrammar.g:17396:4: otherlv_11= ';'
+                    {
+                    otherlv_11=(Token)match(input,16,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"
+    // InternalUIGrammar.g:17405:1: entryRuleXAnnotation returns [EObject current=null] : iv_ruleXAnnotation= ruleXAnnotation EOF ;
+    public final EObject entryRuleXAnnotation() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXAnnotation = null;
+
+
+        try {
+            // InternalUIGrammar.g:17405:52: (iv_ruleXAnnotation= ruleXAnnotation EOF )
+            // InternalUIGrammar.g:17406: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"
+    // InternalUIGrammar.g:17412: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 {
+            // InternalUIGrammar.g:17418: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= ')' )? ) )
+            // InternalUIGrammar.g:17419: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= ')' )? )
+            {
+            // InternalUIGrammar.g:17419: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= ')' )? )
+            // InternalUIGrammar.g:17420: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= ')' )?
+            {
+            // InternalUIGrammar.g:17420:3: ()
+            // InternalUIGrammar.g:17421:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXAnnotationAccess().getXAnnotationAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,160,FOLLOW_3); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXAnnotationAccess().getCommercialAtKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:17431:3: ( ( ruleQualifiedName ) )
+            // InternalUIGrammar.g:17432:4: ( ruleQualifiedName )
+            {
+            // InternalUIGrammar.g:17432:4: ( ruleQualifiedName )
+            // InternalUIGrammar.g:17433: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_130);
+            ruleQualifiedName();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalUIGrammar.g:17447: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 alt402=2;
+            int LA402_0 = input.LA(1);
+
+            if ( (LA402_0==45) && (synpred3_InternalUIGrammar())) {
+                alt402=1;
+            }
+            switch (alt402) {
+                case 1 :
+                    // InternalUIGrammar.g:17448:4: ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')'
+                    {
+                    // InternalUIGrammar.g:17448:4: ( ( '(' )=>otherlv_3= '(' )
+                    // InternalUIGrammar.g:17449:5: ( '(' )=>otherlv_3= '('
+                    {
+                    otherlv_3=(Token)match(input,45,FOLLOW_131); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_3, grammarAccess.getXAnnotationAccess().getLeftParenthesisKeyword_3_0());
+                      				
+                    }
+
+                    }
+
+                    // InternalUIGrammar.g:17455:4: ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )?
+                    int alt401=3;
+                    alt401 = dfa401.predict(input);
+                    switch (alt401) {
+                        case 1 :
+                            // InternalUIGrammar.g:17456:5: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* )
+                            {
+                            // InternalUIGrammar.g:17456:5: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* )
+                            // InternalUIGrammar.g:17457:6: ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )*
+                            {
+                            // InternalUIGrammar.g:17457:6: ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) )
+                            // InternalUIGrammar.g:17458:7: ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair )
+                            {
+                            // InternalUIGrammar.g:17467:7: (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair )
+                            // InternalUIGrammar.g:17468:8: lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              								newCompositeNode(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_0_0());
+                              							
+                            }
+                            pushFollow(FOLLOW_94);
+                            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();
+                              							
+                            }
+
+                            }
+
+
+                            }
+
+                            // InternalUIGrammar.g:17485:6: (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )*
+                            loop400:
+                            do {
+                                int alt400=2;
+                                int LA400_0 = input.LA(1);
+
+                                if ( (LA400_0==102) ) {
+                                    alt400=1;
+                                }
+
+
+                                switch (alt400) {
+                            	case 1 :
+                            	    // InternalUIGrammar.g:17486:7: otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) )
+                            	    {
+                            	    otherlv_5=(Token)match(input,102,FOLLOW_3); if (state.failed) return current;
+                            	    if ( state.backtracking==0 ) {
+
+                            	      							newLeafNode(otherlv_5, grammarAccess.getXAnnotationAccess().getCommaKeyword_3_1_0_1_0());
+                            	      						
+                            	    }
+                            	    // InternalUIGrammar.g:17490:7: ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) )
+                            	    // InternalUIGrammar.g:17491:8: ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair )
+                            	    {
+                            	    // InternalUIGrammar.g:17500:8: (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair )
+                            	    // InternalUIGrammar.g:17501:9: lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair
+                            	    {
+                            	    if ( state.backtracking==0 ) {
+
+                            	      									newCompositeNode(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_1_1_0());
+                            	      								
+                            	    }
+                            	    pushFollow(FOLLOW_94);
+                            	    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 loop400;
+                                }
+                            } while (true);
+
+
+                            }
+
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalUIGrammar.g:17521:5: ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) )
+                            {
+                            // InternalUIGrammar.g:17521:5: ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) )
+                            // InternalUIGrammar.g:17522:6: (lv_value_7_0= ruleXAnnotationElementValueOrCommaList )
+                            {
+                            // InternalUIGrammar.g:17522:6: (lv_value_7_0= ruleXAnnotationElementValueOrCommaList )
+                            // InternalUIGrammar.g:17523:7: lv_value_7_0= ruleXAnnotationElementValueOrCommaList
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getXAnnotationAccess().getValueXAnnotationElementValueOrCommaListParserRuleCall_3_1_1_0());
+                              						
+                            }
+                            pushFollow(FOLLOW_36);
+                            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,47,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"
+    // InternalUIGrammar.g:17550:1: entryRuleXAnnotationElementValuePair returns [EObject current=null] : iv_ruleXAnnotationElementValuePair= ruleXAnnotationElementValuePair EOF ;
+    public final EObject entryRuleXAnnotationElementValuePair() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXAnnotationElementValuePair = null;
+
+
+        try {
+            // InternalUIGrammar.g:17550:68: (iv_ruleXAnnotationElementValuePair= ruleXAnnotationElementValuePair EOF )
+            // InternalUIGrammar.g:17551: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"
+    // InternalUIGrammar.g:17557: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 {
+            // InternalUIGrammar.g:17563:2: ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) ) )
+            // InternalUIGrammar.g:17564:2: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) )
+            {
+            // InternalUIGrammar.g:17564:2: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) )
+            // InternalUIGrammar.g:17565:3: ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) )
+            {
+            // InternalUIGrammar.g:17565:3: ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) )
+            // InternalUIGrammar.g:17566:4: ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' )
+            {
+            // InternalUIGrammar.g:17575:4: ( ( ( ruleValidID ) ) otherlv_1= '=' )
+            // InternalUIGrammar.g:17576:5: ( ( ruleValidID ) ) otherlv_1= '='
+            {
+            // InternalUIGrammar.g:17576:5: ( ( ruleValidID ) )
+            // InternalUIGrammar.g:17577:6: ( ruleValidID )
+            {
+            // InternalUIGrammar.g:17577:6: ( ruleValidID )
+            // InternalUIGrammar.g:17578: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_132);
+            ruleValidID();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              							afterParserOrEnumRuleCall();
+              						
+            }
+
+            }
+
+
+            }
+
+            otherlv_1=(Token)match(input,161,FOLLOW_133); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValuePairAccess().getEqualsSignKeyword_0_0_1());
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalUIGrammar.g:17598:3: ( (lv_value_2_0= ruleXAnnotationElementValue ) )
+            // InternalUIGrammar.g:17599:4: (lv_value_2_0= ruleXAnnotationElementValue )
+            {
+            // InternalUIGrammar.g:17599:4: (lv_value_2_0= ruleXAnnotationElementValue )
+            // InternalUIGrammar.g:17600: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"
+    // InternalUIGrammar.g:17621:1: entryRuleXAnnotationElementValueOrCommaList returns [EObject current=null] : iv_ruleXAnnotationElementValueOrCommaList= ruleXAnnotationElementValueOrCommaList EOF ;
+    public final EObject entryRuleXAnnotationElementValueOrCommaList() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXAnnotationElementValueOrCommaList = null;
+
+
+        try {
+            // InternalUIGrammar.g:17621:75: (iv_ruleXAnnotationElementValueOrCommaList= ruleXAnnotationElementValueOrCommaList EOF )
+            // InternalUIGrammar.g:17622: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"
+    // InternalUIGrammar.g:17628: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 {
+            // InternalUIGrammar.g:17634: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 ) ) )+ )? ) ) )
+            // InternalUIGrammar.g:17635: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 ) ) )+ )? ) )
+            {
+            // InternalUIGrammar.g:17635: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 alt407=2;
+            alt407 = dfa407.predict(input);
+            switch (alt407) {
+                case 1 :
+                    // InternalUIGrammar.g:17636:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
+                    {
+                    // InternalUIGrammar.g:17636:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
+                    // InternalUIGrammar.g:17637:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']'
+                    {
+                    // InternalUIGrammar.g:17637:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) )
+                    // InternalUIGrammar.g:17638:5: ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' )
+                    {
+                    // InternalUIGrammar.g:17645:5: ( () otherlv_1= '#' otherlv_2= '[' )
+                    // InternalUIGrammar.g:17646:6: () otherlv_1= '#' otherlv_2= '['
+                    {
+                    // InternalUIGrammar.g:17646:6: ()
+                    // InternalUIGrammar.g:17647:7: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							current = forceCreateModelElement(
+                      								grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralAction_0_0_0_0(),
+                      								current);
+                      						
+                    }
+
+                    }
+
+                    otherlv_1=(Token)match(input,162,FOLLOW_27); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getNumberSignKeyword_0_0_0_1());
+                      					
+                    }
+                    otherlv_2=(Token)match(input,32,FOLLOW_134); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(otherlv_2, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getLeftSquareBracketKeyword_0_0_0_2());
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalUIGrammar.g:17663:4: ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )?
+                    int alt404=2;
+                    int LA404_0 = input.LA(1);
+
+                    if ( ((LA404_0>=RULE_ID && LA404_0<=RULE_DECIMAL)||LA404_0==20||LA404_0==28||LA404_0==32||LA404_0==42||LA404_0==45||(LA404_0>=155 && LA404_0<=157)||LA404_0==160||LA404_0==162||(LA404_0>=180 && LA404_0<=181)||LA404_0==185||LA404_0==190||LA404_0==192||(LA404_0>=195 && LA404_0<=196)||(LA404_0>=199 && LA404_0<=208)||LA404_0==210) ) {
+                        alt404=1;
+                    }
+                    switch (alt404) {
+                        case 1 :
+                            // InternalUIGrammar.g:17664:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
+                            {
+                            // InternalUIGrammar.g:17664:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) )
+                            // InternalUIGrammar.g:17665:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
+                            {
+                            // InternalUIGrammar.g:17665:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
+                            // InternalUIGrammar.g:17666:7: lv_elements_3_0= ruleXAnnotationOrExpression
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_0_0());
+                              						
+                            }
+                            pushFollow(FOLLOW_135);
+                            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();
+                              						
+                            }
+
+                            }
+
+
+                            }
+
+                            // InternalUIGrammar.g:17683:5: (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
+                            loop403:
+                            do {
+                                int alt403=2;
+                                int LA403_0 = input.LA(1);
+
+                                if ( (LA403_0==102) ) {
+                                    alt403=1;
+                                }
+
+
+                                switch (alt403) {
+                            	case 1 :
+                            	    // InternalUIGrammar.g:17684:6: otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
+                            	    {
+                            	    otherlv_4=(Token)match(input,102,FOLLOW_133); if (state.failed) return current;
+                            	    if ( state.backtracking==0 ) {
+
+                            	      						newLeafNode(otherlv_4, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_0_1_1_0());
+                            	      					
+                            	    }
+                            	    // InternalUIGrammar.g:17688:6: ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
+                            	    // InternalUIGrammar.g:17689:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
+                            	    {
+                            	    // InternalUIGrammar.g:17689:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
+                            	    // InternalUIGrammar.g:17690:8: lv_elements_5_0= ruleXAnnotationOrExpression
+                            	    {
+                            	    if ( state.backtracking==0 ) {
+
+                            	      								newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_1_1_0());
+                            	      							
+                            	    }
+                            	    pushFollow(FOLLOW_135);
+                            	    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 loop403;
+                                }
+                            } while (true);
+
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_6=(Token)match(input,33,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_6, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getRightSquareBracketKeyword_0_2());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalUIGrammar.g:17715:3: (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? )
+                    {
+                    // InternalUIGrammar.g:17715:3: (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? )
+                    // InternalUIGrammar.g:17716:4: this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )?
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      				newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXAnnotationOrExpressionParserRuleCall_1_0());
+                      			
+                    }
+                    pushFollow(FOLLOW_136);
+                    this_XAnnotationOrExpression_7=ruleXAnnotationOrExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = this_XAnnotationOrExpression_7;
+                      				afterParserOrEnumRuleCall();
+                      			
+                    }
+                    // InternalUIGrammar.g:17724:4: ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )?
+                    int alt406=2;
+                    int LA406_0 = input.LA(1);
+
+                    if ( (LA406_0==102) ) {
+                        alt406=1;
+                    }
+                    switch (alt406) {
+                        case 1 :
+                            // InternalUIGrammar.g:17725:5: () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+
+                            {
+                            // InternalUIGrammar.g:17725:5: ()
+                            // InternalUIGrammar.g:17726:6: 
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              						current = forceCreateModelElementAndAdd(
+                              							grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0(),
+                              							current);
+                              					
+                            }
+
+                            }
+
+                            // InternalUIGrammar.g:17732:5: (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+
+                            int cnt405=0;
+                            loop405:
+                            do {
+                                int alt405=2;
+                                int LA405_0 = input.LA(1);
+
+                                if ( (LA405_0==102) ) {
+                                    alt405=1;
+                                }
+
+
+                                switch (alt405) {
+                            	case 1 :
+                            	    // InternalUIGrammar.g:17733:6: otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) )
+                            	    {
+                            	    otherlv_9=(Token)match(input,102,FOLLOW_133); if (state.failed) return current;
+                            	    if ( state.backtracking==0 ) {
+
+                            	      						newLeafNode(otherlv_9, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_1_1_1_0());
+                            	      					
+                            	    }
+                            	    // InternalUIGrammar.g:17737:6: ( (lv_elements_10_0= ruleXAnnotationOrExpression ) )
+                            	    // InternalUIGrammar.g:17738:7: (lv_elements_10_0= ruleXAnnotationOrExpression )
+                            	    {
+                            	    // InternalUIGrammar.g:17738:7: (lv_elements_10_0= ruleXAnnotationOrExpression )
+                            	    // InternalUIGrammar.g:17739:8: lv_elements_10_0= ruleXAnnotationOrExpression
+                            	    {
+                            	    if ( state.backtracking==0 ) {
+
+                            	      								newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_1_1_1_1_0());
+                            	      							
+                            	    }
+                            	    pushFollow(FOLLOW_136);
+                            	    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 ( cnt405 >= 1 ) break loop405;
+                            	    if (state.backtracking>0) {state.failed=true; return current;}
+                                        EarlyExitException eee =
+                                            new EarlyExitException(405, input);
+                                        throw eee;
+                                }
+                                cnt405++;
+                            } 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"
+    // InternalUIGrammar.g:17763:1: entryRuleXAnnotationElementValue returns [EObject current=null] : iv_ruleXAnnotationElementValue= ruleXAnnotationElementValue EOF ;
+    public final EObject entryRuleXAnnotationElementValue() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXAnnotationElementValue = null;
+
+
+        try {
+            // InternalUIGrammar.g:17763:64: (iv_ruleXAnnotationElementValue= ruleXAnnotationElementValue EOF )
+            // InternalUIGrammar.g:17764: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"
+    // InternalUIGrammar.g:17770: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 {
+            // InternalUIGrammar.g:17776:2: ( ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ) )
+            // InternalUIGrammar.g:17777:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression )
+            {
+            // InternalUIGrammar.g:17777:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression )
+            int alt410=2;
+            alt410 = dfa410.predict(input);
+            switch (alt410) {
+                case 1 :
+                    // InternalUIGrammar.g:17778:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
+                    {
+                    // InternalUIGrammar.g:17778:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
+                    // InternalUIGrammar.g:17779:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']'
+                    {
+                    // InternalUIGrammar.g:17779:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) )
+                    // InternalUIGrammar.g:17780:5: ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' )
+                    {
+                    // InternalUIGrammar.g:17787:5: ( () otherlv_1= '#' otherlv_2= '[' )
+                    // InternalUIGrammar.g:17788:6: () otherlv_1= '#' otherlv_2= '['
+                    {
+                    // InternalUIGrammar.g:17788:6: ()
+                    // InternalUIGrammar.g:17789:7: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							current = forceCreateModelElement(
+                      								grammarAccess.getXAnnotationElementValueAccess().getXListLiteralAction_0_0_0_0(),
+                      								current);
+                      						
+                    }
+
+                    }
+
+                    otherlv_1=(Token)match(input,162,FOLLOW_27); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValueAccess().getNumberSignKeyword_0_0_0_1());
+                      					
+                    }
+                    otherlv_2=(Token)match(input,32,FOLLOW_134); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(otherlv_2, grammarAccess.getXAnnotationElementValueAccess().getLeftSquareBracketKeyword_0_0_0_2());
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalUIGrammar.g:17805:4: ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )?
+                    int alt409=2;
+                    int LA409_0 = input.LA(1);
+
+                    if ( ((LA409_0>=RULE_ID && LA409_0<=RULE_DECIMAL)||LA409_0==20||LA409_0==28||LA409_0==32||LA409_0==42||LA409_0==45||(LA409_0>=155 && LA409_0<=157)||LA409_0==160||LA409_0==162||(LA409_0>=180 && LA409_0<=181)||LA409_0==185||LA409_0==190||LA409_0==192||(LA409_0>=195 && LA409_0<=196)||(LA409_0>=199 && LA409_0<=208)||LA409_0==210) ) {
+                        alt409=1;
+                    }
+                    switch (alt409) {
+                        case 1 :
+                            // InternalUIGrammar.g:17806:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
+                            {
+                            // InternalUIGrammar.g:17806:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) )
+                            // InternalUIGrammar.g:17807:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
+                            {
+                            // InternalUIGrammar.g:17807:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
+                            // InternalUIGrammar.g:17808:7: lv_elements_3_0= ruleXAnnotationOrExpression
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getXAnnotationElementValueAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_0_0());
+                              						
+                            }
+                            pushFollow(FOLLOW_135);
+                            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();
+                              						
+                            }
+
+                            }
+
+
+                            }
+
+                            // InternalUIGrammar.g:17825:5: (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
+                            loop408:
+                            do {
+                                int alt408=2;
+                                int LA408_0 = input.LA(1);
+
+                                if ( (LA408_0==102) ) {
+                                    alt408=1;
+                                }
+
+
+                                switch (alt408) {
+                            	case 1 :
+                            	    // InternalUIGrammar.g:17826:6: otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
+                            	    {
+                            	    otherlv_4=(Token)match(input,102,FOLLOW_133); if (state.failed) return current;
+                            	    if ( state.backtracking==0 ) {
+
+                            	      						newLeafNode(otherlv_4, grammarAccess.getXAnnotationElementValueAccess().getCommaKeyword_0_1_1_0());
+                            	      					
+                            	    }
+                            	    // InternalUIGrammar.g:17830:6: ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
+                            	    // InternalUIGrammar.g:17831:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
+                            	    {
+                            	    // InternalUIGrammar.g:17831:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
+                            	    // InternalUIGrammar.g:17832:8: lv_elements_5_0= ruleXAnnotationOrExpression
+                            	    {
+                            	    if ( state.backtracking==0 ) {
+
+                            	      								newCompositeNode(grammarAccess.getXAnnotationElementValueAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_1_1_0());
+                            	      							
+                            	    }
+                            	    pushFollow(FOLLOW_135);
+                            	    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 loop408;
+                                }
+                            } while (true);
+
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_6=(Token)match(input,33,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_6, grammarAccess.getXAnnotationElementValueAccess().getRightSquareBracketKeyword_0_2());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalUIGrammar.g:17857: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"
+    // InternalUIGrammar.g:17869:1: entryRuleXAnnotationOrExpression returns [EObject current=null] : iv_ruleXAnnotationOrExpression= ruleXAnnotationOrExpression EOF ;
+    public final EObject entryRuleXAnnotationOrExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXAnnotationOrExpression = null;
+
+
+        try {
+            // InternalUIGrammar.g:17869:64: (iv_ruleXAnnotationOrExpression= ruleXAnnotationOrExpression EOF )
+            // InternalUIGrammar.g:17870: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"
+    // InternalUIGrammar.g:17876: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 {
+            // InternalUIGrammar.g:17882:2: ( (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression ) )
+            // InternalUIGrammar.g:17883:2: (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression )
+            {
+            // InternalUIGrammar.g:17883:2: (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression )
+            int alt411=2;
+            int LA411_0 = input.LA(1);
+
+            if ( (LA411_0==160) ) {
+                alt411=1;
+            }
+            else if ( ((LA411_0>=RULE_ID && LA411_0<=RULE_DECIMAL)||LA411_0==20||LA411_0==28||LA411_0==32||LA411_0==42||LA411_0==45||(LA411_0>=155 && LA411_0<=157)||LA411_0==162||(LA411_0>=180 && LA411_0<=181)||LA411_0==185||LA411_0==190||LA411_0==192||(LA411_0>=195 && LA411_0<=196)||(LA411_0>=199 && LA411_0<=208)||LA411_0==210) ) {
+                alt411=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 411, 0, input);
+
+                throw nvae;
+            }
+            switch (alt411) {
+                case 1 :
+                    // InternalUIGrammar.g:17884: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 :
+                    // InternalUIGrammar.g:17893: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"
+    // InternalUIGrammar.g:17905:1: entryRuleXExpression returns [EObject current=null] : iv_ruleXExpression= ruleXExpression EOF ;
+    public final EObject entryRuleXExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXExpression = null;
+
+
+        try {
+            // InternalUIGrammar.g:17905:52: (iv_ruleXExpression= ruleXExpression EOF )
+            // InternalUIGrammar.g:17906: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"
+    // InternalUIGrammar.g:17912: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 {
+            // InternalUIGrammar.g:17918:2: (this_XAssignment_0= ruleXAssignment )
+            // InternalUIGrammar.g:17919: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"
+    // InternalUIGrammar.g:17930:1: entryRuleXAssignment returns [EObject current=null] : iv_ruleXAssignment= ruleXAssignment EOF ;
+    public final EObject entryRuleXAssignment() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXAssignment = null;
+
+
+        try {
+            // InternalUIGrammar.g:17930:52: (iv_ruleXAssignment= ruleXAssignment EOF )
+            // InternalUIGrammar.g:17931: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"
+    // InternalUIGrammar.g:17937: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 {
+            // InternalUIGrammar.g:17943:2: ( ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) ) )
+            // InternalUIGrammar.g:17944:2: ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) )
+            {
+            // InternalUIGrammar.g:17944:2: ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) )
+            int alt413=2;
+            switch ( input.LA(1) ) {
+            case RULE_ID:
+                {
+                int LA413_1 = input.LA(2);
+
+                if ( (LA413_1==EOF||(LA413_1>=RULE_ID && LA413_1<=RULE_DECIMAL)||(LA413_1>=15 && LA413_1<=16)||LA413_1==18||(LA413_1>=20 && LA413_1<=21)||LA413_1==24||(LA413_1>=28 && LA413_1<=33)||LA413_1==35||LA413_1==42||LA413_1==45||LA413_1==47||LA413_1==102||(LA413_1>=155 && LA413_1<=158)||(LA413_1>=162 && LA413_1<=188)||(LA413_1>=190 && LA413_1<=211)) ) {
+                    alt413=2;
+                }
+                else if ( (LA413_1==161) ) {
+                    alt413=1;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return current;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 413, 1, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 199:
+                {
+                int LA413_2 = input.LA(2);
+
+                if ( (LA413_2==EOF||(LA413_2>=RULE_ID && LA413_2<=RULE_DECIMAL)||(LA413_2>=15 && LA413_2<=16)||LA413_2==18||(LA413_2>=20 && LA413_2<=21)||LA413_2==24||(LA413_2>=28 && LA413_2<=33)||LA413_2==35||LA413_2==42||LA413_2==45||LA413_2==47||LA413_2==102||(LA413_2>=155 && LA413_2<=158)||(LA413_2>=162 && LA413_2<=188)||(LA413_2>=190 && LA413_2<=211)) ) {
+                    alt413=2;
+                }
+                else if ( (LA413_2==161) ) {
+                    alt413=1;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return current;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 413, 2, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 156:
+                {
+                int LA413_3 = input.LA(2);
+
+                if ( (LA413_3==161) ) {
+                    alt413=1;
+                }
+                else if ( (LA413_3==EOF||(LA413_3>=RULE_ID && LA413_3<=RULE_DECIMAL)||(LA413_3>=15 && LA413_3<=16)||LA413_3==18||(LA413_3>=20 && LA413_3<=21)||LA413_3==24||(LA413_3>=28 && LA413_3<=33)||LA413_3==35||LA413_3==42||LA413_3==45||LA413_3==47||LA413_3==102||(LA413_3>=155 && LA413_3<=158)||(LA413_3>=162 && LA413_3<=188)||(LA413_3>=190 && LA413_3<=211)) ) {
+                    alt413=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return current;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 413, 3, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 155:
+                {
+                int LA413_4 = input.LA(2);
+
+                if ( (LA413_4==161) ) {
+                    alt413=1;
+                }
+                else if ( (LA413_4==EOF||(LA413_4>=RULE_ID && LA413_4<=RULE_DECIMAL)||(LA413_4>=15 && LA413_4<=16)||LA413_4==18||(LA413_4>=20 && LA413_4<=21)||LA413_4==24||(LA413_4>=28 && LA413_4<=33)||LA413_4==35||LA413_4==42||LA413_4==45||LA413_4==47||LA413_4==102||(LA413_4>=155 && LA413_4<=158)||(LA413_4>=162 && LA413_4<=188)||(LA413_4>=190 && LA413_4<=211)) ) {
+                    alt413=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return current;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 413, 4, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 157:
+                {
+                int LA413_5 = input.LA(2);
+
+                if ( (LA413_5==EOF||(LA413_5>=RULE_ID && LA413_5<=RULE_DECIMAL)||(LA413_5>=15 && LA413_5<=16)||LA413_5==18||(LA413_5>=20 && LA413_5<=21)||LA413_5==24||(LA413_5>=28 && LA413_5<=33)||LA413_5==35||LA413_5==42||LA413_5==45||LA413_5==47||LA413_5==102||(LA413_5>=155 && LA413_5<=158)||(LA413_5>=162 && LA413_5<=188)||(LA413_5>=190 && LA413_5<=211)) ) {
+                    alt413=2;
+                }
+                else if ( (LA413_5==161) ) {
+                    alt413=1;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return current;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 413, 5, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case RULE_STRING:
+            case RULE_INT:
+            case RULE_HEX:
+            case RULE_DECIMAL:
+            case 20:
+            case 28:
+            case 32:
+            case 42:
+            case 45:
+            case 162:
+            case 180:
+            case 181:
+            case 185:
+            case 190:
+            case 192:
+            case 195:
+            case 196:
+            case 200:
+            case 201:
+            case 202:
+            case 203:
+            case 204:
+            case 205:
+            case 206:
+            case 207:
+            case 208:
+            case 210:
+                {
+                alt413=2;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 413, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt413) {
+                case 1 :
+                    // InternalUIGrammar.g:17945:3: ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) )
+                    {
+                    // InternalUIGrammar.g:17945:3: ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) )
+                    // InternalUIGrammar.g:17946:4: () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) )
+                    {
+                    // InternalUIGrammar.g:17946:4: ()
+                    // InternalUIGrammar.g:17947:5: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					current = forceCreateModelElement(
+                      						grammarAccess.getXAssignmentAccess().getXAssignmentAction_0_0(),
+                      						current);
+                      				
+                    }
+
+                    }
+
+                    // InternalUIGrammar.g:17953:4: ( ( ruleFeatureCallID ) )
+                    // InternalUIGrammar.g:17954:5: ( ruleFeatureCallID )
+                    {
+                    // InternalUIGrammar.g:17954:5: ( ruleFeatureCallID )
+                    // InternalUIGrammar.g:17955: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_132);
+                    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_133);
+                    ruleOpSingleAssign();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				afterParserOrEnumRuleCall();
+                      			
+                    }
+                    // InternalUIGrammar.g:17976:4: ( (lv_value_3_0= ruleXAssignment ) )
+                    // InternalUIGrammar.g:17977:5: (lv_value_3_0= ruleXAssignment )
+                    {
+                    // InternalUIGrammar.g:17977:5: (lv_value_3_0= ruleXAssignment )
+                    // InternalUIGrammar.g:17978: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 :
+                    // InternalUIGrammar.g:17997:3: (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? )
+                    {
+                    // InternalUIGrammar.g:17997:3: (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? )
+                    // InternalUIGrammar.g:17998:4: this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )?
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      				newCompositeNode(grammarAccess.getXAssignmentAccess().getXOrExpressionParserRuleCall_1_0());
+                      			
+                    }
+                    pushFollow(FOLLOW_137);
+                    this_XOrExpression_4=ruleXOrExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = this_XOrExpression_4;
+                      				afterParserOrEnumRuleCall();
+                      			
+                    }
+                    // InternalUIGrammar.g:18006:4: ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )?
+                    int alt412=2;
+                    alt412 = dfa412.predict(input);
+                    switch (alt412) {
+                        case 1 :
+                            // InternalUIGrammar.g:18007:5: ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) )
+                            {
+                            // InternalUIGrammar.g:18007:5: ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) )
+                            // InternalUIGrammar.g:18008:6: ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) )
+                            {
+                            // InternalUIGrammar.g:18018:6: ( () ( ( ruleOpMultiAssign ) ) )
+                            // InternalUIGrammar.g:18019:7: () ( ( ruleOpMultiAssign ) )
+                            {
+                            // InternalUIGrammar.g:18019:7: ()
+                            // InternalUIGrammar.g:18020:8: 
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              								current = forceCreateModelElementAndSet(
+                              									grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0(),
+                              									current);
+                              							
+                            }
+
+                            }
+
+                            // InternalUIGrammar.g:18026:7: ( ( ruleOpMultiAssign ) )
+                            // InternalUIGrammar.g:18027:8: ( ruleOpMultiAssign )
+                            {
+                            // InternalUIGrammar.g:18027:8: ( ruleOpMultiAssign )
+                            // InternalUIGrammar.g:18028: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_133);
+                            ruleOpMultiAssign();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              									afterParserOrEnumRuleCall();
+                              								
+                            }
+
+                            }
+
+
+                            }
+
+
+                            }
+
+
+                            }
+
+                            // InternalUIGrammar.g:18044:5: ( (lv_rightOperand_7_0= ruleXAssignment ) )
+                            // InternalUIGrammar.g:18045:6: (lv_rightOperand_7_0= ruleXAssignment )
+                            {
+                            // InternalUIGrammar.g:18045:6: (lv_rightOperand_7_0= ruleXAssignment )
+                            // InternalUIGrammar.g:18046: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"
+    // InternalUIGrammar.g:18069:1: entryRuleOpSingleAssign returns [String current=null] : iv_ruleOpSingleAssign= ruleOpSingleAssign EOF ;
+    public final String entryRuleOpSingleAssign() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleOpSingleAssign = null;
+
+
+        try {
+            // InternalUIGrammar.g:18069:54: (iv_ruleOpSingleAssign= ruleOpSingleAssign EOF )
+            // InternalUIGrammar.g:18070: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"
+    // InternalUIGrammar.g:18076:1: ruleOpSingleAssign returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : kw= '=' ;
+    public final AntlrDatatypeRuleToken ruleOpSingleAssign() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:18082:2: (kw= '=' )
+            // InternalUIGrammar.g:18083:2: kw= '='
+            {
+            kw=(Token)match(input,161,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"
+    // InternalUIGrammar.g:18091:1: entryRuleOpMultiAssign returns [String current=null] : iv_ruleOpMultiAssign= ruleOpMultiAssign EOF ;
+    public final String entryRuleOpMultiAssign() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleOpMultiAssign = null;
+
+
+        try {
+            // InternalUIGrammar.g:18091:53: (iv_ruleOpMultiAssign= ruleOpMultiAssign EOF )
+            // InternalUIGrammar.g:18092: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"
+    // InternalUIGrammar.g:18098: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 {
+            // InternalUIGrammar.g:18104:2: ( (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) ) )
+            // InternalUIGrammar.g:18105:2: (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) )
+            {
+            // InternalUIGrammar.g:18105:2: (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) )
+            int alt415=7;
+            switch ( input.LA(1) ) {
+            case 18:
+                {
+                alt415=1;
+                }
+                break;
+            case 163:
+                {
+                alt415=2;
+                }
+                break;
+            case 164:
+                {
+                alt415=3;
+                }
+                break;
+            case 165:
+                {
+                alt415=4;
+                }
+                break;
+            case 166:
+                {
+                alt415=5;
+                }
+                break;
+            case 28:
+                {
+                alt415=6;
+                }
+                break;
+            case 30:
+                {
+                alt415=7;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 415, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt415) {
+                case 1 :
+                    // InternalUIGrammar.g:18106:3: kw= '+='
+                    {
+                    kw=(Token)match(input,18,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0());
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalUIGrammar.g:18112:3: kw= '-='
+                    {
+                    kw=(Token)match(input,163,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getHyphenMinusEqualsSignKeyword_1());
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalUIGrammar.g:18118:3: kw= '*='
+                    {
+                    kw=(Token)match(input,164,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getAsteriskEqualsSignKeyword_2());
+                      		
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalUIGrammar.g:18124:3: kw= '/='
+                    {
+                    kw=(Token)match(input,165,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getSolidusEqualsSignKeyword_3());
+                      		
+                    }
+
+                    }
+                    break;
+                case 5 :
+                    // InternalUIGrammar.g:18130:3: kw= '%='
+                    {
+                    kw=(Token)match(input,166,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getPercentSignEqualsSignKeyword_4());
+                      		
+                    }
+
+                    }
+                    break;
+                case 6 :
+                    // InternalUIGrammar.g:18136:3: (kw= '<' kw= '<' kw= '=' )
+                    {
+                    // InternalUIGrammar.g:18136:3: (kw= '<' kw= '<' kw= '=' )
+                    // InternalUIGrammar.g:18137:4: kw= '<' kw= '<' kw= '='
+                    {
+                    kw=(Token)match(input,28,FOLLOW_138); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_0());
+                      			
+                    }
+                    kw=(Token)match(input,28,FOLLOW_132); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_1());
+                      			
+                    }
+                    kw=(Token)match(input,161,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getEqualsSignKeyword_5_2());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 7 :
+                    // InternalUIGrammar.g:18154:3: (kw= '>' (kw= '>' )? kw= '>=' )
+                    {
+                    // InternalUIGrammar.g:18154:3: (kw= '>' (kw= '>' )? kw= '>=' )
+                    // InternalUIGrammar.g:18155:4: kw= '>' (kw= '>' )? kw= '>='
+                    {
+                    kw=(Token)match(input,30,FOLLOW_139); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:18160:4: (kw= '>' )?
+                    int alt414=2;
+                    int LA414_0 = input.LA(1);
+
+                    if ( (LA414_0==30) ) {
+                        alt414=1;
+                    }
+                    switch (alt414) {
+                        case 1 :
+                            // InternalUIGrammar.g:18161:5: kw= '>'
+                            {
+                            kw=(Token)match(input,30,FOLLOW_140); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					current.merge(kw);
+                              					newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_1());
+                              				
+                            }
+
+                            }
+                            break;
+
+                    }
+
+                    kw=(Token)match(input,167,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"
+    // InternalUIGrammar.g:18177:1: entryRuleXOrExpression returns [EObject current=null] : iv_ruleXOrExpression= ruleXOrExpression EOF ;
+    public final EObject entryRuleXOrExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXOrExpression = null;
+
+
+        try {
+            // InternalUIGrammar.g:18177:54: (iv_ruleXOrExpression= ruleXOrExpression EOF )
+            // InternalUIGrammar.g:18178: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"
+    // InternalUIGrammar.g:18184: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 {
+            // InternalUIGrammar.g:18190:2: ( (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* ) )
+            // InternalUIGrammar.g:18191:2: (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* )
+            {
+            // InternalUIGrammar.g:18191:2: (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* )
+            // InternalUIGrammar.g:18192:3: this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )*
+            {
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getXOrExpressionAccess().getXAndExpressionParserRuleCall_0());
+              		
+            }
+            pushFollow(FOLLOW_141);
+            this_XAndExpression_0=ruleXAndExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_XAndExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalUIGrammar.g:18200:3: ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )*
+            loop416:
+            do {
+                int alt416=2;
+                int LA416_0 = input.LA(1);
+
+                if ( (LA416_0==168) ) {
+                    int LA416_2 = input.LA(2);
+
+                    if ( (synpred10_InternalUIGrammar()) ) {
+                        alt416=1;
+                    }
+
+
+                }
+
+
+                switch (alt416) {
+            	case 1 :
+            	    // InternalUIGrammar.g:18201:4: ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) )
+            	    {
+            	    // InternalUIGrammar.g:18201:4: ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) )
+            	    // InternalUIGrammar.g:18202:5: ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) )
+            	    {
+            	    // InternalUIGrammar.g:18212:5: ( () ( ( ruleOpOr ) ) )
+            	    // InternalUIGrammar.g:18213:6: () ( ( ruleOpOr ) )
+            	    {
+            	    // InternalUIGrammar.g:18213:6: ()
+            	    // InternalUIGrammar.g:18214:7: 
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      							current = forceCreateModelElementAndSet(
+            	      								grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
+            	      								current);
+            	      						
+            	    }
+
+            	    }
+
+            	    // InternalUIGrammar.g:18220:6: ( ( ruleOpOr ) )
+            	    // InternalUIGrammar.g:18221:7: ( ruleOpOr )
+            	    {
+            	    // InternalUIGrammar.g:18221:7: ( ruleOpOr )
+            	    // InternalUIGrammar.g:18222: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_133);
+            	    ruleOpOr();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      								afterParserOrEnumRuleCall();
+            	      							
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    // InternalUIGrammar.g:18238:4: ( (lv_rightOperand_3_0= ruleXAndExpression ) )
+            	    // InternalUIGrammar.g:18239:5: (lv_rightOperand_3_0= ruleXAndExpression )
+            	    {
+            	    // InternalUIGrammar.g:18239:5: (lv_rightOperand_3_0= ruleXAndExpression )
+            	    // InternalUIGrammar.g:18240:6: lv_rightOperand_3_0= ruleXAndExpression
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getXOrExpressionAccess().getRightOperandXAndExpressionParserRuleCall_1_1_0());
+            	      					
+            	    }
+            	    pushFollow(FOLLOW_141);
+            	    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 loop416;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXOrExpression"
+
+
+    // $ANTLR start "entryRuleOpOr"
+    // InternalUIGrammar.g:18262:1: entryRuleOpOr returns [String current=null] : iv_ruleOpOr= ruleOpOr EOF ;
+    public final String entryRuleOpOr() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleOpOr = null;
+
+
+        try {
+            // InternalUIGrammar.g:18262:44: (iv_ruleOpOr= ruleOpOr EOF )
+            // InternalUIGrammar.g:18263: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"
+    // InternalUIGrammar.g:18269:1: ruleOpOr returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : kw= '||' ;
+    public final AntlrDatatypeRuleToken ruleOpOr() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:18275:2: (kw= '||' )
+            // InternalUIGrammar.g:18276:2: kw= '||'
+            {
+            kw=(Token)match(input,168,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"
+    // InternalUIGrammar.g:18284:1: entryRuleXAndExpression returns [EObject current=null] : iv_ruleXAndExpression= ruleXAndExpression EOF ;
+    public final EObject entryRuleXAndExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXAndExpression = null;
+
+
+        try {
+            // InternalUIGrammar.g:18284:55: (iv_ruleXAndExpression= ruleXAndExpression EOF )
+            // InternalUIGrammar.g:18285: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"
+    // InternalUIGrammar.g:18291: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 {
+            // InternalUIGrammar.g:18297:2: ( (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* ) )
+            // InternalUIGrammar.g:18298:2: (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* )
+            {
+            // InternalUIGrammar.g:18298:2: (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* )
+            // InternalUIGrammar.g:18299:3: this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )*
+            {
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getXAndExpressionAccess().getXEqualityExpressionParserRuleCall_0());
+              		
+            }
+            pushFollow(FOLLOW_142);
+            this_XEqualityExpression_0=ruleXEqualityExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_XEqualityExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalUIGrammar.g:18307:3: ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )*
+            loop417:
+            do {
+                int alt417=2;
+                int LA417_0 = input.LA(1);
+
+                if ( (LA417_0==169) ) {
+                    int LA417_2 = input.LA(2);
+
+                    if ( (synpred11_InternalUIGrammar()) ) {
+                        alt417=1;
+                    }
+
+
+                }
+
+
+                switch (alt417) {
+            	case 1 :
+            	    // InternalUIGrammar.g:18308:4: ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) )
+            	    {
+            	    // InternalUIGrammar.g:18308:4: ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) )
+            	    // InternalUIGrammar.g:18309:5: ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) )
+            	    {
+            	    // InternalUIGrammar.g:18319:5: ( () ( ( ruleOpAnd ) ) )
+            	    // InternalUIGrammar.g:18320:6: () ( ( ruleOpAnd ) )
+            	    {
+            	    // InternalUIGrammar.g:18320:6: ()
+            	    // InternalUIGrammar.g:18321:7: 
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      							current = forceCreateModelElementAndSet(
+            	      								grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
+            	      								current);
+            	      						
+            	    }
+
+            	    }
+
+            	    // InternalUIGrammar.g:18327:6: ( ( ruleOpAnd ) )
+            	    // InternalUIGrammar.g:18328:7: ( ruleOpAnd )
+            	    {
+            	    // InternalUIGrammar.g:18328:7: ( ruleOpAnd )
+            	    // InternalUIGrammar.g:18329: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_133);
+            	    ruleOpAnd();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      								afterParserOrEnumRuleCall();
+            	      							
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    // InternalUIGrammar.g:18345:4: ( (lv_rightOperand_3_0= ruleXEqualityExpression ) )
+            	    // InternalUIGrammar.g:18346:5: (lv_rightOperand_3_0= ruleXEqualityExpression )
+            	    {
+            	    // InternalUIGrammar.g:18346:5: (lv_rightOperand_3_0= ruleXEqualityExpression )
+            	    // InternalUIGrammar.g:18347:6: lv_rightOperand_3_0= ruleXEqualityExpression
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getXAndExpressionAccess().getRightOperandXEqualityExpressionParserRuleCall_1_1_0());
+            	      					
+            	    }
+            	    pushFollow(FOLLOW_142);
+            	    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 loop417;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXAndExpression"
+
+
+    // $ANTLR start "entryRuleOpAnd"
+    // InternalUIGrammar.g:18369:1: entryRuleOpAnd returns [String current=null] : iv_ruleOpAnd= ruleOpAnd EOF ;
+    public final String entryRuleOpAnd() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleOpAnd = null;
+
+
+        try {
+            // InternalUIGrammar.g:18369:45: (iv_ruleOpAnd= ruleOpAnd EOF )
+            // InternalUIGrammar.g:18370: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"
+    // InternalUIGrammar.g:18376:1: ruleOpAnd returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : kw= '&&' ;
+    public final AntlrDatatypeRuleToken ruleOpAnd() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:18382:2: (kw= '&&' )
+            // InternalUIGrammar.g:18383:2: kw= '&&'
+            {
+            kw=(Token)match(input,169,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"
+    // InternalUIGrammar.g:18391:1: entryRuleXEqualityExpression returns [EObject current=null] : iv_ruleXEqualityExpression= ruleXEqualityExpression EOF ;
+    public final EObject entryRuleXEqualityExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXEqualityExpression = null;
+
+
+        try {
+            // InternalUIGrammar.g:18391:60: (iv_ruleXEqualityExpression= ruleXEqualityExpression EOF )
+            // InternalUIGrammar.g:18392: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"
+    // InternalUIGrammar.g:18398: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 {
+            // InternalUIGrammar.g:18404:2: ( (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* ) )
+            // InternalUIGrammar.g:18405:2: (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* )
+            {
+            // InternalUIGrammar.g:18405:2: (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* )
+            // InternalUIGrammar.g:18406:3: this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )*
+            {
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getXRelationalExpressionParserRuleCall_0());
+              		
+            }
+            pushFollow(FOLLOW_143);
+            this_XRelationalExpression_0=ruleXRelationalExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_XRelationalExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalUIGrammar.g:18414:3: ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )*
+            loop418:
+            do {
+                int alt418=2;
+                switch ( input.LA(1) ) {
+                case 170:
+                    {
+                    int LA418_2 = input.LA(2);
+
+                    if ( (synpred12_InternalUIGrammar()) ) {
+                        alt418=1;
+                    }
+
+
+                    }
+                    break;
+                case 171:
+                    {
+                    int LA418_3 = input.LA(2);
+
+                    if ( (synpred12_InternalUIGrammar()) ) {
+                        alt418=1;
+                    }
+
+
+                    }
+                    break;
+                case 172:
+                    {
+                    int LA418_4 = input.LA(2);
+
+                    if ( (synpred12_InternalUIGrammar()) ) {
+                        alt418=1;
+                    }
+
+
+                    }
+                    break;
+                case 173:
+                    {
+                    int LA418_5 = input.LA(2);
+
+                    if ( (synpred12_InternalUIGrammar()) ) {
+                        alt418=1;
+                    }
+
+
+                    }
+                    break;
+
+                }
+
+                switch (alt418) {
+            	case 1 :
+            	    // InternalUIGrammar.g:18415:4: ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) )
+            	    {
+            	    // InternalUIGrammar.g:18415:4: ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) )
+            	    // InternalUIGrammar.g:18416:5: ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) )
+            	    {
+            	    // InternalUIGrammar.g:18426:5: ( () ( ( ruleOpEquality ) ) )
+            	    // InternalUIGrammar.g:18427:6: () ( ( ruleOpEquality ) )
+            	    {
+            	    // InternalUIGrammar.g:18427:6: ()
+            	    // InternalUIGrammar.g:18428:7: 
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      							current = forceCreateModelElementAndSet(
+            	      								grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
+            	      								current);
+            	      						
+            	    }
+
+            	    }
+
+            	    // InternalUIGrammar.g:18434:6: ( ( ruleOpEquality ) )
+            	    // InternalUIGrammar.g:18435:7: ( ruleOpEquality )
+            	    {
+            	    // InternalUIGrammar.g:18435:7: ( ruleOpEquality )
+            	    // InternalUIGrammar.g:18436: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_133);
+            	    ruleOpEquality();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      								afterParserOrEnumRuleCall();
+            	      							
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    // InternalUIGrammar.g:18452:4: ( (lv_rightOperand_3_0= ruleXRelationalExpression ) )
+            	    // InternalUIGrammar.g:18453:5: (lv_rightOperand_3_0= ruleXRelationalExpression )
+            	    {
+            	    // InternalUIGrammar.g:18453:5: (lv_rightOperand_3_0= ruleXRelationalExpression )
+            	    // InternalUIGrammar.g:18454:6: lv_rightOperand_3_0= ruleXRelationalExpression
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getRightOperandXRelationalExpressionParserRuleCall_1_1_0());
+            	      					
+            	    }
+            	    pushFollow(FOLLOW_143);
+            	    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 loop418;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXEqualityExpression"
+
+
+    // $ANTLR start "entryRuleOpEquality"
+    // InternalUIGrammar.g:18476:1: entryRuleOpEquality returns [String current=null] : iv_ruleOpEquality= ruleOpEquality EOF ;
+    public final String entryRuleOpEquality() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleOpEquality = null;
+
+
+        try {
+            // InternalUIGrammar.g:18476:50: (iv_ruleOpEquality= ruleOpEquality EOF )
+            // InternalUIGrammar.g:18477: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"
+    // InternalUIGrammar.g:18483: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 {
+            // InternalUIGrammar.g:18489:2: ( (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' ) )
+            // InternalUIGrammar.g:18490:2: (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' )
+            {
+            // InternalUIGrammar.g:18490:2: (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' )
+            int alt419=4;
+            switch ( input.LA(1) ) {
+            case 170:
+                {
+                alt419=1;
+                }
+                break;
+            case 171:
+                {
+                alt419=2;
+                }
+                break;
+            case 172:
+                {
+                alt419=3;
+                }
+                break;
+            case 173:
+                {
+                alt419=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 419, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt419) {
+                case 1 :
+                    // InternalUIGrammar.g:18491:3: kw= '=='
+                    {
+                    kw=(Token)match(input,170,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignKeyword_0());
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalUIGrammar.g:18497:3: kw= '!='
+                    {
+                    kw=(Token)match(input,171,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignKeyword_1());
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalUIGrammar.g:18503:3: kw= '==='
+                    {
+                    kw=(Token)match(input,172,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignEqualsSignKeyword_2());
+                      		
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalUIGrammar.g:18509:3: kw= '!=='
+                    {
+                    kw=(Token)match(input,173,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"
+    // InternalUIGrammar.g:18518:1: entryRuleXRelationalExpression returns [EObject current=null] : iv_ruleXRelationalExpression= ruleXRelationalExpression EOF ;
+    public final EObject entryRuleXRelationalExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXRelationalExpression = null;
+
+
+        try {
+            // InternalUIGrammar.g:18518:62: (iv_ruleXRelationalExpression= ruleXRelationalExpression EOF )
+            // InternalUIGrammar.g:18519: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"
+    // InternalUIGrammar.g:18525: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 {
+            // InternalUIGrammar.g:18531:2: ( (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* ) )
+            // InternalUIGrammar.g:18532:2: (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* )
+            {
+            // InternalUIGrammar.g:18532:2: (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* )
+            // InternalUIGrammar.g:18533: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_144);
+            this_XOtherOperatorExpression_0=ruleXOtherOperatorExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_XOtherOperatorExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalUIGrammar.g:18541:3: ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )*
+            loop420:
+            do {
+                int alt420=3;
+                switch ( input.LA(1) ) {
+                case 28:
+                    {
+                    int LA420_2 = input.LA(2);
+
+                    if ( (synpred14_InternalUIGrammar()) ) {
+                        alt420=2;
+                    }
+
+
+                    }
+                    break;
+                case 30:
+                    {
+                    int LA420_3 = input.LA(2);
+
+                    if ( (synpred14_InternalUIGrammar()) ) {
+                        alt420=2;
+                    }
+
+
+                    }
+                    break;
+                case 174:
+                    {
+                    int LA420_4 = input.LA(2);
+
+                    if ( (synpred13_InternalUIGrammar()) ) {
+                        alt420=1;
+                    }
+
+
+                    }
+                    break;
+                case 167:
+                    {
+                    int LA420_5 = input.LA(2);
+
+                    if ( (synpred14_InternalUIGrammar()) ) {
+                        alt420=2;
+                    }
+
+
+                    }
+                    break;
+
+                }
+
+                switch (alt420) {
+            	case 1 :
+            	    // InternalUIGrammar.g:18542:4: ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )
+            	    {
+            	    // InternalUIGrammar.g:18542:4: ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )
+            	    // InternalUIGrammar.g:18543:5: ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) )
+            	    {
+            	    // InternalUIGrammar.g:18543:5: ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) )
+            	    // InternalUIGrammar.g:18544:6: ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' )
+            	    {
+            	    // InternalUIGrammar.g:18550:6: ( () otherlv_2= 'instanceof' )
+            	    // InternalUIGrammar.g:18551:7: () otherlv_2= 'instanceof'
+            	    {
+            	    // InternalUIGrammar.g:18551:7: ()
+            	    // InternalUIGrammar.g:18552:8: 
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      								current = forceCreateModelElementAndSet(
+            	      									grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0(),
+            	      									current);
+            	      							
+            	    }
+
+            	    }
+
+            	    otherlv_2=(Token)match(input,174,FOLLOW_16); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      							newLeafNode(otherlv_2, grammarAccess.getXRelationalExpressionAccess().getInstanceofKeyword_1_0_0_0_1());
+            	      						
+            	    }
+
+            	    }
+
+
+            	    }
+
+            	    // InternalUIGrammar.g:18564:5: ( (lv_type_3_0= ruleJvmTypeReference ) )
+            	    // InternalUIGrammar.g:18565:6: (lv_type_3_0= ruleJvmTypeReference )
+            	    {
+            	    // InternalUIGrammar.g:18565:6: (lv_type_3_0= ruleJvmTypeReference )
+            	    // InternalUIGrammar.g:18566:7: lv_type_3_0= ruleJvmTypeReference
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      							newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_0_1_0());
+            	      						
+            	    }
+            	    pushFollow(FOLLOW_144);
+            	    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 :
+            	    // InternalUIGrammar.g:18585:4: ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) )
+            	    {
+            	    // InternalUIGrammar.g:18585:4: ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) )
+            	    // InternalUIGrammar.g:18586:5: ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) )
+            	    {
+            	    // InternalUIGrammar.g:18586:5: ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) )
+            	    // InternalUIGrammar.g:18587:6: ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) )
+            	    {
+            	    // InternalUIGrammar.g:18597:6: ( () ( ( ruleOpCompare ) ) )
+            	    // InternalUIGrammar.g:18598:7: () ( ( ruleOpCompare ) )
+            	    {
+            	    // InternalUIGrammar.g:18598:7: ()
+            	    // InternalUIGrammar.g:18599:8: 
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      								current = forceCreateModelElementAndSet(
+            	      									grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0(),
+            	      									current);
+            	      							
+            	    }
+
+            	    }
+
+            	    // InternalUIGrammar.g:18605:7: ( ( ruleOpCompare ) )
+            	    // InternalUIGrammar.g:18606:8: ( ruleOpCompare )
+            	    {
+            	    // InternalUIGrammar.g:18606:8: ( ruleOpCompare )
+            	    // InternalUIGrammar.g:18607: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_133);
+            	    ruleOpCompare();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      									afterParserOrEnumRuleCall();
+            	      								
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    // InternalUIGrammar.g:18623:5: ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) )
+            	    // InternalUIGrammar.g:18624:6: (lv_rightOperand_6_0= ruleXOtherOperatorExpression )
+            	    {
+            	    // InternalUIGrammar.g:18624:6: (lv_rightOperand_6_0= ruleXOtherOperatorExpression )
+            	    // InternalUIGrammar.g:18625:7: lv_rightOperand_6_0= ruleXOtherOperatorExpression
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      							newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getRightOperandXOtherOperatorExpressionParserRuleCall_1_1_1_0());
+            	      						
+            	    }
+            	    pushFollow(FOLLOW_144);
+            	    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 loop420;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXRelationalExpression"
+
+
+    // $ANTLR start "entryRuleOpCompare"
+    // InternalUIGrammar.g:18648:1: entryRuleOpCompare returns [String current=null] : iv_ruleOpCompare= ruleOpCompare EOF ;
+    public final String entryRuleOpCompare() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleOpCompare = null;
+
+
+        try {
+            // InternalUIGrammar.g:18648:49: (iv_ruleOpCompare= ruleOpCompare EOF )
+            // InternalUIGrammar.g:18649: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"
+    // InternalUIGrammar.g:18655: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 {
+            // InternalUIGrammar.g:18661:2: ( (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' ) )
+            // InternalUIGrammar.g:18662:2: (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' )
+            {
+            // InternalUIGrammar.g:18662:2: (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' )
+            int alt421=4;
+            switch ( input.LA(1) ) {
+            case 167:
+                {
+                alt421=1;
+                }
+                break;
+            case 28:
+                {
+                int LA421_2 = input.LA(2);
+
+                if ( (LA421_2==EOF||(LA421_2>=RULE_ID && LA421_2<=RULE_DECIMAL)||LA421_2==20||LA421_2==28||LA421_2==32||LA421_2==42||LA421_2==45||(LA421_2>=155 && LA421_2<=157)||LA421_2==162||(LA421_2>=180 && LA421_2<=181)||LA421_2==185||LA421_2==190||LA421_2==192||(LA421_2>=195 && LA421_2<=196)||(LA421_2>=199 && LA421_2<=208)||LA421_2==210) ) {
+                    alt421=4;
+                }
+                else if ( (LA421_2==161) ) {
+                    alt421=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return current;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 421, 2, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 30:
+                {
+                alt421=3;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 421, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt421) {
+                case 1 :
+                    // InternalUIGrammar.g:18663:3: kw= '>='
+                    {
+                    kw=(Token)match(input,167,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpCompareAccess().getGreaterThanSignEqualsSignKeyword_0());
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalUIGrammar.g:18669:3: (kw= '<' kw= '=' )
+                    {
+                    // InternalUIGrammar.g:18669:3: (kw= '<' kw= '=' )
+                    // InternalUIGrammar.g:18670:4: kw= '<' kw= '='
+                    {
+                    kw=(Token)match(input,28,FOLLOW_132); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getOpCompareAccess().getLessThanSignKeyword_1_0());
+                      			
+                    }
+                    kw=(Token)match(input,161,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getOpCompareAccess().getEqualsSignKeyword_1_1());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalUIGrammar.g:18682:3: kw= '>'
+                    {
+                    kw=(Token)match(input,30,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpCompareAccess().getGreaterThanSignKeyword_2());
+                      		
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalUIGrammar.g:18688:3: kw= '<'
+                    {
+                    kw=(Token)match(input,28,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"
+    // InternalUIGrammar.g:18697:1: entryRuleXOtherOperatorExpression returns [EObject current=null] : iv_ruleXOtherOperatorExpression= ruleXOtherOperatorExpression EOF ;
+    public final EObject entryRuleXOtherOperatorExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXOtherOperatorExpression = null;
+
+
+        try {
+            // InternalUIGrammar.g:18697:65: (iv_ruleXOtherOperatorExpression= ruleXOtherOperatorExpression EOF )
+            // InternalUIGrammar.g:18698: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"
+    // InternalUIGrammar.g:18704: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 {
+            // InternalUIGrammar.g:18710:2: ( (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* ) )
+            // InternalUIGrammar.g:18711:2: (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* )
+            {
+            // InternalUIGrammar.g:18711:2: (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* )
+            // InternalUIGrammar.g:18712:3: this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )*
+            {
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getXAdditiveExpressionParserRuleCall_0());
+              		
+            }
+            pushFollow(FOLLOW_145);
+            this_XAdditiveExpression_0=ruleXAdditiveExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_XAdditiveExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalUIGrammar.g:18720:3: ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )*
+            loop422:
+            do {
+                int alt422=2;
+                alt422 = dfa422.predict(input);
+                switch (alt422) {
+            	case 1 :
+            	    // InternalUIGrammar.g:18721:4: ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) )
+            	    {
+            	    // InternalUIGrammar.g:18721:4: ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) )
+            	    // InternalUIGrammar.g:18722:5: ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) )
+            	    {
+            	    // InternalUIGrammar.g:18732:5: ( () ( ( ruleOpOther ) ) )
+            	    // InternalUIGrammar.g:18733:6: () ( ( ruleOpOther ) )
+            	    {
+            	    // InternalUIGrammar.g:18733:6: ()
+            	    // InternalUIGrammar.g:18734:7: 
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      							current = forceCreateModelElementAndSet(
+            	      								grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
+            	      								current);
+            	      						
+            	    }
+
+            	    }
+
+            	    // InternalUIGrammar.g:18740:6: ( ( ruleOpOther ) )
+            	    // InternalUIGrammar.g:18741:7: ( ruleOpOther )
+            	    {
+            	    // InternalUIGrammar.g:18741:7: ( ruleOpOther )
+            	    // InternalUIGrammar.g:18742: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_133);
+            	    ruleOpOther();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      								afterParserOrEnumRuleCall();
+            	      							
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    // InternalUIGrammar.g:18758:4: ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) )
+            	    // InternalUIGrammar.g:18759:5: (lv_rightOperand_3_0= ruleXAdditiveExpression )
+            	    {
+            	    // InternalUIGrammar.g:18759:5: (lv_rightOperand_3_0= ruleXAdditiveExpression )
+            	    // InternalUIGrammar.g:18760:6: lv_rightOperand_3_0= ruleXAdditiveExpression
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getRightOperandXAdditiveExpressionParserRuleCall_1_1_0());
+            	      					
+            	    }
+            	    pushFollow(FOLLOW_145);
+            	    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 loop422;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXOtherOperatorExpression"
+
+
+    // $ANTLR start "entryRuleOpOther"
+    // InternalUIGrammar.g:18782:1: entryRuleOpOther returns [String current=null] : iv_ruleOpOther= ruleOpOther EOF ;
+    public final String entryRuleOpOther() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleOpOther = null;
+
+
+        try {
+            // InternalUIGrammar.g:18782:47: (iv_ruleOpOther= ruleOpOther EOF )
+            // InternalUIGrammar.g:18783: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"
+    // InternalUIGrammar.g:18789: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 {
+            // InternalUIGrammar.g:18795:2: ( (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' ) )
+            // InternalUIGrammar.g:18796:2: (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' )
+            {
+            // InternalUIGrammar.g:18796:2: (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' )
+            int alt425=9;
+            alt425 = dfa425.predict(input);
+            switch (alt425) {
+                case 1 :
+                    // InternalUIGrammar.g:18797:3: kw= '->'
+                    {
+                    kw=(Token)match(input,175,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getHyphenMinusGreaterThanSignKeyword_0());
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalUIGrammar.g:18803:3: kw= '..<'
+                    {
+                    kw=(Token)match(input,176,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopLessThanSignKeyword_1());
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalUIGrammar.g:18809:3: (kw= '>' kw= '..' )
+                    {
+                    // InternalUIGrammar.g:18809:3: (kw= '>' kw= '..' )
+                    // InternalUIGrammar.g:18810:4: kw= '>' kw= '..'
+                    {
+                    kw=(Token)match(input,30,FOLLOW_146); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_2_0());
+                      			
+                    }
+                    kw=(Token)match(input,35,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_2_1());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalUIGrammar.g:18822:3: kw= '..'
+                    {
+                    kw=(Token)match(input,35,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_3());
+                      		
+                    }
+
+                    }
+                    break;
+                case 5 :
+                    // InternalUIGrammar.g:18828:3: kw= '=>'
+                    {
+                    kw=(Token)match(input,177,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_4());
+                      		
+                    }
+
+                    }
+                    break;
+                case 6 :
+                    // InternalUIGrammar.g:18834:3: (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) )
+                    {
+                    // InternalUIGrammar.g:18834:3: (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) )
+                    // InternalUIGrammar.g:18835:4: kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' )
+                    {
+                    kw=(Token)match(input,30,FOLLOW_147); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:18840:4: ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' )
+                    int alt423=2;
+                    int LA423_0 = input.LA(1);
+
+                    if ( (LA423_0==30) ) {
+                        int LA423_1 = input.LA(2);
+
+                        if ( (LA423_1==EOF||(LA423_1>=RULE_ID && LA423_1<=RULE_DECIMAL)||LA423_1==20||LA423_1==28||LA423_1==32||LA423_1==42||LA423_1==45||(LA423_1>=155 && LA423_1<=157)||LA423_1==162||(LA423_1>=180 && LA423_1<=181)||LA423_1==185||LA423_1==190||LA423_1==192||(LA423_1>=195 && LA423_1<=196)||(LA423_1>=199 && LA423_1<=208)||LA423_1==210) ) {
+                            alt423=2;
+                        }
+                        else if ( (LA423_1==30) && (synpred16_InternalUIGrammar())) {
+                            alt423=1;
+                        }
+                        else {
+                            if (state.backtracking>0) {state.failed=true; return current;}
+                            NoViableAltException nvae =
+                                new NoViableAltException("", 423, 1, input);
+
+                            throw nvae;
+                        }
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 423, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt423) {
+                        case 1 :
+                            // InternalUIGrammar.g:18841:5: ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) )
+                            {
+                            // InternalUIGrammar.g:18841:5: ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) )
+                            // InternalUIGrammar.g:18842:6: ( ( '>' '>' ) )=> (kw= '>' kw= '>' )
+                            {
+                            // InternalUIGrammar.g:18847:6: (kw= '>' kw= '>' )
+                            // InternalUIGrammar.g:18848:7: kw= '>' kw= '>'
+                            {
+                            kw=(Token)match(input,30,FOLLOW_147); 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,30,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 :
+                            // InternalUIGrammar.g:18861:5: kw= '>'
+                            {
+                            kw=(Token)match(input,30,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 :
+                    // InternalUIGrammar.g:18869:3: (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) )
+                    {
+                    // InternalUIGrammar.g:18869:3: (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) )
+                    // InternalUIGrammar.g:18870:4: kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' )
+                    {
+                    kw=(Token)match(input,28,FOLLOW_148); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:18875:4: ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' )
+                    int alt424=3;
+                    int LA424_0 = input.LA(1);
+
+                    if ( (LA424_0==28) ) {
+                        int LA424_1 = input.LA(2);
+
+                        if ( (synpred17_InternalUIGrammar()) ) {
+                            alt424=1;
+                        }
+                        else if ( (true) ) {
+                            alt424=2;
+                        }
+                        else {
+                            if (state.backtracking>0) {state.failed=true; return current;}
+                            NoViableAltException nvae =
+                                new NoViableAltException("", 424, 1, input);
+
+                            throw nvae;
+                        }
+                    }
+                    else if ( (LA424_0==177) ) {
+                        alt424=3;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 424, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt424) {
+                        case 1 :
+                            // InternalUIGrammar.g:18876:5: ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) )
+                            {
+                            // InternalUIGrammar.g:18876:5: ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) )
+                            // InternalUIGrammar.g:18877:6: ( ( '<' '<' ) )=> (kw= '<' kw= '<' )
+                            {
+                            // InternalUIGrammar.g:18882:6: (kw= '<' kw= '<' )
+                            // InternalUIGrammar.g:18883:7: kw= '<' kw= '<'
+                            {
+                            kw=(Token)match(input,28,FOLLOW_138); 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,28,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 :
+                            // InternalUIGrammar.g:18896:5: kw= '<'
+                            {
+                            kw=(Token)match(input,28,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 :
+                            // InternalUIGrammar.g:18902:5: kw= '=>'
+                            {
+                            kw=(Token)match(input,177,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 :
+                    // InternalUIGrammar.g:18910:3: kw= '<>'
+                    {
+                    kw=(Token)match(input,178,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignGreaterThanSignKeyword_7());
+                      		
+                    }
+
+                    }
+                    break;
+                case 9 :
+                    // InternalUIGrammar.g:18916:3: kw= '?:'
+                    {
+                    kw=(Token)match(input,179,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"
+    // InternalUIGrammar.g:18925:1: entryRuleXAdditiveExpression returns [EObject current=null] : iv_ruleXAdditiveExpression= ruleXAdditiveExpression EOF ;
+    public final EObject entryRuleXAdditiveExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXAdditiveExpression = null;
+
+
+        try {
+            // InternalUIGrammar.g:18925:60: (iv_ruleXAdditiveExpression= ruleXAdditiveExpression EOF )
+            // InternalUIGrammar.g:18926: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"
+    // InternalUIGrammar.g:18932: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 {
+            // InternalUIGrammar.g:18938:2: ( (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* ) )
+            // InternalUIGrammar.g:18939:2: (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* )
+            {
+            // InternalUIGrammar.g:18939:2: (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* )
+            // InternalUIGrammar.g:18940:3: this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )*
+            {
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getXMultiplicativeExpressionParserRuleCall_0());
+              		
+            }
+            pushFollow(FOLLOW_149);
+            this_XMultiplicativeExpression_0=ruleXMultiplicativeExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_XMultiplicativeExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalUIGrammar.g:18948:3: ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )*
+            loop426:
+            do {
+                int alt426=2;
+                int LA426_0 = input.LA(1);
+
+                if ( (LA426_0==180) ) {
+                    int LA426_2 = input.LA(2);
+
+                    if ( (synpred18_InternalUIGrammar()) ) {
+                        alt426=1;
+                    }
+
+
+                }
+                else if ( (LA426_0==181) ) {
+                    int LA426_3 = input.LA(2);
+
+                    if ( (synpred18_InternalUIGrammar()) ) {
+                        alt426=1;
+                    }
+
+
+                }
+
+
+                switch (alt426) {
+            	case 1 :
+            	    // InternalUIGrammar.g:18949:4: ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) )
+            	    {
+            	    // InternalUIGrammar.g:18949:4: ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) )
+            	    // InternalUIGrammar.g:18950:5: ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) )
+            	    {
+            	    // InternalUIGrammar.g:18960:5: ( () ( ( ruleOpAdd ) ) )
+            	    // InternalUIGrammar.g:18961:6: () ( ( ruleOpAdd ) )
+            	    {
+            	    // InternalUIGrammar.g:18961:6: ()
+            	    // InternalUIGrammar.g:18962:7: 
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      							current = forceCreateModelElementAndSet(
+            	      								grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
+            	      								current);
+            	      						
+            	    }
+
+            	    }
+
+            	    // InternalUIGrammar.g:18968:6: ( ( ruleOpAdd ) )
+            	    // InternalUIGrammar.g:18969:7: ( ruleOpAdd )
+            	    {
+            	    // InternalUIGrammar.g:18969:7: ( ruleOpAdd )
+            	    // InternalUIGrammar.g:18970: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_133);
+            	    ruleOpAdd();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      								afterParserOrEnumRuleCall();
+            	      							
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    // InternalUIGrammar.g:18986:4: ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) )
+            	    // InternalUIGrammar.g:18987:5: (lv_rightOperand_3_0= ruleXMultiplicativeExpression )
+            	    {
+            	    // InternalUIGrammar.g:18987:5: (lv_rightOperand_3_0= ruleXMultiplicativeExpression )
+            	    // InternalUIGrammar.g:18988:6: lv_rightOperand_3_0= ruleXMultiplicativeExpression
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getRightOperandXMultiplicativeExpressionParserRuleCall_1_1_0());
+            	      					
+            	    }
+            	    pushFollow(FOLLOW_149);
+            	    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 loop426;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXAdditiveExpression"
+
+
+    // $ANTLR start "entryRuleOpAdd"
+    // InternalUIGrammar.g:19010:1: entryRuleOpAdd returns [String current=null] : iv_ruleOpAdd= ruleOpAdd EOF ;
+    public final String entryRuleOpAdd() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleOpAdd = null;
+
+
+        try {
+            // InternalUIGrammar.g:19010:45: (iv_ruleOpAdd= ruleOpAdd EOF )
+            // InternalUIGrammar.g:19011: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"
+    // InternalUIGrammar.g:19017:1: ruleOpAdd returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '+' | kw= '-' ) ;
+    public final AntlrDatatypeRuleToken ruleOpAdd() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:19023:2: ( (kw= '+' | kw= '-' ) )
+            // InternalUIGrammar.g:19024:2: (kw= '+' | kw= '-' )
+            {
+            // InternalUIGrammar.g:19024:2: (kw= '+' | kw= '-' )
+            int alt427=2;
+            int LA427_0 = input.LA(1);
+
+            if ( (LA427_0==180) ) {
+                alt427=1;
+            }
+            else if ( (LA427_0==181) ) {
+                alt427=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 427, 0, input);
+
+                throw nvae;
+            }
+            switch (alt427) {
+                case 1 :
+                    // InternalUIGrammar.g:19025:3: kw= '+'
+                    {
+                    kw=(Token)match(input,180,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpAddAccess().getPlusSignKeyword_0());
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalUIGrammar.g:19031:3: kw= '-'
+                    {
+                    kw=(Token)match(input,181,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"
+    // InternalUIGrammar.g:19040:1: entryRuleXMultiplicativeExpression returns [EObject current=null] : iv_ruleXMultiplicativeExpression= ruleXMultiplicativeExpression EOF ;
+    public final EObject entryRuleXMultiplicativeExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXMultiplicativeExpression = null;
+
+
+        try {
+            // InternalUIGrammar.g:19040:66: (iv_ruleXMultiplicativeExpression= ruleXMultiplicativeExpression EOF )
+            // InternalUIGrammar.g:19041: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"
+    // InternalUIGrammar.g:19047: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 {
+            // InternalUIGrammar.g:19053:2: ( (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* ) )
+            // InternalUIGrammar.g:19054:2: (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* )
+            {
+            // InternalUIGrammar.g:19054:2: (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* )
+            // InternalUIGrammar.g:19055:3: this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )*
+            {
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getXUnaryOperationParserRuleCall_0());
+              		
+            }
+            pushFollow(FOLLOW_150);
+            this_XUnaryOperation_0=ruleXUnaryOperation();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_XUnaryOperation_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalUIGrammar.g:19063:3: ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )*
+            loop428:
+            do {
+                int alt428=2;
+                switch ( input.LA(1) ) {
+                case 158:
+                    {
+                    int LA428_2 = input.LA(2);
+
+                    if ( (synpred19_InternalUIGrammar()) ) {
+                        alt428=1;
+                    }
+
+
+                    }
+                    break;
+                case 182:
+                    {
+                    int LA428_3 = input.LA(2);
+
+                    if ( (synpred19_InternalUIGrammar()) ) {
+                        alt428=1;
+                    }
+
+
+                    }
+                    break;
+                case 183:
+                    {
+                    int LA428_4 = input.LA(2);
+
+                    if ( (synpred19_InternalUIGrammar()) ) {
+                        alt428=1;
+                    }
+
+
+                    }
+                    break;
+                case 184:
+                    {
+                    int LA428_5 = input.LA(2);
+
+                    if ( (synpred19_InternalUIGrammar()) ) {
+                        alt428=1;
+                    }
+
+
+                    }
+                    break;
+
+                }
+
+                switch (alt428) {
+            	case 1 :
+            	    // InternalUIGrammar.g:19064:4: ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) )
+            	    {
+            	    // InternalUIGrammar.g:19064:4: ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) )
+            	    // InternalUIGrammar.g:19065:5: ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) )
+            	    {
+            	    // InternalUIGrammar.g:19075:5: ( () ( ( ruleOpMulti ) ) )
+            	    // InternalUIGrammar.g:19076:6: () ( ( ruleOpMulti ) )
+            	    {
+            	    // InternalUIGrammar.g:19076:6: ()
+            	    // InternalUIGrammar.g:19077:7: 
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      							current = forceCreateModelElementAndSet(
+            	      								grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
+            	      								current);
+            	      						
+            	    }
+
+            	    }
+
+            	    // InternalUIGrammar.g:19083:6: ( ( ruleOpMulti ) )
+            	    // InternalUIGrammar.g:19084:7: ( ruleOpMulti )
+            	    {
+            	    // InternalUIGrammar.g:19084:7: ( ruleOpMulti )
+            	    // InternalUIGrammar.g:19085: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_133);
+            	    ruleOpMulti();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      								afterParserOrEnumRuleCall();
+            	      							
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    // InternalUIGrammar.g:19101:4: ( (lv_rightOperand_3_0= ruleXUnaryOperation ) )
+            	    // InternalUIGrammar.g:19102:5: (lv_rightOperand_3_0= ruleXUnaryOperation )
+            	    {
+            	    // InternalUIGrammar.g:19102:5: (lv_rightOperand_3_0= ruleXUnaryOperation )
+            	    // InternalUIGrammar.g:19103:6: lv_rightOperand_3_0= ruleXUnaryOperation
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getRightOperandXUnaryOperationParserRuleCall_1_1_0());
+            	      					
+            	    }
+            	    pushFollow(FOLLOW_150);
+            	    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 loop428;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXMultiplicativeExpression"
+
+
+    // $ANTLR start "entryRuleOpMulti"
+    // InternalUIGrammar.g:19125:1: entryRuleOpMulti returns [String current=null] : iv_ruleOpMulti= ruleOpMulti EOF ;
+    public final String entryRuleOpMulti() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleOpMulti = null;
+
+
+        try {
+            // InternalUIGrammar.g:19125:47: (iv_ruleOpMulti= ruleOpMulti EOF )
+            // InternalUIGrammar.g:19126: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"
+    // InternalUIGrammar.g:19132: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 {
+            // InternalUIGrammar.g:19138:2: ( (kw= '*' | kw= '**' | kw= '/' | kw= '%' ) )
+            // InternalUIGrammar.g:19139:2: (kw= '*' | kw= '**' | kw= '/' | kw= '%' )
+            {
+            // InternalUIGrammar.g:19139:2: (kw= '*' | kw= '**' | kw= '/' | kw= '%' )
+            int alt429=4;
+            switch ( input.LA(1) ) {
+            case 158:
+                {
+                alt429=1;
+                }
+                break;
+            case 182:
+                {
+                alt429=2;
+                }
+                break;
+            case 183:
+                {
+                alt429=3;
+                }
+                break;
+            case 184:
+                {
+                alt429=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 429, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt429) {
+                case 1 :
+                    // InternalUIGrammar.g:19140:3: kw= '*'
+                    {
+                    kw=(Token)match(input,158,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpMultiAccess().getAsteriskKeyword_0());
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalUIGrammar.g:19146:3: kw= '**'
+                    {
+                    kw=(Token)match(input,182,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpMultiAccess().getAsteriskAsteriskKeyword_1());
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalUIGrammar.g:19152:3: kw= '/'
+                    {
+                    kw=(Token)match(input,183,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpMultiAccess().getSolidusKeyword_2());
+                      		
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalUIGrammar.g:19158:3: kw= '%'
+                    {
+                    kw=(Token)match(input,184,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"
+    // InternalUIGrammar.g:19167:1: entryRuleXUnaryOperation returns [EObject current=null] : iv_ruleXUnaryOperation= ruleXUnaryOperation EOF ;
+    public final EObject entryRuleXUnaryOperation() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXUnaryOperation = null;
+
+
+        try {
+            // InternalUIGrammar.g:19167:56: (iv_ruleXUnaryOperation= ruleXUnaryOperation EOF )
+            // InternalUIGrammar.g:19168: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"
+    // InternalUIGrammar.g:19174: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 {
+            // InternalUIGrammar.g:19180:2: ( ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression ) )
+            // InternalUIGrammar.g:19181:2: ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression )
+            {
+            // InternalUIGrammar.g:19181:2: ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression )
+            int alt430=2;
+            int LA430_0 = input.LA(1);
+
+            if ( ((LA430_0>=180 && LA430_0<=181)||LA430_0==185) ) {
+                alt430=1;
+            }
+            else if ( ((LA430_0>=RULE_ID && LA430_0<=RULE_DECIMAL)||LA430_0==20||LA430_0==28||LA430_0==32||LA430_0==42||LA430_0==45||(LA430_0>=155 && LA430_0<=157)||LA430_0==162||LA430_0==190||LA430_0==192||(LA430_0>=195 && LA430_0<=196)||(LA430_0>=199 && LA430_0<=208)||LA430_0==210) ) {
+                alt430=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 430, 0, input);
+
+                throw nvae;
+            }
+            switch (alt430) {
+                case 1 :
+                    // InternalUIGrammar.g:19182:3: ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) )
+                    {
+                    // InternalUIGrammar.g:19182:3: ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) )
+                    // InternalUIGrammar.g:19183:4: () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) )
+                    {
+                    // InternalUIGrammar.g:19183:4: ()
+                    // InternalUIGrammar.g:19184:5: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					current = forceCreateModelElement(
+                      						grammarAccess.getXUnaryOperationAccess().getXUnaryOperationAction_0_0(),
+                      						current);
+                      				
+                    }
+
+                    }
+
+                    // InternalUIGrammar.g:19190:4: ( ( ruleOpUnary ) )
+                    // InternalUIGrammar.g:19191:5: ( ruleOpUnary )
+                    {
+                    // InternalUIGrammar.g:19191:5: ( ruleOpUnary )
+                    // InternalUIGrammar.g:19192: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_133);
+                    ruleOpUnary();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalUIGrammar.g:19206:4: ( (lv_operand_2_0= ruleXUnaryOperation ) )
+                    // InternalUIGrammar.g:19207:5: (lv_operand_2_0= ruleXUnaryOperation )
+                    {
+                    // InternalUIGrammar.g:19207:5: (lv_operand_2_0= ruleXUnaryOperation )
+                    // InternalUIGrammar.g:19208: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 :
+                    // InternalUIGrammar.g:19227: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"
+    // InternalUIGrammar.g:19239:1: entryRuleOpUnary returns [String current=null] : iv_ruleOpUnary= ruleOpUnary EOF ;
+    public final String entryRuleOpUnary() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleOpUnary = null;
+
+
+        try {
+            // InternalUIGrammar.g:19239:47: (iv_ruleOpUnary= ruleOpUnary EOF )
+            // InternalUIGrammar.g:19240: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"
+    // InternalUIGrammar.g:19246: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 {
+            // InternalUIGrammar.g:19252:2: ( (kw= '!' | kw= '-' | kw= '+' ) )
+            // InternalUIGrammar.g:19253:2: (kw= '!' | kw= '-' | kw= '+' )
+            {
+            // InternalUIGrammar.g:19253:2: (kw= '!' | kw= '-' | kw= '+' )
+            int alt431=3;
+            switch ( input.LA(1) ) {
+            case 185:
+                {
+                alt431=1;
+                }
+                break;
+            case 181:
+                {
+                alt431=2;
+                }
+                break;
+            case 180:
+                {
+                alt431=3;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 431, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt431) {
+                case 1 :
+                    // InternalUIGrammar.g:19254:3: kw= '!'
+                    {
+                    kw=(Token)match(input,185,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpUnaryAccess().getExclamationMarkKeyword_0());
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalUIGrammar.g:19260:3: kw= '-'
+                    {
+                    kw=(Token)match(input,181,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpUnaryAccess().getHyphenMinusKeyword_1());
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalUIGrammar.g:19266:3: kw= '+'
+                    {
+                    kw=(Token)match(input,180,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"
+    // InternalUIGrammar.g:19275:1: entryRuleXCastedExpression returns [EObject current=null] : iv_ruleXCastedExpression= ruleXCastedExpression EOF ;
+    public final EObject entryRuleXCastedExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXCastedExpression = null;
+
+
+        try {
+            // InternalUIGrammar.g:19275:58: (iv_ruleXCastedExpression= ruleXCastedExpression EOF )
+            // InternalUIGrammar.g:19276: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"
+    // InternalUIGrammar.g:19282: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 {
+            // InternalUIGrammar.g:19288:2: ( (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* ) )
+            // InternalUIGrammar.g:19289:2: (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* )
+            {
+            // InternalUIGrammar.g:19289:2: (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* )
+            // InternalUIGrammar.g:19290: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_151);
+            this_XPostfixOperation_0=ruleXPostfixOperation();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_XPostfixOperation_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalUIGrammar.g:19298:3: ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )*
+            loop432:
+            do {
+                int alt432=2;
+                int LA432_0 = input.LA(1);
+
+                if ( (LA432_0==15) ) {
+                    int LA432_2 = input.LA(2);
+
+                    if ( (synpred20_InternalUIGrammar()) ) {
+                        alt432=1;
+                    }
+
+
+                }
+
+
+                switch (alt432) {
+            	case 1 :
+            	    // InternalUIGrammar.g:19299:4: ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) )
+            	    {
+            	    // InternalUIGrammar.g:19299:4: ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) )
+            	    // InternalUIGrammar.g:19300:5: ( ( () 'as' ) )=> ( () otherlv_2= 'as' )
+            	    {
+            	    // InternalUIGrammar.g:19306:5: ( () otherlv_2= 'as' )
+            	    // InternalUIGrammar.g:19307:6: () otherlv_2= 'as'
+            	    {
+            	    // InternalUIGrammar.g:19307:6: ()
+            	    // InternalUIGrammar.g:19308:7: 
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      							current = forceCreateModelElementAndSet(
+            	      								grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0(),
+            	      								current);
+            	      						
+            	    }
+
+            	    }
+
+            	    otherlv_2=(Token)match(input,15,FOLLOW_16); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						newLeafNode(otherlv_2, grammarAccess.getXCastedExpressionAccess().getAsKeyword_1_0_0_1());
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+            	    // InternalUIGrammar.g:19320:4: ( (lv_type_3_0= ruleJvmTypeReference ) )
+            	    // InternalUIGrammar.g:19321:5: (lv_type_3_0= ruleJvmTypeReference )
+            	    {
+            	    // InternalUIGrammar.g:19321:5: (lv_type_3_0= ruleJvmTypeReference )
+            	    // InternalUIGrammar.g:19322:6: lv_type_3_0= ruleJvmTypeReference
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getXCastedExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_1_0());
+            	      					
+            	    }
+            	    pushFollow(FOLLOW_151);
+            	    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 loop432;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXCastedExpression"
+
+
+    // $ANTLR start "entryRuleXPostfixOperation"
+    // InternalUIGrammar.g:19344:1: entryRuleXPostfixOperation returns [EObject current=null] : iv_ruleXPostfixOperation= ruleXPostfixOperation EOF ;
+    public final EObject entryRuleXPostfixOperation() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXPostfixOperation = null;
+
+
+        try {
+            // InternalUIGrammar.g:19344:58: (iv_ruleXPostfixOperation= ruleXPostfixOperation EOF )
+            // InternalUIGrammar.g:19345: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"
+    // InternalUIGrammar.g:19351: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 {
+            // InternalUIGrammar.g:19357:2: ( (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? ) )
+            // InternalUIGrammar.g:19358:2: (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? )
+            {
+            // InternalUIGrammar.g:19358:2: (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? )
+            // InternalUIGrammar.g:19359:3: this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )?
+            {
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getXPostfixOperationAccess().getXMemberFeatureCallParserRuleCall_0());
+              		
+            }
+            pushFollow(FOLLOW_152);
+            this_XMemberFeatureCall_0=ruleXMemberFeatureCall();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_XMemberFeatureCall_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalUIGrammar.g:19367:3: ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )?
+            int alt433=2;
+            int LA433_0 = input.LA(1);
+
+            if ( (LA433_0==186) ) {
+                int LA433_1 = input.LA(2);
+
+                if ( (synpred21_InternalUIGrammar()) ) {
+                    alt433=1;
+                }
+            }
+            else if ( (LA433_0==29) ) {
+                int LA433_2 = input.LA(2);
+
+                if ( (synpred21_InternalUIGrammar()) ) {
+                    alt433=1;
+                }
+            }
+            switch (alt433) {
+                case 1 :
+                    // InternalUIGrammar.g:19368:4: ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) )
+                    {
+                    // InternalUIGrammar.g:19378:4: ( () ( ( ruleOpPostfix ) ) )
+                    // InternalUIGrammar.g:19379:5: () ( ( ruleOpPostfix ) )
+                    {
+                    // InternalUIGrammar.g:19379:5: ()
+                    // InternalUIGrammar.g:19380:6: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						current = forceCreateModelElementAndSet(
+                      							grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0(),
+                      							current);
+                      					
+                    }
+
+                    }
+
+                    // InternalUIGrammar.g:19386:5: ( ( ruleOpPostfix ) )
+                    // InternalUIGrammar.g:19387:6: ( ruleOpPostfix )
+                    {
+                    // InternalUIGrammar.g:19387:6: ( ruleOpPostfix )
+                    // InternalUIGrammar.g:19388: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"
+    // InternalUIGrammar.g:19408:1: entryRuleOpPostfix returns [String current=null] : iv_ruleOpPostfix= ruleOpPostfix EOF ;
+    public final String entryRuleOpPostfix() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleOpPostfix = null;
+
+
+        try {
+            // InternalUIGrammar.g:19408:49: (iv_ruleOpPostfix= ruleOpPostfix EOF )
+            // InternalUIGrammar.g:19409: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"
+    // InternalUIGrammar.g:19415:1: ruleOpPostfix returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '++' | kw= '--' ) ;
+    public final AntlrDatatypeRuleToken ruleOpPostfix() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:19421:2: ( (kw= '++' | kw= '--' ) )
+            // InternalUIGrammar.g:19422:2: (kw= '++' | kw= '--' )
+            {
+            // InternalUIGrammar.g:19422:2: (kw= '++' | kw= '--' )
+            int alt434=2;
+            int LA434_0 = input.LA(1);
+
+            if ( (LA434_0==186) ) {
+                alt434=1;
+            }
+            else if ( (LA434_0==29) ) {
+                alt434=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 434, 0, input);
+
+                throw nvae;
+            }
+            switch (alt434) {
+                case 1 :
+                    // InternalUIGrammar.g:19423:3: kw= '++'
+                    {
+                    kw=(Token)match(input,186,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpPostfixAccess().getPlusSignPlusSignKeyword_0());
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalUIGrammar.g:19429:3: kw= '--'
+                    {
+                    kw=(Token)match(input,29,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"
+    // InternalUIGrammar.g:19438:1: entryRuleXMemberFeatureCall returns [EObject current=null] : iv_ruleXMemberFeatureCall= ruleXMemberFeatureCall EOF ;
+    public final EObject entryRuleXMemberFeatureCall() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXMemberFeatureCall = null;
+
+
+        try {
+            // InternalUIGrammar.g:19438:59: (iv_ruleXMemberFeatureCall= ruleXMemberFeatureCall EOF )
+            // InternalUIGrammar.g:19439: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"
+    // InternalUIGrammar.g:19445: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 {
+            // InternalUIGrammar.g:19451: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 ) )? ) )* ) )
+            // InternalUIGrammar.g:19452: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 ) )? ) )* )
+            {
+            // InternalUIGrammar.g:19452: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 ) )? ) )* )
+            // InternalUIGrammar.g:19453: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_153);
+            this_XPrimaryExpression_0=ruleXPrimaryExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_XPrimaryExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalUIGrammar.g:19461: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 ) )? ) )*
+            loop443:
+            do {
+                int alt443=3;
+                switch ( input.LA(1) ) {
+                case 31:
+                    {
+                    int LA443_2 = input.LA(2);
+
+                    if ( (synpred22_InternalUIGrammar()) ) {
+                        alt443=1;
+                    }
+                    else if ( (synpred23_InternalUIGrammar()) ) {
+                        alt443=2;
+                    }
+
+
+                    }
+                    break;
+                case 187:
+                    {
+                    int LA443_3 = input.LA(2);
+
+                    if ( (synpred22_InternalUIGrammar()) ) {
+                        alt443=1;
+                    }
+                    else if ( (synpred23_InternalUIGrammar()) ) {
+                        alt443=2;
+                    }
+
+
+                    }
+                    break;
+                case 188:
+                    {
+                    int LA443_4 = input.LA(2);
+
+                    if ( (synpred23_InternalUIGrammar()) ) {
+                        alt443=2;
+                    }
+
+
+                    }
+                    break;
+
+                }
+
+                switch (alt443) {
+            	case 1 :
+            	    // InternalUIGrammar.g:19462:4: ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) )
+            	    {
+            	    // InternalUIGrammar.g:19462:4: ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) )
+            	    // InternalUIGrammar.g:19463:5: ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) )
+            	    {
+            	    // InternalUIGrammar.g:19463:5: ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )
+            	    // InternalUIGrammar.g:19464:6: ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
+            	    {
+            	    // InternalUIGrammar.g:19484:6: ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
+            	    // InternalUIGrammar.g:19485:7: () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign
+            	    {
+            	    // InternalUIGrammar.g:19485:7: ()
+            	    // InternalUIGrammar.g:19486:8: 
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      								current = forceCreateModelElementAndSet(
+            	      									grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0(),
+            	      									current);
+            	      							
+            	    }
+
+            	    }
+
+            	    // InternalUIGrammar.g:19492:7: (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) )
+            	    int alt435=2;
+            	    int LA435_0 = input.LA(1);
+
+            	    if ( (LA435_0==31) ) {
+            	        alt435=1;
+            	    }
+            	    else if ( (LA435_0==187) ) {
+            	        alt435=2;
+            	    }
+            	    else {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        NoViableAltException nvae =
+            	            new NoViableAltException("", 435, 0, input);
+
+            	        throw nvae;
+            	    }
+            	    switch (alt435) {
+            	        case 1 :
+            	            // InternalUIGrammar.g:19493:8: otherlv_2= '.'
+            	            {
+            	            otherlv_2=(Token)match(input,31,FOLLOW_154); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              								newLeafNode(otherlv_2, grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_0_0_0_1_0());
+            	              							
+            	            }
+
+            	            }
+            	            break;
+            	        case 2 :
+            	            // InternalUIGrammar.g:19498:8: ( (lv_explicitStatic_3_0= '::' ) )
+            	            {
+            	            // InternalUIGrammar.g:19498:8: ( (lv_explicitStatic_3_0= '::' ) )
+            	            // InternalUIGrammar.g:19499:9: (lv_explicitStatic_3_0= '::' )
+            	            {
+            	            // InternalUIGrammar.g:19499:9: (lv_explicitStatic_3_0= '::' )
+            	            // InternalUIGrammar.g:19500:10: lv_explicitStatic_3_0= '::'
+            	            {
+            	            lv_explicitStatic_3_0=(Token)match(input,187,FOLLOW_154); 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;
+
+            	    }
+
+            	    // InternalUIGrammar.g:19513:7: ( ( ruleFeatureCallID ) )
+            	    // InternalUIGrammar.g:19514:8: ( ruleFeatureCallID )
+            	    {
+            	    // InternalUIGrammar.g:19514:8: ( ruleFeatureCallID )
+            	    // InternalUIGrammar.g:19515: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_132);
+            	    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_133);
+            	    ruleOpSingleAssign();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      							afterParserOrEnumRuleCall();
+            	      						
+            	    }
+
+            	    }
+
+
+            	    }
+
+            	    // InternalUIGrammar.g:19538:5: ( (lv_value_6_0= ruleXAssignment ) )
+            	    // InternalUIGrammar.g:19539:6: (lv_value_6_0= ruleXAssignment )
+            	    {
+            	    // InternalUIGrammar.g:19539:6: (lv_value_6_0= ruleXAssignment )
+            	    // InternalUIGrammar.g:19540:7: lv_value_6_0= ruleXAssignment
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getValueXAssignmentParserRuleCall_1_0_1_0());
+            	      						
+            	    }
+            	    pushFollow(FOLLOW_153);
+            	    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 :
+            	    // InternalUIGrammar.g:19559: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 ) )? )
+            	    {
+            	    // InternalUIGrammar.g:19559: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 ) )? )
+            	    // InternalUIGrammar.g:19560: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 ) )?
+            	    {
+            	    // InternalUIGrammar.g:19560:5: ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) )
+            	    // InternalUIGrammar.g:19561:6: ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) )
+            	    {
+            	    // InternalUIGrammar.g:19581:6: ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) )
+            	    // InternalUIGrammar.g:19582:7: () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) )
+            	    {
+            	    // InternalUIGrammar.g:19582:7: ()
+            	    // InternalUIGrammar.g:19583:8: 
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      								current = forceCreateModelElementAndSet(
+            	      									grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0(),
+            	      									current);
+            	      							
+            	    }
+
+            	    }
+
+            	    // InternalUIGrammar.g:19589:7: (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) )
+            	    int alt436=3;
+            	    switch ( input.LA(1) ) {
+            	    case 31:
+            	        {
+            	        alt436=1;
+            	        }
+            	        break;
+            	    case 188:
+            	        {
+            	        alt436=2;
+            	        }
+            	        break;
+            	    case 187:
+            	        {
+            	        alt436=3;
+            	        }
+            	        break;
+            	    default:
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        NoViableAltException nvae =
+            	            new NoViableAltException("", 436, 0, input);
+
+            	        throw nvae;
+            	    }
+
+            	    switch (alt436) {
+            	        case 1 :
+            	            // InternalUIGrammar.g:19590:8: otherlv_8= '.'
+            	            {
+            	            otherlv_8=(Token)match(input,31,FOLLOW_155); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              								newLeafNode(otherlv_8, grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_1_0_0_1_0());
+            	              							
+            	            }
+
+            	            }
+            	            break;
+            	        case 2 :
+            	            // InternalUIGrammar.g:19595:8: ( (lv_nullSafe_9_0= '?.' ) )
+            	            {
+            	            // InternalUIGrammar.g:19595:8: ( (lv_nullSafe_9_0= '?.' ) )
+            	            // InternalUIGrammar.g:19596:9: (lv_nullSafe_9_0= '?.' )
+            	            {
+            	            // InternalUIGrammar.g:19596:9: (lv_nullSafe_9_0= '?.' )
+            	            // InternalUIGrammar.g:19597:10: lv_nullSafe_9_0= '?.'
+            	            {
+            	            lv_nullSafe_9_0=(Token)match(input,188,FOLLOW_155); 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 :
+            	            // InternalUIGrammar.g:19610:8: ( (lv_explicitStatic_10_0= '::' ) )
+            	            {
+            	            // InternalUIGrammar.g:19610:8: ( (lv_explicitStatic_10_0= '::' ) )
+            	            // InternalUIGrammar.g:19611:9: (lv_explicitStatic_10_0= '::' )
+            	            {
+            	            // InternalUIGrammar.g:19611:9: (lv_explicitStatic_10_0= '::' )
+            	            // InternalUIGrammar.g:19612:10: lv_explicitStatic_10_0= '::'
+            	            {
+            	            lv_explicitStatic_10_0=(Token)match(input,187,FOLLOW_155); 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;
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    // InternalUIGrammar.g:19627:5: (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )?
+            	    int alt438=2;
+            	    int LA438_0 = input.LA(1);
+
+            	    if ( (LA438_0==28) ) {
+            	        alt438=1;
+            	    }
+            	    switch (alt438) {
+            	        case 1 :
+            	            // InternalUIGrammar.g:19628:6: otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>'
+            	            {
+            	            otherlv_11=(Token)match(input,28,FOLLOW_156); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              						newLeafNode(otherlv_11, grammarAccess.getXMemberFeatureCallAccess().getLessThanSignKeyword_1_1_1_0());
+            	              					
+            	            }
+            	            // InternalUIGrammar.g:19632:6: ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) )
+            	            // InternalUIGrammar.g:19633:7: (lv_typeArguments_12_0= ruleJvmArgumentTypeReference )
+            	            {
+            	            // InternalUIGrammar.g:19633:7: (lv_typeArguments_12_0= ruleJvmArgumentTypeReference )
+            	            // InternalUIGrammar.g:19634:8: lv_typeArguments_12_0= ruleJvmArgumentTypeReference
+            	            {
+            	            if ( state.backtracking==0 ) {
+
+            	              								newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_1_0());
+            	              							
+            	            }
+            	            pushFollow(FOLLOW_157);
+            	            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();
+            	              							
+            	            }
+
+            	            }
+
+
+            	            }
+
+            	            // InternalUIGrammar.g:19651:6: (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )*
+            	            loop437:
+            	            do {
+            	                int alt437=2;
+            	                int LA437_0 = input.LA(1);
+
+            	                if ( (LA437_0==102) ) {
+            	                    alt437=1;
+            	                }
+
+
+            	                switch (alt437) {
+            	            	case 1 :
+            	            	    // InternalUIGrammar.g:19652:7: otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) )
+            	            	    {
+            	            	    otherlv_13=(Token)match(input,102,FOLLOW_156); if (state.failed) return current;
+            	            	    if ( state.backtracking==0 ) {
+
+            	            	      							newLeafNode(otherlv_13, grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_1_2_0());
+            	            	      						
+            	            	    }
+            	            	    // InternalUIGrammar.g:19656:7: ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) )
+            	            	    // InternalUIGrammar.g:19657:8: (lv_typeArguments_14_0= ruleJvmArgumentTypeReference )
+            	            	    {
+            	            	    // InternalUIGrammar.g:19657:8: (lv_typeArguments_14_0= ruleJvmArgumentTypeReference )
+            	            	    // InternalUIGrammar.g:19658:9: lv_typeArguments_14_0= ruleJvmArgumentTypeReference
+            	            	    {
+            	            	    if ( state.backtracking==0 ) {
+
+            	            	      									newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_2_1_0());
+            	            	      								
+            	            	    }
+            	            	    pushFollow(FOLLOW_157);
+            	            	    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 loop437;
+            	                }
+            	            } while (true);
+
+            	            otherlv_15=(Token)match(input,30,FOLLOW_155); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              						newLeafNode(otherlv_15, grammarAccess.getXMemberFeatureCallAccess().getGreaterThanSignKeyword_1_1_1_3());
+            	              					
+            	            }
+
+            	            }
+            	            break;
+
+            	    }
+
+            	    // InternalUIGrammar.g:19681:5: ( ( ruleIdOrSuper ) )
+            	    // InternalUIGrammar.g:19682:6: ( ruleIdOrSuper )
+            	    {
+            	    // InternalUIGrammar.g:19682:6: ( ruleIdOrSuper )
+            	    // InternalUIGrammar.g:19683: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_158);
+            	    ruleIdOrSuper();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      							afterParserOrEnumRuleCall();
+            	      						
+            	    }
+
+            	    }
+
+
+            	    }
+
+            	    // InternalUIGrammar.g:19697: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 alt441=2;
+            	    alt441 = dfa441.predict(input);
+            	    switch (alt441) {
+            	        case 1 :
+            	            // InternalUIGrammar.g:19698: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= ')'
+            	            {
+            	            // InternalUIGrammar.g:19698:6: ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) )
+            	            // InternalUIGrammar.g:19699:7: ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' )
+            	            {
+            	            // InternalUIGrammar.g:19703:7: (lv_explicitOperationCall_17_0= '(' )
+            	            // InternalUIGrammar.g:19704:8: lv_explicitOperationCall_17_0= '('
+            	            {
+            	            lv_explicitOperationCall_17_0=(Token)match(input,45,FOLLOW_159); 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, "(");
+            	              							
+            	            }
+
+            	            }
+
+
+            	            }
+
+            	            // InternalUIGrammar.g:19716:6: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )?
+            	            int alt440=3;
+            	            alt440 = dfa440.predict(input);
+            	            switch (alt440) {
+            	                case 1 :
+            	                    // InternalUIGrammar.g:19717:7: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) )
+            	                    {
+            	                    // InternalUIGrammar.g:19717:7: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) )
+            	                    // InternalUIGrammar.g:19718:8: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure )
+            	                    {
+            	                    // InternalUIGrammar.g:19743:8: (lv_memberCallArguments_18_0= ruleXShortClosure )
+            	                    // InternalUIGrammar.g:19744:9: lv_memberCallArguments_18_0= ruleXShortClosure
+            	                    {
+            	                    if ( state.backtracking==0 ) {
+
+            	                      									newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXShortClosureParserRuleCall_1_1_3_1_0_0());
+            	                      								
+            	                    }
+            	                    pushFollow(FOLLOW_36);
+            	                    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 :
+            	                    // InternalUIGrammar.g:19762:7: ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* )
+            	                    {
+            	                    // InternalUIGrammar.g:19762:7: ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* )
+            	                    // InternalUIGrammar.g:19763:8: ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )*
+            	                    {
+            	                    // InternalUIGrammar.g:19763:8: ( (lv_memberCallArguments_19_0= ruleXExpression ) )
+            	                    // InternalUIGrammar.g:19764:9: (lv_memberCallArguments_19_0= ruleXExpression )
+            	                    {
+            	                    // InternalUIGrammar.g:19764:9: (lv_memberCallArguments_19_0= ruleXExpression )
+            	                    // InternalUIGrammar.g:19765:10: lv_memberCallArguments_19_0= ruleXExpression
+            	                    {
+            	                    if ( state.backtracking==0 ) {
+
+            	                      										newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_0_0());
+            	                      									
+            	                    }
+            	                    pushFollow(FOLLOW_94);
+            	                    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();
+            	                      									
+            	                    }
+
+            	                    }
+
+
+            	                    }
+
+            	                    // InternalUIGrammar.g:19782:8: (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )*
+            	                    loop439:
+            	                    do {
+            	                        int alt439=2;
+            	                        int LA439_0 = input.LA(1);
+
+            	                        if ( (LA439_0==102) ) {
+            	                            alt439=1;
+            	                        }
+
+
+            	                        switch (alt439) {
+            	                    	case 1 :
+            	                    	    // InternalUIGrammar.g:19783:9: otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) )
+            	                    	    {
+            	                    	    otherlv_20=(Token)match(input,102,FOLLOW_133); if (state.failed) return current;
+            	                    	    if ( state.backtracking==0 ) {
+
+            	                    	      									newLeafNode(otherlv_20, grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_3_1_1_1_0());
+            	                    	      								
+            	                    	    }
+            	                    	    // InternalUIGrammar.g:19787:9: ( (lv_memberCallArguments_21_0= ruleXExpression ) )
+            	                    	    // InternalUIGrammar.g:19788:10: (lv_memberCallArguments_21_0= ruleXExpression )
+            	                    	    {
+            	                    	    // InternalUIGrammar.g:19788:10: (lv_memberCallArguments_21_0= ruleXExpression )
+            	                    	    // InternalUIGrammar.g:19789:11: lv_memberCallArguments_21_0= ruleXExpression
+            	                    	    {
+            	                    	    if ( state.backtracking==0 ) {
+
+            	                    	      											newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_1_1_0());
+            	                    	      										
+            	                    	    }
+            	                    	    pushFollow(FOLLOW_94);
+            	                    	    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 loop439;
+            	                        }
+            	                    } while (true);
+
+
+            	                    }
+
+
+            	                    }
+            	                    break;
+
+            	            }
+
+            	            otherlv_22=(Token)match(input,47,FOLLOW_160); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              						newLeafNode(otherlv_22, grammarAccess.getXMemberFeatureCallAccess().getRightParenthesisKeyword_1_1_3_2());
+            	              					
+            	            }
+
+            	            }
+            	            break;
+
+            	    }
+
+            	    // InternalUIGrammar.g:19814:5: ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )?
+            	    int alt442=2;
+            	    alt442 = dfa442.predict(input);
+            	    switch (alt442) {
+            	        case 1 :
+            	            // InternalUIGrammar.g:19815:6: ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure )
+            	            {
+            	            // InternalUIGrammar.g:19821:6: (lv_memberCallArguments_23_0= ruleXClosure )
+            	            // InternalUIGrammar.g:19822:7: lv_memberCallArguments_23_0= ruleXClosure
+            	            {
+            	            if ( state.backtracking==0 ) {
+
+            	              							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXClosureParserRuleCall_1_1_4_0());
+            	              						
+            	            }
+            	            pushFollow(FOLLOW_153);
+            	            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 loop443;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXMemberFeatureCall"
+
+
+    // $ANTLR start "entryRuleXPrimaryExpression"
+    // InternalUIGrammar.g:19845:1: entryRuleXPrimaryExpression returns [EObject current=null] : iv_ruleXPrimaryExpression= ruleXPrimaryExpression EOF ;
+    public final EObject entryRuleXPrimaryExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXPrimaryExpression = null;
+
+
+        try {
+            // InternalUIGrammar.g:19845:59: (iv_ruleXPrimaryExpression= ruleXPrimaryExpression EOF )
+            // InternalUIGrammar.g:19846: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"
+    // InternalUIGrammar.g:19852: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 {
+            // InternalUIGrammar.g:19858: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 ) )
+            // InternalUIGrammar.g:19859: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 )
+            {
+            // InternalUIGrammar.g:19859: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 alt444=15;
+            alt444 = dfa444.predict(input);
+            switch (alt444) {
+                case 1 :
+                    // InternalUIGrammar.g:19860: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 :
+                    // InternalUIGrammar.g:19869: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 :
+                    // InternalUIGrammar.g:19878: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 :
+                    // InternalUIGrammar.g:19887:3: ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression )
+                    {
+                    // InternalUIGrammar.g:19887:3: ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression )
+                    // InternalUIGrammar.g:19888: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 :
+                    // InternalUIGrammar.g:19905: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 :
+                    // InternalUIGrammar.g:19914: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 :
+                    // InternalUIGrammar.g:19923: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 :
+                    // InternalUIGrammar.g:19932:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression )
+                    {
+                    // InternalUIGrammar.g:19932:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression )
+                    // InternalUIGrammar.g:19933: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 :
+                    // InternalUIGrammar.g:19956: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 :
+                    // InternalUIGrammar.g:19965: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 :
+                    // InternalUIGrammar.g:19974: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 :
+                    // InternalUIGrammar.g:19983: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 :
+                    // InternalUIGrammar.g:19992: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 :
+                    // InternalUIGrammar.g:20001: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 :
+                    // InternalUIGrammar.g:20010: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"
+    // InternalUIGrammar.g:20022:1: entryRuleXLiteral returns [EObject current=null] : iv_ruleXLiteral= ruleXLiteral EOF ;
+    public final EObject entryRuleXLiteral() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXLiteral = null;
+
+
+        try {
+            // InternalUIGrammar.g:20022:49: (iv_ruleXLiteral= ruleXLiteral EOF )
+            // InternalUIGrammar.g:20023: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"
+    // InternalUIGrammar.g:20029: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 {
+            // InternalUIGrammar.g:20035: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 ) )
+            // InternalUIGrammar.g:20036: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 )
+            {
+            // InternalUIGrammar.g:20036: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 alt445=7;
+            int LA445_0 = input.LA(1);
+
+            if ( (LA445_0==162) ) {
+                alt445=1;
+            }
+            else if ( (LA445_0==32) && (synpred29_InternalUIGrammar())) {
+                alt445=2;
+            }
+            else if ( ((LA445_0>=202 && LA445_0<=203)) ) {
+                alt445=3;
+            }
+            else if ( ((LA445_0>=RULE_INT && LA445_0<=RULE_DECIMAL)) ) {
+                alt445=4;
+            }
+            else if ( (LA445_0==204) ) {
+                alt445=5;
+            }
+            else if ( (LA445_0==RULE_STRING) ) {
+                alt445=6;
+            }
+            else if ( (LA445_0==205) ) {
+                alt445=7;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 445, 0, input);
+
+                throw nvae;
+            }
+            switch (alt445) {
+                case 1 :
+                    // InternalUIGrammar.g:20037: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 :
+                    // InternalUIGrammar.g:20046:3: ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure )
+                    {
+                    // InternalUIGrammar.g:20046:3: ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure )
+                    // InternalUIGrammar.g:20047: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 :
+                    // InternalUIGrammar.g:20063: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 :
+                    // InternalUIGrammar.g:20072: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 :
+                    // InternalUIGrammar.g:20081: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 :
+                    // InternalUIGrammar.g:20090: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 :
+                    // InternalUIGrammar.g:20099: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"
+    // InternalUIGrammar.g:20111:1: entryRuleXCollectionLiteral returns [EObject current=null] : iv_ruleXCollectionLiteral= ruleXCollectionLiteral EOF ;
+    public final EObject entryRuleXCollectionLiteral() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXCollectionLiteral = null;
+
+
+        try {
+            // InternalUIGrammar.g:20111:59: (iv_ruleXCollectionLiteral= ruleXCollectionLiteral EOF )
+            // InternalUIGrammar.g:20112: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"
+    // InternalUIGrammar.g:20118: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 {
+            // InternalUIGrammar.g:20124:2: ( (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral ) )
+            // InternalUIGrammar.g:20125:2: (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral )
+            {
+            // InternalUIGrammar.g:20125:2: (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral )
+            int alt446=2;
+            int LA446_0 = input.LA(1);
+
+            if ( (LA446_0==162) ) {
+                int LA446_1 = input.LA(2);
+
+                if ( (LA446_1==32) ) {
+                    alt446=2;
+                }
+                else if ( (LA446_1==20) ) {
+                    alt446=1;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return current;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 446, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 446, 0, input);
+
+                throw nvae;
+            }
+            switch (alt446) {
+                case 1 :
+                    // InternalUIGrammar.g:20126: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 :
+                    // InternalUIGrammar.g:20135: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"
+    // InternalUIGrammar.g:20147:1: entryRuleXSetLiteral returns [EObject current=null] : iv_ruleXSetLiteral= ruleXSetLiteral EOF ;
+    public final EObject entryRuleXSetLiteral() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXSetLiteral = null;
+
+
+        try {
+            // InternalUIGrammar.g:20147:52: (iv_ruleXSetLiteral= ruleXSetLiteral EOF )
+            // InternalUIGrammar.g:20148: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"
+    // InternalUIGrammar.g:20154: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 {
+            // InternalUIGrammar.g:20160:2: ( ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' ) )
+            // InternalUIGrammar.g:20161:2: ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' )
+            {
+            // InternalUIGrammar.g:20161:2: ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' )
+            // InternalUIGrammar.g:20162:3: () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}'
+            {
+            // InternalUIGrammar.g:20162:3: ()
+            // InternalUIGrammar.g:20163:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXSetLiteralAccess().getXSetLiteralAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,162,FOLLOW_11); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXSetLiteralAccess().getNumberSignKeyword_1());
+              		
+            }
+            otherlv_2=(Token)match(input,20,FOLLOW_161); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getXSetLiteralAccess().getLeftCurlyBracketKeyword_2());
+              		
+            }
+            // InternalUIGrammar.g:20177:3: ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )?
+            int alt448=2;
+            int LA448_0 = input.LA(1);
+
+            if ( ((LA448_0>=RULE_ID && LA448_0<=RULE_DECIMAL)||LA448_0==20||LA448_0==28||LA448_0==32||LA448_0==42||LA448_0==45||(LA448_0>=155 && LA448_0<=157)||LA448_0==162||(LA448_0>=180 && LA448_0<=181)||LA448_0==185||LA448_0==190||LA448_0==192||(LA448_0>=195 && LA448_0<=196)||(LA448_0>=199 && LA448_0<=208)||LA448_0==210) ) {
+                alt448=1;
+            }
+            switch (alt448) {
+                case 1 :
+                    // InternalUIGrammar.g:20178:4: ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
+                    {
+                    // InternalUIGrammar.g:20178:4: ( (lv_elements_3_0= ruleXExpression ) )
+                    // InternalUIGrammar.g:20179:5: (lv_elements_3_0= ruleXExpression )
+                    {
+                    // InternalUIGrammar.g:20179:5: (lv_elements_3_0= ruleXExpression )
+                    // InternalUIGrammar.g:20180:6: lv_elements_3_0= ruleXExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_162);
+                    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();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalUIGrammar.g:20197:4: (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
+                    loop447:
+                    do {
+                        int alt447=2;
+                        int LA447_0 = input.LA(1);
+
+                        if ( (LA447_0==102) ) {
+                            alt447=1;
+                        }
+
+
+                        switch (alt447) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:20198:5: otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) )
+                    	    {
+                    	    otherlv_4=(Token)match(input,102,FOLLOW_133); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      					newLeafNode(otherlv_4, grammarAccess.getXSetLiteralAccess().getCommaKeyword_3_1_0());
+                    	      				
+                    	    }
+                    	    // InternalUIGrammar.g:20202:5: ( (lv_elements_5_0= ruleXExpression ) )
+                    	    // InternalUIGrammar.g:20203:6: (lv_elements_5_0= ruleXExpression )
+                    	    {
+                    	    // InternalUIGrammar.g:20203:6: (lv_elements_5_0= ruleXExpression )
+                    	    // InternalUIGrammar.g:20204:7: lv_elements_5_0= ruleXExpression
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_162);
+                    	    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 loop447;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_6=(Token)match(input,21,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"
+    // InternalUIGrammar.g:20231:1: entryRuleXListLiteral returns [EObject current=null] : iv_ruleXListLiteral= ruleXListLiteral EOF ;
+    public final EObject entryRuleXListLiteral() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXListLiteral = null;
+
+
+        try {
+            // InternalUIGrammar.g:20231:53: (iv_ruleXListLiteral= ruleXListLiteral EOF )
+            // InternalUIGrammar.g:20232: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"
+    // InternalUIGrammar.g:20238: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 {
+            // InternalUIGrammar.g:20244:2: ( ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' ) )
+            // InternalUIGrammar.g:20245:2: ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' )
+            {
+            // InternalUIGrammar.g:20245:2: ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' )
+            // InternalUIGrammar.g:20246:3: () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']'
+            {
+            // InternalUIGrammar.g:20246:3: ()
+            // InternalUIGrammar.g:20247:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXListLiteralAccess().getXListLiteralAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,162,FOLLOW_27); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXListLiteralAccess().getNumberSignKeyword_1());
+              		
+            }
+            otherlv_2=(Token)match(input,32,FOLLOW_134); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getXListLiteralAccess().getLeftSquareBracketKeyword_2());
+              		
+            }
+            // InternalUIGrammar.g:20261:3: ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )?
+            int alt450=2;
+            int LA450_0 = input.LA(1);
+
+            if ( ((LA450_0>=RULE_ID && LA450_0<=RULE_DECIMAL)||LA450_0==20||LA450_0==28||LA450_0==32||LA450_0==42||LA450_0==45||(LA450_0>=155 && LA450_0<=157)||LA450_0==162||(LA450_0>=180 && LA450_0<=181)||LA450_0==185||LA450_0==190||LA450_0==192||(LA450_0>=195 && LA450_0<=196)||(LA450_0>=199 && LA450_0<=208)||LA450_0==210) ) {
+                alt450=1;
+            }
+            switch (alt450) {
+                case 1 :
+                    // InternalUIGrammar.g:20262:4: ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
+                    {
+                    // InternalUIGrammar.g:20262:4: ( (lv_elements_3_0= ruleXExpression ) )
+                    // InternalUIGrammar.g:20263:5: (lv_elements_3_0= ruleXExpression )
+                    {
+                    // InternalUIGrammar.g:20263:5: (lv_elements_3_0= ruleXExpression )
+                    // InternalUIGrammar.g:20264:6: lv_elements_3_0= ruleXExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_135);
+                    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();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalUIGrammar.g:20281:4: (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
+                    loop449:
+                    do {
+                        int alt449=2;
+                        int LA449_0 = input.LA(1);
+
+                        if ( (LA449_0==102) ) {
+                            alt449=1;
+                        }
+
+
+                        switch (alt449) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:20282:5: otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) )
+                    	    {
+                    	    otherlv_4=(Token)match(input,102,FOLLOW_133); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      					newLeafNode(otherlv_4, grammarAccess.getXListLiteralAccess().getCommaKeyword_3_1_0());
+                    	      				
+                    	    }
+                    	    // InternalUIGrammar.g:20286:5: ( (lv_elements_5_0= ruleXExpression ) )
+                    	    // InternalUIGrammar.g:20287:6: (lv_elements_5_0= ruleXExpression )
+                    	    {
+                    	    // InternalUIGrammar.g:20287:6: (lv_elements_5_0= ruleXExpression )
+                    	    // InternalUIGrammar.g:20288:7: lv_elements_5_0= ruleXExpression
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_135);
+                    	    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 loop449;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_6=(Token)match(input,33,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"
+    // InternalUIGrammar.g:20315:1: entryRuleXClosure returns [EObject current=null] : iv_ruleXClosure= ruleXClosure EOF ;
+    public final EObject entryRuleXClosure() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXClosure = null;
+
+
+        try {
+            // InternalUIGrammar.g:20315:49: (iv_ruleXClosure= ruleXClosure EOF )
+            // InternalUIGrammar.g:20316: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"
+    // InternalUIGrammar.g:20322: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 {
+            // InternalUIGrammar.g:20328: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= ']' ) )
+            // InternalUIGrammar.g:20329: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= ']' )
+            {
+            // InternalUIGrammar.g:20329: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= ']' )
+            // InternalUIGrammar.g:20330: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= ']'
+            {
+            // InternalUIGrammar.g:20330:3: ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) )
+            // InternalUIGrammar.g:20331:4: ( ( () '[' ) )=> ( () otherlv_1= '[' )
+            {
+            // InternalUIGrammar.g:20337:4: ( () otherlv_1= '[' )
+            // InternalUIGrammar.g:20338:5: () otherlv_1= '['
+            {
+            // InternalUIGrammar.g:20338:5: ()
+            // InternalUIGrammar.g:20339:6: 
+            {
+            if ( state.backtracking==0 ) {
+
+              						current = forceCreateModelElement(
+              							grammarAccess.getXClosureAccess().getXClosureAction_0_0_0(),
+              							current);
+              					
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,32,FOLLOW_163); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(otherlv_1, grammarAccess.getXClosureAccess().getLeftSquareBracketKeyword_0_0_1());
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalUIGrammar.g:20351:3: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )?
+            int alt453=2;
+            alt453 = dfa453.predict(input);
+            switch (alt453) {
+                case 1 :
+                    // InternalUIGrammar.g:20352:4: ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) )
+                    {
+                    // InternalUIGrammar.g:20375:4: ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) )
+                    // InternalUIGrammar.g:20376:5: ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) )
+                    {
+                    // InternalUIGrammar.g:20376:5: ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )?
+                    int alt452=2;
+                    int LA452_0 = input.LA(1);
+
+                    if ( (LA452_0==RULE_ID||LA452_0==45||LA452_0==177) ) {
+                        alt452=1;
+                    }
+                    switch (alt452) {
+                        case 1 :
+                            // InternalUIGrammar.g:20377:6: ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )*
+                            {
+                            // InternalUIGrammar.g:20377:6: ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) )
+                            // InternalUIGrammar.g:20378:7: (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter )
+                            {
+                            // InternalUIGrammar.g:20378:7: (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter )
+                            // InternalUIGrammar.g:20379:8: lv_declaredFormalParameters_2_0= ruleJvmFormalParameter
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              								newCompositeNode(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_0_0());
+                              							
+                            }
+                            pushFollow(FOLLOW_164);
+                            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();
+                              							
+                            }
+
+                            }
+
+
+                            }
+
+                            // InternalUIGrammar.g:20396:6: (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )*
+                            loop451:
+                            do {
+                                int alt451=2;
+                                int LA451_0 = input.LA(1);
+
+                                if ( (LA451_0==102) ) {
+                                    alt451=1;
+                                }
+
+
+                                switch (alt451) {
+                            	case 1 :
+                            	    // InternalUIGrammar.g:20397:7: otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) )
+                            	    {
+                            	    otherlv_3=(Token)match(input,102,FOLLOW_16); if (state.failed) return current;
+                            	    if ( state.backtracking==0 ) {
+
+                            	      							newLeafNode(otherlv_3, grammarAccess.getXClosureAccess().getCommaKeyword_1_0_0_1_0());
+                            	      						
+                            	    }
+                            	    // InternalUIGrammar.g:20401:7: ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) )
+                            	    // InternalUIGrammar.g:20402:8: (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter )
+                            	    {
+                            	    // InternalUIGrammar.g:20402:8: (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter )
+                            	    // InternalUIGrammar.g:20403:9: lv_declaredFormalParameters_4_0= ruleJvmFormalParameter
+                            	    {
+                            	    if ( state.backtracking==0 ) {
+
+                            	      									newCompositeNode(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_1_1_0());
+                            	      								
+                            	    }
+                            	    pushFollow(FOLLOW_164);
+                            	    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 loop451;
+                                }
+                            } while (true);
+
+
+                            }
+                            break;
+
+                    }
+
+                    // InternalUIGrammar.g:20422:5: ( (lv_explicitSyntax_5_0= '|' ) )
+                    // InternalUIGrammar.g:20423:6: (lv_explicitSyntax_5_0= '|' )
+                    {
+                    // InternalUIGrammar.g:20423:6: (lv_explicitSyntax_5_0= '|' )
+                    // InternalUIGrammar.g:20424:7: lv_explicitSyntax_5_0= '|'
+                    {
+                    lv_explicitSyntax_5_0=(Token)match(input,189,FOLLOW_165); 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;
+
+            }
+
+            // InternalUIGrammar.g:20438:3: ( (lv_expression_6_0= ruleXExpressionInClosure ) )
+            // InternalUIGrammar.g:20439:4: (lv_expression_6_0= ruleXExpressionInClosure )
+            {
+            // InternalUIGrammar.g:20439:4: (lv_expression_6_0= ruleXExpressionInClosure )
+            // InternalUIGrammar.g:20440:5: lv_expression_6_0= ruleXExpressionInClosure
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXClosureAccess().getExpressionXExpressionInClosureParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FOLLOW_25);
+            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,33,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"
+    // InternalUIGrammar.g:20465:1: entryRuleXExpressionInClosure returns [EObject current=null] : iv_ruleXExpressionInClosure= ruleXExpressionInClosure EOF ;
+    public final EObject entryRuleXExpressionInClosure() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXExpressionInClosure = null;
+
+
+        try {
+            // InternalUIGrammar.g:20465:61: (iv_ruleXExpressionInClosure= ruleXExpressionInClosure EOF )
+            // InternalUIGrammar.g:20466: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"
+    // InternalUIGrammar.g:20472: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 {
+            // InternalUIGrammar.g:20478:2: ( ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* ) )
+            // InternalUIGrammar.g:20479:2: ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* )
+            {
+            // InternalUIGrammar.g:20479:2: ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* )
+            // InternalUIGrammar.g:20480:3: () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )*
+            {
+            // InternalUIGrammar.g:20480:3: ()
+            // InternalUIGrammar.g:20481:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXExpressionInClosureAccess().getXBlockExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalUIGrammar.g:20487:3: ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )*
+            loop455:
+            do {
+                int alt455=2;
+                int LA455_0 = input.LA(1);
+
+                if ( ((LA455_0>=RULE_ID && LA455_0<=RULE_DECIMAL)||LA455_0==20||LA455_0==28||LA455_0==32||LA455_0==42||LA455_0==45||(LA455_0>=155 && LA455_0<=157)||LA455_0==162||(LA455_0>=180 && LA455_0<=181)||LA455_0==185||LA455_0==190||LA455_0==192||(LA455_0>=195 && LA455_0<=208)||LA455_0==210) ) {
+                    alt455=1;
+                }
+
+
+                switch (alt455) {
+            	case 1 :
+            	    // InternalUIGrammar.g:20488:4: ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )?
+            	    {
+            	    // InternalUIGrammar.g:20488:4: ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) )
+            	    // InternalUIGrammar.g:20489:5: (lv_expressions_1_0= ruleXExpressionOrVarDeclaration )
+            	    {
+            	    // InternalUIGrammar.g:20489:5: (lv_expressions_1_0= ruleXExpressionOrVarDeclaration )
+            	    // InternalUIGrammar.g:20490:6: lv_expressions_1_0= ruleXExpressionOrVarDeclaration
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getXExpressionInClosureAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_1_0_0());
+            	      					
+            	    }
+            	    pushFollow(FOLLOW_166);
+            	    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();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+            	    // InternalUIGrammar.g:20507:4: (otherlv_2= ';' )?
+            	    int alt454=2;
+            	    int LA454_0 = input.LA(1);
+
+            	    if ( (LA454_0==16) ) {
+            	        alt454=1;
+            	    }
+            	    switch (alt454) {
+            	        case 1 :
+            	            // InternalUIGrammar.g:20508:5: otherlv_2= ';'
+            	            {
+            	            otherlv_2=(Token)match(input,16,FOLLOW_167); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              					newLeafNode(otherlv_2, grammarAccess.getXExpressionInClosureAccess().getSemicolonKeyword_1_1());
+            	              				
+            	            }
+
+            	            }
+            	            break;
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop455;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXExpressionInClosure"
+
+
+    // $ANTLR start "entryRuleXShortClosure"
+    // InternalUIGrammar.g:20518:1: entryRuleXShortClosure returns [EObject current=null] : iv_ruleXShortClosure= ruleXShortClosure EOF ;
+    public final EObject entryRuleXShortClosure() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXShortClosure = null;
+
+
+        try {
+            // InternalUIGrammar.g:20518:54: (iv_ruleXShortClosure= ruleXShortClosure EOF )
+            // InternalUIGrammar.g:20519: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"
+    // InternalUIGrammar.g:20525: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 {
+            // InternalUIGrammar.g:20531:2: ( ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) ) )
+            // InternalUIGrammar.g:20532:2: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) )
+            {
+            // InternalUIGrammar.g:20532:2: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) )
+            // InternalUIGrammar.g:20533:3: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) )
+            {
+            // InternalUIGrammar.g:20533:3: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) )
+            // InternalUIGrammar.g:20534:4: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) )
+            {
+            // InternalUIGrammar.g:20559:4: ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) )
+            // InternalUIGrammar.g:20560:5: () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) )
+            {
+            // InternalUIGrammar.g:20560:5: ()
+            // InternalUIGrammar.g:20561:6: 
+            {
+            if ( state.backtracking==0 ) {
+
+              						current = forceCreateModelElement(
+              							grammarAccess.getXShortClosureAccess().getXClosureAction_0_0_0(),
+              							current);
+              					
+            }
+
+            }
+
+            // InternalUIGrammar.g:20567:5: ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )?
+            int alt457=2;
+            int LA457_0 = input.LA(1);
+
+            if ( (LA457_0==RULE_ID||LA457_0==45||LA457_0==177) ) {
+                alt457=1;
+            }
+            switch (alt457) {
+                case 1 :
+                    // InternalUIGrammar.g:20568:6: ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )*
+                    {
+                    // InternalUIGrammar.g:20568:6: ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) )
+                    // InternalUIGrammar.g:20569:7: (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter )
+                    {
+                    // InternalUIGrammar.g:20569:7: (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter )
+                    // InternalUIGrammar.g:20570:8: lv_declaredFormalParameters_1_0= ruleJvmFormalParameter
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      								newCompositeNode(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_0_0());
+                      							
+                    }
+                    pushFollow(FOLLOW_164);
+                    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();
+                      							
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalUIGrammar.g:20587:6: (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )*
+                    loop456:
+                    do {
+                        int alt456=2;
+                        int LA456_0 = input.LA(1);
+
+                        if ( (LA456_0==102) ) {
+                            alt456=1;
+                        }
+
+
+                        switch (alt456) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:20588:7: otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) )
+                    	    {
+                    	    otherlv_2=(Token)match(input,102,FOLLOW_16); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newLeafNode(otherlv_2, grammarAccess.getXShortClosureAccess().getCommaKeyword_0_0_1_1_0());
+                    	      						
+                    	    }
+                    	    // InternalUIGrammar.g:20592:7: ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) )
+                    	    // InternalUIGrammar.g:20593:8: (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter )
+                    	    {
+                    	    // InternalUIGrammar.g:20593:8: (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter )
+                    	    // InternalUIGrammar.g:20594:9: lv_declaredFormalParameters_3_0= ruleJvmFormalParameter
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      									newCompositeNode(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_1_1_0());
+                    	      								
+                    	    }
+                    	    pushFollow(FOLLOW_164);
+                    	    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 loop456;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:20613:5: ( (lv_explicitSyntax_4_0= '|' ) )
+            // InternalUIGrammar.g:20614:6: (lv_explicitSyntax_4_0= '|' )
+            {
+            // InternalUIGrammar.g:20614:6: (lv_explicitSyntax_4_0= '|' )
+            // InternalUIGrammar.g:20615:7: lv_explicitSyntax_4_0= '|'
+            {
+            lv_explicitSyntax_4_0=(Token)match(input,189,FOLLOW_133); 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, "|");
+              						
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            // InternalUIGrammar.g:20629:3: ( (lv_expression_5_0= ruleXExpression ) )
+            // InternalUIGrammar.g:20630:4: (lv_expression_5_0= ruleXExpression )
+            {
+            // InternalUIGrammar.g:20630:4: (lv_expression_5_0= ruleXExpression )
+            // InternalUIGrammar.g:20631: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"
+    // InternalUIGrammar.g:20652:1: entryRuleXParenthesizedExpression returns [EObject current=null] : iv_ruleXParenthesizedExpression= ruleXParenthesizedExpression EOF ;
+    public final EObject entryRuleXParenthesizedExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXParenthesizedExpression = null;
+
+
+        try {
+            // InternalUIGrammar.g:20652:65: (iv_ruleXParenthesizedExpression= ruleXParenthesizedExpression EOF )
+            // InternalUIGrammar.g:20653: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"
+    // InternalUIGrammar.g:20659: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 {
+            // InternalUIGrammar.g:20665:2: ( (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' ) )
+            // InternalUIGrammar.g:20666:2: (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' )
+            {
+            // InternalUIGrammar.g:20666:2: (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' )
+            // InternalUIGrammar.g:20667:3: otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')'
+            {
+            otherlv_0=(Token)match(input,45,FOLLOW_133); 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_36);
+            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,47,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"
+    // InternalUIGrammar.g:20687:1: entryRuleXIfExpression returns [EObject current=null] : iv_ruleXIfExpression= ruleXIfExpression EOF ;
+    public final EObject entryRuleXIfExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXIfExpression = null;
+
+
+        try {
+            // InternalUIGrammar.g:20687:54: (iv_ruleXIfExpression= ruleXIfExpression EOF )
+            // InternalUIGrammar.g:20688: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"
+    // InternalUIGrammar.g:20694: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 {
+            // InternalUIGrammar.g:20700: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 ) ) )? ) )
+            // InternalUIGrammar.g:20701: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 ) ) )? )
+            {
+            // InternalUIGrammar.g:20701: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 ) ) )? )
+            // InternalUIGrammar.g:20702: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 ) ) )?
+            {
+            // InternalUIGrammar.g:20702:3: ()
+            // InternalUIGrammar.g:20703:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXIfExpressionAccess().getXIfExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,190,FOLLOW_34); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXIfExpressionAccess().getIfKeyword_1());
+              		
+            }
+            otherlv_2=(Token)match(input,45,FOLLOW_133); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getXIfExpressionAccess().getLeftParenthesisKeyword_2());
+              		
+            }
+            // InternalUIGrammar.g:20717:3: ( (lv_if_3_0= ruleXExpression ) )
+            // InternalUIGrammar.g:20718:4: (lv_if_3_0= ruleXExpression )
+            {
+            // InternalUIGrammar.g:20718:4: (lv_if_3_0= ruleXExpression )
+            // InternalUIGrammar.g:20719:5: lv_if_3_0= ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXIfExpressionAccess().getIfXExpressionParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FOLLOW_36);
+            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,47,FOLLOW_133); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_4, grammarAccess.getXIfExpressionAccess().getRightParenthesisKeyword_4());
+              		
+            }
+            // InternalUIGrammar.g:20740:3: ( (lv_then_5_0= ruleXExpression ) )
+            // InternalUIGrammar.g:20741:4: (lv_then_5_0= ruleXExpression )
+            {
+            // InternalUIGrammar.g:20741:4: (lv_then_5_0= ruleXExpression )
+            // InternalUIGrammar.g:20742:5: lv_then_5_0= ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXIfExpressionAccess().getThenXExpressionParserRuleCall_5_0());
+              				
+            }
+            pushFollow(FOLLOW_168);
+            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();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalUIGrammar.g:20759:3: ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )?
+            int alt458=2;
+            int LA458_0 = input.LA(1);
+
+            if ( (LA458_0==191) ) {
+                int LA458_1 = input.LA(2);
+
+                if ( (synpred33_InternalUIGrammar()) ) {
+                    alt458=1;
+                }
+            }
+            switch (alt458) {
+                case 1 :
+                    // InternalUIGrammar.g:20760:4: ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) )
+                    {
+                    // InternalUIGrammar.g:20760:4: ( ( 'else' )=>otherlv_6= 'else' )
+                    // InternalUIGrammar.g:20761:5: ( 'else' )=>otherlv_6= 'else'
+                    {
+                    otherlv_6=(Token)match(input,191,FOLLOW_133); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_6, grammarAccess.getXIfExpressionAccess().getElseKeyword_6_0());
+                      				
+                    }
+
+                    }
+
+                    // InternalUIGrammar.g:20767:4: ( (lv_else_7_0= ruleXExpression ) )
+                    // InternalUIGrammar.g:20768:5: (lv_else_7_0= ruleXExpression )
+                    {
+                    // InternalUIGrammar.g:20768:5: (lv_else_7_0= ruleXExpression )
+                    // InternalUIGrammar.g:20769: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"
+    // InternalUIGrammar.g:20791:1: entryRuleXSwitchExpression returns [EObject current=null] : iv_ruleXSwitchExpression= ruleXSwitchExpression EOF ;
+    public final EObject entryRuleXSwitchExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXSwitchExpression = null;
+
+
+        try {
+            // InternalUIGrammar.g:20791:58: (iv_ruleXSwitchExpression= ruleXSwitchExpression EOF )
+            // InternalUIGrammar.g:20792: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"
+    // InternalUIGrammar.g:20798: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 {
+            // InternalUIGrammar.g:20804: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= '}' ) )
+            // InternalUIGrammar.g:20805: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= '}' )
+            {
+            // InternalUIGrammar.g:20805: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= '}' )
+            // InternalUIGrammar.g:20806: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= '}'
+            {
+            // InternalUIGrammar.g:20806:3: ()
+            // InternalUIGrammar.g:20807:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXSwitchExpressionAccess().getXSwitchExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,192,FOLLOW_169); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXSwitchExpressionAccess().getSwitchKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:20817: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 alt460=2;
+            alt460 = dfa460.predict(input);
+            switch (alt460) {
+                case 1 :
+                    // InternalUIGrammar.g:20818:4: ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' )
+                    {
+                    // InternalUIGrammar.g:20818:4: ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' )
+                    // InternalUIGrammar.g:20819:5: ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')'
+                    {
+                    // InternalUIGrammar.g:20819:5: ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) )
+                    // InternalUIGrammar.g:20820:6: ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
+                    {
+                    // InternalUIGrammar.g:20830:6: (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
+                    // InternalUIGrammar.g:20831:7: otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':'
+                    {
+                    otherlv_2=(Token)match(input,45,FOLLOW_16); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							newLeafNode(otherlv_2, grammarAccess.getXSwitchExpressionAccess().getLeftParenthesisKeyword_2_0_0_0_0());
+                      						
+                    }
+                    // InternalUIGrammar.g:20835:7: ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) )
+                    // InternalUIGrammar.g:20836:8: (lv_declaredParam_3_0= ruleJvmFormalParameter )
+                    {
+                    // InternalUIGrammar.g:20836:8: (lv_declaredParam_3_0= ruleJvmFormalParameter )
+                    // InternalUIGrammar.g:20837:9: lv_declaredParam_3_0= ruleJvmFormalParameter
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      									newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_0_0_0_1_0());
+                      								
+                    }
+                    pushFollow(FOLLOW_15);
+                    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,24,FOLLOW_133); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							newLeafNode(otherlv_4, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_0_0_0_2());
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalUIGrammar.g:20860:5: ( (lv_switch_5_0= ruleXExpression ) )
+                    // InternalUIGrammar.g:20861:6: (lv_switch_5_0= ruleXExpression )
+                    {
+                    // InternalUIGrammar.g:20861:6: (lv_switch_5_0= ruleXExpression )
+                    // InternalUIGrammar.g:20862:7: lv_switch_5_0= ruleXExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_0_1_0());
+                      						
+                    }
+                    pushFollow(FOLLOW_36);
+                    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,47,FOLLOW_11); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_6, grammarAccess.getXSwitchExpressionAccess().getRightParenthesisKeyword_2_0_2());
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalUIGrammar.g:20885:4: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) )
+                    {
+                    // InternalUIGrammar.g:20885:4: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) )
+                    // InternalUIGrammar.g:20886:5: ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) )
+                    {
+                    // InternalUIGrammar.g:20886:5: ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )?
+                    int alt459=2;
+                    alt459 = dfa459.predict(input);
+                    switch (alt459) {
+                        case 1 :
+                            // InternalUIGrammar.g:20887:6: ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' )
+                            {
+                            // InternalUIGrammar.g:20896:6: ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' )
+                            // InternalUIGrammar.g:20897:7: ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':'
+                            {
+                            // InternalUIGrammar.g:20897:7: ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) )
+                            // InternalUIGrammar.g:20898:8: (lv_declaredParam_7_0= ruleJvmFormalParameter )
+                            {
+                            // InternalUIGrammar.g:20898:8: (lv_declaredParam_7_0= ruleJvmFormalParameter )
+                            // InternalUIGrammar.g:20899:9: lv_declaredParam_7_0= ruleJvmFormalParameter
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              									newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_1_0_0_0_0());
+                              								
+                            }
+                            pushFollow(FOLLOW_15);
+                            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,24,FOLLOW_133); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							newLeafNode(otherlv_8, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_1_0_0_1());
+                              						
+                            }
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    // InternalUIGrammar.g:20922:5: ( (lv_switch_9_0= ruleXExpression ) )
+                    // InternalUIGrammar.g:20923:6: (lv_switch_9_0= ruleXExpression )
+                    {
+                    // InternalUIGrammar.g:20923:6: (lv_switch_9_0= ruleXExpression )
+                    // InternalUIGrammar.g:20924:7: lv_switch_9_0= ruleXExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_1_1_0());
+                      						
+                    }
+                    pushFollow(FOLLOW_11);
+                    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,20,FOLLOW_170); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_10, grammarAccess.getXSwitchExpressionAccess().getLeftCurlyBracketKeyword_3());
+              		
+            }
+            // InternalUIGrammar.g:20947:3: ( (lv_cases_11_0= ruleXCasePart ) )*
+            loop461:
+            do {
+                int alt461=2;
+                int LA461_0 = input.LA(1);
+
+                if ( (LA461_0==RULE_ID||LA461_0==24||LA461_0==45||LA461_0==102||LA461_0==177||LA461_0==194) ) {
+                    alt461=1;
+                }
+
+
+                switch (alt461) {
+            	case 1 :
+            	    // InternalUIGrammar.g:20948:4: (lv_cases_11_0= ruleXCasePart )
+            	    {
+            	    // InternalUIGrammar.g:20948:4: (lv_cases_11_0= ruleXCasePart )
+            	    // InternalUIGrammar.g:20949:5: lv_cases_11_0= ruleXCasePart
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getCasesXCasePartParserRuleCall_4_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_170);
+            	    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 loop461;
+                }
+            } while (true);
+
+            // InternalUIGrammar.g:20966:3: (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )?
+            int alt462=2;
+            int LA462_0 = input.LA(1);
+
+            if ( (LA462_0==193) ) {
+                alt462=1;
+            }
+            switch (alt462) {
+                case 1 :
+                    // InternalUIGrammar.g:20967:4: otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) )
+                    {
+                    otherlv_12=(Token)match(input,193,FOLLOW_15); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_12, grammarAccess.getXSwitchExpressionAccess().getDefaultKeyword_5_0());
+                      			
+                    }
+                    otherlv_13=(Token)match(input,24,FOLLOW_133); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_13, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_5_1());
+                      			
+                    }
+                    // InternalUIGrammar.g:20975:4: ( (lv_default_14_0= ruleXExpression ) )
+                    // InternalUIGrammar.g:20976:5: (lv_default_14_0= ruleXExpression )
+                    {
+                    // InternalUIGrammar.g:20976:5: (lv_default_14_0= ruleXExpression )
+                    // InternalUIGrammar.g:20977:6: lv_default_14_0= ruleXExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDefaultXExpressionParserRuleCall_5_2_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_61);
+                    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,21,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"
+    // InternalUIGrammar.g:21003:1: entryRuleXCasePart returns [EObject current=null] : iv_ruleXCasePart= ruleXCasePart EOF ;
+    public final EObject entryRuleXCasePart() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXCasePart = null;
+
+
+        try {
+            // InternalUIGrammar.g:21003:50: (iv_ruleXCasePart= ruleXCasePart EOF )
+            // InternalUIGrammar.g:21004: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"
+    // InternalUIGrammar.g:21010: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 {
+            // InternalUIGrammar.g:21016: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= ',' ) ) ) ) )
+            // InternalUIGrammar.g:21017: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= ',' ) ) ) )
+            {
+            // InternalUIGrammar.g:21017: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= ',' ) ) ) )
+            // InternalUIGrammar.g:21018: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= ',' ) ) )
+            {
+            // InternalUIGrammar.g:21018:3: ()
+            // InternalUIGrammar.g:21019:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXCasePartAccess().getXCasePartAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalUIGrammar.g:21025:3: ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )?
+            int alt463=2;
+            int LA463_0 = input.LA(1);
+
+            if ( (LA463_0==RULE_ID||LA463_0==45||LA463_0==177) ) {
+                alt463=1;
+            }
+            switch (alt463) {
+                case 1 :
+                    // InternalUIGrammar.g:21026:4: (lv_typeGuard_1_0= ruleJvmTypeReference )
+                    {
+                    // InternalUIGrammar.g:21026:4: (lv_typeGuard_1_0= ruleJvmTypeReference )
+                    // InternalUIGrammar.g:21027:5: lv_typeGuard_1_0= ruleJvmTypeReference
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getXCasePartAccess().getTypeGuardJvmTypeReferenceParserRuleCall_1_0());
+                      				
+                    }
+                    pushFollow(FOLLOW_171);
+                    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;
+
+            }
+
+            // InternalUIGrammar.g:21044:3: (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )?
+            int alt464=2;
+            int LA464_0 = input.LA(1);
+
+            if ( (LA464_0==194) ) {
+                alt464=1;
+            }
+            switch (alt464) {
+                case 1 :
+                    // InternalUIGrammar.g:21045:4: otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) )
+                    {
+                    otherlv_2=(Token)match(input,194,FOLLOW_133); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getXCasePartAccess().getCaseKeyword_2_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:21049:4: ( (lv_case_3_0= ruleXExpression ) )
+                    // InternalUIGrammar.g:21050:5: (lv_case_3_0= ruleXExpression )
+                    {
+                    // InternalUIGrammar.g:21050:5: (lv_case_3_0= ruleXExpression )
+                    // InternalUIGrammar.g:21051:6: lv_case_3_0= ruleXExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getXCasePartAccess().getCaseXExpressionParserRuleCall_2_1_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_172);
+                    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;
+
+            }
+
+            // InternalUIGrammar.g:21069:3: ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) )
+            int alt465=2;
+            int LA465_0 = input.LA(1);
+
+            if ( (LA465_0==24) ) {
+                alt465=1;
+            }
+            else if ( (LA465_0==102) ) {
+                alt465=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 465, 0, input);
+
+                throw nvae;
+            }
+            switch (alt465) {
+                case 1 :
+                    // InternalUIGrammar.g:21070:4: (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) )
+                    {
+                    // InternalUIGrammar.g:21070:4: (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) )
+                    // InternalUIGrammar.g:21071:5: otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) )
+                    {
+                    otherlv_4=(Token)match(input,24,FOLLOW_133); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_4, grammarAccess.getXCasePartAccess().getColonKeyword_3_0_0());
+                      				
+                    }
+                    // InternalUIGrammar.g:21075:5: ( (lv_then_5_0= ruleXExpression ) )
+                    // InternalUIGrammar.g:21076:6: (lv_then_5_0= ruleXExpression )
+                    {
+                    // InternalUIGrammar.g:21076:6: (lv_then_5_0= ruleXExpression )
+                    // InternalUIGrammar.g:21077: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 :
+                    // InternalUIGrammar.g:21096:4: ( (lv_fallThrough_6_0= ',' ) )
+                    {
+                    // InternalUIGrammar.g:21096:4: ( (lv_fallThrough_6_0= ',' ) )
+                    // InternalUIGrammar.g:21097:5: (lv_fallThrough_6_0= ',' )
+                    {
+                    // InternalUIGrammar.g:21097:5: (lv_fallThrough_6_0= ',' )
+                    // InternalUIGrammar.g:21098:6: lv_fallThrough_6_0= ','
+                    {
+                    lv_fallThrough_6_0=(Token)match(input,102,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"
+    // InternalUIGrammar.g:21115:1: entryRuleXForLoopExpression returns [EObject current=null] : iv_ruleXForLoopExpression= ruleXForLoopExpression EOF ;
+    public final EObject entryRuleXForLoopExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXForLoopExpression = null;
+
+
+        try {
+            // InternalUIGrammar.g:21115:59: (iv_ruleXForLoopExpression= ruleXForLoopExpression EOF )
+            // InternalUIGrammar.g:21116: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"
+    // InternalUIGrammar.g:21122: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 {
+            // InternalUIGrammar.g:21128: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 ) ) ) )
+            // InternalUIGrammar.g:21129: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 ) ) )
+            {
+            // InternalUIGrammar.g:21129: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 ) ) )
+            // InternalUIGrammar.g:21130: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 ) )
+            {
+            // InternalUIGrammar.g:21130:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) )
+            // InternalUIGrammar.g:21131:4: ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
+            {
+            // InternalUIGrammar.g:21144:4: ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
+            // InternalUIGrammar.g:21145:5: () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':'
+            {
+            // InternalUIGrammar.g:21145:5: ()
+            // InternalUIGrammar.g:21146:6: 
+            {
+            if ( state.backtracking==0 ) {
+
+              						current = forceCreateModelElement(
+              							grammarAccess.getXForLoopExpressionAccess().getXForLoopExpressionAction_0_0_0(),
+              							current);
+              					
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,42,FOLLOW_34); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(otherlv_1, grammarAccess.getXForLoopExpressionAccess().getForKeyword_0_0_1());
+              				
+            }
+            otherlv_2=(Token)match(input,45,FOLLOW_16); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(otherlv_2, grammarAccess.getXForLoopExpressionAccess().getLeftParenthesisKeyword_0_0_2());
+              				
+            }
+            // InternalUIGrammar.g:21160:5: ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) )
+            // InternalUIGrammar.g:21161:6: (lv_declaredParam_3_0= ruleJvmFormalParameter )
+            {
+            // InternalUIGrammar.g:21161:6: (lv_declaredParam_3_0= ruleJvmFormalParameter )
+            // InternalUIGrammar.g:21162:7: lv_declaredParam_3_0= ruleJvmFormalParameter
+            {
+            if ( state.backtracking==0 ) {
+
+              							newCompositeNode(grammarAccess.getXForLoopExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_0_0_3_0());
+              						
+            }
+            pushFollow(FOLLOW_15);
+            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,24,FOLLOW_133); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(otherlv_4, grammarAccess.getXForLoopExpressionAccess().getColonKeyword_0_0_4());
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalUIGrammar.g:21185:3: ( (lv_forExpression_5_0= ruleXExpression ) )
+            // InternalUIGrammar.g:21186:4: (lv_forExpression_5_0= ruleXExpression )
+            {
+            // InternalUIGrammar.g:21186:4: (lv_forExpression_5_0= ruleXExpression )
+            // InternalUIGrammar.g:21187:5: lv_forExpression_5_0= ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXForLoopExpressionAccess().getForExpressionXExpressionParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FOLLOW_36);
+            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,47,FOLLOW_133); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_6, grammarAccess.getXForLoopExpressionAccess().getRightParenthesisKeyword_2());
+              		
+            }
+            // InternalUIGrammar.g:21208:3: ( (lv_eachExpression_7_0= ruleXExpression ) )
+            // InternalUIGrammar.g:21209:4: (lv_eachExpression_7_0= ruleXExpression )
+            {
+            // InternalUIGrammar.g:21209:4: (lv_eachExpression_7_0= ruleXExpression )
+            // InternalUIGrammar.g:21210: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"
+    // InternalUIGrammar.g:21231:1: entryRuleXBasicForLoopExpression returns [EObject current=null] : iv_ruleXBasicForLoopExpression= ruleXBasicForLoopExpression EOF ;
+    public final EObject entryRuleXBasicForLoopExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXBasicForLoopExpression = null;
+
+
+        try {
+            // InternalUIGrammar.g:21231:64: (iv_ruleXBasicForLoopExpression= ruleXBasicForLoopExpression EOF )
+            // InternalUIGrammar.g:21232: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"
+    // InternalUIGrammar.g:21238: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 {
+            // InternalUIGrammar.g:21244: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 ) ) ) )
+            // InternalUIGrammar.g:21245: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 ) ) )
+            {
+            // InternalUIGrammar.g:21245: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 ) ) )
+            // InternalUIGrammar.g:21246: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 ) )
+            {
+            // InternalUIGrammar.g:21246:3: ()
+            // InternalUIGrammar.g:21247:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXBasicForLoopExpressionAccess().getXBasicForLoopExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,42,FOLLOW_34); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXBasicForLoopExpressionAccess().getForKeyword_1());
+              		
+            }
+            otherlv_2=(Token)match(input,45,FOLLOW_173); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getXBasicForLoopExpressionAccess().getLeftParenthesisKeyword_2());
+              		
+            }
+            // InternalUIGrammar.g:21261:3: ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )?
+            int alt467=2;
+            int LA467_0 = input.LA(1);
+
+            if ( ((LA467_0>=RULE_ID && LA467_0<=RULE_DECIMAL)||LA467_0==20||LA467_0==28||LA467_0==32||LA467_0==42||LA467_0==45||(LA467_0>=155 && LA467_0<=157)||LA467_0==162||(LA467_0>=180 && LA467_0<=181)||LA467_0==185||LA467_0==190||LA467_0==192||(LA467_0>=195 && LA467_0<=208)||LA467_0==210) ) {
+                alt467=1;
+            }
+            switch (alt467) {
+                case 1 :
+                    // InternalUIGrammar.g:21262:4: ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )*
+                    {
+                    // InternalUIGrammar.g:21262:4: ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) )
+                    // InternalUIGrammar.g:21263:5: (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration )
+                    {
+                    // InternalUIGrammar.g:21263:5: (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration )
+                    // InternalUIGrammar.g:21264:6: lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsXExpressionOrVarDeclarationParserRuleCall_3_0_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_174);
+                    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();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalUIGrammar.g:21281:4: (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )*
+                    loop466:
+                    do {
+                        int alt466=2;
+                        int LA466_0 = input.LA(1);
+
+                        if ( (LA466_0==102) ) {
+                            alt466=1;
+                        }
+
+
+                        switch (alt466) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:21282:5: otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) )
+                    	    {
+                    	    otherlv_4=(Token)match(input,102,FOLLOW_175); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      					newLeafNode(otherlv_4, grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_3_1_0());
+                    	      				
+                    	    }
+                    	    // InternalUIGrammar.g:21286:5: ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) )
+                    	    // InternalUIGrammar.g:21287:6: (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration )
+                    	    {
+                    	    // InternalUIGrammar.g:21287:6: (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration )
+                    	    // InternalUIGrammar.g:21288:7: lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsXExpressionOrVarDeclarationParserRuleCall_3_1_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_174);
+                    	    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 loop466;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_6=(Token)match(input,16,FOLLOW_176); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_6, grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_4());
+              		
+            }
+            // InternalUIGrammar.g:21311:3: ( (lv_expression_7_0= ruleXExpression ) )?
+            int alt468=2;
+            int LA468_0 = input.LA(1);
+
+            if ( ((LA468_0>=RULE_ID && LA468_0<=RULE_DECIMAL)||LA468_0==20||LA468_0==28||LA468_0==32||LA468_0==42||LA468_0==45||(LA468_0>=155 && LA468_0<=157)||LA468_0==162||(LA468_0>=180 && LA468_0<=181)||LA468_0==185||LA468_0==190||LA468_0==192||(LA468_0>=195 && LA468_0<=196)||(LA468_0>=199 && LA468_0<=208)||LA468_0==210) ) {
+                alt468=1;
+            }
+            switch (alt468) {
+                case 1 :
+                    // InternalUIGrammar.g:21312:4: (lv_expression_7_0= ruleXExpression )
+                    {
+                    // InternalUIGrammar.g:21312:4: (lv_expression_7_0= ruleXExpression )
+                    // InternalUIGrammar.g:21313:5: lv_expression_7_0= ruleXExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getExpressionXExpressionParserRuleCall_5_0());
+                      				
+                    }
+                    pushFollow(FOLLOW_177);
+                    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,16,FOLLOW_131); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_8, grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_6());
+              		
+            }
+            // InternalUIGrammar.g:21334:3: ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )?
+            int alt470=2;
+            int LA470_0 = input.LA(1);
+
+            if ( ((LA470_0>=RULE_ID && LA470_0<=RULE_DECIMAL)||LA470_0==20||LA470_0==28||LA470_0==32||LA470_0==42||LA470_0==45||(LA470_0>=155 && LA470_0<=157)||LA470_0==162||(LA470_0>=180 && LA470_0<=181)||LA470_0==185||LA470_0==190||LA470_0==192||(LA470_0>=195 && LA470_0<=196)||(LA470_0>=199 && LA470_0<=208)||LA470_0==210) ) {
+                alt470=1;
+            }
+            switch (alt470) {
+                case 1 :
+                    // InternalUIGrammar.g:21335:4: ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )*
+                    {
+                    // InternalUIGrammar.g:21335:4: ( (lv_updateExpressions_9_0= ruleXExpression ) )
+                    // InternalUIGrammar.g:21336:5: (lv_updateExpressions_9_0= ruleXExpression )
+                    {
+                    // InternalUIGrammar.g:21336:5: (lv_updateExpressions_9_0= ruleXExpression )
+                    // InternalUIGrammar.g:21337:6: lv_updateExpressions_9_0= ruleXExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsXExpressionParserRuleCall_7_0_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_94);
+                    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();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalUIGrammar.g:21354:4: (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )*
+                    loop469:
+                    do {
+                        int alt469=2;
+                        int LA469_0 = input.LA(1);
+
+                        if ( (LA469_0==102) ) {
+                            alt469=1;
+                        }
+
+
+                        switch (alt469) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:21355:5: otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) )
+                    	    {
+                    	    otherlv_10=(Token)match(input,102,FOLLOW_133); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      					newLeafNode(otherlv_10, grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_7_1_0());
+                    	      				
+                    	    }
+                    	    // InternalUIGrammar.g:21359:5: ( (lv_updateExpressions_11_0= ruleXExpression ) )
+                    	    // InternalUIGrammar.g:21360:6: (lv_updateExpressions_11_0= ruleXExpression )
+                    	    {
+                    	    // InternalUIGrammar.g:21360:6: (lv_updateExpressions_11_0= ruleXExpression )
+                    	    // InternalUIGrammar.g:21361:7: lv_updateExpressions_11_0= ruleXExpression
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsXExpressionParserRuleCall_7_1_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_94);
+                    	    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 loop469;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_12=(Token)match(input,47,FOLLOW_133); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_12, grammarAccess.getXBasicForLoopExpressionAccess().getRightParenthesisKeyword_8());
+              		
+            }
+            // InternalUIGrammar.g:21384:3: ( (lv_eachExpression_13_0= ruleXExpression ) )
+            // InternalUIGrammar.g:21385:4: (lv_eachExpression_13_0= ruleXExpression )
+            {
+            // InternalUIGrammar.g:21385:4: (lv_eachExpression_13_0= ruleXExpression )
+            // InternalUIGrammar.g:21386: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"
+    // InternalUIGrammar.g:21407:1: entryRuleXWhileExpression returns [EObject current=null] : iv_ruleXWhileExpression= ruleXWhileExpression EOF ;
+    public final EObject entryRuleXWhileExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXWhileExpression = null;
+
+
+        try {
+            // InternalUIGrammar.g:21407:57: (iv_ruleXWhileExpression= ruleXWhileExpression EOF )
+            // InternalUIGrammar.g:21408: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"
+    // InternalUIGrammar.g:21414: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 {
+            // InternalUIGrammar.g:21420:2: ( ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) ) )
+            // InternalUIGrammar.g:21421:2: ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) )
+            {
+            // InternalUIGrammar.g:21421:2: ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) )
+            // InternalUIGrammar.g:21422:3: () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) )
+            {
+            // InternalUIGrammar.g:21422:3: ()
+            // InternalUIGrammar.g:21423:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXWhileExpressionAccess().getXWhileExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,195,FOLLOW_34); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXWhileExpressionAccess().getWhileKeyword_1());
+              		
+            }
+            otherlv_2=(Token)match(input,45,FOLLOW_133); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getXWhileExpressionAccess().getLeftParenthesisKeyword_2());
+              		
+            }
+            // InternalUIGrammar.g:21437:3: ( (lv_predicate_3_0= ruleXExpression ) )
+            // InternalUIGrammar.g:21438:4: (lv_predicate_3_0= ruleXExpression )
+            {
+            // InternalUIGrammar.g:21438:4: (lv_predicate_3_0= ruleXExpression )
+            // InternalUIGrammar.g:21439:5: lv_predicate_3_0= ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXWhileExpressionAccess().getPredicateXExpressionParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FOLLOW_36);
+            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,47,FOLLOW_133); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_4, grammarAccess.getXWhileExpressionAccess().getRightParenthesisKeyword_4());
+              		
+            }
+            // InternalUIGrammar.g:21460:3: ( (lv_body_5_0= ruleXExpression ) )
+            // InternalUIGrammar.g:21461:4: (lv_body_5_0= ruleXExpression )
+            {
+            // InternalUIGrammar.g:21461:4: (lv_body_5_0= ruleXExpression )
+            // InternalUIGrammar.g:21462: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"
+    // InternalUIGrammar.g:21483:1: entryRuleXDoWhileExpression returns [EObject current=null] : iv_ruleXDoWhileExpression= ruleXDoWhileExpression EOF ;
+    public final EObject entryRuleXDoWhileExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXDoWhileExpression = null;
+
+
+        try {
+            // InternalUIGrammar.g:21483:59: (iv_ruleXDoWhileExpression= ruleXDoWhileExpression EOF )
+            // InternalUIGrammar.g:21484: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"
+    // InternalUIGrammar.g:21490: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 {
+            // InternalUIGrammar.g:21496:2: ( ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' ) )
+            // InternalUIGrammar.g:21497:2: ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' )
+            {
+            // InternalUIGrammar.g:21497:2: ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' )
+            // InternalUIGrammar.g:21498:3: () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')'
+            {
+            // InternalUIGrammar.g:21498:3: ()
+            // InternalUIGrammar.g:21499:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXDoWhileExpressionAccess().getXDoWhileExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,196,FOLLOW_133); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXDoWhileExpressionAccess().getDoKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:21509:3: ( (lv_body_2_0= ruleXExpression ) )
+            // InternalUIGrammar.g:21510:4: (lv_body_2_0= ruleXExpression )
+            {
+            // InternalUIGrammar.g:21510:4: (lv_body_2_0= ruleXExpression )
+            // InternalUIGrammar.g:21511:5: lv_body_2_0= ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXDoWhileExpressionAccess().getBodyXExpressionParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FOLLOW_178);
+            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,195,FOLLOW_34); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_3, grammarAccess.getXDoWhileExpressionAccess().getWhileKeyword_3());
+              		
+            }
+            otherlv_4=(Token)match(input,45,FOLLOW_133); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_4, grammarAccess.getXDoWhileExpressionAccess().getLeftParenthesisKeyword_4());
+              		
+            }
+            // InternalUIGrammar.g:21536:3: ( (lv_predicate_5_0= ruleXExpression ) )
+            // InternalUIGrammar.g:21537:4: (lv_predicate_5_0= ruleXExpression )
+            {
+            // InternalUIGrammar.g:21537:4: (lv_predicate_5_0= ruleXExpression )
+            // InternalUIGrammar.g:21538:5: lv_predicate_5_0= ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXDoWhileExpressionAccess().getPredicateXExpressionParserRuleCall_5_0());
+              				
+            }
+            pushFollow(FOLLOW_36);
+            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,47,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"
+    // InternalUIGrammar.g:21563:1: entryRuleXBlockExpression returns [EObject current=null] : iv_ruleXBlockExpression= ruleXBlockExpression EOF ;
+    public final EObject entryRuleXBlockExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXBlockExpression = null;
+
+
+        try {
+            // InternalUIGrammar.g:21563:57: (iv_ruleXBlockExpression= ruleXBlockExpression EOF )
+            // InternalUIGrammar.g:21564: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"
+    // InternalUIGrammar.g:21570: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 {
+            // InternalUIGrammar.g:21576:2: ( ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' ) )
+            // InternalUIGrammar.g:21577:2: ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' )
+            {
+            // InternalUIGrammar.g:21577:2: ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' )
+            // InternalUIGrammar.g:21578:3: () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}'
+            {
+            // InternalUIGrammar.g:21578:3: ()
+            // InternalUIGrammar.g:21579:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXBlockExpressionAccess().getXBlockExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,20,FOLLOW_179); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXBlockExpressionAccess().getLeftCurlyBracketKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:21589:3: ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )*
+            loop472:
+            do {
+                int alt472=2;
+                int LA472_0 = input.LA(1);
+
+                if ( ((LA472_0>=RULE_ID && LA472_0<=RULE_DECIMAL)||LA472_0==20||LA472_0==28||LA472_0==32||LA472_0==42||LA472_0==45||(LA472_0>=155 && LA472_0<=157)||LA472_0==162||(LA472_0>=180 && LA472_0<=181)||LA472_0==185||LA472_0==190||LA472_0==192||(LA472_0>=195 && LA472_0<=208)||LA472_0==210) ) {
+                    alt472=1;
+                }
+
+
+                switch (alt472) {
+            	case 1 :
+            	    // InternalUIGrammar.g:21590:4: ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )?
+            	    {
+            	    // InternalUIGrammar.g:21590:4: ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) )
+            	    // InternalUIGrammar.g:21591:5: (lv_expressions_2_0= ruleXExpressionOrVarDeclaration )
+            	    {
+            	    // InternalUIGrammar.g:21591:5: (lv_expressions_2_0= ruleXExpressionOrVarDeclaration )
+            	    // InternalUIGrammar.g:21592:6: lv_expressions_2_0= ruleXExpressionOrVarDeclaration
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getXBlockExpressionAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_2_0_0());
+            	      					
+            	    }
+            	    pushFollow(FOLLOW_180);
+            	    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();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+            	    // InternalUIGrammar.g:21609:4: (otherlv_3= ';' )?
+            	    int alt471=2;
+            	    int LA471_0 = input.LA(1);
+
+            	    if ( (LA471_0==16) ) {
+            	        alt471=1;
+            	    }
+            	    switch (alt471) {
+            	        case 1 :
+            	            // InternalUIGrammar.g:21610:5: otherlv_3= ';'
+            	            {
+            	            otherlv_3=(Token)match(input,16,FOLLOW_179); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              					newLeafNode(otherlv_3, grammarAccess.getXBlockExpressionAccess().getSemicolonKeyword_2_1());
+            	              				
+            	            }
+
+            	            }
+            	            break;
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop472;
+                }
+            } while (true);
+
+            otherlv_4=(Token)match(input,21,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"
+    // InternalUIGrammar.g:21624:1: entryRuleXExpressionOrVarDeclaration returns [EObject current=null] : iv_ruleXExpressionOrVarDeclaration= ruleXExpressionOrVarDeclaration EOF ;
+    public final EObject entryRuleXExpressionOrVarDeclaration() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXExpressionOrVarDeclaration = null;
+
+
+        try {
+            // InternalUIGrammar.g:21624:68: (iv_ruleXExpressionOrVarDeclaration= ruleXExpressionOrVarDeclaration EOF )
+            // InternalUIGrammar.g:21625: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"
+    // InternalUIGrammar.g:21631: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 {
+            // InternalUIGrammar.g:21637:2: ( (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression ) )
+            // InternalUIGrammar.g:21638:2: (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression )
+            {
+            // InternalUIGrammar.g:21638:2: (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression )
+            int alt473=2;
+            int LA473_0 = input.LA(1);
+
+            if ( ((LA473_0>=197 && LA473_0<=198)) ) {
+                alt473=1;
+            }
+            else if ( ((LA473_0>=RULE_ID && LA473_0<=RULE_DECIMAL)||LA473_0==20||LA473_0==28||LA473_0==32||LA473_0==42||LA473_0==45||(LA473_0>=155 && LA473_0<=157)||LA473_0==162||(LA473_0>=180 && LA473_0<=181)||LA473_0==185||LA473_0==190||LA473_0==192||(LA473_0>=195 && LA473_0<=196)||(LA473_0>=199 && LA473_0<=208)||LA473_0==210) ) {
+                alt473=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 473, 0, input);
+
+                throw nvae;
+            }
+            switch (alt473) {
+                case 1 :
+                    // InternalUIGrammar.g:21639: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 :
+                    // InternalUIGrammar.g:21648: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"
+    // InternalUIGrammar.g:21660:1: entryRuleXVariableDeclaration returns [EObject current=null] : iv_ruleXVariableDeclaration= ruleXVariableDeclaration EOF ;
+    public final EObject entryRuleXVariableDeclaration() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXVariableDeclaration = null;
+
+
+        try {
+            // InternalUIGrammar.g:21660:61: (iv_ruleXVariableDeclaration= ruleXVariableDeclaration EOF )
+            // InternalUIGrammar.g:21661: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"
+    // InternalUIGrammar.g:21667: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 {
+            // InternalUIGrammar.g:21673: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 ) ) )? ) )
+            // InternalUIGrammar.g:21674: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 ) ) )? )
+            {
+            // InternalUIGrammar.g:21674: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 ) ) )? )
+            // InternalUIGrammar.g:21675: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 ) ) )?
+            {
+            // InternalUIGrammar.g:21675:3: ()
+            // InternalUIGrammar.g:21676:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXVariableDeclarationAccess().getXVariableDeclarationAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalUIGrammar.g:21682:3: ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' )
+            int alt474=2;
+            int LA474_0 = input.LA(1);
+
+            if ( (LA474_0==197) ) {
+                alt474=1;
+            }
+            else if ( (LA474_0==198) ) {
+                alt474=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 474, 0, input);
+
+                throw nvae;
+            }
+            switch (alt474) {
+                case 1 :
+                    // InternalUIGrammar.g:21683:4: ( (lv_writeable_1_0= 'var' ) )
+                    {
+                    // InternalUIGrammar.g:21683:4: ( (lv_writeable_1_0= 'var' ) )
+                    // InternalUIGrammar.g:21684:5: (lv_writeable_1_0= 'var' )
+                    {
+                    // InternalUIGrammar.g:21684:5: (lv_writeable_1_0= 'var' )
+                    // InternalUIGrammar.g:21685:6: lv_writeable_1_0= 'var'
+                    {
+                    lv_writeable_1_0=(Token)match(input,197,FOLLOW_16); 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 :
+                    // InternalUIGrammar.g:21698:4: otherlv_2= 'val'
+                    {
+                    otherlv_2=(Token)match(input,198,FOLLOW_16); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getXVariableDeclarationAccess().getValKeyword_1_1());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:21703:3: ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) )
+            int alt475=2;
+            int LA475_0 = input.LA(1);
+
+            if ( (LA475_0==RULE_ID) ) {
+                int LA475_1 = input.LA(2);
+
+                if ( (synpred37_InternalUIGrammar()) ) {
+                    alt475=1;
+                }
+                else if ( (true) ) {
+                    alt475=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return current;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 475, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else if ( (LA475_0==45) && (synpred37_InternalUIGrammar())) {
+                alt475=1;
+            }
+            else if ( (LA475_0==177) && (synpred37_InternalUIGrammar())) {
+                alt475=1;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 475, 0, input);
+
+                throw nvae;
+            }
+            switch (alt475) {
+                case 1 :
+                    // InternalUIGrammar.g:21704:4: ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) )
+                    {
+                    // InternalUIGrammar.g:21704:4: ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) )
+                    // InternalUIGrammar.g:21705:5: ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) )
+                    {
+                    // InternalUIGrammar.g:21718:5: ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) )
+                    // InternalUIGrammar.g:21719:6: ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) )
+                    {
+                    // InternalUIGrammar.g:21719:6: ( (lv_type_3_0= ruleJvmTypeReference ) )
+                    // InternalUIGrammar.g:21720:7: (lv_type_3_0= ruleJvmTypeReference )
+                    {
+                    // InternalUIGrammar.g:21720:7: (lv_type_3_0= ruleJvmTypeReference )
+                    // InternalUIGrammar.g:21721:8: lv_type_3_0= ruleJvmTypeReference
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      								newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getTypeJvmTypeReferenceParserRuleCall_2_0_0_0_0());
+                      							
+                    }
+                    pushFollow(FOLLOW_3);
+                    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();
+                      							
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalUIGrammar.g:21738:6: ( (lv_name_4_0= ruleValidID ) )
+                    // InternalUIGrammar.g:21739:7: (lv_name_4_0= ruleValidID )
+                    {
+                    // InternalUIGrammar.g:21739:7: (lv_name_4_0= ruleValidID )
+                    // InternalUIGrammar.g:21740:8: lv_name_4_0= ruleValidID
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      								newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getNameValidIDParserRuleCall_2_0_0_1_0());
+                      							
+                    }
+                    pushFollow(FOLLOW_181);
+                    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 :
+                    // InternalUIGrammar.g:21760:4: ( (lv_name_5_0= ruleValidID ) )
+                    {
+                    // InternalUIGrammar.g:21760:4: ( (lv_name_5_0= ruleValidID ) )
+                    // InternalUIGrammar.g:21761:5: (lv_name_5_0= ruleValidID )
+                    {
+                    // InternalUIGrammar.g:21761:5: (lv_name_5_0= ruleValidID )
+                    // InternalUIGrammar.g:21762:6: lv_name_5_0= ruleValidID
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getNameValidIDParserRuleCall_2_1_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_181);
+                    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;
+
+            }
+
+            // InternalUIGrammar.g:21780:3: (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )?
+            int alt476=2;
+            int LA476_0 = input.LA(1);
+
+            if ( (LA476_0==161) ) {
+                alt476=1;
+            }
+            switch (alt476) {
+                case 1 :
+                    // InternalUIGrammar.g:21781:4: otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) )
+                    {
+                    otherlv_6=(Token)match(input,161,FOLLOW_133); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_6, grammarAccess.getXVariableDeclarationAccess().getEqualsSignKeyword_3_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:21785:4: ( (lv_right_7_0= ruleXExpression ) )
+                    // InternalUIGrammar.g:21786:5: (lv_right_7_0= ruleXExpression )
+                    {
+                    // InternalUIGrammar.g:21786:5: (lv_right_7_0= ruleXExpression )
+                    // InternalUIGrammar.g:21787: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"
+    // InternalUIGrammar.g:21809:1: entryRuleJvmFormalParameter returns [EObject current=null] : iv_ruleJvmFormalParameter= ruleJvmFormalParameter EOF ;
+    public final EObject entryRuleJvmFormalParameter() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleJvmFormalParameter = null;
+
+
+        try {
+            // InternalUIGrammar.g:21809:59: (iv_ruleJvmFormalParameter= ruleJvmFormalParameter EOF )
+            // InternalUIGrammar.g:21810: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"
+    // InternalUIGrammar.g:21816: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 {
+            // InternalUIGrammar.g:21822:2: ( ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) ) )
+            // InternalUIGrammar.g:21823:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) )
+            {
+            // InternalUIGrammar.g:21823:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) )
+            // InternalUIGrammar.g:21824:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) )
+            {
+            // InternalUIGrammar.g:21824:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) )?
+            int alt477=2;
+            int LA477_0 = input.LA(1);
+
+            if ( (LA477_0==RULE_ID) ) {
+                int LA477_1 = input.LA(2);
+
+                if ( (LA477_1==RULE_ID||LA477_1==28||(LA477_1>=31 && LA477_1<=32)) ) {
+                    alt477=1;
+                }
+            }
+            else if ( (LA477_0==45||LA477_0==177) ) {
+                alt477=1;
+            }
+            switch (alt477) {
+                case 1 :
+                    // InternalUIGrammar.g:21825:4: (lv_parameterType_0_0= ruleJvmTypeReference )
+                    {
+                    // InternalUIGrammar.g:21825:4: (lv_parameterType_0_0= ruleJvmTypeReference )
+                    // InternalUIGrammar.g:21826:5: lv_parameterType_0_0= ruleJvmTypeReference
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getJvmFormalParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0());
+                      				
+                    }
+                    pushFollow(FOLLOW_3);
+                    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;
+
+            }
+
+            // InternalUIGrammar.g:21843:3: ( (lv_name_1_0= ruleValidID ) )
+            // InternalUIGrammar.g:21844:4: (lv_name_1_0= ruleValidID )
+            {
+            // InternalUIGrammar.g:21844:4: (lv_name_1_0= ruleValidID )
+            // InternalUIGrammar.g:21845: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"
+    // InternalUIGrammar.g:21866:1: entryRuleFullJvmFormalParameter returns [EObject current=null] : iv_ruleFullJvmFormalParameter= ruleFullJvmFormalParameter EOF ;
+    public final EObject entryRuleFullJvmFormalParameter() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleFullJvmFormalParameter = null;
+
+
+        try {
+            // InternalUIGrammar.g:21866:63: (iv_ruleFullJvmFormalParameter= ruleFullJvmFormalParameter EOF )
+            // InternalUIGrammar.g:21867: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"
+    // InternalUIGrammar.g:21873: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 {
+            // InternalUIGrammar.g:21879:2: ( ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) ) )
+            // InternalUIGrammar.g:21880:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) )
+            {
+            // InternalUIGrammar.g:21880:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) )
+            // InternalUIGrammar.g:21881:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) )
+            {
+            // InternalUIGrammar.g:21881:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) )
+            // InternalUIGrammar.g:21882:4: (lv_parameterType_0_0= ruleJvmTypeReference )
+            {
+            // InternalUIGrammar.g:21882:4: (lv_parameterType_0_0= ruleJvmTypeReference )
+            // InternalUIGrammar.g:21883:5: lv_parameterType_0_0= ruleJvmTypeReference
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getFullJvmFormalParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0());
+              				
+            }
+            pushFollow(FOLLOW_3);
+            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();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalUIGrammar.g:21900:3: ( (lv_name_1_0= ruleValidID ) )
+            // InternalUIGrammar.g:21901:4: (lv_name_1_0= ruleValidID )
+            {
+            // InternalUIGrammar.g:21901:4: (lv_name_1_0= ruleValidID )
+            // InternalUIGrammar.g:21902: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"
+    // InternalUIGrammar.g:21923:1: entryRuleXFeatureCall returns [EObject current=null] : iv_ruleXFeatureCall= ruleXFeatureCall EOF ;
+    public final EObject entryRuleXFeatureCall() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXFeatureCall = null;
+
+
+        try {
+            // InternalUIGrammar.g:21923:53: (iv_ruleXFeatureCall= ruleXFeatureCall EOF )
+            // InternalUIGrammar.g:21924: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"
+    // InternalUIGrammar.g:21930: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 {
+            // InternalUIGrammar.g:21936: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 ) )? ) )
+            // InternalUIGrammar.g:21937: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 ) )? )
+            {
+            // InternalUIGrammar.g:21937: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 ) )? )
+            // InternalUIGrammar.g:21938: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 ) )?
+            {
+            // InternalUIGrammar.g:21938:3: ()
+            // InternalUIGrammar.g:21939:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXFeatureCallAccess().getXFeatureCallAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalUIGrammar.g:21945:3: (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )?
+            int alt479=2;
+            int LA479_0 = input.LA(1);
+
+            if ( (LA479_0==28) ) {
+                alt479=1;
+            }
+            switch (alt479) {
+                case 1 :
+                    // InternalUIGrammar.g:21946:4: otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>'
+                    {
+                    otherlv_1=(Token)match(input,28,FOLLOW_156); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_1, grammarAccess.getXFeatureCallAccess().getLessThanSignKeyword_1_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:21950:4: ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) )
+                    // InternalUIGrammar.g:21951:5: (lv_typeArguments_2_0= ruleJvmArgumentTypeReference )
+                    {
+                    // InternalUIGrammar.g:21951:5: (lv_typeArguments_2_0= ruleJvmArgumentTypeReference )
+                    // InternalUIGrammar.g:21952:6: lv_typeArguments_2_0= ruleJvmArgumentTypeReference
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_157);
+                    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();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalUIGrammar.g:21969:4: (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )*
+                    loop478:
+                    do {
+                        int alt478=2;
+                        int LA478_0 = input.LA(1);
+
+                        if ( (LA478_0==102) ) {
+                            alt478=1;
+                        }
+
+
+                        switch (alt478) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:21970:5: otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) )
+                    	    {
+                    	    otherlv_3=(Token)match(input,102,FOLLOW_156); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      					newLeafNode(otherlv_3, grammarAccess.getXFeatureCallAccess().getCommaKeyword_1_2_0());
+                    	      				
+                    	    }
+                    	    // InternalUIGrammar.g:21974:5: ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) )
+                    	    // InternalUIGrammar.g:21975:6: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
+                    	    {
+                    	    // InternalUIGrammar.g:21975:6: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
+                    	    // InternalUIGrammar.g:21976:7: lv_typeArguments_4_0= ruleJvmArgumentTypeReference
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_157);
+                    	    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 loop478;
+                        }
+                    } while (true);
+
+                    otherlv_5=(Token)match(input,30,FOLLOW_155); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_5, grammarAccess.getXFeatureCallAccess().getGreaterThanSignKeyword_1_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:21999:3: ( ( ruleIdOrSuper ) )
+            // InternalUIGrammar.g:22000:4: ( ruleIdOrSuper )
+            {
+            // InternalUIGrammar.g:22000:4: ( ruleIdOrSuper )
+            // InternalUIGrammar.g:22001: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_182);
+            ruleIdOrSuper();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalUIGrammar.g:22015: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 alt482=2;
+            alt482 = dfa482.predict(input);
+            switch (alt482) {
+                case 1 :
+                    // InternalUIGrammar.g:22016: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= ')'
+                    {
+                    // InternalUIGrammar.g:22016:4: ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) )
+                    // InternalUIGrammar.g:22017:5: ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' )
+                    {
+                    // InternalUIGrammar.g:22021:5: (lv_explicitOperationCall_7_0= '(' )
+                    // InternalUIGrammar.g:22022:6: lv_explicitOperationCall_7_0= '('
+                    {
+                    lv_explicitOperationCall_7_0=(Token)match(input,45,FOLLOW_159); 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, "(");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalUIGrammar.g:22034:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )?
+                    int alt481=3;
+                    alt481 = dfa481.predict(input);
+                    switch (alt481) {
+                        case 1 :
+                            // InternalUIGrammar.g:22035:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) )
+                            {
+                            // InternalUIGrammar.g:22035:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) )
+                            // InternalUIGrammar.g:22036:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure )
+                            {
+                            // InternalUIGrammar.g:22061:6: (lv_featureCallArguments_8_0= ruleXShortClosure )
+                            // InternalUIGrammar.g:22062:7: lv_featureCallArguments_8_0= ruleXShortClosure
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXShortClosureParserRuleCall_3_1_0_0());
+                              						
+                            }
+                            pushFollow(FOLLOW_36);
+                            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 :
+                            // InternalUIGrammar.g:22080:5: ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* )
+                            {
+                            // InternalUIGrammar.g:22080:5: ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* )
+                            // InternalUIGrammar.g:22081:6: ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )*
+                            {
+                            // InternalUIGrammar.g:22081:6: ( (lv_featureCallArguments_9_0= ruleXExpression ) )
+                            // InternalUIGrammar.g:22082:7: (lv_featureCallArguments_9_0= ruleXExpression )
+                            {
+                            // InternalUIGrammar.g:22082:7: (lv_featureCallArguments_9_0= ruleXExpression )
+                            // InternalUIGrammar.g:22083:8: lv_featureCallArguments_9_0= ruleXExpression
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              								newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_0_0());
+                              							
+                            }
+                            pushFollow(FOLLOW_94);
+                            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();
+                              							
+                            }
+
+                            }
+
+
+                            }
+
+                            // InternalUIGrammar.g:22100:6: (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )*
+                            loop480:
+                            do {
+                                int alt480=2;
+                                int LA480_0 = input.LA(1);
+
+                                if ( (LA480_0==102) ) {
+                                    alt480=1;
+                                }
+
+
+                                switch (alt480) {
+                            	case 1 :
+                            	    // InternalUIGrammar.g:22101:7: otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) )
+                            	    {
+                            	    otherlv_10=(Token)match(input,102,FOLLOW_133); if (state.failed) return current;
+                            	    if ( state.backtracking==0 ) {
+
+                            	      							newLeafNode(otherlv_10, grammarAccess.getXFeatureCallAccess().getCommaKeyword_3_1_1_1_0());
+                            	      						
+                            	    }
+                            	    // InternalUIGrammar.g:22105:7: ( (lv_featureCallArguments_11_0= ruleXExpression ) )
+                            	    // InternalUIGrammar.g:22106:8: (lv_featureCallArguments_11_0= ruleXExpression )
+                            	    {
+                            	    // InternalUIGrammar.g:22106:8: (lv_featureCallArguments_11_0= ruleXExpression )
+                            	    // InternalUIGrammar.g:22107:9: lv_featureCallArguments_11_0= ruleXExpression
+                            	    {
+                            	    if ( state.backtracking==0 ) {
+
+                            	      									newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_1_1_0());
+                            	      								
+                            	    }
+                            	    pushFollow(FOLLOW_94);
+                            	    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 loop480;
+                                }
+                            } while (true);
+
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_12=(Token)match(input,47,FOLLOW_183); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_12, grammarAccess.getXFeatureCallAccess().getRightParenthesisKeyword_3_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:22132:3: ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )?
+            int alt483=2;
+            alt483 = dfa483.predict(input);
+            switch (alt483) {
+                case 1 :
+                    // InternalUIGrammar.g:22133:4: ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure )
+                    {
+                    // InternalUIGrammar.g:22139:4: (lv_featureCallArguments_13_0= ruleXClosure )
+                    // InternalUIGrammar.g:22140: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"
+    // InternalUIGrammar.g:22161:1: entryRuleFeatureCallID returns [String current=null] : iv_ruleFeatureCallID= ruleFeatureCallID EOF ;
+    public final String entryRuleFeatureCallID() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleFeatureCallID = null;
+
+
+        try {
+            // InternalUIGrammar.g:22161:53: (iv_ruleFeatureCallID= ruleFeatureCallID EOF )
+            // InternalUIGrammar.g:22162: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"
+    // InternalUIGrammar.g:22168: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 {
+            // InternalUIGrammar.g:22174:2: ( (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' ) )
+            // InternalUIGrammar.g:22175:2: (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' )
+            {
+            // InternalUIGrammar.g:22175:2: (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' )
+            int alt484=5;
+            switch ( input.LA(1) ) {
+            case RULE_ID:
+                {
+                alt484=1;
+                }
+                break;
+            case 199:
+                {
+                alt484=2;
+                }
+                break;
+            case 156:
+                {
+                alt484=3;
+                }
+                break;
+            case 155:
+                {
+                alt484=4;
+                }
+                break;
+            case 157:
+                {
+                alt484=5;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 484, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt484) {
+                case 1 :
+                    // InternalUIGrammar.g:22176: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 :
+                    // InternalUIGrammar.g:22187:3: kw= 'extends'
+                    {
+                    kw=(Token)match(input,199,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getExtendsKeyword_1());
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalUIGrammar.g:22193:3: kw= 'static'
+                    {
+                    kw=(Token)match(input,156,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getStaticKeyword_2());
+                      		
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalUIGrammar.g:22199:3: kw= 'import'
+                    {
+                    kw=(Token)match(input,155,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getImportKeyword_3());
+                      		
+                    }
+
+                    }
+                    break;
+                case 5 :
+                    // InternalUIGrammar.g:22205:3: kw= 'extension'
+                    {
+                    kw=(Token)match(input,157,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"
+    // InternalUIGrammar.g:22214:1: entryRuleIdOrSuper returns [String current=null] : iv_ruleIdOrSuper= ruleIdOrSuper EOF ;
+    public final String entryRuleIdOrSuper() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleIdOrSuper = null;
+
+
+        try {
+            // InternalUIGrammar.g:22214:49: (iv_ruleIdOrSuper= ruleIdOrSuper EOF )
+            // InternalUIGrammar.g:22215: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"
+    // InternalUIGrammar.g:22221: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 {
+            // InternalUIGrammar.g:22227:2: ( (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' ) )
+            // InternalUIGrammar.g:22228:2: (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' )
+            {
+            // InternalUIGrammar.g:22228:2: (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' )
+            int alt485=2;
+            int LA485_0 = input.LA(1);
+
+            if ( (LA485_0==RULE_ID||(LA485_0>=155 && LA485_0<=157)||LA485_0==199) ) {
+                alt485=1;
+            }
+            else if ( (LA485_0==200) ) {
+                alt485=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 485, 0, input);
+
+                throw nvae;
+            }
+            switch (alt485) {
+                case 1 :
+                    // InternalUIGrammar.g:22229: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 :
+                    // InternalUIGrammar.g:22240:3: kw= 'super'
+                    {
+                    kw=(Token)match(input,200,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"
+    // InternalUIGrammar.g:22249:1: entryRuleXConstructorCall returns [EObject current=null] : iv_ruleXConstructorCall= ruleXConstructorCall EOF ;
+    public final EObject entryRuleXConstructorCall() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXConstructorCall = null;
+
+
+        try {
+            // InternalUIGrammar.g:22249:57: (iv_ruleXConstructorCall= ruleXConstructorCall EOF )
+            // InternalUIGrammar.g:22250: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"
+    // InternalUIGrammar.g:22256: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 {
+            // InternalUIGrammar.g:22262: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 ) )? ) )
+            // InternalUIGrammar.g:22263: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 ) )? )
+            {
+            // InternalUIGrammar.g:22263: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 ) )? )
+            // InternalUIGrammar.g:22264: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 ) )?
+            {
+            // InternalUIGrammar.g:22264:3: ()
+            // InternalUIGrammar.g:22265:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXConstructorCallAccess().getXConstructorCallAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,201,FOLLOW_3); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXConstructorCallAccess().getNewKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:22275:3: ( ( ruleQualifiedName ) )
+            // InternalUIGrammar.g:22276:4: ( ruleQualifiedName )
+            {
+            // InternalUIGrammar.g:22276:4: ( ruleQualifiedName )
+            // InternalUIGrammar.g:22277: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_184);
+            ruleQualifiedName();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalUIGrammar.g:22291:3: ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )?
+            int alt487=2;
+            alt487 = dfa487.predict(input);
+            switch (alt487) {
+                case 1 :
+                    // InternalUIGrammar.g:22292:4: ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>'
+                    {
+                    // InternalUIGrammar.g:22292:4: ( ( '<' )=>otherlv_3= '<' )
+                    // InternalUIGrammar.g:22293:5: ( '<' )=>otherlv_3= '<'
+                    {
+                    otherlv_3=(Token)match(input,28,FOLLOW_156); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_3, grammarAccess.getXConstructorCallAccess().getLessThanSignKeyword_3_0());
+                      				
+                    }
+
+                    }
+
+                    // InternalUIGrammar.g:22299:4: ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) )
+                    // InternalUIGrammar.g:22300:5: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
+                    {
+                    // InternalUIGrammar.g:22300:5: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
+                    // InternalUIGrammar.g:22301:6: lv_typeArguments_4_0= ruleJvmArgumentTypeReference
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getXConstructorCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_3_1_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_157);
+                    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();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalUIGrammar.g:22318:4: (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )*
+                    loop486:
+                    do {
+                        int alt486=2;
+                        int LA486_0 = input.LA(1);
+
+                        if ( (LA486_0==102) ) {
+                            alt486=1;
+                        }
+
+
+                        switch (alt486) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:22319:5: otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) )
+                    	    {
+                    	    otherlv_5=(Token)match(input,102,FOLLOW_156); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      					newLeafNode(otherlv_5, grammarAccess.getXConstructorCallAccess().getCommaKeyword_3_2_0());
+                    	      				
+                    	    }
+                    	    // InternalUIGrammar.g:22323:5: ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) )
+                    	    // InternalUIGrammar.g:22324:6: (lv_typeArguments_6_0= ruleJvmArgumentTypeReference )
+                    	    {
+                    	    // InternalUIGrammar.g:22324:6: (lv_typeArguments_6_0= ruleJvmArgumentTypeReference )
+                    	    // InternalUIGrammar.g:22325:7: lv_typeArguments_6_0= ruleJvmArgumentTypeReference
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getXConstructorCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_3_2_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_157);
+                    	    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 loop486;
+                        }
+                    } while (true);
+
+                    otherlv_7=(Token)match(input,30,FOLLOW_182); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_7, grammarAccess.getXConstructorCallAccess().getGreaterThanSignKeyword_3_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:22348: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 alt490=2;
+            alt490 = dfa490.predict(input);
+            switch (alt490) {
+                case 1 :
+                    // InternalUIGrammar.g:22349: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= ')'
+                    {
+                    // InternalUIGrammar.g:22349:4: ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) )
+                    // InternalUIGrammar.g:22350:5: ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' )
+                    {
+                    // InternalUIGrammar.g:22354:5: (lv_explicitConstructorCall_8_0= '(' )
+                    // InternalUIGrammar.g:22355:6: lv_explicitConstructorCall_8_0= '('
+                    {
+                    lv_explicitConstructorCall_8_0=(Token)match(input,45,FOLLOW_159); 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, "(");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalUIGrammar.g:22367:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )?
+                    int alt489=3;
+                    alt489 = dfa489.predict(input);
+                    switch (alt489) {
+                        case 1 :
+                            // InternalUIGrammar.g:22368:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) )
+                            {
+                            // InternalUIGrammar.g:22368:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) )
+                            // InternalUIGrammar.g:22369:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure )
+                            {
+                            // InternalUIGrammar.g:22394:6: (lv_arguments_9_0= ruleXShortClosure )
+                            // InternalUIGrammar.g:22395:7: lv_arguments_9_0= ruleXShortClosure
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXShortClosureParserRuleCall_4_1_0_0());
+                              						
+                            }
+                            pushFollow(FOLLOW_36);
+                            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 :
+                            // InternalUIGrammar.g:22413:5: ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* )
+                            {
+                            // InternalUIGrammar.g:22413:5: ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* )
+                            // InternalUIGrammar.g:22414:6: ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )*
+                            {
+                            // InternalUIGrammar.g:22414:6: ( (lv_arguments_10_0= ruleXExpression ) )
+                            // InternalUIGrammar.g:22415:7: (lv_arguments_10_0= ruleXExpression )
+                            {
+                            // InternalUIGrammar.g:22415:7: (lv_arguments_10_0= ruleXExpression )
+                            // InternalUIGrammar.g:22416:8: lv_arguments_10_0= ruleXExpression
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              								newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXExpressionParserRuleCall_4_1_1_0_0());
+                              							
+                            }
+                            pushFollow(FOLLOW_94);
+                            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();
+                              							
+                            }
+
+                            }
+
+
+                            }
+
+                            // InternalUIGrammar.g:22433:6: (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )*
+                            loop488:
+                            do {
+                                int alt488=2;
+                                int LA488_0 = input.LA(1);
+
+                                if ( (LA488_0==102) ) {
+                                    alt488=1;
+                                }
+
+
+                                switch (alt488) {
+                            	case 1 :
+                            	    // InternalUIGrammar.g:22434:7: otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) )
+                            	    {
+                            	    otherlv_11=(Token)match(input,102,FOLLOW_133); if (state.failed) return current;
+                            	    if ( state.backtracking==0 ) {
+
+                            	      							newLeafNode(otherlv_11, grammarAccess.getXConstructorCallAccess().getCommaKeyword_4_1_1_1_0());
+                            	      						
+                            	    }
+                            	    // InternalUIGrammar.g:22438:7: ( (lv_arguments_12_0= ruleXExpression ) )
+                            	    // InternalUIGrammar.g:22439:8: (lv_arguments_12_0= ruleXExpression )
+                            	    {
+                            	    // InternalUIGrammar.g:22439:8: (lv_arguments_12_0= ruleXExpression )
+                            	    // InternalUIGrammar.g:22440:9: lv_arguments_12_0= ruleXExpression
+                            	    {
+                            	    if ( state.backtracking==0 ) {
+
+                            	      									newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXExpressionParserRuleCall_4_1_1_1_1_0());
+                            	      								
+                            	    }
+                            	    pushFollow(FOLLOW_94);
+                            	    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 loop488;
+                                }
+                            } while (true);
+
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_13=(Token)match(input,47,FOLLOW_183); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_13, grammarAccess.getXConstructorCallAccess().getRightParenthesisKeyword_4_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUIGrammar.g:22465:3: ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )?
+            int alt491=2;
+            alt491 = dfa491.predict(input);
+            switch (alt491) {
+                case 1 :
+                    // InternalUIGrammar.g:22466:4: ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure )
+                    {
+                    // InternalUIGrammar.g:22472:4: (lv_arguments_14_0= ruleXClosure )
+                    // InternalUIGrammar.g:22473: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"
+    // InternalUIGrammar.g:22494:1: entryRuleXBooleanLiteral returns [EObject current=null] : iv_ruleXBooleanLiteral= ruleXBooleanLiteral EOF ;
+    public final EObject entryRuleXBooleanLiteral() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXBooleanLiteral = null;
+
+
+        try {
+            // InternalUIGrammar.g:22494:56: (iv_ruleXBooleanLiteral= ruleXBooleanLiteral EOF )
+            // InternalUIGrammar.g:22495: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"
+    // InternalUIGrammar.g:22501: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 {
+            // InternalUIGrammar.g:22507:2: ( ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) ) )
+            // InternalUIGrammar.g:22508:2: ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) )
+            {
+            // InternalUIGrammar.g:22508:2: ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) )
+            // InternalUIGrammar.g:22509:3: () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) )
+            {
+            // InternalUIGrammar.g:22509:3: ()
+            // InternalUIGrammar.g:22510:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXBooleanLiteralAccess().getXBooleanLiteralAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalUIGrammar.g:22516:3: (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) )
+            int alt492=2;
+            int LA492_0 = input.LA(1);
+
+            if ( (LA492_0==202) ) {
+                alt492=1;
+            }
+            else if ( (LA492_0==203) ) {
+                alt492=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 492, 0, input);
+
+                throw nvae;
+            }
+            switch (alt492) {
+                case 1 :
+                    // InternalUIGrammar.g:22517:4: otherlv_1= 'false'
+                    {
+                    otherlv_1=(Token)match(input,202,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_1, grammarAccess.getXBooleanLiteralAccess().getFalseKeyword_1_0());
+                      			
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalUIGrammar.g:22522:4: ( (lv_isTrue_2_0= 'true' ) )
+                    {
+                    // InternalUIGrammar.g:22522:4: ( (lv_isTrue_2_0= 'true' ) )
+                    // InternalUIGrammar.g:22523:5: (lv_isTrue_2_0= 'true' )
+                    {
+                    // InternalUIGrammar.g:22523:5: (lv_isTrue_2_0= 'true' )
+                    // InternalUIGrammar.g:22524:6: lv_isTrue_2_0= 'true'
+                    {
+                    lv_isTrue_2_0=(Token)match(input,203,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"
+    // InternalUIGrammar.g:22541:1: entryRuleXNullLiteral returns [EObject current=null] : iv_ruleXNullLiteral= ruleXNullLiteral EOF ;
+    public final EObject entryRuleXNullLiteral() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXNullLiteral = null;
+
+
+        try {
+            // InternalUIGrammar.g:22541:53: (iv_ruleXNullLiteral= ruleXNullLiteral EOF )
+            // InternalUIGrammar.g:22542: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"
+    // InternalUIGrammar.g:22548:1: ruleXNullLiteral returns [EObject current=null] : ( () otherlv_1= 'null' ) ;
+    public final EObject ruleXNullLiteral() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:22554:2: ( ( () otherlv_1= 'null' ) )
+            // InternalUIGrammar.g:22555:2: ( () otherlv_1= 'null' )
+            {
+            // InternalUIGrammar.g:22555:2: ( () otherlv_1= 'null' )
+            // InternalUIGrammar.g:22556:3: () otherlv_1= 'null'
+            {
+            // InternalUIGrammar.g:22556:3: ()
+            // InternalUIGrammar.g:22557:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXNullLiteralAccess().getXNullLiteralAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,204,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"
+    // InternalUIGrammar.g:22571:1: entryRuleXNumberLiteral returns [EObject current=null] : iv_ruleXNumberLiteral= ruleXNumberLiteral EOF ;
+    public final EObject entryRuleXNumberLiteral() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXNumberLiteral = null;
+
+
+        try {
+            // InternalUIGrammar.g:22571:55: (iv_ruleXNumberLiteral= ruleXNumberLiteral EOF )
+            // InternalUIGrammar.g:22572: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"
+    // InternalUIGrammar.g:22578: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 {
+            // InternalUIGrammar.g:22584:2: ( ( () ( (lv_value_1_0= ruleNumber ) ) ) )
+            // InternalUIGrammar.g:22585:2: ( () ( (lv_value_1_0= ruleNumber ) ) )
+            {
+            // InternalUIGrammar.g:22585:2: ( () ( (lv_value_1_0= ruleNumber ) ) )
+            // InternalUIGrammar.g:22586:3: () ( (lv_value_1_0= ruleNumber ) )
+            {
+            // InternalUIGrammar.g:22586:3: ()
+            // InternalUIGrammar.g:22587:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXNumberLiteralAccess().getXNumberLiteralAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalUIGrammar.g:22593:3: ( (lv_value_1_0= ruleNumber ) )
+            // InternalUIGrammar.g:22594:4: (lv_value_1_0= ruleNumber )
+            {
+            // InternalUIGrammar.g:22594:4: (lv_value_1_0= ruleNumber )
+            // InternalUIGrammar.g:22595: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"
+    // InternalUIGrammar.g:22616:1: entryRuleXStringLiteral returns [EObject current=null] : iv_ruleXStringLiteral= ruleXStringLiteral EOF ;
+    public final EObject entryRuleXStringLiteral() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXStringLiteral = null;
+
+
+        try {
+            // InternalUIGrammar.g:22616:55: (iv_ruleXStringLiteral= ruleXStringLiteral EOF )
+            // InternalUIGrammar.g:22617: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"
+    // InternalUIGrammar.g:22623: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 {
+            // InternalUIGrammar.g:22629:2: ( ( () ( (lv_value_1_0= RULE_STRING ) ) ) )
+            // InternalUIGrammar.g:22630:2: ( () ( (lv_value_1_0= RULE_STRING ) ) )
+            {
+            // InternalUIGrammar.g:22630:2: ( () ( (lv_value_1_0= RULE_STRING ) ) )
+            // InternalUIGrammar.g:22631:3: () ( (lv_value_1_0= RULE_STRING ) )
+            {
+            // InternalUIGrammar.g:22631:3: ()
+            // InternalUIGrammar.g:22632:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXStringLiteralAccess().getXStringLiteralAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalUIGrammar.g:22638:3: ( (lv_value_1_0= RULE_STRING ) )
+            // InternalUIGrammar.g:22639:4: (lv_value_1_0= RULE_STRING )
+            {
+            // InternalUIGrammar.g:22639:4: (lv_value_1_0= RULE_STRING )
+            // InternalUIGrammar.g:22640: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"
+    // InternalUIGrammar.g:22660:1: entryRuleXTypeLiteral returns [EObject current=null] : iv_ruleXTypeLiteral= ruleXTypeLiteral EOF ;
+    public final EObject entryRuleXTypeLiteral() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXTypeLiteral = null;
+
+
+        try {
+            // InternalUIGrammar.g:22660:53: (iv_ruleXTypeLiteral= ruleXTypeLiteral EOF )
+            // InternalUIGrammar.g:22661: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"
+    // InternalUIGrammar.g:22667: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 {
+            // InternalUIGrammar.g:22673:2: ( ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' ) )
+            // InternalUIGrammar.g:22674:2: ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' )
+            {
+            // InternalUIGrammar.g:22674:2: ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' )
+            // InternalUIGrammar.g:22675:3: () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')'
+            {
+            // InternalUIGrammar.g:22675:3: ()
+            // InternalUIGrammar.g:22676:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXTypeLiteralAccess().getXTypeLiteralAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,205,FOLLOW_34); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXTypeLiteralAccess().getTypeofKeyword_1());
+              		
+            }
+            otherlv_2=(Token)match(input,45,FOLLOW_3); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getXTypeLiteralAccess().getLeftParenthesisKeyword_2());
+              		
+            }
+            // InternalUIGrammar.g:22690:3: ( ( ruleQualifiedName ) )
+            // InternalUIGrammar.g:22691:4: ( ruleQualifiedName )
+            {
+            // InternalUIGrammar.g:22691:4: ( ruleQualifiedName )
+            // InternalUIGrammar.g:22692: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_185);
+            ruleQualifiedName();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalUIGrammar.g:22706:3: ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )*
+            loop493:
+            do {
+                int alt493=2;
+                int LA493_0 = input.LA(1);
+
+                if ( (LA493_0==32) ) {
+                    alt493=1;
+                }
+
+
+                switch (alt493) {
+            	case 1 :
+            	    // InternalUIGrammar.g:22707:4: (lv_arrayDimensions_4_0= ruleArrayBrackets )
+            	    {
+            	    // InternalUIGrammar.g:22707:4: (lv_arrayDimensions_4_0= ruleArrayBrackets )
+            	    // InternalUIGrammar.g:22708:5: lv_arrayDimensions_4_0= ruleArrayBrackets
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getXTypeLiteralAccess().getArrayDimensionsArrayBracketsParserRuleCall_4_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_185);
+            	    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 loop493;
+                }
+            } while (true);
+
+            otherlv_5=(Token)match(input,47,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"
+    // InternalUIGrammar.g:22733:1: entryRuleXThrowExpression returns [EObject current=null] : iv_ruleXThrowExpression= ruleXThrowExpression EOF ;
+    public final EObject entryRuleXThrowExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXThrowExpression = null;
+
+
+        try {
+            // InternalUIGrammar.g:22733:57: (iv_ruleXThrowExpression= ruleXThrowExpression EOF )
+            // InternalUIGrammar.g:22734: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"
+    // InternalUIGrammar.g:22740: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 {
+            // InternalUIGrammar.g:22746:2: ( ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) ) )
+            // InternalUIGrammar.g:22747:2: ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) )
+            {
+            // InternalUIGrammar.g:22747:2: ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) )
+            // InternalUIGrammar.g:22748:3: () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) )
+            {
+            // InternalUIGrammar.g:22748:3: ()
+            // InternalUIGrammar.g:22749:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXThrowExpressionAccess().getXThrowExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,206,FOLLOW_133); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXThrowExpressionAccess().getThrowKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:22759:3: ( (lv_expression_2_0= ruleXExpression ) )
+            // InternalUIGrammar.g:22760:4: (lv_expression_2_0= ruleXExpression )
+            {
+            // InternalUIGrammar.g:22760:4: (lv_expression_2_0= ruleXExpression )
+            // InternalUIGrammar.g:22761: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"
+    // InternalUIGrammar.g:22782:1: entryRuleXReturnExpression returns [EObject current=null] : iv_ruleXReturnExpression= ruleXReturnExpression EOF ;
+    public final EObject entryRuleXReturnExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXReturnExpression = null;
+
+
+        try {
+            // InternalUIGrammar.g:22782:58: (iv_ruleXReturnExpression= ruleXReturnExpression EOF )
+            // InternalUIGrammar.g:22783: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"
+    // InternalUIGrammar.g:22789: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 {
+            // InternalUIGrammar.g:22795: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 ) )? ) )
+            // InternalUIGrammar.g:22796: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 ) )? )
+            {
+            // InternalUIGrammar.g:22796: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 ) )? )
+            // InternalUIGrammar.g:22797: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 ) )?
+            {
+            // InternalUIGrammar.g:22797:3: ()
+            // InternalUIGrammar.g:22798:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXReturnExpressionAccess().getXReturnExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,207,FOLLOW_186); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXReturnExpressionAccess().getReturnKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:22808: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 alt494=2;
+            alt494 = dfa494.predict(input);
+            switch (alt494) {
+                case 1 :
+                    // InternalUIGrammar.g:22809: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 )
+                    {
+                    // InternalUIGrammar.g:22810:4: (lv_expression_2_0= ruleXExpression )
+                    // InternalUIGrammar.g:22811: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"
+    // InternalUIGrammar.g:22832:1: entryRuleXTryCatchFinallyExpression returns [EObject current=null] : iv_ruleXTryCatchFinallyExpression= ruleXTryCatchFinallyExpression EOF ;
+    public final EObject entryRuleXTryCatchFinallyExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXTryCatchFinallyExpression = null;
+
+
+        try {
+            // InternalUIGrammar.g:22832:67: (iv_ruleXTryCatchFinallyExpression= ruleXTryCatchFinallyExpression EOF )
+            // InternalUIGrammar.g:22833: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"
+    // InternalUIGrammar.g:22839: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 {
+            // InternalUIGrammar.g:22845: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 ) ) ) ) ) )
+            // InternalUIGrammar.g:22846: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 ) ) ) ) )
+            {
+            // InternalUIGrammar.g:22846: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 ) ) ) ) )
+            // InternalUIGrammar.g:22847: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 ) ) ) )
+            {
+            // InternalUIGrammar.g:22847:3: ()
+            // InternalUIGrammar.g:22848:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXTryCatchFinallyExpressionAccess().getXTryCatchFinallyExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,208,FOLLOW_133); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXTryCatchFinallyExpressionAccess().getTryKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:22858:3: ( (lv_expression_2_0= ruleXExpression ) )
+            // InternalUIGrammar.g:22859:4: (lv_expression_2_0= ruleXExpression )
+            {
+            // InternalUIGrammar.g:22859:4: (lv_expression_2_0= ruleXExpression )
+            // InternalUIGrammar.g:22860:5: lv_expression_2_0= ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getExpressionXExpressionParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FOLLOW_187);
+            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();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalUIGrammar.g:22877: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 alt497=2;
+            int LA497_0 = input.LA(1);
+
+            if ( (LA497_0==211) ) {
+                alt497=1;
+            }
+            else if ( (LA497_0==209) ) {
+                alt497=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 497, 0, input);
+
+                throw nvae;
+            }
+            switch (alt497) {
+                case 1 :
+                    // InternalUIGrammar.g:22878:4: ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? )
+                    {
+                    // InternalUIGrammar.g:22878:4: ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? )
+                    // InternalUIGrammar.g:22879:5: ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )?
+                    {
+                    // InternalUIGrammar.g:22879:5: ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+
+                    int cnt495=0;
+                    loop495:
+                    do {
+                        int alt495=2;
+                        int LA495_0 = input.LA(1);
+
+                        if ( (LA495_0==211) ) {
+                            int LA495_2 = input.LA(2);
+
+                            if ( (synpred46_InternalUIGrammar()) ) {
+                                alt495=1;
+                            }
+
+
+                        }
+
+
+                        switch (alt495) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:22880:6: ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause )
+                    	    {
+                    	    // InternalUIGrammar.g:22881:6: (lv_catchClauses_3_0= ruleXCatchClause )
+                    	    // InternalUIGrammar.g:22882:7: lv_catchClauses_3_0= ruleXCatchClause
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getCatchClausesXCatchClauseParserRuleCall_3_0_0_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_188);
+                    	    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 ( cnt495 >= 1 ) break loop495;
+                    	    if (state.backtracking>0) {state.failed=true; return current;}
+                                EarlyExitException eee =
+                                    new EarlyExitException(495, input);
+                                throw eee;
+                        }
+                        cnt495++;
+                    } while (true);
+
+                    // InternalUIGrammar.g:22899:5: ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )?
+                    int alt496=2;
+                    int LA496_0 = input.LA(1);
+
+                    if ( (LA496_0==209) ) {
+                        int LA496_1 = input.LA(2);
+
+                        if ( (synpred47_InternalUIGrammar()) ) {
+                            alt496=1;
+                        }
+                    }
+                    switch (alt496) {
+                        case 1 :
+                            // InternalUIGrammar.g:22900:6: ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) )
+                            {
+                            // InternalUIGrammar.g:22900:6: ( ( 'finally' )=>otherlv_4= 'finally' )
+                            // InternalUIGrammar.g:22901:7: ( 'finally' )=>otherlv_4= 'finally'
+                            {
+                            otherlv_4=(Token)match(input,209,FOLLOW_133); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							newLeafNode(otherlv_4, grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_0_1_0());
+                              						
+                            }
+
+                            }
+
+                            // InternalUIGrammar.g:22907:6: ( (lv_finallyExpression_5_0= ruleXExpression ) )
+                            // InternalUIGrammar.g:22908:7: (lv_finallyExpression_5_0= ruleXExpression )
+                            {
+                            // InternalUIGrammar.g:22908:7: (lv_finallyExpression_5_0= ruleXExpression )
+                            // InternalUIGrammar.g:22909: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 :
+                    // InternalUIGrammar.g:22929:4: (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) )
+                    {
+                    // InternalUIGrammar.g:22929:4: (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) )
+                    // InternalUIGrammar.g:22930:5: otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) )
+                    {
+                    otherlv_6=(Token)match(input,209,FOLLOW_133); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_6, grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_1_0());
+                      				
+                    }
+                    // InternalUIGrammar.g:22934:5: ( (lv_finallyExpression_7_0= ruleXExpression ) )
+                    // InternalUIGrammar.g:22935:6: (lv_finallyExpression_7_0= ruleXExpression )
+                    {
+                    // InternalUIGrammar.g:22935:6: (lv_finallyExpression_7_0= ruleXExpression )
+                    // InternalUIGrammar.g:22936: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"
+    // InternalUIGrammar.g:22959:1: entryRuleXSynchronizedExpression returns [EObject current=null] : iv_ruleXSynchronizedExpression= ruleXSynchronizedExpression EOF ;
+    public final EObject entryRuleXSynchronizedExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXSynchronizedExpression = null;
+
+
+        try {
+            // InternalUIGrammar.g:22959:64: (iv_ruleXSynchronizedExpression= ruleXSynchronizedExpression EOF )
+            // InternalUIGrammar.g:22960: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"
+    // InternalUIGrammar.g:22966: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 {
+            // InternalUIGrammar.g:22972:2: ( ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) ) )
+            // InternalUIGrammar.g:22973:2: ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) )
+            {
+            // InternalUIGrammar.g:22973:2: ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) )
+            // InternalUIGrammar.g:22974:3: ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) )
+            {
+            // InternalUIGrammar.g:22974:3: ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) )
+            // InternalUIGrammar.g:22975:4: ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' )
+            {
+            // InternalUIGrammar.g:22982:4: ( () otherlv_1= 'synchronized' otherlv_2= '(' )
+            // InternalUIGrammar.g:22983:5: () otherlv_1= 'synchronized' otherlv_2= '('
+            {
+            // InternalUIGrammar.g:22983:5: ()
+            // InternalUIGrammar.g:22984:6: 
+            {
+            if ( state.backtracking==0 ) {
+
+              						current = forceCreateModelElement(
+              							grammarAccess.getXSynchronizedExpressionAccess().getXSynchronizedExpressionAction_0_0_0(),
+              							current);
+              					
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,210,FOLLOW_34); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(otherlv_1, grammarAccess.getXSynchronizedExpressionAccess().getSynchronizedKeyword_0_0_1());
+              				
+            }
+            otherlv_2=(Token)match(input,45,FOLLOW_133); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(otherlv_2, grammarAccess.getXSynchronizedExpressionAccess().getLeftParenthesisKeyword_0_0_2());
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalUIGrammar.g:23000:3: ( (lv_param_3_0= ruleXExpression ) )
+            // InternalUIGrammar.g:23001:4: (lv_param_3_0= ruleXExpression )
+            {
+            // InternalUIGrammar.g:23001:4: (lv_param_3_0= ruleXExpression )
+            // InternalUIGrammar.g:23002:5: lv_param_3_0= ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXSynchronizedExpressionAccess().getParamXExpressionParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FOLLOW_36);
+            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,47,FOLLOW_133); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_4, grammarAccess.getXSynchronizedExpressionAccess().getRightParenthesisKeyword_2());
+              		
+            }
+            // InternalUIGrammar.g:23023:3: ( (lv_expression_5_0= ruleXExpression ) )
+            // InternalUIGrammar.g:23024:4: (lv_expression_5_0= ruleXExpression )
+            {
+            // InternalUIGrammar.g:23024:4: (lv_expression_5_0= ruleXExpression )
+            // InternalUIGrammar.g:23025: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"
+    // InternalUIGrammar.g:23046:1: entryRuleXCatchClause returns [EObject current=null] : iv_ruleXCatchClause= ruleXCatchClause EOF ;
+    public final EObject entryRuleXCatchClause() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXCatchClause = null;
+
+
+        try {
+            // InternalUIGrammar.g:23046:53: (iv_ruleXCatchClause= ruleXCatchClause EOF )
+            // InternalUIGrammar.g:23047: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"
+    // InternalUIGrammar.g:23053: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 {
+            // InternalUIGrammar.g:23059:2: ( ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) ) )
+            // InternalUIGrammar.g:23060:2: ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) )
+            {
+            // InternalUIGrammar.g:23060:2: ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) )
+            // InternalUIGrammar.g:23061:3: ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) )
+            {
+            // InternalUIGrammar.g:23061:3: ( ( 'catch' )=>otherlv_0= 'catch' )
+            // InternalUIGrammar.g:23062:4: ( 'catch' )=>otherlv_0= 'catch'
+            {
+            otherlv_0=(Token)match(input,211,FOLLOW_34); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              				newLeafNode(otherlv_0, grammarAccess.getXCatchClauseAccess().getCatchKeyword_0());
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,45,FOLLOW_16); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXCatchClauseAccess().getLeftParenthesisKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:23072:3: ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) )
+            // InternalUIGrammar.g:23073:4: (lv_declaredParam_2_0= ruleFullJvmFormalParameter )
+            {
+            // InternalUIGrammar.g:23073:4: (lv_declaredParam_2_0= ruleFullJvmFormalParameter )
+            // InternalUIGrammar.g:23074:5: lv_declaredParam_2_0= ruleFullJvmFormalParameter
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXCatchClauseAccess().getDeclaredParamFullJvmFormalParameterParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FOLLOW_36);
+            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,47,FOLLOW_133); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_3, grammarAccess.getXCatchClauseAccess().getRightParenthesisKeyword_3());
+              		
+            }
+            // InternalUIGrammar.g:23095:3: ( (lv_expression_4_0= ruleXExpression ) )
+            // InternalUIGrammar.g:23096:4: (lv_expression_4_0= ruleXExpression )
+            {
+            // InternalUIGrammar.g:23096:4: (lv_expression_4_0= ruleXExpression )
+            // InternalUIGrammar.g:23097: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"
+    // InternalUIGrammar.g:23118:1: entryRuleQualifiedName returns [String current=null] : iv_ruleQualifiedName= ruleQualifiedName EOF ;
+    public final String entryRuleQualifiedName() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleQualifiedName = null;
+
+
+        try {
+            // InternalUIGrammar.g:23118:53: (iv_ruleQualifiedName= ruleQualifiedName EOF )
+            // InternalUIGrammar.g:23119: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"
+    // InternalUIGrammar.g:23125: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 {
+            // InternalUIGrammar.g:23131:2: ( (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* ) )
+            // InternalUIGrammar.g:23132:2: (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* )
+            {
+            // InternalUIGrammar.g:23132:2: (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* )
+            // InternalUIGrammar.g:23133:3: this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )*
+            {
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_0());
+              		
+            }
+            pushFollow(FOLLOW_23);
+            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();
+              		
+            }
+            // InternalUIGrammar.g:23143:3: ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )*
+            loop498:
+            do {
+                int alt498=2;
+                int LA498_0 = input.LA(1);
+
+                if ( (LA498_0==31) ) {
+                    int LA498_2 = input.LA(2);
+
+                    if ( (LA498_2==RULE_ID) ) {
+                        int LA498_3 = input.LA(3);
+
+                        if ( (synpred50_InternalUIGrammar()) ) {
+                            alt498=1;
+                        }
+
+
+                    }
+
+
+                }
+
+
+                switch (alt498) {
+            	case 1 :
+            	    // InternalUIGrammar.g:23144:4: ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID
+            	    {
+            	    // InternalUIGrammar.g:23144:4: ( ( '.' )=>kw= '.' )
+            	    // InternalUIGrammar.g:23145:5: ( '.' )=>kw= '.'
+            	    {
+            	    kw=(Token)match(input,31,FOLLOW_3); 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_23);
+            	    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 loop498;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleQualifiedName"
+
+
+    // $ANTLR start "entryRuleNumber"
+    // InternalUIGrammar.g:23167: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 {
+            // InternalUIGrammar.g:23169:2: (iv_ruleNumber= ruleNumber EOF )
+            // InternalUIGrammar.g:23170: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"
+    // InternalUIGrammar.g:23179: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 {
+            // InternalUIGrammar.g:23186: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 ) )? ) ) )
+            // InternalUIGrammar.g:23187: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 ) )? ) )
+            {
+            // InternalUIGrammar.g:23187: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 alt502=2;
+            int LA502_0 = input.LA(1);
+
+            if ( (LA502_0==RULE_HEX) ) {
+                alt502=1;
+            }
+            else if ( (LA502_0==RULE_INT||LA502_0==RULE_DECIMAL) ) {
+                alt502=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 502, 0, input);
+
+                throw nvae;
+            }
+            switch (alt502) {
+                case 1 :
+                    // InternalUIGrammar.g:23188: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 :
+                    // InternalUIGrammar.g:23196:3: ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? )
+                    {
+                    // InternalUIGrammar.g:23196:3: ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? )
+                    // InternalUIGrammar.g:23197:4: (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )?
+                    {
+                    // InternalUIGrammar.g:23197:4: (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL )
+                    int alt499=2;
+                    int LA499_0 = input.LA(1);
+
+                    if ( (LA499_0==RULE_INT) ) {
+                        alt499=1;
+                    }
+                    else if ( (LA499_0==RULE_DECIMAL) ) {
+                        alt499=2;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 499, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt499) {
+                        case 1 :
+                            // InternalUIGrammar.g:23198:5: this_INT_1= RULE_INT
+                            {
+                            this_INT_1=(Token)match(input,RULE_INT,FOLLOW_23); 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 :
+                            // InternalUIGrammar.g:23206:5: this_DECIMAL_2= RULE_DECIMAL
+                            {
+                            this_DECIMAL_2=(Token)match(input,RULE_DECIMAL,FOLLOW_23); 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;
+
+                    }
+
+                    // InternalUIGrammar.g:23214:4: (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )?
+                    int alt501=2;
+                    int LA501_0 = input.LA(1);
+
+                    if ( (LA501_0==31) ) {
+                        int LA501_1 = input.LA(2);
+
+                        if ( (LA501_1==RULE_INT||LA501_1==RULE_DECIMAL) ) {
+                            alt501=1;
+                        }
+                    }
+                    switch (alt501) {
+                        case 1 :
+                            // InternalUIGrammar.g:23215:5: kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL )
+                            {
+                            kw=(Token)match(input,31,FOLLOW_189); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					current.merge(kw);
+                              					newLeafNode(kw, grammarAccess.getNumberAccess().getFullStopKeyword_1_1_0());
+                              				
+                            }
+                            // InternalUIGrammar.g:23220:5: (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL )
+                            int alt500=2;
+                            int LA500_0 = input.LA(1);
+
+                            if ( (LA500_0==RULE_INT) ) {
+                                alt500=1;
+                            }
+                            else if ( (LA500_0==RULE_DECIMAL) ) {
+                                alt500=2;
+                            }
+                            else {
+                                if (state.backtracking>0) {state.failed=true; return current;}
+                                NoViableAltException nvae =
+                                    new NoViableAltException("", 500, 0, input);
+
+                                throw nvae;
+                            }
+                            switch (alt500) {
+                                case 1 :
+                                    // InternalUIGrammar.g:23221: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 :
+                                    // InternalUIGrammar.g:23229: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"
+    // InternalUIGrammar.g:23246:1: entryRuleJvmTypeReference returns [EObject current=null] : iv_ruleJvmTypeReference= ruleJvmTypeReference EOF ;
+    public final EObject entryRuleJvmTypeReference() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleJvmTypeReference = null;
+
+
+        try {
+            // InternalUIGrammar.g:23246:57: (iv_ruleJvmTypeReference= ruleJvmTypeReference EOF )
+            // InternalUIGrammar.g:23247: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"
+    // InternalUIGrammar.g:23253: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 {
+            // InternalUIGrammar.g:23259:2: ( ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef ) )
+            // InternalUIGrammar.g:23260:2: ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef )
+            {
+            // InternalUIGrammar.g:23260:2: ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef )
+            int alt504=2;
+            int LA504_0 = input.LA(1);
+
+            if ( (LA504_0==RULE_ID) ) {
+                alt504=1;
+            }
+            else if ( (LA504_0==45||LA504_0==177) ) {
+                alt504=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 504, 0, input);
+
+                throw nvae;
+            }
+            switch (alt504) {
+                case 1 :
+                    // InternalUIGrammar.g:23261:3: (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* )
+                    {
+                    // InternalUIGrammar.g:23261:3: (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* )
+                    // InternalUIGrammar.g:23262:4: this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )*
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      				newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getJvmParameterizedTypeReferenceParserRuleCall_0_0());
+                      			
+                    }
+                    pushFollow(FOLLOW_183);
+                    this_JvmParameterizedTypeReference_0=ruleJvmParameterizedTypeReference();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = this_JvmParameterizedTypeReference_0;
+                      				afterParserOrEnumRuleCall();
+                      			
+                    }
+                    // InternalUIGrammar.g:23270:4: ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )*
+                    loop503:
+                    do {
+                        int alt503=2;
+                        int LA503_0 = input.LA(1);
+
+                        if ( (LA503_0==32) ) {
+                            int LA503_2 = input.LA(2);
+
+                            if ( (LA503_2==33) ) {
+                                int LA503_3 = input.LA(3);
+
+                                if ( (synpred51_InternalUIGrammar()) ) {
+                                    alt503=1;
+                                }
+
+
+                            }
+
+
+                        }
+
+
+                        switch (alt503) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:23271:5: ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets )
+                    	    {
+                    	    // InternalUIGrammar.g:23277:5: ( () ruleArrayBrackets )
+                    	    // InternalUIGrammar.g:23278:6: () ruleArrayBrackets
+                    	    {
+                    	    // InternalUIGrammar.g:23278:6: ()
+                    	    // InternalUIGrammar.g:23279: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_183);
+                    	    ruleArrayBrackets();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						afterParserOrEnumRuleCall();
+                    	      					
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop503;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalUIGrammar.g:23296: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"
+    // InternalUIGrammar.g:23308:1: entryRuleArrayBrackets returns [String current=null] : iv_ruleArrayBrackets= ruleArrayBrackets EOF ;
+    public final String entryRuleArrayBrackets() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleArrayBrackets = null;
+
+
+        try {
+            // InternalUIGrammar.g:23308:53: (iv_ruleArrayBrackets= ruleArrayBrackets EOF )
+            // InternalUIGrammar.g:23309: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"
+    // InternalUIGrammar.g:23315:1: ruleArrayBrackets returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '[' kw= ']' ) ;
+    public final AntlrDatatypeRuleToken ruleArrayBrackets() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:23321:2: ( (kw= '[' kw= ']' ) )
+            // InternalUIGrammar.g:23322:2: (kw= '[' kw= ']' )
+            {
+            // InternalUIGrammar.g:23322:2: (kw= '[' kw= ']' )
+            // InternalUIGrammar.g:23323:3: kw= '[' kw= ']'
+            {
+            kw=(Token)match(input,32,FOLLOW_25); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current.merge(kw);
+              			newLeafNode(kw, grammarAccess.getArrayBracketsAccess().getLeftSquareBracketKeyword_0());
+              		
+            }
+            kw=(Token)match(input,33,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"
+    // InternalUIGrammar.g:23337:1: entryRuleXFunctionTypeRef returns [EObject current=null] : iv_ruleXFunctionTypeRef= ruleXFunctionTypeRef EOF ;
+    public final EObject entryRuleXFunctionTypeRef() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXFunctionTypeRef = null;
+
+
+        try {
+            // InternalUIGrammar.g:23337:57: (iv_ruleXFunctionTypeRef= ruleXFunctionTypeRef EOF )
+            // InternalUIGrammar.g:23338: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"
+    // InternalUIGrammar.g:23344: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 {
+            // InternalUIGrammar.g:23350:2: ( ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) ) )
+            // InternalUIGrammar.g:23351:2: ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) )
+            {
+            // InternalUIGrammar.g:23351:2: ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) )
+            // InternalUIGrammar.g:23352:3: (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) )
+            {
+            // InternalUIGrammar.g:23352:3: (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )?
+            int alt507=2;
+            int LA507_0 = input.LA(1);
+
+            if ( (LA507_0==45) ) {
+                alt507=1;
+            }
+            switch (alt507) {
+                case 1 :
+                    // InternalUIGrammar.g:23353:4: otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')'
+                    {
+                    otherlv_0=(Token)match(input,45,FOLLOW_190); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_0, grammarAccess.getXFunctionTypeRefAccess().getLeftParenthesisKeyword_0_0());
+                      			
+                    }
+                    // InternalUIGrammar.g:23357:4: ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )?
+                    int alt506=2;
+                    int LA506_0 = input.LA(1);
+
+                    if ( (LA506_0==RULE_ID||LA506_0==45||LA506_0==177) ) {
+                        alt506=1;
+                    }
+                    switch (alt506) {
+                        case 1 :
+                            // InternalUIGrammar.g:23358:5: ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )*
+                            {
+                            // InternalUIGrammar.g:23358:5: ( (lv_paramTypes_1_0= ruleJvmTypeReference ) )
+                            // InternalUIGrammar.g:23359:6: (lv_paramTypes_1_0= ruleJvmTypeReference )
+                            {
+                            // InternalUIGrammar.g:23359:6: (lv_paramTypes_1_0= ruleJvmTypeReference )
+                            // InternalUIGrammar.g:23360:7: lv_paramTypes_1_0= ruleJvmTypeReference
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_0_0());
+                              						
+                            }
+                            pushFollow(FOLLOW_94);
+                            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();
+                              						
+                            }
+
+                            }
+
+
+                            }
+
+                            // InternalUIGrammar.g:23377:5: (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )*
+                            loop505:
+                            do {
+                                int alt505=2;
+                                int LA505_0 = input.LA(1);
+
+                                if ( (LA505_0==102) ) {
+                                    alt505=1;
+                                }
+
+
+                                switch (alt505) {
+                            	case 1 :
+                            	    // InternalUIGrammar.g:23378:6: otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) )
+                            	    {
+                            	    otherlv_2=(Token)match(input,102,FOLLOW_16); if (state.failed) return current;
+                            	    if ( state.backtracking==0 ) {
+
+                            	      						newLeafNode(otherlv_2, grammarAccess.getXFunctionTypeRefAccess().getCommaKeyword_0_1_1_0());
+                            	      					
+                            	    }
+                            	    // InternalUIGrammar.g:23382:6: ( (lv_paramTypes_3_0= ruleJvmTypeReference ) )
+                            	    // InternalUIGrammar.g:23383:7: (lv_paramTypes_3_0= ruleJvmTypeReference )
+                            	    {
+                            	    // InternalUIGrammar.g:23383:7: (lv_paramTypes_3_0= ruleJvmTypeReference )
+                            	    // InternalUIGrammar.g:23384:8: lv_paramTypes_3_0= ruleJvmTypeReference
+                            	    {
+                            	    if ( state.backtracking==0 ) {
+
+                            	      								newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_1_1_0());
+                            	      							
+                            	    }
+                            	    pushFollow(FOLLOW_94);
+                            	    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 loop505;
+                                }
+                            } while (true);
+
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_4=(Token)match(input,47,FOLLOW_191); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getXFunctionTypeRefAccess().getRightParenthesisKeyword_0_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            otherlv_5=(Token)match(input,177,FOLLOW_16); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_5, grammarAccess.getXFunctionTypeRefAccess().getEqualsSignGreaterThanSignKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:23412:3: ( (lv_returnType_6_0= ruleJvmTypeReference ) )
+            // InternalUIGrammar.g:23413:4: (lv_returnType_6_0= ruleJvmTypeReference )
+            {
+            // InternalUIGrammar.g:23413:4: (lv_returnType_6_0= ruleJvmTypeReference )
+            // InternalUIGrammar.g:23414: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"
+    // InternalUIGrammar.g:23435:1: entryRuleJvmParameterizedTypeReference returns [EObject current=null] : iv_ruleJvmParameterizedTypeReference= ruleJvmParameterizedTypeReference EOF ;
+    public final EObject entryRuleJvmParameterizedTypeReference() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleJvmParameterizedTypeReference = null;
+
+
+        try {
+            // InternalUIGrammar.g:23435:70: (iv_ruleJvmParameterizedTypeReference= ruleJvmParameterizedTypeReference EOF )
+            // InternalUIGrammar.g:23436: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"
+    // InternalUIGrammar.g:23442: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 {
+            // InternalUIGrammar.g:23448: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= '>' )? )* )? ) )
+            // InternalUIGrammar.g:23449: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= '>' )? )* )? )
+            {
+            // InternalUIGrammar.g:23449: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= '>' )? )* )? )
+            // InternalUIGrammar.g:23450: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= '>' )? )* )?
+            {
+            // InternalUIGrammar.g:23450:3: ( ( ruleQualifiedName ) )
+            // InternalUIGrammar.g:23451:4: ( ruleQualifiedName )
+            {
+            // InternalUIGrammar.g:23451:4: ( ruleQualifiedName )
+            // InternalUIGrammar.g:23452: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_192);
+            ruleQualifiedName();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalUIGrammar.g:23466: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 alt512=2;
+            alt512 = dfa512.predict(input);
+            switch (alt512) {
+                case 1 :
+                    // InternalUIGrammar.g:23467: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= '>' )? )*
+                    {
+                    // InternalUIGrammar.g:23467:4: ( ( '<' )=>otherlv_1= '<' )
+                    // InternalUIGrammar.g:23468:5: ( '<' )=>otherlv_1= '<'
+                    {
+                    otherlv_1=(Token)match(input,28,FOLLOW_156); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_1, grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_0());
+                      				
+                    }
+
+                    }
+
+                    // InternalUIGrammar.g:23474:4: ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) )
+                    // InternalUIGrammar.g:23475:5: (lv_arguments_2_0= ruleJvmArgumentTypeReference )
+                    {
+                    // InternalUIGrammar.g:23475:5: (lv_arguments_2_0= ruleJvmArgumentTypeReference )
+                    // InternalUIGrammar.g:23476:6: lv_arguments_2_0= ruleJvmArgumentTypeReference
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_157);
+                    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();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalUIGrammar.g:23493:4: (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )*
+                    loop508:
+                    do {
+                        int alt508=2;
+                        int LA508_0 = input.LA(1);
+
+                        if ( (LA508_0==102) ) {
+                            alt508=1;
+                        }
+
+
+                        switch (alt508) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:23494:5: otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) )
+                    	    {
+                    	    otherlv_3=(Token)match(input,102,FOLLOW_156); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      					newLeafNode(otherlv_3, grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_2_0());
+                    	      				
+                    	    }
+                    	    // InternalUIGrammar.g:23498:5: ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) )
+                    	    // InternalUIGrammar.g:23499:6: (lv_arguments_4_0= ruleJvmArgumentTypeReference )
+                    	    {
+                    	    // InternalUIGrammar.g:23499:6: (lv_arguments_4_0= ruleJvmArgumentTypeReference )
+                    	    // InternalUIGrammar.g:23500:7: lv_arguments_4_0= ruleJvmArgumentTypeReference
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_157);
+                    	    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 loop508;
+                        }
+                    } while (true);
+
+                    otherlv_5=(Token)match(input,30,FOLLOW_23); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_5, grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_3());
+                      			
+                    }
+                    // InternalUIGrammar.g:23522:4: ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )*
+                    loop511:
+                    do {
+                        int alt511=2;
+                        int LA511_0 = input.LA(1);
+
+                        if ( (LA511_0==31) ) {
+                            int LA511_2 = input.LA(2);
+
+                            if ( (LA511_2==RULE_ID) ) {
+                                int LA511_3 = input.LA(3);
+
+                                if ( (synpred53_InternalUIGrammar()) ) {
+                                    alt511=1;
+                                }
+
+
+                            }
+
+
+                        }
+
+
+                        switch (alt511) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:23523:5: ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )?
+                    	    {
+                    	    // InternalUIGrammar.g:23523:5: ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) )
+                    	    // InternalUIGrammar.g:23524:6: ( ( () '.' ) )=> ( () otherlv_7= '.' )
+                    	    {
+                    	    // InternalUIGrammar.g:23530:6: ( () otherlv_7= '.' )
+                    	    // InternalUIGrammar.g:23531:7: () otherlv_7= '.'
+                    	    {
+                    	    // InternalUIGrammar.g:23531:7: ()
+                    	    // InternalUIGrammar.g:23532:8: 
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      								current = forceCreateModelElementAndSet(
+                    	      									grammarAccess.getJvmParameterizedTypeReferenceAccess().getJvmInnerTypeReferenceOuterAction_1_4_0_0_0(),
+                    	      									current);
+                    	      							
+                    	    }
+
+                    	    }
+
+                    	    otherlv_7=(Token)match(input,31,FOLLOW_3); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newLeafNode(otherlv_7, grammarAccess.getJvmParameterizedTypeReferenceAccess().getFullStopKeyword_1_4_0_0_1());
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    // InternalUIGrammar.g:23544:5: ( ( ruleValidID ) )
+                    	    // InternalUIGrammar.g:23545:6: ( ruleValidID )
+                    	    {
+                    	    // InternalUIGrammar.g:23545:6: ( ruleValidID )
+                    	    // InternalUIGrammar.g:23546: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_193);
+                    	    ruleValidID();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    // InternalUIGrammar.g:23560:5: ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )?
+                    	    int alt510=2;
+                    	    alt510 = dfa510.predict(input);
+                    	    switch (alt510) {
+                    	        case 1 :
+                    	            // InternalUIGrammar.g:23561:6: ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>'
+                    	            {
+                    	            // InternalUIGrammar.g:23561:6: ( ( '<' )=>otherlv_9= '<' )
+                    	            // InternalUIGrammar.g:23562:7: ( '<' )=>otherlv_9= '<'
+                    	            {
+                    	            otherlv_9=(Token)match(input,28,FOLLOW_156); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              							newLeafNode(otherlv_9, grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_4_2_0());
+                    	              						
+                    	            }
+
+                    	            }
+
+                    	            // InternalUIGrammar.g:23568:6: ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) )
+                    	            // InternalUIGrammar.g:23569:7: (lv_arguments_10_0= ruleJvmArgumentTypeReference )
+                    	            {
+                    	            // InternalUIGrammar.g:23569:7: (lv_arguments_10_0= ruleJvmArgumentTypeReference )
+                    	            // InternalUIGrammar.g:23570:8: lv_arguments_10_0= ruleJvmArgumentTypeReference
+                    	            {
+                    	            if ( state.backtracking==0 ) {
+
+                    	              								newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_1_0());
+                    	              							
+                    	            }
+                    	            pushFollow(FOLLOW_157);
+                    	            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();
+                    	              							
+                    	            }
+
+                    	            }
+
+
+                    	            }
+
+                    	            // InternalUIGrammar.g:23587:6: (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )*
+                    	            loop509:
+                    	            do {
+                    	                int alt509=2;
+                    	                int LA509_0 = input.LA(1);
+
+                    	                if ( (LA509_0==102) ) {
+                    	                    alt509=1;
+                    	                }
+
+
+                    	                switch (alt509) {
+                    	            	case 1 :
+                    	            	    // InternalUIGrammar.g:23588:7: otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) )
+                    	            	    {
+                    	            	    otherlv_11=(Token)match(input,102,FOLLOW_156); if (state.failed) return current;
+                    	            	    if ( state.backtracking==0 ) {
+
+                    	            	      							newLeafNode(otherlv_11, grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_4_2_2_0());
+                    	            	      						
+                    	            	    }
+                    	            	    // InternalUIGrammar.g:23592:7: ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) )
+                    	            	    // InternalUIGrammar.g:23593:8: (lv_arguments_12_0= ruleJvmArgumentTypeReference )
+                    	            	    {
+                    	            	    // InternalUIGrammar.g:23593:8: (lv_arguments_12_0= ruleJvmArgumentTypeReference )
+                    	            	    // InternalUIGrammar.g:23594:9: lv_arguments_12_0= ruleJvmArgumentTypeReference
+                    	            	    {
+                    	            	    if ( state.backtracking==0 ) {
+
+                    	            	      									newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_2_1_0());
+                    	            	      								
+                    	            	    }
+                    	            	    pushFollow(FOLLOW_157);
+                    	            	    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 loop509;
+                    	                }
+                    	            } while (true);
+
+                    	            otherlv_13=(Token)match(input,30,FOLLOW_23); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              						newLeafNode(otherlv_13, grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_4_2_3());
+                    	              					
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop511;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleJvmParameterizedTypeReference"
+
+
+    // $ANTLR start "entryRuleJvmArgumentTypeReference"
+    // InternalUIGrammar.g:23623:1: entryRuleJvmArgumentTypeReference returns [EObject current=null] : iv_ruleJvmArgumentTypeReference= ruleJvmArgumentTypeReference EOF ;
+    public final EObject entryRuleJvmArgumentTypeReference() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleJvmArgumentTypeReference = null;
+
+
+        try {
+            // InternalUIGrammar.g:23623:65: (iv_ruleJvmArgumentTypeReference= ruleJvmArgumentTypeReference EOF )
+            // InternalUIGrammar.g:23624: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"
+    // InternalUIGrammar.g:23630: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 {
+            // InternalUIGrammar.g:23636:2: ( (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference ) )
+            // InternalUIGrammar.g:23637:2: (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference )
+            {
+            // InternalUIGrammar.g:23637:2: (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference )
+            int alt513=2;
+            int LA513_0 = input.LA(1);
+
+            if ( (LA513_0==RULE_ID||LA513_0==45||LA513_0==177) ) {
+                alt513=1;
+            }
+            else if ( (LA513_0==212) ) {
+                alt513=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 513, 0, input);
+
+                throw nvae;
+            }
+            switch (alt513) {
+                case 1 :
+                    // InternalUIGrammar.g:23638: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 :
+                    // InternalUIGrammar.g:23647: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"
+    // InternalUIGrammar.g:23659:1: entryRuleJvmWildcardTypeReference returns [EObject current=null] : iv_ruleJvmWildcardTypeReference= ruleJvmWildcardTypeReference EOF ;
+    public final EObject entryRuleJvmWildcardTypeReference() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleJvmWildcardTypeReference = null;
+
+
+        try {
+            // InternalUIGrammar.g:23659:65: (iv_ruleJvmWildcardTypeReference= ruleJvmWildcardTypeReference EOF )
+            // InternalUIGrammar.g:23660: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"
+    // InternalUIGrammar.g:23666: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 {
+            // InternalUIGrammar.g:23672:2: ( ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? ) )
+            // InternalUIGrammar.g:23673:2: ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? )
+            {
+            // InternalUIGrammar.g:23673:2: ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? )
+            // InternalUIGrammar.g:23674:3: () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )?
+            {
+            // InternalUIGrammar.g:23674:3: ()
+            // InternalUIGrammar.g:23675:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getJvmWildcardTypeReferenceAccess().getJvmWildcardTypeReferenceAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,212,FOLLOW_194); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getJvmWildcardTypeReferenceAccess().getQuestionMarkKeyword_1());
+              		
+            }
+            // InternalUIGrammar.g:23685:3: ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )?
+            int alt516=3;
+            int LA516_0 = input.LA(1);
+
+            if ( (LA516_0==199) ) {
+                alt516=1;
+            }
+            else if ( (LA516_0==200) ) {
+                alt516=2;
+            }
+            switch (alt516) {
+                case 1 :
+                    // InternalUIGrammar.g:23686:4: ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* )
+                    {
+                    // InternalUIGrammar.g:23686:4: ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* )
+                    // InternalUIGrammar.g:23687:5: ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )*
+                    {
+                    // InternalUIGrammar.g:23687:5: ( (lv_constraints_2_0= ruleJvmUpperBound ) )
+                    // InternalUIGrammar.g:23688:6: (lv_constraints_2_0= ruleJvmUpperBound )
+                    {
+                    // InternalUIGrammar.g:23688:6: (lv_constraints_2_0= ruleJvmUpperBound )
+                    // InternalUIGrammar.g:23689:7: lv_constraints_2_0= ruleJvmUpperBound
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundParserRuleCall_2_0_0_0());
+                      						
+                    }
+                    pushFollow(FOLLOW_195);
+                    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();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalUIGrammar.g:23706:5: ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )*
+                    loop514:
+                    do {
+                        int alt514=2;
+                        int LA514_0 = input.LA(1);
+
+                        if ( (LA514_0==213) ) {
+                            alt514=1;
+                        }
+
+
+                        switch (alt514) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:23707:6: (lv_constraints_3_0= ruleJvmUpperBoundAnded )
+                    	    {
+                    	    // InternalUIGrammar.g:23707:6: (lv_constraints_3_0= ruleJvmUpperBoundAnded )
+                    	    // InternalUIGrammar.g:23708:7: lv_constraints_3_0= ruleJvmUpperBoundAnded
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundAndedParserRuleCall_2_0_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_195);
+                    	    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 loop514;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalUIGrammar.g:23727:4: ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* )
+                    {
+                    // InternalUIGrammar.g:23727:4: ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* )
+                    // InternalUIGrammar.g:23728:5: ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )*
+                    {
+                    // InternalUIGrammar.g:23728:5: ( (lv_constraints_4_0= ruleJvmLowerBound ) )
+                    // InternalUIGrammar.g:23729:6: (lv_constraints_4_0= ruleJvmLowerBound )
+                    {
+                    // InternalUIGrammar.g:23729:6: (lv_constraints_4_0= ruleJvmLowerBound )
+                    // InternalUIGrammar.g:23730:7: lv_constraints_4_0= ruleJvmLowerBound
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundParserRuleCall_2_1_0_0());
+                      						
+                    }
+                    pushFollow(FOLLOW_195);
+                    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();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalUIGrammar.g:23747:5: ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )*
+                    loop515:
+                    do {
+                        int alt515=2;
+                        int LA515_0 = input.LA(1);
+
+                        if ( (LA515_0==213) ) {
+                            alt515=1;
+                        }
+
+
+                        switch (alt515) {
+                    	case 1 :
+                    	    // InternalUIGrammar.g:23748:6: (lv_constraints_5_0= ruleJvmLowerBoundAnded )
+                    	    {
+                    	    // InternalUIGrammar.g:23748:6: (lv_constraints_5_0= ruleJvmLowerBoundAnded )
+                    	    // InternalUIGrammar.g:23749:7: lv_constraints_5_0= ruleJvmLowerBoundAnded
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundAndedParserRuleCall_2_1_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_195);
+                    	    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 loop515;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleJvmWildcardTypeReference"
+
+
+    // $ANTLR start "entryRuleJvmUpperBound"
+    // InternalUIGrammar.g:23772:1: entryRuleJvmUpperBound returns [EObject current=null] : iv_ruleJvmUpperBound= ruleJvmUpperBound EOF ;
+    public final EObject entryRuleJvmUpperBound() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleJvmUpperBound = null;
+
+
+        try {
+            // InternalUIGrammar.g:23772:54: (iv_ruleJvmUpperBound= ruleJvmUpperBound EOF )
+            // InternalUIGrammar.g:23773: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"
+    // InternalUIGrammar.g:23779: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 {
+            // InternalUIGrammar.g:23785:2: ( (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
+            // InternalUIGrammar.g:23786:2: (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            {
+            // InternalUIGrammar.g:23786:2: (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            // InternalUIGrammar.g:23787:3: otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            {
+            otherlv_0=(Token)match(input,199,FOLLOW_16); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getJvmUpperBoundAccess().getExtendsKeyword_0());
+              		
+            }
+            // InternalUIGrammar.g:23791:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            // InternalUIGrammar.g:23792:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            {
+            // InternalUIGrammar.g:23792:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            // InternalUIGrammar.g:23793: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"
+    // InternalUIGrammar.g:23814:1: entryRuleJvmUpperBoundAnded returns [EObject current=null] : iv_ruleJvmUpperBoundAnded= ruleJvmUpperBoundAnded EOF ;
+    public final EObject entryRuleJvmUpperBoundAnded() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleJvmUpperBoundAnded = null;
+
+
+        try {
+            // InternalUIGrammar.g:23814:59: (iv_ruleJvmUpperBoundAnded= ruleJvmUpperBoundAnded EOF )
+            // InternalUIGrammar.g:23815: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"
+    // InternalUIGrammar.g:23821: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 {
+            // InternalUIGrammar.g:23827:2: ( (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
+            // InternalUIGrammar.g:23828:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            {
+            // InternalUIGrammar.g:23828:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            // InternalUIGrammar.g:23829:3: otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            {
+            otherlv_0=(Token)match(input,213,FOLLOW_16); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getJvmUpperBoundAndedAccess().getAmpersandKeyword_0());
+              		
+            }
+            // InternalUIGrammar.g:23833:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            // InternalUIGrammar.g:23834:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            {
+            // InternalUIGrammar.g:23834:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            // InternalUIGrammar.g:23835: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"
+    // InternalUIGrammar.g:23856:1: entryRuleJvmLowerBound returns [EObject current=null] : iv_ruleJvmLowerBound= ruleJvmLowerBound EOF ;
+    public final EObject entryRuleJvmLowerBound() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleJvmLowerBound = null;
+
+
+        try {
+            // InternalUIGrammar.g:23856:54: (iv_ruleJvmLowerBound= ruleJvmLowerBound EOF )
+            // InternalUIGrammar.g:23857: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"
+    // InternalUIGrammar.g:23863: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 {
+            // InternalUIGrammar.g:23869:2: ( (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
+            // InternalUIGrammar.g:23870:2: (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            {
+            // InternalUIGrammar.g:23870:2: (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            // InternalUIGrammar.g:23871:3: otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            {
+            otherlv_0=(Token)match(input,200,FOLLOW_16); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getJvmLowerBoundAccess().getSuperKeyword_0());
+              		
+            }
+            // InternalUIGrammar.g:23875:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            // InternalUIGrammar.g:23876:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            {
+            // InternalUIGrammar.g:23876:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            // InternalUIGrammar.g:23877: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"
+    // InternalUIGrammar.g:23898:1: entryRuleJvmLowerBoundAnded returns [EObject current=null] : iv_ruleJvmLowerBoundAnded= ruleJvmLowerBoundAnded EOF ;
+    public final EObject entryRuleJvmLowerBoundAnded() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleJvmLowerBoundAnded = null;
+
+
+        try {
+            // InternalUIGrammar.g:23898:59: (iv_ruleJvmLowerBoundAnded= ruleJvmLowerBoundAnded EOF )
+            // InternalUIGrammar.g:23899: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"
+    // InternalUIGrammar.g:23905: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 {
+            // InternalUIGrammar.g:23911:2: ( (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
+            // InternalUIGrammar.g:23912:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            {
+            // InternalUIGrammar.g:23912:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            // InternalUIGrammar.g:23913:3: otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            {
+            otherlv_0=(Token)match(input,213,FOLLOW_16); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getJvmLowerBoundAndedAccess().getAmpersandKeyword_0());
+              		
+            }
+            // InternalUIGrammar.g:23917:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            // InternalUIGrammar.g:23918:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            {
+            // InternalUIGrammar.g:23918:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            // InternalUIGrammar.g:23919: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"
+    // InternalUIGrammar.g:23940:1: entryRuleQualifiedNameWithWildcard returns [String current=null] : iv_ruleQualifiedNameWithWildcard= ruleQualifiedNameWithWildcard EOF ;
+    public final String entryRuleQualifiedNameWithWildcard() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleQualifiedNameWithWildcard = null;
+
+
+        try {
+            // InternalUIGrammar.g:23940:65: (iv_ruleQualifiedNameWithWildcard= ruleQualifiedNameWithWildcard EOF )
+            // InternalUIGrammar.g:23941: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"
+    // InternalUIGrammar.g:23947: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 {
+            // InternalUIGrammar.g:23953:2: ( (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' ) )
+            // InternalUIGrammar.g:23954:2: (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' )
+            {
+            // InternalUIGrammar.g:23954:2: (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' )
+            // InternalUIGrammar.g:23955:3: this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*'
+            {
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getQualifiedNameWithWildcardAccess().getQualifiedNameParserRuleCall_0());
+              		
+            }
+            pushFollow(FOLLOW_26);
+            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,31,FOLLOW_196); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current.merge(kw);
+              			newLeafNode(kw, grammarAccess.getQualifiedNameWithWildcardAccess().getFullStopKeyword_1());
+              		
+            }
+            kw=(Token)match(input,158,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"
+    // InternalUIGrammar.g:23979:1: entryRuleValidID returns [String current=null] : iv_ruleValidID= ruleValidID EOF ;
+    public final String entryRuleValidID() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleValidID = null;
+
+
+        try {
+            // InternalUIGrammar.g:23979:47: (iv_ruleValidID= ruleValidID EOF )
+            // InternalUIGrammar.g:23980: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"
+    // InternalUIGrammar.g:23986: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 {
+            // InternalUIGrammar.g:23992:2: (this_ID_0= RULE_ID )
+            // InternalUIGrammar.g:23993: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"
+    // InternalUIGrammar.g:24003:1: entryRuleXImportSection returns [EObject current=null] : iv_ruleXImportSection= ruleXImportSection EOF ;
+    public final EObject entryRuleXImportSection() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXImportSection = null;
+
+
+        try {
+            // InternalUIGrammar.g:24003:55: (iv_ruleXImportSection= ruleXImportSection EOF )
+            // InternalUIGrammar.g:24004: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"
+    // InternalUIGrammar.g:24010: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 {
+            // InternalUIGrammar.g:24016:2: ( ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+ )
+            // InternalUIGrammar.g:24017:2: ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+
+            {
+            // InternalUIGrammar.g:24017:2: ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+
+            int cnt517=0;
+            loop517:
+            do {
+                int alt517=2;
+                int LA517_0 = input.LA(1);
+
+                if ( (LA517_0==155) ) {
+                    alt517=1;
+                }
+
+
+                switch (alt517) {
+            	case 1 :
+            	    // InternalUIGrammar.g:24018:3: (lv_importDeclarations_0_0= ruleXImportDeclaration )
+            	    {
+            	    // InternalUIGrammar.g:24018:3: (lv_importDeclarations_0_0= ruleXImportDeclaration )
+            	    // InternalUIGrammar.g:24019:4: lv_importDeclarations_0_0= ruleXImportDeclaration
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      				newCompositeNode(grammarAccess.getXImportSectionAccess().getImportDeclarationsXImportDeclarationParserRuleCall_0());
+            	      			
+            	    }
+            	    pushFollow(FOLLOW_197);
+            	    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 ( cnt517 >= 1 ) break loop517;
+            	    if (state.backtracking>0) {state.failed=true; return current;}
+                        EarlyExitException eee =
+                            new EarlyExitException(517, input);
+                        throw eee;
+                }
+                cnt517++;
+            } while (true);
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXImportSection"
+
+
+    // $ANTLR start "entryRuleQualifiedNameInStaticImport"
+    // InternalUIGrammar.g:24039:1: entryRuleQualifiedNameInStaticImport returns [String current=null] : iv_ruleQualifiedNameInStaticImport= ruleQualifiedNameInStaticImport EOF ;
+    public final String entryRuleQualifiedNameInStaticImport() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleQualifiedNameInStaticImport = null;
+
+
+        try {
+            // InternalUIGrammar.g:24039:67: (iv_ruleQualifiedNameInStaticImport= ruleQualifiedNameInStaticImport EOF )
+            // InternalUIGrammar.g:24040: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"
+    // InternalUIGrammar.g:24046: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 {
+            // InternalUIGrammar.g:24052:2: ( (this_ValidID_0= ruleValidID kw= '.' )+ )
+            // InternalUIGrammar.g:24053:2: (this_ValidID_0= ruleValidID kw= '.' )+
+            {
+            // InternalUIGrammar.g:24053:2: (this_ValidID_0= ruleValidID kw= '.' )+
+            int cnt518=0;
+            loop518:
+            do {
+                int alt518=2;
+                int LA518_0 = input.LA(1);
+
+                if ( (LA518_0==RULE_ID) ) {
+                    int LA518_2 = input.LA(2);
+
+                    if ( (LA518_2==31) ) {
+                        alt518=1;
+                    }
+
+
+                }
+
+
+                switch (alt518) {
+            	case 1 :
+            	    // InternalUIGrammar.g:24054:3: this_ValidID_0= ruleValidID kw= '.'
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      			newCompositeNode(grammarAccess.getQualifiedNameInStaticImportAccess().getValidIDParserRuleCall_0());
+            	      		
+            	    }
+            	    pushFollow(FOLLOW_26);
+            	    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,31,FOLLOW_110); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      			current.merge(kw);
+            	      			newLeafNode(kw, grammarAccess.getQualifiedNameInStaticImportAccess().getFullStopKeyword_1());
+            	      		
+            	    }
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt518 >= 1 ) break loop518;
+            	    if (state.backtracking>0) {state.failed=true; return current;}
+                        EarlyExitException eee =
+                            new EarlyExitException(518, input);
+                        throw eee;
+                }
+                cnt518++;
+            } while (true);
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleQualifiedNameInStaticImport"
+
+
+    // $ANTLR start "ruleUiDateFormat"
+    // InternalUIGrammar.g:24073:1: ruleUiDateFormat returns [Enumerator current=null] : ( (enumLiteral_0= 'date' ) | (enumLiteral_1= 'datetime' ) | (enumLiteral_2= 'time' ) ) ;
+    public final Enumerator ruleUiDateFormat() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+        Token enumLiteral_1=null;
+        Token enumLiteral_2=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:24079:2: ( ( (enumLiteral_0= 'date' ) | (enumLiteral_1= 'datetime' ) | (enumLiteral_2= 'time' ) ) )
+            // InternalUIGrammar.g:24080:2: ( (enumLiteral_0= 'date' ) | (enumLiteral_1= 'datetime' ) | (enumLiteral_2= 'time' ) )
+            {
+            // InternalUIGrammar.g:24080:2: ( (enumLiteral_0= 'date' ) | (enumLiteral_1= 'datetime' ) | (enumLiteral_2= 'time' ) )
+            int alt519=3;
+            switch ( input.LA(1) ) {
+            case 214:
+                {
+                alt519=1;
+                }
+                break;
+            case 215:
+                {
+                alt519=2;
+                }
+                break;
+            case 216:
+                {
+                alt519=3;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 519, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt519) {
+                case 1 :
+                    // InternalUIGrammar.g:24081:3: (enumLiteral_0= 'date' )
+                    {
+                    // InternalUIGrammar.g:24081:3: (enumLiteral_0= 'date' )
+                    // InternalUIGrammar.g:24082:4: enumLiteral_0= 'date'
+                    {
+                    enumLiteral_0=(Token)match(input,214,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getUiDateFormatAccess().getDATEEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_0, grammarAccess.getUiDateFormatAccess().getDATEEnumLiteralDeclaration_0());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalUIGrammar.g:24089:3: (enumLiteral_1= 'datetime' )
+                    {
+                    // InternalUIGrammar.g:24089:3: (enumLiteral_1= 'datetime' )
+                    // InternalUIGrammar.g:24090:4: enumLiteral_1= 'datetime'
+                    {
+                    enumLiteral_1=(Token)match(input,215,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getUiDateFormatAccess().getDATE_TIMEEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_1, grammarAccess.getUiDateFormatAccess().getDATE_TIMEEnumLiteralDeclaration_1());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalUIGrammar.g:24097:3: (enumLiteral_2= 'time' )
+                    {
+                    // InternalUIGrammar.g:24097:3: (enumLiteral_2= 'time' )
+                    // InternalUIGrammar.g:24098:4: enumLiteral_2= 'time'
+                    {
+                    enumLiteral_2=(Token)match(input,216,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getUiDateFormatAccess().getTIMEEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_2, grammarAccess.getUiDateFormatAccess().getTIMEEnumLiteralDeclaration_2());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiDateFormat"
+
+
+    // $ANTLR start "ruleUiDateTimeResolution"
+    // InternalUIGrammar.g:24108:1: ruleUiDateTimeResolution returns [Enumerator current=null] : ( (enumLiteral_0= 'undefined' ) | (enumLiteral_1= 'second' ) | (enumLiteral_2= 'minute' ) | (enumLiteral_3= 'hour' ) | (enumLiteral_4= 'day' ) | (enumLiteral_5= 'month' ) | (enumLiteral_6= 'year' ) ) ;
+    public final Enumerator ruleUiDateTimeResolution() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+        Token enumLiteral_1=null;
+        Token enumLiteral_2=null;
+        Token enumLiteral_3=null;
+        Token enumLiteral_4=null;
+        Token enumLiteral_5=null;
+        Token enumLiteral_6=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:24114:2: ( ( (enumLiteral_0= 'undefined' ) | (enumLiteral_1= 'second' ) | (enumLiteral_2= 'minute' ) | (enumLiteral_3= 'hour' ) | (enumLiteral_4= 'day' ) | (enumLiteral_5= 'month' ) | (enumLiteral_6= 'year' ) ) )
+            // InternalUIGrammar.g:24115:2: ( (enumLiteral_0= 'undefined' ) | (enumLiteral_1= 'second' ) | (enumLiteral_2= 'minute' ) | (enumLiteral_3= 'hour' ) | (enumLiteral_4= 'day' ) | (enumLiteral_5= 'month' ) | (enumLiteral_6= 'year' ) )
+            {
+            // InternalUIGrammar.g:24115:2: ( (enumLiteral_0= 'undefined' ) | (enumLiteral_1= 'second' ) | (enumLiteral_2= 'minute' ) | (enumLiteral_3= 'hour' ) | (enumLiteral_4= 'day' ) | (enumLiteral_5= 'month' ) | (enumLiteral_6= 'year' ) )
+            int alt520=7;
+            switch ( input.LA(1) ) {
+            case 217:
+                {
+                alt520=1;
+                }
+                break;
+            case 82:
+                {
+                alt520=2;
+                }
+                break;
+            case 218:
+                {
+                alt520=3;
+                }
+                break;
+            case 219:
+                {
+                alt520=4;
+                }
+                break;
+            case 220:
+                {
+                alt520=5;
+                }
+                break;
+            case 221:
+                {
+                alt520=6;
+                }
+                break;
+            case 222:
+                {
+                alt520=7;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 520, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt520) {
+                case 1 :
+                    // InternalUIGrammar.g:24116:3: (enumLiteral_0= 'undefined' )
+                    {
+                    // InternalUIGrammar.g:24116:3: (enumLiteral_0= 'undefined' )
+                    // InternalUIGrammar.g:24117:4: enumLiteral_0= 'undefined'
+                    {
+                    enumLiteral_0=(Token)match(input,217,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getUiDateTimeResolutionAccess().getUNDEFINEDEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_0, grammarAccess.getUiDateTimeResolutionAccess().getUNDEFINEDEnumLiteralDeclaration_0());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalUIGrammar.g:24124:3: (enumLiteral_1= 'second' )
+                    {
+                    // InternalUIGrammar.g:24124:3: (enumLiteral_1= 'second' )
+                    // InternalUIGrammar.g:24125:4: enumLiteral_1= 'second'
+                    {
+                    enumLiteral_1=(Token)match(input,82,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getUiDateTimeResolutionAccess().getSECONDEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_1, grammarAccess.getUiDateTimeResolutionAccess().getSECONDEnumLiteralDeclaration_1());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalUIGrammar.g:24132:3: (enumLiteral_2= 'minute' )
+                    {
+                    // InternalUIGrammar.g:24132:3: (enumLiteral_2= 'minute' )
+                    // InternalUIGrammar.g:24133:4: enumLiteral_2= 'minute'
+                    {
+                    enumLiteral_2=(Token)match(input,218,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getUiDateTimeResolutionAccess().getMINUTEEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_2, grammarAccess.getUiDateTimeResolutionAccess().getMINUTEEnumLiteralDeclaration_2());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalUIGrammar.g:24140:3: (enumLiteral_3= 'hour' )
+                    {
+                    // InternalUIGrammar.g:24140:3: (enumLiteral_3= 'hour' )
+                    // InternalUIGrammar.g:24141:4: enumLiteral_3= 'hour'
+                    {
+                    enumLiteral_3=(Token)match(input,219,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getUiDateTimeResolutionAccess().getHOUREnumLiteralDeclaration_3().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_3, grammarAccess.getUiDateTimeResolutionAccess().getHOUREnumLiteralDeclaration_3());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalUIGrammar.g:24148:3: (enumLiteral_4= 'day' )
+                    {
+                    // InternalUIGrammar.g:24148:3: (enumLiteral_4= 'day' )
+                    // InternalUIGrammar.g:24149:4: enumLiteral_4= 'day'
+                    {
+                    enumLiteral_4=(Token)match(input,220,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getUiDateTimeResolutionAccess().getDAYEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_4, grammarAccess.getUiDateTimeResolutionAccess().getDAYEnumLiteralDeclaration_4());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalUIGrammar.g:24156:3: (enumLiteral_5= 'month' )
+                    {
+                    // InternalUIGrammar.g:24156:3: (enumLiteral_5= 'month' )
+                    // InternalUIGrammar.g:24157:4: enumLiteral_5= 'month'
+                    {
+                    enumLiteral_5=(Token)match(input,221,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getUiDateTimeResolutionAccess().getMONTHEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_5, grammarAccess.getUiDateTimeResolutionAccess().getMONTHEnumLiteralDeclaration_5());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 7 :
+                    // InternalUIGrammar.g:24164:3: (enumLiteral_6= 'year' )
+                    {
+                    // InternalUIGrammar.g:24164:3: (enumLiteral_6= 'year' )
+                    // InternalUIGrammar.g:24165:4: enumLiteral_6= 'year'
+                    {
+                    enumLiteral_6=(Token)match(input,222,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getUiDateTimeResolutionAccess().getYEAREnumLiteralDeclaration_6().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_6, grammarAccess.getUiDateTimeResolutionAccess().getYEAREnumLiteralDeclaration_6());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiDateTimeResolution"
+
+
+    // $ANTLR start "ruleUiSelectionType"
+    // InternalUIGrammar.g:24175:1: ruleUiSelectionType returns [Enumerator current=null] : ( (enumLiteral_0= 'single' ) | (enumLiteral_1= 'multi' ) | (enumLiteral_2= 'none' ) ) ;
+    public final Enumerator ruleUiSelectionType() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+        Token enumLiteral_1=null;
+        Token enumLiteral_2=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:24181:2: ( ( (enumLiteral_0= 'single' ) | (enumLiteral_1= 'multi' ) | (enumLiteral_2= 'none' ) ) )
+            // InternalUIGrammar.g:24182:2: ( (enumLiteral_0= 'single' ) | (enumLiteral_1= 'multi' ) | (enumLiteral_2= 'none' ) )
+            {
+            // InternalUIGrammar.g:24182:2: ( (enumLiteral_0= 'single' ) | (enumLiteral_1= 'multi' ) | (enumLiteral_2= 'none' ) )
+            int alt521=3;
+            switch ( input.LA(1) ) {
+            case 223:
+                {
+                alt521=1;
+                }
+                break;
+            case 224:
+                {
+                alt521=2;
+                }
+                break;
+            case 225:
+                {
+                alt521=3;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 521, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt521) {
+                case 1 :
+                    // InternalUIGrammar.g:24183:3: (enumLiteral_0= 'single' )
+                    {
+                    // InternalUIGrammar.g:24183:3: (enumLiteral_0= 'single' )
+                    // InternalUIGrammar.g:24184:4: enumLiteral_0= 'single'
+                    {
+                    enumLiteral_0=(Token)match(input,223,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getUiSelectionTypeAccess().getSINGLEEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_0, grammarAccess.getUiSelectionTypeAccess().getSINGLEEnumLiteralDeclaration_0());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalUIGrammar.g:24191:3: (enumLiteral_1= 'multi' )
+                    {
+                    // InternalUIGrammar.g:24191:3: (enumLiteral_1= 'multi' )
+                    // InternalUIGrammar.g:24192:4: enumLiteral_1= 'multi'
+                    {
+                    enumLiteral_1=(Token)match(input,224,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getUiSelectionTypeAccess().getMULTIEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_1, grammarAccess.getUiSelectionTypeAccess().getMULTIEnumLiteralDeclaration_1());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalUIGrammar.g:24199:3: (enumLiteral_2= 'none' )
+                    {
+                    // InternalUIGrammar.g:24199:3: (enumLiteral_2= 'none' )
+                    // InternalUIGrammar.g:24200:4: enumLiteral_2= 'none'
+                    {
+                    enumLiteral_2=(Token)match(input,225,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getUiSelectionTypeAccess().getNONEEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_2, grammarAccess.getUiSelectionTypeAccess().getNONEEnumLiteralDeclaration_2());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiSelectionType"
+
+
+    // $ANTLR start "ruleUiAlignment"
+    // InternalUIGrammar.g:24210:1: ruleUiAlignment returns [Enumerator current=null] : ( (enumLiteral_0= 'undefined' ) | (enumLiteral_1= 'bottom-center' ) | (enumLiteral_2= 'bottom-left' ) | (enumLiteral_3= 'bottom-right' ) | (enumLiteral_4= 'bottom-fill' ) | (enumLiteral_5= 'middle-center' ) | (enumLiteral_6= 'middle-left' ) | (enumLiteral_7= 'middle-right' ) | (enumLiteral_8= 'middle-fill' ) | (enumLiteral_9= 'top-center' ) | (enumLiteral_10= 'top-left' ) | (enumLiteral_11= 'top-right' ) | (enumLiteral_12= 'top-fill' ) | (enumLiteral_13= 'fill-center' ) | (enumLiteral_14= 'fill-left' ) | (enumLiteral_15= 'fill-right' ) | (enumLiteral_16= 'fill-fill' ) ) ;
+    public final Enumerator ruleUiAlignment() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+        Token enumLiteral_1=null;
+        Token enumLiteral_2=null;
+        Token enumLiteral_3=null;
+        Token enumLiteral_4=null;
+        Token enumLiteral_5=null;
+        Token enumLiteral_6=null;
+        Token enumLiteral_7=null;
+        Token enumLiteral_8=null;
+        Token enumLiteral_9=null;
+        Token enumLiteral_10=null;
+        Token enumLiteral_11=null;
+        Token enumLiteral_12=null;
+        Token enumLiteral_13=null;
+        Token enumLiteral_14=null;
+        Token enumLiteral_15=null;
+        Token enumLiteral_16=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalUIGrammar.g:24216:2: ( ( (enumLiteral_0= 'undefined' ) | (enumLiteral_1= 'bottom-center' ) | (enumLiteral_2= 'bottom-left' ) | (enumLiteral_3= 'bottom-right' ) | (enumLiteral_4= 'bottom-fill' ) | (enumLiteral_5= 'middle-center' ) | (enumLiteral_6= 'middle-left' ) | (enumLiteral_7= 'middle-right' ) | (enumLiteral_8= 'middle-fill' ) | (enumLiteral_9= 'top-center' ) | (enumLiteral_10= 'top-left' ) | (enumLiteral_11= 'top-right' ) | (enumLiteral_12= 'top-fill' ) | (enumLiteral_13= 'fill-center' ) | (enumLiteral_14= 'fill-left' ) | (enumLiteral_15= 'fill-right' ) | (enumLiteral_16= 'fill-fill' ) ) )
+            // InternalUIGrammar.g:24217:2: ( (enumLiteral_0= 'undefined' ) | (enumLiteral_1= 'bottom-center' ) | (enumLiteral_2= 'bottom-left' ) | (enumLiteral_3= 'bottom-right' ) | (enumLiteral_4= 'bottom-fill' ) | (enumLiteral_5= 'middle-center' ) | (enumLiteral_6= 'middle-left' ) | (enumLiteral_7= 'middle-right' ) | (enumLiteral_8= 'middle-fill' ) | (enumLiteral_9= 'top-center' ) | (enumLiteral_10= 'top-left' ) | (enumLiteral_11= 'top-right' ) | (enumLiteral_12= 'top-fill' ) | (enumLiteral_13= 'fill-center' ) | (enumLiteral_14= 'fill-left' ) | (enumLiteral_15= 'fill-right' ) | (enumLiteral_16= 'fill-fill' ) )
+            {
+            // InternalUIGrammar.g:24217:2: ( (enumLiteral_0= 'undefined' ) | (enumLiteral_1= 'bottom-center' ) | (enumLiteral_2= 'bottom-left' ) | (enumLiteral_3= 'bottom-right' ) | (enumLiteral_4= 'bottom-fill' ) | (enumLiteral_5= 'middle-center' ) | (enumLiteral_6= 'middle-left' ) | (enumLiteral_7= 'middle-right' ) | (enumLiteral_8= 'middle-fill' ) | (enumLiteral_9= 'top-center' ) | (enumLiteral_10= 'top-left' ) | (enumLiteral_11= 'top-right' ) | (enumLiteral_12= 'top-fill' ) | (enumLiteral_13= 'fill-center' ) | (enumLiteral_14= 'fill-left' ) | (enumLiteral_15= 'fill-right' ) | (enumLiteral_16= 'fill-fill' ) )
+            int alt522=17;
+            switch ( input.LA(1) ) {
+            case 217:
+                {
+                alt522=1;
+                }
+                break;
+            case 226:
+                {
+                alt522=2;
+                }
+                break;
+            case 227:
+                {
+                alt522=3;
+                }
+                break;
+            case 228:
+                {
+                alt522=4;
+                }
+                break;
+            case 229:
+                {
+                alt522=5;
+                }
+                break;
+            case 230:
+                {
+                alt522=6;
+                }
+                break;
+            case 231:
+                {
+                alt522=7;
+                }
+                break;
+            case 232:
+                {
+                alt522=8;
+                }
+                break;
+            case 233:
+                {
+                alt522=9;
+                }
+                break;
+            case 234:
+                {
+                alt522=10;
+                }
+                break;
+            case 235:
+                {
+                alt522=11;
+                }
+                break;
+            case 236:
+                {
+                alt522=12;
+                }
+                break;
+            case 237:
+                {
+                alt522=13;
+                }
+                break;
+            case 238:
+                {
+                alt522=14;
+                }
+                break;
+            case 239:
+                {
+                alt522=15;
+                }
+                break;
+            case 240:
+                {
+                alt522=16;
+                }
+                break;
+            case 241:
+                {
+                alt522=17;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 522, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt522) {
+                case 1 :
+                    // InternalUIGrammar.g:24218:3: (enumLiteral_0= 'undefined' )
+                    {
+                    // InternalUIGrammar.g:24218:3: (enumLiteral_0= 'undefined' )
+                    // InternalUIGrammar.g:24219:4: enumLiteral_0= 'undefined'
+                    {
+                    enumLiteral_0=(Token)match(input,217,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getUiAlignmentAccess().getUNDEFINEDEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_0, grammarAccess.getUiAlignmentAccess().getUNDEFINEDEnumLiteralDeclaration_0());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalUIGrammar.g:24226:3: (enumLiteral_1= 'bottom-center' )
+                    {
+                    // InternalUIGrammar.g:24226:3: (enumLiteral_1= 'bottom-center' )
+                    // InternalUIGrammar.g:24227:4: enumLiteral_1= 'bottom-center'
+                    {
+                    enumLiteral_1=(Token)match(input,226,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getUiAlignmentAccess().getBOTTOM_CENTEREnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_1, grammarAccess.getUiAlignmentAccess().getBOTTOM_CENTEREnumLiteralDeclaration_1());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalUIGrammar.g:24234:3: (enumLiteral_2= 'bottom-left' )
+                    {
+                    // InternalUIGrammar.g:24234:3: (enumLiteral_2= 'bottom-left' )
+                    // InternalUIGrammar.g:24235:4: enumLiteral_2= 'bottom-left'
+                    {
+                    enumLiteral_2=(Token)match(input,227,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getUiAlignmentAccess().getBOTTOM_LEFTEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_2, grammarAccess.getUiAlignmentAccess().getBOTTOM_LEFTEnumLiteralDeclaration_2());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalUIGrammar.g:24242:3: (enumLiteral_3= 'bottom-right' )
+                    {
+                    // InternalUIGrammar.g:24242:3: (enumLiteral_3= 'bottom-right' )
+                    // InternalUIGrammar.g:24243:4: enumLiteral_3= 'bottom-right'
+                    {
+                    enumLiteral_3=(Token)match(input,228,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getUiAlignmentAccess().getBOTTOM_RIGHTEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_3, grammarAccess.getUiAlignmentAccess().getBOTTOM_RIGHTEnumLiteralDeclaration_3());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalUIGrammar.g:24250:3: (enumLiteral_4= 'bottom-fill' )
+                    {
+                    // InternalUIGrammar.g:24250:3: (enumLiteral_4= 'bottom-fill' )
+                    // InternalUIGrammar.g:24251:4: enumLiteral_4= 'bottom-fill'
+                    {
+                    enumLiteral_4=(Token)match(input,229,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getUiAlignmentAccess().getBOTTOM_FILLEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_4, grammarAccess.getUiAlignmentAccess().getBOTTOM_FILLEnumLiteralDeclaration_4());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalUIGrammar.g:24258:3: (enumLiteral_5= 'middle-center' )
+                    {
+                    // InternalUIGrammar.g:24258:3: (enumLiteral_5= 'middle-center' )
+                    // InternalUIGrammar.g:24259:4: enumLiteral_5= 'middle-center'
+                    {
+                    enumLiteral_5=(Token)match(input,230,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getUiAlignmentAccess().getMIDDLE_CENTEREnumLiteralDeclaration_5().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_5, grammarAccess.getUiAlignmentAccess().getMIDDLE_CENTEREnumLiteralDeclaration_5());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 7 :
+                    // InternalUIGrammar.g:24266:3: (enumLiteral_6= 'middle-left' )
+                    {
+                    // InternalUIGrammar.g:24266:3: (enumLiteral_6= 'middle-left' )
+                    // InternalUIGrammar.g:24267:4: enumLiteral_6= 'middle-left'
+                    {
+                    enumLiteral_6=(Token)match(input,231,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getUiAlignmentAccess().getMIDDLE_LEFTEnumLiteralDeclaration_6().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_6, grammarAccess.getUiAlignmentAccess().getMIDDLE_LEFTEnumLiteralDeclaration_6());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 8 :
+                    // InternalUIGrammar.g:24274:3: (enumLiteral_7= 'middle-right' )
+                    {
+                    // InternalUIGrammar.g:24274:3: (enumLiteral_7= 'middle-right' )
+                    // InternalUIGrammar.g:24275:4: enumLiteral_7= 'middle-right'
+                    {
+                    enumLiteral_7=(Token)match(input,232,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getUiAlignmentAccess().getMIDDLE_RIGHTEnumLiteralDeclaration_7().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_7, grammarAccess.getUiAlignmentAccess().getMIDDLE_RIGHTEnumLiteralDeclaration_7());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 9 :
+                    // InternalUIGrammar.g:24282:3: (enumLiteral_8= 'middle-fill' )
+                    {
+                    // InternalUIGrammar.g:24282:3: (enumLiteral_8= 'middle-fill' )
+                    // InternalUIGrammar.g:24283:4: enumLiteral_8= 'middle-fill'
+                    {
+                    enumLiteral_8=(Token)match(input,233,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getUiAlignmentAccess().getMIDDLE_FILLEnumLiteralDeclaration_8().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_8, grammarAccess.getUiAlignmentAccess().getMIDDLE_FILLEnumLiteralDeclaration_8());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 10 :
+                    // InternalUIGrammar.g:24290:3: (enumLiteral_9= 'top-center' )
+                    {
+                    // InternalUIGrammar.g:24290:3: (enumLiteral_9= 'top-center' )
+                    // InternalUIGrammar.g:24291:4: enumLiteral_9= 'top-center'
+                    {
+                    enumLiteral_9=(Token)match(input,234,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getUiAlignmentAccess().getTOP_CENTEREnumLiteralDeclaration_9().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_9, grammarAccess.getUiAlignmentAccess().getTOP_CENTEREnumLiteralDeclaration_9());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 11 :
+                    // InternalUIGrammar.g:24298:3: (enumLiteral_10= 'top-left' )
+                    {
+                    // InternalUIGrammar.g:24298:3: (enumLiteral_10= 'top-left' )
+                    // InternalUIGrammar.g:24299:4: enumLiteral_10= 'top-left'
+                    {
+                    enumLiteral_10=(Token)match(input,235,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getUiAlignmentAccess().getTOP_LEFTEnumLiteralDeclaration_10().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_10, grammarAccess.getUiAlignmentAccess().getTOP_LEFTEnumLiteralDeclaration_10());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 12 :
+                    // InternalUIGrammar.g:24306:3: (enumLiteral_11= 'top-right' )
+                    {
+                    // InternalUIGrammar.g:24306:3: (enumLiteral_11= 'top-right' )
+                    // InternalUIGrammar.g:24307:4: enumLiteral_11= 'top-right'
+                    {
+                    enumLiteral_11=(Token)match(input,236,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getUiAlignmentAccess().getTOP_RIGHTEnumLiteralDeclaration_11().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_11, grammarAccess.getUiAlignmentAccess().getTOP_RIGHTEnumLiteralDeclaration_11());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 13 :
+                    // InternalUIGrammar.g:24314:3: (enumLiteral_12= 'top-fill' )
+                    {
+                    // InternalUIGrammar.g:24314:3: (enumLiteral_12= 'top-fill' )
+                    // InternalUIGrammar.g:24315:4: enumLiteral_12= 'top-fill'
+                    {
+                    enumLiteral_12=(Token)match(input,237,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getUiAlignmentAccess().getTOP_FILLEnumLiteralDeclaration_12().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_12, grammarAccess.getUiAlignmentAccess().getTOP_FILLEnumLiteralDeclaration_12());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 14 :
+                    // InternalUIGrammar.g:24322:3: (enumLiteral_13= 'fill-center' )
+                    {
+                    // InternalUIGrammar.g:24322:3: (enumLiteral_13= 'fill-center' )
+                    // InternalUIGrammar.g:24323:4: enumLiteral_13= 'fill-center'
+                    {
+                    enumLiteral_13=(Token)match(input,238,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getUiAlignmentAccess().getFILL_CENTEREnumLiteralDeclaration_13().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_13, grammarAccess.getUiAlignmentAccess().getFILL_CENTEREnumLiteralDeclaration_13());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 15 :
+                    // InternalUIGrammar.g:24330:3: (enumLiteral_14= 'fill-left' )
+                    {
+                    // InternalUIGrammar.g:24330:3: (enumLiteral_14= 'fill-left' )
+                    // InternalUIGrammar.g:24331:4: enumLiteral_14= 'fill-left'
+                    {
+                    enumLiteral_14=(Token)match(input,239,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getUiAlignmentAccess().getFILL_LEFTEnumLiteralDeclaration_14().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_14, grammarAccess.getUiAlignmentAccess().getFILL_LEFTEnumLiteralDeclaration_14());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 16 :
+                    // InternalUIGrammar.g:24338:3: (enumLiteral_15= 'fill-right' )
+                    {
+                    // InternalUIGrammar.g:24338:3: (enumLiteral_15= 'fill-right' )
+                    // InternalUIGrammar.g:24339:4: enumLiteral_15= 'fill-right'
+                    {
+                    enumLiteral_15=(Token)match(input,240,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getUiAlignmentAccess().getFILL_RIGHTEnumLiteralDeclaration_15().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_15, grammarAccess.getUiAlignmentAccess().getFILL_RIGHTEnumLiteralDeclaration_15());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 17 :
+                    // InternalUIGrammar.g:24346:3: (enumLiteral_16= 'fill-fill' )
+                    {
+                    // InternalUIGrammar.g:24346:3: (enumLiteral_16= 'fill-fill' )
+                    // InternalUIGrammar.g:24347:4: enumLiteral_16= 'fill-fill'
+                    {
+                    enumLiteral_16=(Token)match(input,241,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getUiAlignmentAccess().getFILL_FILLEnumLiteralDeclaration_16().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_16, grammarAccess.getUiAlignmentAccess().getFILL_FILLEnumLiteralDeclaration_16());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUiAlignment"
+
+    // $ANTLR start synpred1_InternalUIGrammar
+    public final void synpred1_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:2574:5: ( ( ruleQualifiedName ) )
+        // InternalUIGrammar.g:2574:6: ( ruleQualifiedName )
+        {
+        // InternalUIGrammar.g:2574:6: ( ruleQualifiedName )
+        // InternalUIGrammar.g:2575:6: ruleQualifiedName
+        {
+        pushFollow(FOLLOW_2);
+        ruleQualifiedName();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred1_InternalUIGrammar
+
+    // $ANTLR start synpred2_InternalUIGrammar
+    public final void synpred2_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:2724:5: ( ( ruleQualifiedName ) )
+        // InternalUIGrammar.g:2724:6: ( ruleQualifiedName )
+        {
+        // InternalUIGrammar.g:2724:6: ( ruleQualifiedName )
+        // InternalUIGrammar.g:2725:6: ruleQualifiedName
+        {
+        pushFollow(FOLLOW_2);
+        ruleQualifiedName();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred2_InternalUIGrammar
+
+    // $ANTLR start synpred3_InternalUIGrammar
+    public final void synpred3_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:17449:5: ( '(' )
+        // InternalUIGrammar.g:17449:6: '('
+        {
+        match(input,45,FOLLOW_2); if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred3_InternalUIGrammar
+
+    // $ANTLR start synpred4_InternalUIGrammar
+    public final void synpred4_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:17458:7: ( ( ( ( ruleValidID ) ) '=' ) )
+        // InternalUIGrammar.g:17458:8: ( ( ( ruleValidID ) ) '=' )
+        {
+        // InternalUIGrammar.g:17458:8: ( ( ( ruleValidID ) ) '=' )
+        // InternalUIGrammar.g:17459:8: ( ( ruleValidID ) ) '='
+        {
+        // InternalUIGrammar.g:17459:8: ( ( ruleValidID ) )
+        // InternalUIGrammar.g:17460:9: ( ruleValidID )
+        {
+        // InternalUIGrammar.g:17460:9: ( ruleValidID )
+        // InternalUIGrammar.g:17461:10: ruleValidID
+        {
+        pushFollow(FOLLOW_132);
+        ruleValidID();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        match(input,161,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred4_InternalUIGrammar
+
+    // $ANTLR start synpred7_InternalUIGrammar
+    public final void synpred7_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:17638:5: ( ( () '#' '[' ) )
+        // InternalUIGrammar.g:17638:6: ( () '#' '[' )
+        {
+        // InternalUIGrammar.g:17638:6: ( () '#' '[' )
+        // InternalUIGrammar.g:17639:6: () '#' '['
+        {
+        // InternalUIGrammar.g:17639:6: ()
+        // InternalUIGrammar.g:17640:6: 
+        {
+        }
+
+        match(input,162,FOLLOW_27); if (state.failed) return ;
+        match(input,32,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred7_InternalUIGrammar
+
+    // $ANTLR start synpred8_InternalUIGrammar
+    public final void synpred8_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:17780:5: ( ( () '#' '[' ) )
+        // InternalUIGrammar.g:17780:6: ( () '#' '[' )
+        {
+        // InternalUIGrammar.g:17780:6: ( () '#' '[' )
+        // InternalUIGrammar.g:17781:6: () '#' '['
+        {
+        // InternalUIGrammar.g:17781:6: ()
+        // InternalUIGrammar.g:17782:6: 
+        {
+        }
+
+        match(input,162,FOLLOW_27); if (state.failed) return ;
+        match(input,32,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred8_InternalUIGrammar
+
+    // $ANTLR start synpred9_InternalUIGrammar
+    public final void synpred9_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:18008:6: ( ( () ( ( ruleOpMultiAssign ) ) ) )
+        // InternalUIGrammar.g:18008:7: ( () ( ( ruleOpMultiAssign ) ) )
+        {
+        // InternalUIGrammar.g:18008:7: ( () ( ( ruleOpMultiAssign ) ) )
+        // InternalUIGrammar.g:18009:7: () ( ( ruleOpMultiAssign ) )
+        {
+        // InternalUIGrammar.g:18009:7: ()
+        // InternalUIGrammar.g:18010:7: 
+        {
+        }
+
+        // InternalUIGrammar.g:18011:7: ( ( ruleOpMultiAssign ) )
+        // InternalUIGrammar.g:18012:8: ( ruleOpMultiAssign )
+        {
+        // InternalUIGrammar.g:18012:8: ( ruleOpMultiAssign )
+        // InternalUIGrammar.g:18013:9: ruleOpMultiAssign
+        {
+        pushFollow(FOLLOW_2);
+        ruleOpMultiAssign();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred9_InternalUIGrammar
+
+    // $ANTLR start synpred10_InternalUIGrammar
+    public final void synpred10_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:18202:5: ( ( () ( ( ruleOpOr ) ) ) )
+        // InternalUIGrammar.g:18202:6: ( () ( ( ruleOpOr ) ) )
+        {
+        // InternalUIGrammar.g:18202:6: ( () ( ( ruleOpOr ) ) )
+        // InternalUIGrammar.g:18203:6: () ( ( ruleOpOr ) )
+        {
+        // InternalUIGrammar.g:18203:6: ()
+        // InternalUIGrammar.g:18204:6: 
+        {
+        }
+
+        // InternalUIGrammar.g:18205:6: ( ( ruleOpOr ) )
+        // InternalUIGrammar.g:18206:7: ( ruleOpOr )
+        {
+        // InternalUIGrammar.g:18206:7: ( ruleOpOr )
+        // InternalUIGrammar.g:18207:8: ruleOpOr
+        {
+        pushFollow(FOLLOW_2);
+        ruleOpOr();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred10_InternalUIGrammar
+
+    // $ANTLR start synpred11_InternalUIGrammar
+    public final void synpred11_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:18309:5: ( ( () ( ( ruleOpAnd ) ) ) )
+        // InternalUIGrammar.g:18309:6: ( () ( ( ruleOpAnd ) ) )
+        {
+        // InternalUIGrammar.g:18309:6: ( () ( ( ruleOpAnd ) ) )
+        // InternalUIGrammar.g:18310:6: () ( ( ruleOpAnd ) )
+        {
+        // InternalUIGrammar.g:18310:6: ()
+        // InternalUIGrammar.g:18311:6: 
+        {
+        }
+
+        // InternalUIGrammar.g:18312:6: ( ( ruleOpAnd ) )
+        // InternalUIGrammar.g:18313:7: ( ruleOpAnd )
+        {
+        // InternalUIGrammar.g:18313:7: ( ruleOpAnd )
+        // InternalUIGrammar.g:18314:8: ruleOpAnd
+        {
+        pushFollow(FOLLOW_2);
+        ruleOpAnd();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred11_InternalUIGrammar
+
+    // $ANTLR start synpred12_InternalUIGrammar
+    public final void synpred12_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:18416:5: ( ( () ( ( ruleOpEquality ) ) ) )
+        // InternalUIGrammar.g:18416:6: ( () ( ( ruleOpEquality ) ) )
+        {
+        // InternalUIGrammar.g:18416:6: ( () ( ( ruleOpEquality ) ) )
+        // InternalUIGrammar.g:18417:6: () ( ( ruleOpEquality ) )
+        {
+        // InternalUIGrammar.g:18417:6: ()
+        // InternalUIGrammar.g:18418:6: 
+        {
+        }
+
+        // InternalUIGrammar.g:18419:6: ( ( ruleOpEquality ) )
+        // InternalUIGrammar.g:18420:7: ( ruleOpEquality )
+        {
+        // InternalUIGrammar.g:18420:7: ( ruleOpEquality )
+        // InternalUIGrammar.g:18421:8: ruleOpEquality
+        {
+        pushFollow(FOLLOW_2);
+        ruleOpEquality();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred12_InternalUIGrammar
+
+    // $ANTLR start synpred13_InternalUIGrammar
+    public final void synpred13_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:18544:6: ( ( () 'instanceof' ) )
+        // InternalUIGrammar.g:18544:7: ( () 'instanceof' )
+        {
+        // InternalUIGrammar.g:18544:7: ( () 'instanceof' )
+        // InternalUIGrammar.g:18545:7: () 'instanceof'
+        {
+        // InternalUIGrammar.g:18545:7: ()
+        // InternalUIGrammar.g:18546:7: 
+        {
+        }
+
+        match(input,174,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred13_InternalUIGrammar
+
+    // $ANTLR start synpred14_InternalUIGrammar
+    public final void synpred14_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:18587:6: ( ( () ( ( ruleOpCompare ) ) ) )
+        // InternalUIGrammar.g:18587:7: ( () ( ( ruleOpCompare ) ) )
+        {
+        // InternalUIGrammar.g:18587:7: ( () ( ( ruleOpCompare ) ) )
+        // InternalUIGrammar.g:18588:7: () ( ( ruleOpCompare ) )
+        {
+        // InternalUIGrammar.g:18588:7: ()
+        // InternalUIGrammar.g:18589:7: 
+        {
+        }
+
+        // InternalUIGrammar.g:18590:7: ( ( ruleOpCompare ) )
+        // InternalUIGrammar.g:18591:8: ( ruleOpCompare )
+        {
+        // InternalUIGrammar.g:18591:8: ( ruleOpCompare )
+        // InternalUIGrammar.g:18592:9: ruleOpCompare
+        {
+        pushFollow(FOLLOW_2);
+        ruleOpCompare();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred14_InternalUIGrammar
+
+    // $ANTLR start synpred15_InternalUIGrammar
+    public final void synpred15_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:18722:5: ( ( () ( ( ruleOpOther ) ) ) )
+        // InternalUIGrammar.g:18722:6: ( () ( ( ruleOpOther ) ) )
+        {
+        // InternalUIGrammar.g:18722:6: ( () ( ( ruleOpOther ) ) )
+        // InternalUIGrammar.g:18723:6: () ( ( ruleOpOther ) )
+        {
+        // InternalUIGrammar.g:18723:6: ()
+        // InternalUIGrammar.g:18724:6: 
+        {
+        }
+
+        // InternalUIGrammar.g:18725:6: ( ( ruleOpOther ) )
+        // InternalUIGrammar.g:18726:7: ( ruleOpOther )
+        {
+        // InternalUIGrammar.g:18726:7: ( ruleOpOther )
+        // InternalUIGrammar.g:18727:8: ruleOpOther
+        {
+        pushFollow(FOLLOW_2);
+        ruleOpOther();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred15_InternalUIGrammar
+
+    // $ANTLR start synpred16_InternalUIGrammar
+    public final void synpred16_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:18842:6: ( ( '>' '>' ) )
+        // InternalUIGrammar.g:18842:7: ( '>' '>' )
+        {
+        // InternalUIGrammar.g:18842:7: ( '>' '>' )
+        // InternalUIGrammar.g:18843:7: '>' '>'
+        {
+        match(input,30,FOLLOW_147); if (state.failed) return ;
+        match(input,30,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred16_InternalUIGrammar
+
+    // $ANTLR start synpred17_InternalUIGrammar
+    public final void synpred17_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:18877:6: ( ( '<' '<' ) )
+        // InternalUIGrammar.g:18877:7: ( '<' '<' )
+        {
+        // InternalUIGrammar.g:18877:7: ( '<' '<' )
+        // InternalUIGrammar.g:18878:7: '<' '<'
+        {
+        match(input,28,FOLLOW_138); if (state.failed) return ;
+        match(input,28,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred17_InternalUIGrammar
+
+    // $ANTLR start synpred18_InternalUIGrammar
+    public final void synpred18_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:18950:5: ( ( () ( ( ruleOpAdd ) ) ) )
+        // InternalUIGrammar.g:18950:6: ( () ( ( ruleOpAdd ) ) )
+        {
+        // InternalUIGrammar.g:18950:6: ( () ( ( ruleOpAdd ) ) )
+        // InternalUIGrammar.g:18951:6: () ( ( ruleOpAdd ) )
+        {
+        // InternalUIGrammar.g:18951:6: ()
+        // InternalUIGrammar.g:18952:6: 
+        {
+        }
+
+        // InternalUIGrammar.g:18953:6: ( ( ruleOpAdd ) )
+        // InternalUIGrammar.g:18954:7: ( ruleOpAdd )
+        {
+        // InternalUIGrammar.g:18954:7: ( ruleOpAdd )
+        // InternalUIGrammar.g:18955:8: ruleOpAdd
+        {
+        pushFollow(FOLLOW_2);
+        ruleOpAdd();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred18_InternalUIGrammar
+
+    // $ANTLR start synpred19_InternalUIGrammar
+    public final void synpred19_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:19065:5: ( ( () ( ( ruleOpMulti ) ) ) )
+        // InternalUIGrammar.g:19065:6: ( () ( ( ruleOpMulti ) ) )
+        {
+        // InternalUIGrammar.g:19065:6: ( () ( ( ruleOpMulti ) ) )
+        // InternalUIGrammar.g:19066:6: () ( ( ruleOpMulti ) )
+        {
+        // InternalUIGrammar.g:19066:6: ()
+        // InternalUIGrammar.g:19067:6: 
+        {
+        }
+
+        // InternalUIGrammar.g:19068:6: ( ( ruleOpMulti ) )
+        // InternalUIGrammar.g:19069:7: ( ruleOpMulti )
+        {
+        // InternalUIGrammar.g:19069:7: ( ruleOpMulti )
+        // InternalUIGrammar.g:19070:8: ruleOpMulti
+        {
+        pushFollow(FOLLOW_2);
+        ruleOpMulti();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred19_InternalUIGrammar
+
+    // $ANTLR start synpred20_InternalUIGrammar
+    public final void synpred20_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:19300:5: ( ( () 'as' ) )
+        // InternalUIGrammar.g:19300:6: ( () 'as' )
+        {
+        // InternalUIGrammar.g:19300:6: ( () 'as' )
+        // InternalUIGrammar.g:19301:6: () 'as'
+        {
+        // InternalUIGrammar.g:19301:6: ()
+        // InternalUIGrammar.g:19302:6: 
+        {
+        }
+
+        match(input,15,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred20_InternalUIGrammar
+
+    // $ANTLR start synpred21_InternalUIGrammar
+    public final void synpred21_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:19368:4: ( ( () ( ( ruleOpPostfix ) ) ) )
+        // InternalUIGrammar.g:19368:5: ( () ( ( ruleOpPostfix ) ) )
+        {
+        // InternalUIGrammar.g:19368:5: ( () ( ( ruleOpPostfix ) ) )
+        // InternalUIGrammar.g:19369:5: () ( ( ruleOpPostfix ) )
+        {
+        // InternalUIGrammar.g:19369:5: ()
+        // InternalUIGrammar.g:19370:5: 
+        {
+        }
+
+        // InternalUIGrammar.g:19371:5: ( ( ruleOpPostfix ) )
+        // InternalUIGrammar.g:19372:6: ( ruleOpPostfix )
+        {
+        // InternalUIGrammar.g:19372:6: ( ruleOpPostfix )
+        // InternalUIGrammar.g:19373:7: ruleOpPostfix
+        {
+        pushFollow(FOLLOW_2);
+        ruleOpPostfix();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred21_InternalUIGrammar
+
+    // $ANTLR start synpred22_InternalUIGrammar
+    public final void synpred22_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:19464:6: ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )
+        // InternalUIGrammar.g:19464:7: ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
+        {
+        // InternalUIGrammar.g:19464:7: ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
+        // InternalUIGrammar.g:19465:7: () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign
+        {
+        // InternalUIGrammar.g:19465:7: ()
+        // InternalUIGrammar.g:19466:7: 
+        {
+        }
+
+        // InternalUIGrammar.g:19467:7: ( '.' | ( ( '::' ) ) )
+        int alt523=2;
+        int LA523_0 = input.LA(1);
+
+        if ( (LA523_0==31) ) {
+            alt523=1;
+        }
+        else if ( (LA523_0==187) ) {
+            alt523=2;
+        }
+        else {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            NoViableAltException nvae =
+                new NoViableAltException("", 523, 0, input);
+
+            throw nvae;
+        }
+        switch (alt523) {
+            case 1 :
+                // InternalUIGrammar.g:19468:8: '.'
+                {
+                match(input,31,FOLLOW_154); if (state.failed) return ;
+
+                }
+                break;
+            case 2 :
+                // InternalUIGrammar.g:19470:8: ( ( '::' ) )
+                {
+                // InternalUIGrammar.g:19470:8: ( ( '::' ) )
+                // InternalUIGrammar.g:19471:9: ( '::' )
+                {
+                // InternalUIGrammar.g:19471:9: ( '::' )
+                // InternalUIGrammar.g:19472:10: '::'
+                {
+                match(input,187,FOLLOW_154); if (state.failed) return ;
+
+                }
+
+
+                }
+
+
+                }
+                break;
+
+        }
+
+        // InternalUIGrammar.g:19476:7: ( ( ruleFeatureCallID ) )
+        // InternalUIGrammar.g:19477:8: ( ruleFeatureCallID )
+        {
+        // InternalUIGrammar.g:19477:8: ( ruleFeatureCallID )
+        // InternalUIGrammar.g:19478:9: ruleFeatureCallID
+        {
+        pushFollow(FOLLOW_132);
+        ruleFeatureCallID();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        pushFollow(FOLLOW_2);
+        ruleOpSingleAssign();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred22_InternalUIGrammar
+
+    // $ANTLR start synpred23_InternalUIGrammar
+    public final void synpred23_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:19561:6: ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )
+        // InternalUIGrammar.g:19561:7: ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) )
+        {
+        // InternalUIGrammar.g:19561:7: ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) )
+        // InternalUIGrammar.g:19562:7: () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) )
+        {
+        // InternalUIGrammar.g:19562:7: ()
+        // InternalUIGrammar.g:19563:7: 
+        {
+        }
+
+        // InternalUIGrammar.g:19564:7: ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) )
+        int alt524=3;
+        switch ( input.LA(1) ) {
+        case 31:
+            {
+            alt524=1;
+            }
+            break;
+        case 188:
+            {
+            alt524=2;
+            }
+            break;
+        case 187:
+            {
+            alt524=3;
+            }
+            break;
+        default:
+            if (state.backtracking>0) {state.failed=true; return ;}
+            NoViableAltException nvae =
+                new NoViableAltException("", 524, 0, input);
+
+            throw nvae;
+        }
+
+        switch (alt524) {
+            case 1 :
+                // InternalUIGrammar.g:19565:8: '.'
+                {
+                match(input,31,FOLLOW_2); if (state.failed) return ;
+
+                }
+                break;
+            case 2 :
+                // InternalUIGrammar.g:19567:8: ( ( '?.' ) )
+                {
+                // InternalUIGrammar.g:19567:8: ( ( '?.' ) )
+                // InternalUIGrammar.g:19568:9: ( '?.' )
+                {
+                // InternalUIGrammar.g:19568:9: ( '?.' )
+                // InternalUIGrammar.g:19569:10: '?.'
+                {
+                match(input,188,FOLLOW_2); if (state.failed) return ;
+
+                }
+
+
+                }
+
+
+                }
+                break;
+            case 3 :
+                // InternalUIGrammar.g:19573:8: ( ( '::' ) )
+                {
+                // InternalUIGrammar.g:19573:8: ( ( '::' ) )
+                // InternalUIGrammar.g:19574:9: ( '::' )
+                {
+                // InternalUIGrammar.g:19574:9: ( '::' )
+                // InternalUIGrammar.g:19575:10: '::'
+                {
+                match(input,187,FOLLOW_2); if (state.failed) return ;
+
+                }
+
+
+                }
+
+
+                }
+                break;
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred23_InternalUIGrammar
+
+    // $ANTLR start synpred24_InternalUIGrammar
+    public final void synpred24_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:19699:7: ( ( '(' ) )
+        // InternalUIGrammar.g:19699:8: ( '(' )
+        {
+        // InternalUIGrammar.g:19699:8: ( '(' )
+        // InternalUIGrammar.g:19700:8: '('
+        {
+        match(input,45,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred24_InternalUIGrammar
+
+    // $ANTLR start synpred25_InternalUIGrammar
+    public final void synpred25_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:19718:8: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
+        // InternalUIGrammar.g:19718:9: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
+        {
+        // InternalUIGrammar.g:19718:9: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
+        // InternalUIGrammar.g:19719:9: () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
+        {
+        // InternalUIGrammar.g:19719:9: ()
+        // InternalUIGrammar.g:19720:9: 
+        {
+        }
+
+        // InternalUIGrammar.g:19721:9: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
+        int alt526=2;
+        int LA526_0 = input.LA(1);
+
+        if ( (LA526_0==RULE_ID||LA526_0==45||LA526_0==177) ) {
+            alt526=1;
+        }
+        switch (alt526) {
+            case 1 :
+                // InternalUIGrammar.g:19722:10: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
+                {
+                // InternalUIGrammar.g:19722:10: ( ( ruleJvmFormalParameter ) )
+                // InternalUIGrammar.g:19723:11: ( ruleJvmFormalParameter )
+                {
+                // InternalUIGrammar.g:19723:11: ( ruleJvmFormalParameter )
+                // InternalUIGrammar.g:19724:12: ruleJvmFormalParameter
+                {
+                pushFollow(FOLLOW_164);
+                ruleJvmFormalParameter();
+
+                state._fsp--;
+                if (state.failed) return ;
+
+                }
+
+
+                }
+
+                // InternalUIGrammar.g:19727:10: ( ',' ( ( ruleJvmFormalParameter ) ) )*
+                loop525:
+                do {
+                    int alt525=2;
+                    int LA525_0 = input.LA(1);
+
+                    if ( (LA525_0==102) ) {
+                        alt525=1;
+                    }
+
+
+                    switch (alt525) {
+                	case 1 :
+                	    // InternalUIGrammar.g:19728:11: ',' ( ( ruleJvmFormalParameter ) )
+                	    {
+                	    match(input,102,FOLLOW_16); if (state.failed) return ;
+                	    // InternalUIGrammar.g:19729:11: ( ( ruleJvmFormalParameter ) )
+                	    // InternalUIGrammar.g:19730:12: ( ruleJvmFormalParameter )
+                	    {
+                	    // InternalUIGrammar.g:19730:12: ( ruleJvmFormalParameter )
+                	    // InternalUIGrammar.g:19731:13: ruleJvmFormalParameter
+                	    {
+                	    pushFollow(FOLLOW_164);
+                	    ruleJvmFormalParameter();
+
+                	    state._fsp--;
+                	    if (state.failed) return ;
+
+                	    }
+
+
+                	    }
+
+
+                	    }
+                	    break;
+
+                	default :
+                	    break loop525;
+                    }
+                } while (true);
+
+
+                }
+                break;
+
+        }
+
+        // InternalUIGrammar.g:19736:9: ( ( '|' ) )
+        // InternalUIGrammar.g:19737:10: ( '|' )
+        {
+        // InternalUIGrammar.g:19737:10: ( '|' )
+        // InternalUIGrammar.g:19738:11: '|'
+        {
+        match(input,189,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred25_InternalUIGrammar
+
+    // $ANTLR start synpred26_InternalUIGrammar
+    public final void synpred26_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:19815:6: ( ( () '[' ) )
+        // InternalUIGrammar.g:19815:7: ( () '[' )
+        {
+        // InternalUIGrammar.g:19815:7: ( () '[' )
+        // InternalUIGrammar.g:19816:7: () '['
+        {
+        // InternalUIGrammar.g:19816:7: ()
+        // InternalUIGrammar.g:19817:7: 
+        {
+        }
+
+        match(input,32,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred26_InternalUIGrammar
+
+    // $ANTLR start synpred27_InternalUIGrammar
+    public final void synpred27_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:19888:4: ( ( () 'synchronized' '(' ) )
+        // InternalUIGrammar.g:19888:5: ( () 'synchronized' '(' )
+        {
+        // InternalUIGrammar.g:19888:5: ( () 'synchronized' '(' )
+        // InternalUIGrammar.g:19889:5: () 'synchronized' '('
+        {
+        // InternalUIGrammar.g:19889:5: ()
+        // InternalUIGrammar.g:19890:5: 
+        {
+        }
+
+        match(input,210,FOLLOW_34); if (state.failed) return ;
+        match(input,45,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred27_InternalUIGrammar
+
+    // $ANTLR start synpred28_InternalUIGrammar
+    public final void synpred28_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:19933:4: ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )
+        // InternalUIGrammar.g:19933:5: ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' )
+        {
+        // InternalUIGrammar.g:19933:5: ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' )
+        // InternalUIGrammar.g:19934:5: () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':'
+        {
+        // InternalUIGrammar.g:19934:5: ()
+        // InternalUIGrammar.g:19935:5: 
+        {
+        }
+
+        match(input,42,FOLLOW_34); if (state.failed) return ;
+        match(input,45,FOLLOW_16); if (state.failed) return ;
+        // InternalUIGrammar.g:19938:5: ( ( ruleJvmFormalParameter ) )
+        // InternalUIGrammar.g:19939:6: ( ruleJvmFormalParameter )
+        {
+        // InternalUIGrammar.g:19939:6: ( ruleJvmFormalParameter )
+        // InternalUIGrammar.g:19940:7: ruleJvmFormalParameter
+        {
+        pushFollow(FOLLOW_15);
+        ruleJvmFormalParameter();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        match(input,24,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred28_InternalUIGrammar
+
+    // $ANTLR start synpred29_InternalUIGrammar
+    public final void synpred29_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:20047:4: ( ( () '[' ) )
+        // InternalUIGrammar.g:20047:5: ( () '[' )
+        {
+        // InternalUIGrammar.g:20047:5: ( () '[' )
+        // InternalUIGrammar.g:20048:5: () '['
+        {
+        // InternalUIGrammar.g:20048:5: ()
+        // InternalUIGrammar.g:20049:5: 
+        {
+        }
+
+        match(input,32,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred29_InternalUIGrammar
+
+    // $ANTLR start synpred31_InternalUIGrammar
+    public final void synpred31_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:20352:4: ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
+        // InternalUIGrammar.g:20352:5: ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
+        {
+        // InternalUIGrammar.g:20352:5: ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
+        // InternalUIGrammar.g:20353:5: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
+        {
+        // InternalUIGrammar.g:20353:5: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
+        int alt528=2;
+        int LA528_0 = input.LA(1);
+
+        if ( (LA528_0==RULE_ID||LA528_0==45||LA528_0==177) ) {
+            alt528=1;
+        }
+        switch (alt528) {
+            case 1 :
+                // InternalUIGrammar.g:20354:6: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
+                {
+                // InternalUIGrammar.g:20354:6: ( ( ruleJvmFormalParameter ) )
+                // InternalUIGrammar.g:20355:7: ( ruleJvmFormalParameter )
+                {
+                // InternalUIGrammar.g:20355:7: ( ruleJvmFormalParameter )
+                // InternalUIGrammar.g:20356:8: ruleJvmFormalParameter
+                {
+                pushFollow(FOLLOW_164);
+                ruleJvmFormalParameter();
+
+                state._fsp--;
+                if (state.failed) return ;
+
+                }
+
+
+                }
+
+                // InternalUIGrammar.g:20359:6: ( ',' ( ( ruleJvmFormalParameter ) ) )*
+                loop527:
+                do {
+                    int alt527=2;
+                    int LA527_0 = input.LA(1);
+
+                    if ( (LA527_0==102) ) {
+                        alt527=1;
+                    }
+
+
+                    switch (alt527) {
+                	case 1 :
+                	    // InternalUIGrammar.g:20360:7: ',' ( ( ruleJvmFormalParameter ) )
+                	    {
+                	    match(input,102,FOLLOW_16); if (state.failed) return ;
+                	    // InternalUIGrammar.g:20361:7: ( ( ruleJvmFormalParameter ) )
+                	    // InternalUIGrammar.g:20362:8: ( ruleJvmFormalParameter )
+                	    {
+                	    // InternalUIGrammar.g:20362:8: ( ruleJvmFormalParameter )
+                	    // InternalUIGrammar.g:20363:9: ruleJvmFormalParameter
+                	    {
+                	    pushFollow(FOLLOW_164);
+                	    ruleJvmFormalParameter();
+
+                	    state._fsp--;
+                	    if (state.failed) return ;
+
+                	    }
+
+
+                	    }
+
+
+                	    }
+                	    break;
+
+                	default :
+                	    break loop527;
+                    }
+                } while (true);
+
+
+                }
+                break;
+
+        }
+
+        // InternalUIGrammar.g:20368:5: ( ( '|' ) )
+        // InternalUIGrammar.g:20369:6: ( '|' )
+        {
+        // InternalUIGrammar.g:20369:6: ( '|' )
+        // InternalUIGrammar.g:20370:7: '|'
+        {
+        match(input,189,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred31_InternalUIGrammar
+
+    // $ANTLR start synpred33_InternalUIGrammar
+    public final void synpred33_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:20761:5: ( 'else' )
+        // InternalUIGrammar.g:20761:6: 'else'
+        {
+        match(input,191,FOLLOW_2); if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred33_InternalUIGrammar
+
+    // $ANTLR start synpred34_InternalUIGrammar
+    public final void synpred34_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:20820:6: ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )
+        // InternalUIGrammar.g:20820:7: ( '(' ( ( ruleJvmFormalParameter ) ) ':' )
+        {
+        // InternalUIGrammar.g:20820:7: ( '(' ( ( ruleJvmFormalParameter ) ) ':' )
+        // InternalUIGrammar.g:20821:7: '(' ( ( ruleJvmFormalParameter ) ) ':'
+        {
+        match(input,45,FOLLOW_16); if (state.failed) return ;
+        // InternalUIGrammar.g:20822:7: ( ( ruleJvmFormalParameter ) )
+        // InternalUIGrammar.g:20823:8: ( ruleJvmFormalParameter )
+        {
+        // InternalUIGrammar.g:20823:8: ( ruleJvmFormalParameter )
+        // InternalUIGrammar.g:20824:9: ruleJvmFormalParameter
+        {
+        pushFollow(FOLLOW_15);
+        ruleJvmFormalParameter();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        match(input,24,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred34_InternalUIGrammar
+
+    // $ANTLR start synpred35_InternalUIGrammar
+    public final void synpred35_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:20887:6: ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )
+        // InternalUIGrammar.g:20887:7: ( ( ( ruleJvmFormalParameter ) ) ':' )
+        {
+        // InternalUIGrammar.g:20887:7: ( ( ( ruleJvmFormalParameter ) ) ':' )
+        // InternalUIGrammar.g:20888:7: ( ( ruleJvmFormalParameter ) ) ':'
+        {
+        // InternalUIGrammar.g:20888:7: ( ( ruleJvmFormalParameter ) )
+        // InternalUIGrammar.g:20889:8: ( ruleJvmFormalParameter )
+        {
+        // InternalUIGrammar.g:20889:8: ( ruleJvmFormalParameter )
+        // InternalUIGrammar.g:20890:9: ruleJvmFormalParameter
+        {
+        pushFollow(FOLLOW_15);
+        ruleJvmFormalParameter();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        match(input,24,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred35_InternalUIGrammar
+
+    // $ANTLR start synpred37_InternalUIGrammar
+    public final void synpred37_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:21705:5: ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )
+        // InternalUIGrammar.g:21705:6: ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) )
+        {
+        // InternalUIGrammar.g:21705:6: ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) )
+        // InternalUIGrammar.g:21706:6: ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) )
+        {
+        // InternalUIGrammar.g:21706:6: ( ( ruleJvmTypeReference ) )
+        // InternalUIGrammar.g:21707:7: ( ruleJvmTypeReference )
+        {
+        // InternalUIGrammar.g:21707:7: ( ruleJvmTypeReference )
+        // InternalUIGrammar.g:21708:8: ruleJvmTypeReference
+        {
+        pushFollow(FOLLOW_3);
+        ruleJvmTypeReference();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        // InternalUIGrammar.g:21711:6: ( ( ruleValidID ) )
+        // InternalUIGrammar.g:21712:7: ( ruleValidID )
+        {
+        // InternalUIGrammar.g:21712:7: ( ruleValidID )
+        // InternalUIGrammar.g:21713:8: ruleValidID
+        {
+        pushFollow(FOLLOW_2);
+        ruleValidID();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred37_InternalUIGrammar
+
+    // $ANTLR start synpred38_InternalUIGrammar
+    public final void synpred38_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:22017:5: ( ( '(' ) )
+        // InternalUIGrammar.g:22017:6: ( '(' )
+        {
+        // InternalUIGrammar.g:22017:6: ( '(' )
+        // InternalUIGrammar.g:22018:6: '('
+        {
+        match(input,45,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred38_InternalUIGrammar
+
+    // $ANTLR start synpred39_InternalUIGrammar
+    public final void synpred39_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:22036:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
+        // InternalUIGrammar.g:22036:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
+        {
+        // InternalUIGrammar.g:22036:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
+        // InternalUIGrammar.g:22037:7: () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
+        {
+        // InternalUIGrammar.g:22037:7: ()
+        // InternalUIGrammar.g:22038:7: 
+        {
+        }
+
+        // InternalUIGrammar.g:22039:7: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
+        int alt532=2;
+        int LA532_0 = input.LA(1);
+
+        if ( (LA532_0==RULE_ID||LA532_0==45||LA532_0==177) ) {
+            alt532=1;
+        }
+        switch (alt532) {
+            case 1 :
+                // InternalUIGrammar.g:22040:8: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
+                {
+                // InternalUIGrammar.g:22040:8: ( ( ruleJvmFormalParameter ) )
+                // InternalUIGrammar.g:22041:9: ( ruleJvmFormalParameter )
+                {
+                // InternalUIGrammar.g:22041:9: ( ruleJvmFormalParameter )
+                // InternalUIGrammar.g:22042:10: ruleJvmFormalParameter
+                {
+                pushFollow(FOLLOW_164);
+                ruleJvmFormalParameter();
+
+                state._fsp--;
+                if (state.failed) return ;
+
+                }
+
+
+                }
+
+                // InternalUIGrammar.g:22045:8: ( ',' ( ( ruleJvmFormalParameter ) ) )*
+                loop531:
+                do {
+                    int alt531=2;
+                    int LA531_0 = input.LA(1);
+
+                    if ( (LA531_0==102) ) {
+                        alt531=1;
+                    }
+
+
+                    switch (alt531) {
+                	case 1 :
+                	    // InternalUIGrammar.g:22046:9: ',' ( ( ruleJvmFormalParameter ) )
+                	    {
+                	    match(input,102,FOLLOW_16); if (state.failed) return ;
+                	    // InternalUIGrammar.g:22047:9: ( ( ruleJvmFormalParameter ) )
+                	    // InternalUIGrammar.g:22048:10: ( ruleJvmFormalParameter )
+                	    {
+                	    // InternalUIGrammar.g:22048:10: ( ruleJvmFormalParameter )
+                	    // InternalUIGrammar.g:22049:11: ruleJvmFormalParameter
+                	    {
+                	    pushFollow(FOLLOW_164);
+                	    ruleJvmFormalParameter();
+
+                	    state._fsp--;
+                	    if (state.failed) return ;
+
+                	    }
+
+
+                	    }
+
+
+                	    }
+                	    break;
+
+                	default :
+                	    break loop531;
+                    }
+                } while (true);
+
+
+                }
+                break;
+
+        }
+
+        // InternalUIGrammar.g:22054:7: ( ( '|' ) )
+        // InternalUIGrammar.g:22055:8: ( '|' )
+        {
+        // InternalUIGrammar.g:22055:8: ( '|' )
+        // InternalUIGrammar.g:22056:9: '|'
+        {
+        match(input,189,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred39_InternalUIGrammar
+
+    // $ANTLR start synpred40_InternalUIGrammar
+    public final void synpred40_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:22133:4: ( ( () '[' ) )
+        // InternalUIGrammar.g:22133:5: ( () '[' )
+        {
+        // InternalUIGrammar.g:22133:5: ( () '[' )
+        // InternalUIGrammar.g:22134:5: () '['
+        {
+        // InternalUIGrammar.g:22134:5: ()
+        // InternalUIGrammar.g:22135:5: 
+        {
+        }
+
+        match(input,32,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred40_InternalUIGrammar
+
+    // $ANTLR start synpred41_InternalUIGrammar
+    public final void synpred41_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:22293:5: ( '<' )
+        // InternalUIGrammar.g:22293:6: '<'
+        {
+        match(input,28,FOLLOW_2); if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred41_InternalUIGrammar
+
+    // $ANTLR start synpred42_InternalUIGrammar
+    public final void synpred42_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:22350:5: ( ( '(' ) )
+        // InternalUIGrammar.g:22350:6: ( '(' )
+        {
+        // InternalUIGrammar.g:22350:6: ( '(' )
+        // InternalUIGrammar.g:22351:6: '('
+        {
+        match(input,45,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred42_InternalUIGrammar
+
+    // $ANTLR start synpred43_InternalUIGrammar
+    public final void synpred43_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:22369:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
+        // InternalUIGrammar.g:22369:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
+        {
+        // InternalUIGrammar.g:22369:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
+        // InternalUIGrammar.g:22370:7: () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
+        {
+        // InternalUIGrammar.g:22370:7: ()
+        // InternalUIGrammar.g:22371:7: 
+        {
+        }
+
+        // InternalUIGrammar.g:22372:7: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
+        int alt534=2;
+        int LA534_0 = input.LA(1);
+
+        if ( (LA534_0==RULE_ID||LA534_0==45||LA534_0==177) ) {
+            alt534=1;
+        }
+        switch (alt534) {
+            case 1 :
+                // InternalUIGrammar.g:22373:8: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
+                {
+                // InternalUIGrammar.g:22373:8: ( ( ruleJvmFormalParameter ) )
+                // InternalUIGrammar.g:22374:9: ( ruleJvmFormalParameter )
+                {
+                // InternalUIGrammar.g:22374:9: ( ruleJvmFormalParameter )
+                // InternalUIGrammar.g:22375:10: ruleJvmFormalParameter
+                {
+                pushFollow(FOLLOW_164);
+                ruleJvmFormalParameter();
+
+                state._fsp--;
+                if (state.failed) return ;
+
+                }
+
+
+                }
+
+                // InternalUIGrammar.g:22378:8: ( ',' ( ( ruleJvmFormalParameter ) ) )*
+                loop533:
+                do {
+                    int alt533=2;
+                    int LA533_0 = input.LA(1);
+
+                    if ( (LA533_0==102) ) {
+                        alt533=1;
+                    }
+
+
+                    switch (alt533) {
+                	case 1 :
+                	    // InternalUIGrammar.g:22379:9: ',' ( ( ruleJvmFormalParameter ) )
+                	    {
+                	    match(input,102,FOLLOW_16); if (state.failed) return ;
+                	    // InternalUIGrammar.g:22380:9: ( ( ruleJvmFormalParameter ) )
+                	    // InternalUIGrammar.g:22381:10: ( ruleJvmFormalParameter )
+                	    {
+                	    // InternalUIGrammar.g:22381:10: ( ruleJvmFormalParameter )
+                	    // InternalUIGrammar.g:22382:11: ruleJvmFormalParameter
+                	    {
+                	    pushFollow(FOLLOW_164);
+                	    ruleJvmFormalParameter();
+
+                	    state._fsp--;
+                	    if (state.failed) return ;
+
+                	    }
+
+
+                	    }
+
+
+                	    }
+                	    break;
+
+                	default :
+                	    break loop533;
+                    }
+                } while (true);
+
+
+                }
+                break;
+
+        }
+
+        // InternalUIGrammar.g:22387:7: ( ( '|' ) )
+        // InternalUIGrammar.g:22388:8: ( '|' )
+        {
+        // InternalUIGrammar.g:22388:8: ( '|' )
+        // InternalUIGrammar.g:22389:9: '|'
+        {
+        match(input,189,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred43_InternalUIGrammar
+
+    // $ANTLR start synpred44_InternalUIGrammar
+    public final void synpred44_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:22466:4: ( ( () '[' ) )
+        // InternalUIGrammar.g:22466:5: ( () '[' )
+        {
+        // InternalUIGrammar.g:22466:5: ( () '[' )
+        // InternalUIGrammar.g:22467:5: () '['
+        {
+        // InternalUIGrammar.g:22467:5: ()
+        // InternalUIGrammar.g:22468:5: 
+        {
+        }
+
+        match(input,32,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred44_InternalUIGrammar
+
+    // $ANTLR start synpred45_InternalUIGrammar
+    public final void synpred45_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:22809: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 )
+        // InternalUIGrammar.g:
+        {
+        if ( (input.LA(1)>=RULE_ID && input.LA(1)<=RULE_DECIMAL)||input.LA(1)==20||input.LA(1)==28||input.LA(1)==32||input.LA(1)==42||input.LA(1)==45||(input.LA(1)>=155 && input.LA(1)<=157)||input.LA(1)==162||(input.LA(1)>=180 && input.LA(1)<=181)||input.LA(1)==185||input.LA(1)==190||input.LA(1)==192||(input.LA(1)>=195 && input.LA(1)<=196)||(input.LA(1)>=199 && input.LA(1)<=208)||input.LA(1)==210 ) {
+            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 synpred45_InternalUIGrammar
+
+    // $ANTLR start synpred46_InternalUIGrammar
+    public final void synpred46_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:22880:6: ( 'catch' )
+        // InternalUIGrammar.g:22880:7: 'catch'
+        {
+        match(input,211,FOLLOW_2); if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred46_InternalUIGrammar
+
+    // $ANTLR start synpred47_InternalUIGrammar
+    public final void synpred47_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:22901:7: ( 'finally' )
+        // InternalUIGrammar.g:22901:8: 'finally'
+        {
+        match(input,209,FOLLOW_2); if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred47_InternalUIGrammar
+
+    // $ANTLR start synpred50_InternalUIGrammar
+    public final void synpred50_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:23145:5: ( '.' )
+        // InternalUIGrammar.g:23145:6: '.'
+        {
+        match(input,31,FOLLOW_2); if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred50_InternalUIGrammar
+
+    // $ANTLR start synpred51_InternalUIGrammar
+    public final void synpred51_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:23271:5: ( ( () ruleArrayBrackets ) )
+        // InternalUIGrammar.g:23271:6: ( () ruleArrayBrackets )
+        {
+        // InternalUIGrammar.g:23271:6: ( () ruleArrayBrackets )
+        // InternalUIGrammar.g:23272:6: () ruleArrayBrackets
+        {
+        // InternalUIGrammar.g:23272:6: ()
+        // InternalUIGrammar.g:23273:6: 
+        {
+        }
+
+        pushFollow(FOLLOW_2);
+        ruleArrayBrackets();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred51_InternalUIGrammar
+
+    // $ANTLR start synpred52_InternalUIGrammar
+    public final void synpred52_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:23468:5: ( '<' )
+        // InternalUIGrammar.g:23468:6: '<'
+        {
+        match(input,28,FOLLOW_2); if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred52_InternalUIGrammar
+
+    // $ANTLR start synpred53_InternalUIGrammar
+    public final void synpred53_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:23524:6: ( ( () '.' ) )
+        // InternalUIGrammar.g:23524:7: ( () '.' )
+        {
+        // InternalUIGrammar.g:23524:7: ( () '.' )
+        // InternalUIGrammar.g:23525:7: () '.'
+        {
+        // InternalUIGrammar.g:23525:7: ()
+        // InternalUIGrammar.g:23526:7: 
+        {
+        }
+
+        match(input,31,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred53_InternalUIGrammar
+
+    // $ANTLR start synpred54_InternalUIGrammar
+    public final void synpred54_InternalUIGrammar_fragment() throws RecognitionException {   
+        // InternalUIGrammar.g:23562:7: ( '<' )
+        // InternalUIGrammar.g:23562:8: '<'
+        {
+        match(input,28,FOLLOW_2); if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred54_InternalUIGrammar
+
+    // Delegated rules
+
+    public final boolean synpred28_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred28_InternalUIGrammar_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_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred15_InternalUIGrammar_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_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred50_InternalUIGrammar_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_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred7_InternalUIGrammar_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_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred18_InternalUIGrammar_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_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred25_InternalUIGrammar_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 synpred4_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred4_InternalUIGrammar_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 synpred53_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred53_InternalUIGrammar_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 synpred12_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred12_InternalUIGrammar_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_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred22_InternalUIGrammar_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_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred43_InternalUIGrammar_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_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred45_InternalUIGrammar_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_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred35_InternalUIGrammar_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_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred40_InternalUIGrammar_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_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred20_InternalUIGrammar_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_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred38_InternalUIGrammar_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_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred10_InternalUIGrammar_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_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred14_InternalUIGrammar_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_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred27_InternalUIGrammar_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_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred37_InternalUIGrammar_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_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred11_InternalUIGrammar_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_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred17_InternalUIGrammar_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_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred41_InternalUIGrammar_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 synpred3_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred3_InternalUIGrammar_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_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred9_InternalUIGrammar_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 synpred54_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred54_InternalUIGrammar_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 synpred34_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred34_InternalUIGrammar_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_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred24_InternalUIGrammar_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_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred51_InternalUIGrammar_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_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred44_InternalUIGrammar_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_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred21_InternalUIGrammar_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_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred31_InternalUIGrammar_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_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred47_InternalUIGrammar_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_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred19_InternalUIGrammar_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_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred52_InternalUIGrammar_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_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred2_InternalUIGrammar_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_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred13_InternalUIGrammar_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_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred42_InternalUIGrammar_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_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred23_InternalUIGrammar_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_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred33_InternalUIGrammar_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_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred39_InternalUIGrammar_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_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred16_InternalUIGrammar_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_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred26_InternalUIGrammar_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_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred8_InternalUIGrammar_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_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred29_InternalUIGrammar_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_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred46_InternalUIGrammar_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_InternalUIGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1_InternalUIGrammar_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 DFA398 dfa398 = new DFA398(this);
+    protected DFA401 dfa401 = new DFA401(this);
+    protected DFA407 dfa407 = new DFA407(this);
+    protected DFA410 dfa410 = new DFA410(this);
+    protected DFA412 dfa412 = new DFA412(this);
+    protected DFA422 dfa422 = new DFA422(this);
+    protected DFA425 dfa425 = new DFA425(this);
+    protected DFA441 dfa441 = new DFA441(this);
+    protected DFA440 dfa440 = new DFA440(this);
+    protected DFA442 dfa442 = new DFA442(this);
+    protected DFA444 dfa444 = new DFA444(this);
+    protected DFA453 dfa453 = new DFA453(this);
+    protected DFA460 dfa460 = new DFA460(this);
+    protected DFA459 dfa459 = new DFA459(this);
+    protected DFA482 dfa482 = new DFA482(this);
+    protected DFA481 dfa481 = new DFA481(this);
+    protected DFA483 dfa483 = new DFA483(this);
+    protected DFA487 dfa487 = new DFA487(this);
+    protected DFA490 dfa490 = new DFA490(this);
+    protected DFA489 dfa489 = new DFA489(this);
+    protected DFA491 dfa491 = new DFA491(this);
+    protected DFA494 dfa494 = new DFA494(this);
+    protected DFA512 dfa512 = new DFA512(this);
+    protected DFA510 dfa510 = new DFA510(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\16\1\uffff\1\4\1\uffff\1\16\1\uffff";
+    static final String dfa_4s = "\1\u009f\1\uffff\1\u009b\1\uffff\1\u009e\1\uffff\1\u009b\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\u0097\uffff\1\1\2\uffff\1\3",
+            "",
+            "\1\5\1\uffff\1\5\2\uffff\1\5\13\uffff\1\4\20\uffff\1\5\5\uffff\1\5\4\uffff\1\5\137\uffff\1\5",
+            "",
+            "\1\6\u0099\uffff\1\7",
+            "",
+            "\1\5\1\uffff\1\5\2\uffff\1\5\13\uffff\1\4\20\uffff\1\5\5\uffff\1\5\4\uffff\1\5\137\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 DFA398 extends DFA {
+
+        public DFA398(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 398;
+            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 "17238: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\u00d2\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\13\uffff\1\2\7\uffff\1\2\3\uffff\1\2\11\uffff\1\2\2\uffff\1\2\1\uffff\1\42\153\uffff\3\2\2\uffff\1\2\1\uffff\1\2\21\uffff\2\2\3\uffff\1\2\4\uffff\1\2\1\uffff\1\2\2\uffff\2\2\2\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 DFA401 extends DFA {
+
+        public DFA401(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 401;
+            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 "17455: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 LA401_1 = input.LA(1);
+
+                         
+                        int index401_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred4_InternalUIGrammar()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index401_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 401, _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\u00d2\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\13\uffff\1\2\7\uffff\1\2\3\uffff\1\2\11\uffff\1\2\2\uffff\1\2\155\uffff\3\2\2\uffff\1\2\1\uffff\1\1\21\uffff\2\2\3\uffff\1\2\4\uffff\1\2\1\uffff\1\2\2\uffff\2\2\2\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 DFA407 extends DFA {
+
+        public DFA407(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 407;
+            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 "17635: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 LA407_1 = input.LA(1);
+
+                         
+                        int index407_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred7_InternalUIGrammar()) ) {s = 34;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index407_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 407, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA410 extends DFA {
+
+        public DFA410(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 410;
+            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 "17777: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 LA410_1 = input.LA(1);
+
+                         
+                        int index410_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred8_InternalUIGrammar()) ) {s = 34;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index410_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 410, _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\u00d3\7\0\2\uffff";
+    static final String dfa_24s = "\10\uffff\1\2\1\1";
+    static final String dfa_25s = "\1\uffff\1\1\1\2\1\3\1\4\1\5\1\6\1\0\2\uffff}>";
+    static final String[] dfa_26s = {
+            "\5\10\6\uffff\2\10\1\uffff\1\1\1\uffff\2\10\2\uffff\1\10\3\uffff\1\6\1\10\1\7\3\10\1\uffff\1\10\6\uffff\1\10\2\uffff\1\10\1\uffff\1\10\66\uffff\1\10\64\uffff\4\10\3\uffff\1\10\1\2\1\3\1\4\1\5\26\10\1\uffff\26\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 DFA412 extends DFA {
+
+        public DFA412(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 412;
+            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 "18006: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 LA412_7 = input.LA(1);
+
+                         
+                        int index412_7 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred9_InternalUIGrammar()) ) {s = 9;}
+
+                        else if ( (true) ) {s = 8;}
+
+                         
+                        input.seek(index412_7);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA412_1 = input.LA(1);
+
+                         
+                        int index412_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred9_InternalUIGrammar()) ) {s = 9;}
+
+                        else if ( (true) ) {s = 8;}
+
+                         
+                        input.seek(index412_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA412_2 = input.LA(1);
+
+                         
+                        int index412_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred9_InternalUIGrammar()) ) {s = 9;}
+
+                        else if ( (true) ) {s = 8;}
+
+                         
+                        input.seek(index412_2);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA412_3 = input.LA(1);
+
+                         
+                        int index412_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred9_InternalUIGrammar()) ) {s = 9;}
+
+                        else if ( (true) ) {s = 8;}
+
+                         
+                        input.seek(index412_3);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA412_4 = input.LA(1);
+
+                         
+                        int index412_4 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred9_InternalUIGrammar()) ) {s = 9;}
+
+                        else if ( (true) ) {s = 8;}
+
+                         
+                        input.seek(index412_4);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA412_5 = input.LA(1);
+
+                         
+                        int index412_5 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred9_InternalUIGrammar()) ) {s = 9;}
+
+                        else if ( (true) ) {s = 8;}
+
+                         
+                        input.seek(index412_5);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA412_6 = input.LA(1);
+
+                         
+                        int index412_6 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred9_InternalUIGrammar()) ) {s = 9;}
+
+                        else if ( (true) ) {s = 8;}
+
+                         
+                        input.seek(index412_6);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 412, _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\u00d3\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\2\1\5\1\6\1\7\1\1\1\0\1\3\1\4\1\uffff}>";
+    static final String[] dfa_33s = {
+            "\5\1\6\uffff\2\1\1\uffff\1\1\1\uffff\2\1\2\uffff\1\1\3\uffff\1\2\1\1\1\3\3\1\1\uffff\1\6\6\uffff\1\1\2\uffff\1\1\1\uffff\1\1\66\uffff\1\1\64\uffff\4\1\3\uffff\15\1\1\4\1\5\1\7\1\10\1\11\11\1\1\uffff\26\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 DFA422 extends DFA {
+
+        public DFA422(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 422;
+            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 18720: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 LA422_7 = input.LA(1);
+
+                         
+                        int index422_7 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred15_InternalUIGrammar()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index422_7);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA422_6 = input.LA(1);
+
+                         
+                        int index422_6 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred15_InternalUIGrammar()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index422_6);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA422_2 = input.LA(1);
+
+                         
+                        int index422_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred15_InternalUIGrammar()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index422_2);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA422_8 = input.LA(1);
+
+                         
+                        int index422_8 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred15_InternalUIGrammar()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index422_8);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA422_9 = input.LA(1);
+
+                         
+                        int index422_9 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred15_InternalUIGrammar()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index422_9);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA422_3 = input.LA(1);
+
+                         
+                        int index422_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred15_InternalUIGrammar()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index422_3);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA422_4 = input.LA(1);
+
+                         
+                        int index422_4 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred15_InternalUIGrammar()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index422_4);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 7 : 
+                        int LA422_5 = input.LA(1);
+
+                         
+                        int index422_5 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred15_InternalUIGrammar()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index422_5);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 422, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_34s = "\1\34\2\uffff\1\36\7\uffff";
+    static final String dfa_35s = "\1\u00b3\2\uffff\1\43\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\uffff\1\3\4\uffff\1\4\u008b\uffff\1\1\1\2\1\5\1\7\1\10",
+            "",
+            "",
+            "\1\12\4\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 DFA425 extends DFA {
+
+        public DFA425(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 425;
+            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 "18796: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\u00d3\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\6\uffff\2\2\1\uffff\1\2\1\uffff\2\2\2\uffff\1\2\3\uffff\6\2\1\uffff\1\2\6\uffff\1\2\2\uffff\1\1\1\uffff\1\2\66\uffff\1\2\64\uffff\4\2\3\uffff\33\2\1\uffff\26\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 DFA441 extends DFA {
+
+        public DFA441(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 441;
+            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 "19697: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 LA441_1 = input.LA(1);
+
+                         
+                        int index441_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred24_InternalUIGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index441_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 441, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_46s = "\1\4\2\0\41\uffff";
+    static final String dfa_47s = "\1\u00d2\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\13\uffff\1\5\7\uffff\1\5\3\uffff\1\5\11\uffff\1\5\2\uffff\1\2\1\uffff\1\43\153\uffff\3\5\4\uffff\1\5\16\uffff\1\3\2\uffff\2\5\3\uffff\1\5\3\uffff\1\4\1\5\1\uffff\1\5\2\uffff\2\5\2\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 DFA440 extends DFA {
+
+        public DFA440(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 440;
+            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 "19716: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 LA440_0 = input.LA(1);
+
+                         
+                        int index440_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA440_0==RULE_ID) ) {s = 1;}
+
+                        else if ( (LA440_0==45) ) {s = 2;}
+
+                        else if ( (LA440_0==177) && (synpred25_InternalUIGrammar())) {s = 3;}
+
+                        else if ( (LA440_0==189) && (synpred25_InternalUIGrammar())) {s = 4;}
+
+                        else if ( ((LA440_0>=RULE_STRING && LA440_0<=RULE_DECIMAL)||LA440_0==20||LA440_0==28||LA440_0==32||LA440_0==42||(LA440_0>=155 && LA440_0<=157)||LA440_0==162||(LA440_0>=180 && LA440_0<=181)||LA440_0==185||LA440_0==190||LA440_0==192||(LA440_0>=195 && LA440_0<=196)||(LA440_0>=199 && LA440_0<=208)||LA440_0==210) ) {s = 5;}
+
+                        else if ( (LA440_0==47) ) {s = 35;}
+
+                         
+                        input.seek(index440_0);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA440_1 = input.LA(1);
+
+                         
+                        int index440_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred25_InternalUIGrammar()) ) {s = 4;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index440_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA440_2 = input.LA(1);
+
+                         
+                        int index440_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred25_InternalUIGrammar()) ) {s = 4;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index440_2);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 440, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String[] dfa_51s = {
+            "\5\2\6\uffff\2\2\1\uffff\1\2\1\uffff\2\2\2\uffff\1\2\3\uffff\4\2\1\1\1\2\1\uffff\1\2\6\uffff\1\2\2\uffff\1\2\1\uffff\1\2\66\uffff\1\2\64\uffff\4\2\3\uffff\33\2\1\uffff\26\2",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final short[][] dfa_51 = unpackEncodedStringArray(dfa_51s);
+
+    class DFA442 extends DFA {
+
+        public DFA442(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 442;
+            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 "19814: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 LA442_1 = input.LA(1);
+
+                         
+                        int index442_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred26_InternalUIGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index442_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 442, _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\u00d2\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\13\uffff\1\2\7\uffff\1\5\3\uffff\1\14\11\uffff\1\27\2\uffff\1\35\155\uffff\3\5\4\uffff\1\14\33\uffff\1\26\1\uffff\1\3\2\uffff\1\30\1\31\2\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 DFA444 extends DFA {
+
+        public DFA444(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 444;
+            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 "19859: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 LA444_0 = input.LA(1);
+
+                         
+                        int index444_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA444_0==201) ) {s = 1;}
+
+                        else if ( (LA444_0==20) ) {s = 2;}
+
+                        else if ( (LA444_0==192) ) {s = 3;}
+
+                        else if ( (LA444_0==210) && (synpred27_InternalUIGrammar())) {s = 4;}
+
+                        else if ( (LA444_0==RULE_ID||LA444_0==28||(LA444_0>=155 && LA444_0<=157)||(LA444_0>=199 && LA444_0<=200)) ) {s = 5;}
+
+                        else if ( ((LA444_0>=RULE_STRING && LA444_0<=RULE_DECIMAL)||LA444_0==32||LA444_0==162||(LA444_0>=202 && LA444_0<=205)) ) {s = 12;}
+
+                        else if ( (LA444_0==190) ) {s = 22;}
+
+                        else if ( (LA444_0==42) ) {s = 23;}
+
+                        else if ( (LA444_0==195) ) {s = 24;}
+
+                        else if ( (LA444_0==196) ) {s = 25;}
+
+                        else if ( (LA444_0==206) ) {s = 26;}
+
+                        else if ( (LA444_0==207) ) {s = 27;}
+
+                        else if ( (LA444_0==208) ) {s = 28;}
+
+                        else if ( (LA444_0==45) ) {s = 29;}
+
+                         
+                        input.seek(index444_0);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA444_23 = input.LA(1);
+
+                         
+                        int index444_23 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred28_InternalUIGrammar()) ) {s = 30;}
+
+                        else if ( (true) ) {s = 31;}
+
+                         
+                        input.seek(index444_23);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 444, _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\u00d2\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\13\uffff\1\5\7\uffff\1\5\3\uffff\2\5\10\uffff\1\5\2\uffff\1\2\155\uffff\3\5\4\uffff\1\5\16\uffff\1\3\2\uffff\2\5\3\uffff\1\5\3\uffff\1\4\1\5\1\uffff\1\5\2\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 DFA453 extends DFA {
+
+        public DFA453(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 453;
+            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 "20351: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 LA453_0 = input.LA(1);
+
+                         
+                        int index453_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA453_0==RULE_ID) ) {s = 1;}
+
+                        else if ( (LA453_0==45) ) {s = 2;}
+
+                        else if ( (LA453_0==177) && (synpred31_InternalUIGrammar())) {s = 3;}
+
+                        else if ( (LA453_0==189) && (synpred31_InternalUIGrammar())) {s = 4;}
+
+                        else if ( ((LA453_0>=RULE_STRING && LA453_0<=RULE_DECIMAL)||LA453_0==20||LA453_0==28||(LA453_0>=32 && LA453_0<=33)||LA453_0==42||(LA453_0>=155 && LA453_0<=157)||LA453_0==162||(LA453_0>=180 && LA453_0<=181)||LA453_0==185||LA453_0==190||LA453_0==192||(LA453_0>=195 && LA453_0<=208)||LA453_0==210) ) {s = 5;}
+
+                         
+                        input.seek(index453_0);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA453_1 = input.LA(1);
+
+                         
+                        int index453_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred31_InternalUIGrammar()) ) {s = 4;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index453_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA453_2 = input.LA(1);
+
+                         
+                        int index453_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred31_InternalUIGrammar()) ) {s = 4;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index453_2);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 453, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String[] dfa_64s = {
+            "\5\2\13\uffff\1\2\7\uffff\1\2\3\uffff\1\2\11\uffff\1\2\2\uffff\1\1\155\uffff\3\2\4\uffff\1\2\16\uffff\1\2\2\uffff\2\2\3\uffff\1\2\4\uffff\1\2\1\uffff\1\2\2\uffff\2\2\2\uffff\12\2\1\uffff\1\2",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final short[][] dfa_64 = unpackEncodedStringArray(dfa_64s);
+
+    class DFA460 extends DFA {
+
+        public DFA460(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 460;
+            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 "20817: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 LA460_1 = input.LA(1);
+
+                         
+                        int index460_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred34_InternalUIGrammar()) ) {s = 34;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index460_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 460, _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\u00d2\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\13\uffff\1\4\7\uffff\1\4\3\uffff\1\4\11\uffff\1\4\2\uffff\1\2\155\uffff\3\4\4\uffff\1\4\16\uffff\1\3\2\uffff\2\4\3\uffff\1\4\4\uffff\1\4\1\uffff\1\4\2\uffff\2\4\2\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 DFA459 extends DFA {
+
+        public DFA459(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 459;
+            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 "20886: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 LA459_0 = input.LA(1);
+
+                         
+                        int index459_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA459_0==RULE_ID) ) {s = 1;}
+
+                        else if ( (LA459_0==45) ) {s = 2;}
+
+                        else if ( (LA459_0==177) && (synpred35_InternalUIGrammar())) {s = 3;}
+
+                        else if ( ((LA459_0>=RULE_STRING && LA459_0<=RULE_DECIMAL)||LA459_0==20||LA459_0==28||LA459_0==32||LA459_0==42||(LA459_0>=155 && LA459_0<=157)||LA459_0==162||(LA459_0>=180 && LA459_0<=181)||LA459_0==185||LA459_0==190||LA459_0==192||(LA459_0>=195 && LA459_0<=196)||(LA459_0>=199 && LA459_0<=208)||LA459_0==210) ) {s = 4;}
+
+                         
+                        input.seek(index459_0);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA459_1 = input.LA(1);
+
+                         
+                        int index459_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred35_InternalUIGrammar()) ) {s = 3;}
+
+                        else if ( (true) ) {s = 4;}
+
+                         
+                        input.seek(index459_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA459_2 = input.LA(1);
+
+                         
+                        int index459_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred35_InternalUIGrammar()) ) {s = 3;}
+
+                        else if ( (true) ) {s = 4;}
+
+                         
+                        input.seek(index459_2);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 459, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA482 extends DFA {
+
+        public DFA482(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 482;
+            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 "22015: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 LA482_1 = input.LA(1);
+
+                         
+                        int index482_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred38_InternalUIGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index482_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 482, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA481 extends DFA {
+
+        public DFA481(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 481;
+            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 "22034: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 LA481_0 = input.LA(1);
+
+                         
+                        int index481_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA481_0==RULE_ID) ) {s = 1;}
+
+                        else if ( (LA481_0==45) ) {s = 2;}
+
+                        else if ( (LA481_0==177) && (synpred39_InternalUIGrammar())) {s = 3;}
+
+                        else if ( (LA481_0==189) && (synpred39_InternalUIGrammar())) {s = 4;}
+
+                        else if ( ((LA481_0>=RULE_STRING && LA481_0<=RULE_DECIMAL)||LA481_0==20||LA481_0==28||LA481_0==32||LA481_0==42||(LA481_0>=155 && LA481_0<=157)||LA481_0==162||(LA481_0>=180 && LA481_0<=181)||LA481_0==185||LA481_0==190||LA481_0==192||(LA481_0>=195 && LA481_0<=196)||(LA481_0>=199 && LA481_0<=208)||LA481_0==210) ) {s = 5;}
+
+                        else if ( (LA481_0==47) ) {s = 35;}
+
+                         
+                        input.seek(index481_0);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA481_1 = input.LA(1);
+
+                         
+                        int index481_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred39_InternalUIGrammar()) ) {s = 4;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index481_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA481_2 = input.LA(1);
+
+                         
+                        int index481_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred39_InternalUIGrammar()) ) {s = 4;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index481_2);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 481, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA483 extends DFA {
+
+        public DFA483(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 483;
+            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 "22132: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 LA483_1 = input.LA(1);
+
+                         
+                        int index483_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred40_InternalUIGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index483_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 483, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String[] dfa_71s = {
+            "\5\2\6\uffff\2\2\1\uffff\1\2\1\uffff\2\2\2\uffff\1\2\3\uffff\1\1\5\2\1\uffff\1\2\6\uffff\1\2\2\uffff\1\2\1\uffff\1\2\66\uffff\1\2\64\uffff\4\2\3\uffff\33\2\1\uffff\26\2",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final short[][] dfa_71 = unpackEncodedStringArray(dfa_71s);
+
+    class DFA487 extends DFA {
+
+        public DFA487(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 487;
+            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 "22291: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 LA487_1 = input.LA(1);
+
+                         
+                        int index487_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred41_InternalUIGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index487_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 487, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA490 extends DFA {
+
+        public DFA490(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 490;
+            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 "22348: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 LA490_1 = input.LA(1);
+
+                         
+                        int index490_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred42_InternalUIGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index490_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 490, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA489 extends DFA {
+
+        public DFA489(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 489;
+            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 "22367: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 LA489_0 = input.LA(1);
+
+                         
+                        int index489_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA489_0==RULE_ID) ) {s = 1;}
+
+                        else if ( (LA489_0==45) ) {s = 2;}
+
+                        else if ( (LA489_0==177) && (synpred43_InternalUIGrammar())) {s = 3;}
+
+                        else if ( (LA489_0==189) && (synpred43_InternalUIGrammar())) {s = 4;}
+
+                        else if ( ((LA489_0>=RULE_STRING && LA489_0<=RULE_DECIMAL)||LA489_0==20||LA489_0==28||LA489_0==32||LA489_0==42||(LA489_0>=155 && LA489_0<=157)||LA489_0==162||(LA489_0>=180 && LA489_0<=181)||LA489_0==185||LA489_0==190||LA489_0==192||(LA489_0>=195 && LA489_0<=196)||(LA489_0>=199 && LA489_0<=208)||LA489_0==210) ) {s = 5;}
+
+                        else if ( (LA489_0==47) ) {s = 35;}
+
+                         
+                        input.seek(index489_0);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA489_1 = input.LA(1);
+
+                         
+                        int index489_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred43_InternalUIGrammar()) ) {s = 4;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index489_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA489_2 = input.LA(1);
+
+                         
+                        int index489_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred43_InternalUIGrammar()) ) {s = 4;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index489_2);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 489, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA491 extends DFA {
+
+        public DFA491(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 491;
+            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 "22465: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 LA491_1 = input.LA(1);
+
+                         
+                        int index491_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred44_InternalUIGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index491_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 491, _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\u00d3\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\6\uffff\2\41\1\uffff\1\41\1\uffff\1\12\1\41\2\uffff\1\41\3\uffff\1\15\3\41\1\20\1\41\1\uffff\1\41\6\uffff\1\32\2\uffff\1\40\1\uffff\1\41\66\uffff\1\41\64\uffff\1\4\1\3\1\5\1\41\3\uffff\1\17\21\41\1\10\1\7\3\41\1\6\3\41\1\uffff\1\31\1\41\1\13\2\41\1\33\1\34\2\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 DFA494 extends DFA {
+
+        public DFA494(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 494;
+            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 "22808: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 LA494_1 = input.LA(1);
+
+                         
+                        int index494_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred45_InternalUIGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index494_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA494_2 = input.LA(1);
+
+                         
+                        int index494_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred45_InternalUIGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index494_2);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA494_3 = input.LA(1);
+
+                         
+                        int index494_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred45_InternalUIGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index494_3);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA494_4 = input.LA(1);
+
+                         
+                        int index494_4 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred45_InternalUIGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index494_4);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA494_5 = input.LA(1);
+
+                         
+                        int index494_5 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred45_InternalUIGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index494_5);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA494_6 = input.LA(1);
+
+                         
+                        int index494_6 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred45_InternalUIGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index494_6);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA494_7 = input.LA(1);
+
+                         
+                        int index494_7 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred45_InternalUIGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index494_7);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 7 : 
+                        int LA494_8 = input.LA(1);
+
+                         
+                        int index494_8 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred45_InternalUIGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index494_8);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 8 : 
+                        int LA494_9 = input.LA(1);
+
+                         
+                        int index494_9 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred45_InternalUIGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index494_9);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 9 : 
+                        int LA494_10 = input.LA(1);
+
+                         
+                        int index494_10 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred45_InternalUIGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index494_10);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 10 : 
+                        int LA494_11 = input.LA(1);
+
+                         
+                        int index494_11 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred45_InternalUIGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index494_11);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 11 : 
+                        int LA494_12 = input.LA(1);
+
+                         
+                        int index494_12 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred45_InternalUIGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index494_12);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 12 : 
+                        int LA494_13 = input.LA(1);
+
+                         
+                        int index494_13 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred45_InternalUIGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index494_13);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 13 : 
+                        int LA494_14 = input.LA(1);
+
+                         
+                        int index494_14 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred45_InternalUIGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index494_14);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 14 : 
+                        int LA494_15 = input.LA(1);
+
+                         
+                        int index494_15 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred45_InternalUIGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index494_15);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 15 : 
+                        int LA494_16 = input.LA(1);
+
+                         
+                        int index494_16 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred45_InternalUIGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index494_16);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 16 : 
+                        int LA494_17 = input.LA(1);
+
+                         
+                        int index494_17 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred45_InternalUIGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index494_17);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 17 : 
+                        int LA494_18 = input.LA(1);
+
+                         
+                        int index494_18 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred45_InternalUIGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index494_18);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 18 : 
+                        int LA494_19 = input.LA(1);
+
+                         
+                        int index494_19 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred45_InternalUIGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index494_19);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 19 : 
+                        int LA494_20 = input.LA(1);
+
+                         
+                        int index494_20 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred45_InternalUIGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index494_20);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 20 : 
+                        int LA494_21 = input.LA(1);
+
+                         
+                        int index494_21 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred45_InternalUIGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index494_21);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 21 : 
+                        int LA494_22 = input.LA(1);
+
+                         
+                        int index494_22 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred45_InternalUIGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index494_22);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 22 : 
+                        int LA494_23 = input.LA(1);
+
+                         
+                        int index494_23 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred45_InternalUIGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index494_23);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 23 : 
+                        int LA494_24 = input.LA(1);
+
+                         
+                        int index494_24 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred45_InternalUIGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index494_24);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 24 : 
+                        int LA494_25 = input.LA(1);
+
+                         
+                        int index494_25 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred45_InternalUIGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index494_25);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 25 : 
+                        int LA494_26 = input.LA(1);
+
+                         
+                        int index494_26 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred45_InternalUIGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index494_26);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 26 : 
+                        int LA494_27 = input.LA(1);
+
+                         
+                        int index494_27 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred45_InternalUIGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index494_27);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 27 : 
+                        int LA494_28 = input.LA(1);
+
+                         
+                        int index494_28 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred45_InternalUIGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index494_28);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 28 : 
+                        int LA494_29 = input.LA(1);
+
+                         
+                        int index494_29 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred45_InternalUIGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index494_29);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 29 : 
+                        int LA494_30 = input.LA(1);
+
+                         
+                        int index494_30 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred45_InternalUIGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index494_30);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 30 : 
+                        int LA494_31 = input.LA(1);
+
+                         
+                        int index494_31 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred45_InternalUIGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index494_31);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 31 : 
+                        int LA494_32 = input.LA(1);
+
+                         
+                        int index494_32 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred45_InternalUIGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index494_32);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 494, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_78s = "\u009a\uffff";
+    static final String dfa_79s = "\1\2\u0099\uffff";
+    static final String dfa_80s = "\1\4\1\0\u0098\uffff";
+    static final String dfa_81s = "\1\u00d5\1\0\u0098\uffff";
+    static final String dfa_82s = "\2\uffff\1\2\u0096\uffff\1\1";
+    static final String dfa_83s = "\1\uffff\1\0\u0098\uffff}>";
+    static final String[] dfa_84s = {
+            "\5\2\6\uffff\2\2\1\uffff\1\2\1\uffff\7\2\1\uffff\1\1\5\2\1\uffff\1\2\6\uffff\2\2\1\uffff\1\2\1\uffff\1\2\1\uffff\4\2\11\uffff\1\2\2\uffff\15\2\1\uffff\2\2\3\uffff\2\2\2\uffff\4\2\3\uffff\2\2\1\uffff\3\2\1\uffff\1\2\2\uffff\1\2\1\uffff\20\2\1\uffff\7\2\1\uffff\3\2\3\uffff\4\2\3\uffff\7\2\1\uffff\1\2\1\uffff\4\2\3\uffff\33\2\1\uffff\26\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 DFA512 extends DFA {
+
+        public DFA512(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 512;
+            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 "23466: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 LA512_1 = input.LA(1);
+
+                         
+                        int index512_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred52_InternalUIGrammar()) ) {s = 153;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index512_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 512, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA510 extends DFA {
+
+        public DFA510(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 510;
+            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 "23560: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 LA510_1 = input.LA(1);
+
+                         
+                        int index510_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred54_InternalUIGrammar()) ) {s = 153;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index510_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 510, _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[]{0x0000000000000010L});
+    public static final BitSet FOLLOW_4 = new BitSet(new long[]{0x0841000000084002L,0x0000000000000000L,0x0000000008000000L});
+    public static final BitSet FOLLOW_5 = new BitSet(new long[]{0x0841000000084002L});
+    public static final BitSet FOLLOW_6 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000F80000L});
+    public static final BitSet FOLLOW_7 = new BitSet(new long[]{0x0000000000008000L});
+    public static final BitSet FOLLOW_8 = new BitSet(new long[]{0x0000000000010002L});
+    public static final BitSet FOLLOW_9 = new BitSet(new long[]{0x0000000000040000L});
+    public static final BitSet FOLLOW_10 = new BitSet(new long[]{0x0000000000000010L,0x0000000000000000L,0x0000000000F80000L});
+    public static final BitSet FOLLOW_11 = new BitSet(new long[]{0x0000000000100000L});
+    public static final BitSet FOLLOW_12 = new BitSet(new long[]{0x0000000000E00000L});
+    public static final BitSet FOLLOW_13 = new BitSet(new long[]{0x0000000000600000L});
+    public static final BitSet FOLLOW_14 = new BitSet(new long[]{0x000013F100000010L});
+    public static final BitSet FOLLOW_15 = new BitSet(new long[]{0x0000000001000000L});
+    public static final BitSet FOLLOW_16 = new BitSet(new long[]{0x0000200000000010L,0x0000000000000000L,0x0002000000000000L});
+    public static final BitSet FOLLOW_17 = new BitSet(new long[]{0x0000000002010002L});
+    public static final BitSet FOLLOW_18 = new BitSet(new long[]{0x0000000000000020L});
+    public static final BitSet FOLLOW_19 = new BitSet(new long[]{0x000013F108000010L});
+    public static final BitSet FOLLOW_20 = new BitSet(new long[]{0x0000000030000000L});
+    public static final BitSet FOLLOW_21 = new BitSet(new long[]{0x0000000020000000L});
+    public static final BitSet FOLLOW_22 = new BitSet(new long[]{0x000013F140000010L});
+    public static final BitSet FOLLOW_23 = new BitSet(new long[]{0x0000000080000002L});
+    public static final BitSet FOLLOW_24 = new BitSet(new long[]{0x0000000A80000000L});
+    public static final BitSet FOLLOW_25 = new BitSet(new long[]{0x0000000200000000L});
+    public static final BitSet FOLLOW_26 = new BitSet(new long[]{0x0000000080000000L});
+    public static final BitSet FOLLOW_27 = new BitSet(new long[]{0x0000000100000000L});
+    public static final BitSet FOLLOW_28 = new BitSet(new long[]{0x0000000880000002L});
+    public static final BitSet FOLLOW_29 = new BitSet(new long[]{0x0000000000000000L,0x0000000002000000L});
+    public static final BitSet FOLLOW_30 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_31 = new BitSet(new long[]{0x0000000000000000L,0x0000000000800000L});
+    public static final BitSet FOLLOW_32 = new BitSet(new long[]{0x00000C0000000000L});
+    public static final BitSet FOLLOW_33 = new BitSet(new long[]{0x0000080000000000L});
+    public static final BitSet FOLLOW_34 = new BitSet(new long[]{0x0000200000000000L});
+    public static final BitSet FOLLOW_35 = new BitSet(new long[]{0x0000400000000020L});
+    public static final BitSet FOLLOW_36 = new BitSet(new long[]{0x0000800000000000L});
+    public static final BitSet FOLLOW_37 = new BitSet(new long[]{0x401E000004C00000L,0x17E10A1D8811844CL,0x0000000000060C63L});
+    public static final BitSet FOLLOW_38 = new BitSet(new long[]{0x401E000004C10000L,0x17E10A1D8811844CL,0x0000000000060C63L});
+    public static final BitSet FOLLOW_39 = new BitSet(new long[]{0x0000000000200010L});
+    public static final BitSet FOLLOW_40 = new BitSet(new long[]{0x0020000004E20000L,0x0000000000000000L,0x0000000002000000L});
+    public static final BitSet FOLLOW_41 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0003FFFC02000000L});
+    public static final BitSet FOLLOW_42 = new BitSet(new long[]{0x0000000004E20000L,0x0000000000000000L,0x0000000002000000L});
+    public static final BitSet FOLLOW_43 = new BitSet(new long[]{0x0008000000000000L});
+    public static final BitSet FOLLOW_44 = new BitSet(new long[]{0x0180000000000000L});
+    public static final BitSet FOLLOW_45 = new BitSet(new long[]{0x0100000000000000L});
+    public static final BitSet FOLLOW_46 = new BitSet(new long[]{0x0000000000000030L});
+    public static final BitSet FOLLOW_47 = new BitSet(new long[]{0x0600000000010002L});
+    public static final BitSet FOLLOW_48 = new BitSet(new long[]{0x0400000000010002L});
+    public static final BitSet FOLLOW_49 = new BitSet(new long[]{0x000A000000C00000L,0x17E00A1D8A0033B0L,0x0000000000020477L});
+    public static final BitSet FOLLOW_50 = new BitSet(new long[]{0x000A000000C10000L,0x17E00A1D8A0033B0L,0x0000000000020477L});
+    public static final BitSet FOLLOW_51 = new BitSet(new long[]{0x2000000000000020L});
+    public static final BitSet FOLLOW_52 = new BitSet(new long[]{0x0000200000100010L});
+    public static final BitSet FOLLOW_53 = new BitSet(new long[]{0x9000800000000000L,0x0000000000000003L});
+    public static final BitSet FOLLOW_54 = new BitSet(new long[]{0x0000000000000040L});
+    public static final BitSet FOLLOW_55 = new BitSet(new long[]{0x0000000000100010L});
+    public static final BitSet FOLLOW_56 = new BitSet(new long[]{0x401E000004E20000L,0x17E10A1D8811844CL,0x0000000002060C63L});
+    public static final BitSet FOLLOW_57 = new BitSet(new long[]{0x0020000000000002L});
+    public static final BitSet FOLLOW_58 = new BitSet(new long[]{0x0000A00000100010L,0x0000000000000003L});
+    public static final BitSet FOLLOW_59 = new BitSet(new long[]{0x1000A00000100010L,0x0000000000000003L});
+    public static final BitSet FOLLOW_60 = new BitSet(new long[]{0x000A000004E20000L,0x17E00A1D8A0033B0L,0x0000000002020477L});
+    public static final BitSet FOLLOW_61 = new BitSet(new long[]{0x0000000000200000L});
+    public static final BitSet FOLLOW_62 = new BitSet(new long[]{0x1000800000000000L,0x0000000000000003L});
+    public static final BitSet FOLLOW_63 = new BitSet(new long[]{0x1000800000000000L,0x0000000000000001L});
+    public static final BitSet FOLLOW_64 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000800L});
+    public static final BitSet FOLLOW_65 = new BitSet(new long[]{0x0000000004E30000L,0x0020000000000000L,0x0000000002000000L});
+    public static final BitSet FOLLOW_66 = new BitSet(new long[]{0x0000000004E20000L,0x0020000000000000L,0x0000000002000000L});
+    public static final BitSet FOLLOW_67 = new BitSet(new long[]{0x0000000004E20000L,0x0000000000004000L,0x0000000002000000L});
+    public static final BitSet FOLLOW_68 = new BitSet(new long[]{0x000A000000C00010L,0x17E00A1D8A0033B0L,0x0000000000020477L});
+    public static final BitSet FOLLOW_69 = new BitSet(new long[]{0x401E000004C00010L,0x17E10A1D8811844CL,0x0000000000060C63L});
+    public static final BitSet FOLLOW_70 = new BitSet(new long[]{0x0000A00000000010L,0x0000000000000001L});
+    public static final BitSet FOLLOW_71 = new BitSet(new long[]{0x1000A00000000010L,0x0000000000000001L});
+    public static final BitSet FOLLOW_72 = new BitSet(new long[]{0x0000000000000000L,0x00000000000E0002L});
+    public static final BitSet FOLLOW_73 = new BitSet(new long[]{0x0000000004E20000L,0x00000000000E0002L,0x0000000002000000L});
+    public static final BitSet FOLLOW_74 = new BitSet(new long[]{0x0000200000000010L});
+    public static final BitSet FOLLOW_75 = new BitSet(new long[]{0x0000000000000000L,0x0000000000200000L});
+    public static final BitSet FOLLOW_76 = new BitSet(new long[]{0x401E000004E20000L,0x17E10A1D88118C4CL,0x0000000002060C63L});
+    public static final BitSet FOLLOW_77 = new BitSet(new long[]{0x401E000004E30000L,0x17E10A1D8811844CL,0x0000000002060C63L});
+    public static final BitSet FOLLOW_78 = new BitSet(new long[]{0x0000000004E30000L,0x0000000000000000L,0x0000000002000000L});
+    public static final BitSet FOLLOW_79 = new BitSet(new long[]{0x0000000004E20000L,0x0000000001200800L,0x0000000002000000L});
+    public static final BitSet FOLLOW_80 = new BitSet(new long[]{0x0000000004E20000L,0x0000000001200000L,0x0000000002000000L});
+    public static final BitSet FOLLOW_81 = new BitSet(new long[]{0x0000000000200000L,0x0020000000000000L});
+    public static final BitSet FOLLOW_82 = new BitSet(new long[]{0x0000000004E20000L,0x0000000000200000L,0x0000000002000000L});
+    public static final BitSet FOLLOW_83 = new BitSet(new long[]{0x000A000004E20000L,0x17E00A1D8E003BB0L,0x0000000002020477L});
+    public static final BitSet FOLLOW_84 = new BitSet(new long[]{0x000A000004E30000L,0x17E00A1D8E0033B0L,0x0000000002020477L});
+    public static final BitSet FOLLOW_85 = new BitSet(new long[]{0x000A000004E20000L,0x17E00A1D8E0033B0L,0x0000000002020477L});
+    public static final BitSet FOLLOW_86 = new BitSet(new long[]{0x0000200000100012L});
+    public static final BitSet FOLLOW_87 = new BitSet(new long[]{0x1000800000000000L,0x0000000070000003L});
+    public static final BitSet FOLLOW_88 = new BitSet(new long[]{0x0000000000100012L});
+    public static final BitSet FOLLOW_89 = new BitSet(new long[]{0x0000000000100002L});
+    public static final BitSet FOLLOW_90 = new BitSet(new long[]{0x0000000004E20000L,0x0000000000000000L,0x0000000002F80000L});
+    public static final BitSet FOLLOW_91 = new BitSet(new long[]{0x1000800000000000L,0x0000000200000003L});
+    public static final BitSet FOLLOW_92 = new BitSet(new long[]{0x1000800000000000L,0x0000002200000003L});
+    public static final BitSet FOLLOW_93 = new BitSet(new long[]{0x0000000000000000L,0x0000008000000000L});
+    public static final BitSet FOLLOW_94 = new BitSet(new long[]{0x0000800000000000L,0x0000004000000000L});
+    public static final BitSet FOLLOW_95 = new BitSet(new long[]{0x0000000000000000L,0x0000010000000000L});
+    public static final BitSet FOLLOW_96 = new BitSet(new long[]{0x1000800000000000L,0x0000040000000003L});
+    public static final BitSet FOLLOW_97 = new BitSet(new long[]{0x0000000004E20000L,0x0000F00000000802L,0x0000000002F80000L});
+    public static final BitSet FOLLOW_98 = new BitSet(new long[]{0x0000000004E30000L,0x0000F00000000802L,0x0000000002F80000L});
+    public static final BitSet FOLLOW_99 = new BitSet(new long[]{0x0000000004E20000L,0x001E100000000800L,0x0000000002F80000L});
+    public static final BitSet FOLLOW_100 = new BitSet(new long[]{0x0000000004E30000L,0x001E100000000800L,0x0000000002F80000L});
+    public static final BitSet FOLLOW_101 = new BitSet(new long[]{0x1000800000000000L,0x0000000000040003L,0x0000000000000000L,0x000000007FC00000L});
+    public static final BitSet FOLLOW_102 = new BitSet(new long[]{0x0000000004E20000L,0x0800000000000000L,0x0000000002000000L});
+    public static final BitSet FOLLOW_103 = new BitSet(new long[]{0x0000000004E20000L,0xE008000000000802L,0x0000000002F83000L});
+    public static final BitSet FOLLOW_104 = new BitSet(new long[]{0x0000000004E30000L,0xE008000000000802L,0x0000000002F83000L});
+    public static final BitSet FOLLOW_105 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000380000000L});
+    public static final BitSet FOLLOW_106 = new BitSet(new long[]{0x0000000004E20000L,0x0000000000000000L,0x0000000002F82000L});
+    public static final BitSet FOLLOW_107 = new BitSet(new long[]{0x0000000004E20000L,0x400C100000000802L,0x0000000002F80000L});
+    public static final BitSet FOLLOW_108 = new BitSet(new long[]{0x0000000004E30000L,0x400C100000000802L,0x0000000002F80000L});
+    public static final BitSet FOLLOW_109 = new BitSet(new long[]{0x0000200000000012L});
+    public static final BitSet FOLLOW_110 = new BitSet(new long[]{0x0000000000000012L});
+    public static final BitSet FOLLOW_111 = new BitSet(new long[]{0x0000200000000010L,0x0000000002000000L,0x0000000000000008L});
+    public static final BitSet FOLLOW_112 = new BitSet(new long[]{0x0000000000000010L,0x0000000002000000L,0x0000000000000008L});
+    public static final BitSet FOLLOW_113 = new BitSet(new long[]{0x0000000000000000L,0x0000000002000000L,0x0000000000000008L});
+    public static final BitSet FOLLOW_114 = new BitSet(new long[]{0x0000000004E00000L,0x0000000000000000L,0x0000000000F80000L});
+    public static final BitSet FOLLOW_115 = new BitSet(new long[]{0x0000000004E00000L});
+    public static final BitSet FOLLOW_116 = new BitSet(new long[]{0x1000800000000000L,0x0000000000000003L,0x0000000000000380L});
+    public static final BitSet FOLLOW_117 = new BitSet(new long[]{0x0000000004E20000L,0x600C100000000802L,0x0000000002F80000L});
+    public static final BitSet FOLLOW_118 = new BitSet(new long[]{0x0000000004E30000L,0x600C100000000802L,0x0000000002F80000L});
+    public static final BitSet FOLLOW_119 = new BitSet(new long[]{0x0000000000200000L,0x0000000000000000L,0x0000000000004000L});
+    public static final BitSet FOLLOW_120 = new BitSet(new long[]{0x0000000000010002L,0x0000000000000000L,0x0000000000018000L});
+    public static final BitSet FOLLOW_121 = new BitSet(new long[]{0x0080000000010002L});
+    public static final BitSet FOLLOW_122 = new BitSet(new long[]{0x1000800000000000L,0x0000000000000003L,0x0000000000000180L});
+    public static final BitSet FOLLOW_123 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000001000000L});
+    public static final BitSet FOLLOW_124 = new BitSet(new long[]{0x0000000000100002L,0x0000000000000000L,0x0000000001000000L});
+    public static final BitSet FOLLOW_125 = new BitSet(new long[]{0x0000000000000022L});
+    public static final BitSet FOLLOW_126 = new BitSet(new long[]{0x0000000400700000L,0x0000000000000000L,0x0000000004000000L});
+    public static final BitSet FOLLOW_127 = new BitSet(new long[]{0x0000000000000010L,0x0000000000000000L,0x0000000090000000L});
+    public static final BitSet FOLLOW_128 = new BitSet(new long[]{0x0000000000000010L,0x0000000000000000L,0x0000000020000000L});
+    public static final BitSet FOLLOW_129 = new BitSet(new long[]{0x0000000000000010L,0x0000000000000000L,0x0000000040000000L});
+    public static final BitSet FOLLOW_130 = new BitSet(new long[]{0x0000200000000002L});
+    public static final BitSet FOLLOW_131 = new BitSet(new long[]{0x0000A401101001F0L,0x0000000000000000L,0x4230000538000000L,0x000000000005FF99L});
+    public static final BitSet FOLLOW_132 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000200000000L});
+    public static final BitSet FOLLOW_133 = new BitSet(new long[]{0x00002401101001F0L,0x0000000000000000L,0x4230000538000000L,0x000000000005FF99L});
+    public static final BitSet FOLLOW_134 = new BitSet(new long[]{0x00002403101001F0L,0x0000000000000000L,0x4230000538000000L,0x000000000005FF99L});
+    public static final BitSet FOLLOW_135 = new BitSet(new long[]{0x0000000200000000L,0x0000004000000000L});
+    public static final BitSet FOLLOW_136 = new BitSet(new long[]{0x0000000000000002L,0x0000004000000000L});
+    public static final BitSet FOLLOW_137 = new BitSet(new long[]{0x0000000050040002L,0x0000000000000000L,0x0000007800000000L});
+    public static final BitSet FOLLOW_138 = new BitSet(new long[]{0x0000000010000000L});
+    public static final BitSet FOLLOW_139 = new BitSet(new long[]{0x0000000040000000L,0x0000000000000000L,0x0000008000000000L});
+    public static final BitSet FOLLOW_140 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000008000000000L});
+    public static final BitSet FOLLOW_141 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000010000000000L});
+    public static final BitSet FOLLOW_142 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000020000000000L});
+    public static final BitSet FOLLOW_143 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x00003C0000000000L});
+    public static final BitSet FOLLOW_144 = new BitSet(new long[]{0x0000000050000002L,0x0000000000000000L,0x0000408000000000L});
+    public static final BitSet FOLLOW_145 = new BitSet(new long[]{0x0000000850000002L,0x0000000000000000L,0x000F800000000000L});
+    public static final BitSet FOLLOW_146 = new BitSet(new long[]{0x0000000800000000L});
+    public static final BitSet FOLLOW_147 = new BitSet(new long[]{0x0000000040000000L});
+    public static final BitSet FOLLOW_148 = new BitSet(new long[]{0x0000000010000000L,0x0000000000000000L,0x0002000000000000L});
+    public static final BitSet FOLLOW_149 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0030000000000000L});
+    public static final BitSet FOLLOW_150 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x01C0000040000000L});
+    public static final BitSet FOLLOW_151 = new BitSet(new long[]{0x0000000000008002L});
+    public static final BitSet FOLLOW_152 = new BitSet(new long[]{0x0000000020000002L,0x0000000000000000L,0x0400000000000000L});
+    public static final BitSet FOLLOW_153 = new BitSet(new long[]{0x0000000080000002L,0x0000000000000000L,0x1800000000000000L});
+    public static final BitSet FOLLOW_154 = new BitSet(new long[]{0x0000000000000010L,0x0000000000000000L,0x0000000038000000L,0x0000000000000080L});
+    public static final BitSet FOLLOW_155 = new BitSet(new long[]{0x0000000010000010L,0x0000000000000000L,0x0000000038000000L,0x0000000000000180L});
+    public static final BitSet FOLLOW_156 = new BitSet(new long[]{0x0000200000000010L,0x0000000000000000L,0x0002000000000000L,0x0000000000100000L});
+    public static final BitSet FOLLOW_157 = new BitSet(new long[]{0x0000000040000000L,0x0000004000000000L});
+    public static final BitSet FOLLOW_158 = new BitSet(new long[]{0x0000200180000002L,0x0000000000000000L,0x1800000000000000L});
+    public static final BitSet FOLLOW_159 = new BitSet(new long[]{0x0000A401101001F0L,0x0000000000000000L,0x6232000538000000L,0x000000000005FF99L});
+    public static final BitSet FOLLOW_160 = new BitSet(new long[]{0x0000000180000002L,0x0000000000000000L,0x1800000000000000L});
+    public static final BitSet FOLLOW_161 = new BitSet(new long[]{0x00002401103001F0L,0x0000000000000000L,0x4230000538000000L,0x000000000005FF99L});
+    public static final BitSet FOLLOW_162 = new BitSet(new long[]{0x0000000000200000L,0x0000004000000000L});
+    public static final BitSet FOLLOW_163 = new BitSet(new long[]{0x00002403101001F0L,0x0000000000000000L,0x6232000538000000L,0x000000000005FFF9L});
+    public static final BitSet FOLLOW_164 = new BitSet(new long[]{0x0000000000000000L,0x0000004000000000L,0x2000000000000000L});
+    public static final BitSet FOLLOW_165 = new BitSet(new long[]{0x00002403101001F0L,0x0000000000000000L,0x4230000538000000L,0x000000000005FFF9L});
+    public static final BitSet FOLLOW_166 = new BitSet(new long[]{0x00002401101101F2L,0x0000000000000000L,0x4230000538000000L,0x000000000005FFF9L});
+    public static final BitSet FOLLOW_167 = new BitSet(new long[]{0x00002401101001F2L,0x0000000000000000L,0x4230000538000000L,0x000000000005FFF9L});
+    public static final BitSet FOLLOW_168 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x8000000000000000L});
+    public static final BitSet FOLLOW_169 = new BitSet(new long[]{0x00002401101001F0L,0x0000000000000000L,0x4232000538000000L,0x000000000005FF99L});
+    public static final BitSet FOLLOW_170 = new BitSet(new long[]{0x0000200001200010L,0x0000004000000000L,0x0002000000000000L,0x0000000000000006L});
+    public static final BitSet FOLLOW_171 = new BitSet(new long[]{0x0000000001000000L,0x0000004000000000L,0x0000000000000000L,0x0000000000000004L});
+    public static final BitSet FOLLOW_172 = new BitSet(new long[]{0x0000000001000000L,0x0000004000000000L});
+    public static final BitSet FOLLOW_173 = new BitSet(new long[]{0x00002401101101F0L,0x0000000000000000L,0x4230000538000000L,0x000000000005FFF9L});
+    public static final BitSet FOLLOW_174 = new BitSet(new long[]{0x0000000000010000L,0x0000004000000000L});
+    public static final BitSet FOLLOW_175 = new BitSet(new long[]{0x00002401101001F0L,0x0000000000000000L,0x4230000538000000L,0x000000000005FFF9L});
+    public static final BitSet FOLLOW_176 = new BitSet(new long[]{0x00002401101101F0L,0x0000000000000000L,0x4230000538000000L,0x000000000005FF99L});
+    public static final BitSet FOLLOW_177 = new BitSet(new long[]{0x0000000000010000L});
+    public static final BitSet FOLLOW_178 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000008L});
+    public static final BitSet FOLLOW_179 = new BitSet(new long[]{0x00002401103001F0L,0x0000000000000000L,0x4230000538000000L,0x000000000005FFF9L});
+    public static final BitSet FOLLOW_180 = new BitSet(new long[]{0x00002401103101F0L,0x0000000000000000L,0x4230000538000000L,0x000000000005FFF9L});
+    public static final BitSet FOLLOW_181 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000200000000L});
+    public static final BitSet FOLLOW_182 = new BitSet(new long[]{0x0000200100000002L});
+    public static final BitSet FOLLOW_183 = new BitSet(new long[]{0x0000000100000002L});
+    public static final BitSet FOLLOW_184 = new BitSet(new long[]{0x0000200110000002L});
+    public static final BitSet FOLLOW_185 = new BitSet(new long[]{0x0000800100000000L});
+    public static final BitSet FOLLOW_186 = new BitSet(new long[]{0x00002401101001F2L,0x0000000000000000L,0x4230000538000000L,0x000000000005FF99L});
+    public static final BitSet FOLLOW_187 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x00000000000A0000L});
+    public static final BitSet FOLLOW_188 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000000L,0x00000000000A0000L});
+    public static final BitSet FOLLOW_189 = new BitSet(new long[]{0x0000000000000140L});
+    public static final BitSet FOLLOW_190 = new BitSet(new long[]{0x0000A00000000010L,0x0000000000000000L,0x0002000000000000L});
+    public static final BitSet FOLLOW_191 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0002000000000000L});
+    public static final BitSet FOLLOW_192 = new BitSet(new long[]{0x0000000010000002L});
+    public static final BitSet FOLLOW_193 = new BitSet(new long[]{0x0000000090000002L});
+    public static final BitSet FOLLOW_194 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000000L,0x0000000000000180L});
+    public static final BitSet FOLLOW_195 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000000L,0x0000000000200000L});
+    public static final BitSet FOLLOW_196 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000040000000L});
+    public static final BitSet FOLLOW_197 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000008000000L});
+
+}
diff --git a/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/serializer/UIGrammarSemanticSequencer.java b/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/serializer/UIGrammarSemanticSequencer.java
index a9835e4..51c2060 100644
--- a/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/serializer/UIGrammarSemanticSequencer.java
+++ b/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/serializer/UIGrammarSemanticSequencer.java
@@ -7,14 +7,18 @@
  *
  * Contributors:
  *         Florian Pirchner - Initial implementation
+ *
+ * generated by Xtext 2.11.0
+ *
  */
 
 package org.eclipse.osbp.ecview.dsl.serializer;
 
 import com.google.inject.Inject;
-import com.google.inject.Provider;
-import org.eclipse.emf.common.util.BasicEMap.Entry;
+import java.util.Map;
+import java.util.Set;
 import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
 import org.eclipse.osbp.ecview.dsl.services.UIGrammarGrammarAccess;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiAddToTableCommand;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiBeanReferenceField;
@@ -36,6 +40,7 @@
 import org.eclipse.osbp.ecview.semantic.uimodel.UiDialog;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiDialogAssignment;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiDialogSearchFieldAssignment;
+import org.eclipse.osbp.ecview.semantic.uimodel.UiDisplayView;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiErrorCode;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiExposedAction;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiFormLayout;
@@ -49,7 +54,6 @@
 import org.eclipse.osbp.ecview.semantic.uimodel.UiI18nInfo;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiIDEView;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiImage;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiImports;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiLabel;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiList;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiMaskedDecimalField;
@@ -116,6 +120,12 @@
 import org.eclipse.osbp.ecview.semantic.uimodel.UiVisibilityProcessorAssignment;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiXbaseValidator;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiXbaseVisibilityRule;
+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;
@@ -125,14 +135,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;
@@ -166,2119 +170,1044 @@
 import org.eclipse.xtext.xbase.XVariableDeclaration;
 import org.eclipse.xtext.xbase.XWhileExpression;
 import org.eclipse.xtext.xbase.XbasePackage;
-import org.eclipse.xtext.xbase.serializer.XbaseSemanticSequencer;
+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 UIGrammarSemanticSequencer extends XbaseSemanticSequencer {
+public class UIGrammarSemanticSequencer extends OXtypeSemanticSequencer {
 
 	@Inject
 	private UIGrammarGrammarAccess grammarAccess;
 	
-	public void createSequence(EObject context, EObject semanticObject) {
-		if(semanticObject.eClass().getEPackage() == TypesPackage.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 == OXtypePackage.eINSTANCE)
+			switch (semanticObject.eClass().getClassifierID()) {
+			case OXtypePackage.OX_IMPORT_DECLARATION:
+				sequence_XImportDeclaration(context, (OXImportDeclaration) semanticObject); 
+				return; 
+			}
+		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() == UiModelPackage.eINSTANCE) switch(semanticObject.eClass().getClassifierID()) {
+		else if (epackage == UiModelPackage.eINSTANCE)
+			switch (semanticObject.eClass().getClassifierID()) {
 			case UiModelPackage.UI_ADD_TO_TABLE_COMMAND:
-				if(context == grammarAccess.getUiAddToTableCommandRule() ||
-				   context == grammarAccess.getUiCommandRule()) {
-					sequence_UiAddToTableCommand(context, (UiAddToTableCommand) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiAddToTableCommand(context, (UiAddToTableCommand) semanticObject); 
+				return; 
 			case UiModelPackage.UI_BEAN_REFERENCE_FIELD:
-				if(context == grammarAccess.getUiBeanReferenceFieldRule() ||
-				   context == grammarAccess.getUiEmbeddableRule() ||
-				   context == grammarAccess.getUiFieldRule()) {
-					sequence_UiBeanReferenceField(context, (UiBeanReferenceField) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiBeanReferenceField(context, (UiBeanReferenceField) semanticObject); 
+				return; 
 			case UiModelPackage.UI_BEAN_SLOT:
-				if(context == grammarAccess.getUiBeanSlotRule()) {
-					sequence_UiBeanSlot(context, (UiBeanSlot) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiBeanSlot(context, (UiBeanSlot) semanticObject); 
+				return; 
 			case UiModelPackage.UI_BEAN_VALIDATION_VALIDATOR:
-				if(context == grammarAccess.getUiBeanValidationValidatorRule() ||
-				   context == grammarAccess.getUiValidatorRule()) {
-					sequence_UiBeanValidationValidator(context, (UiBeanValidationValidator) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiBeanValidationValidator(context, (UiBeanValidationValidator) semanticObject); 
+				return; 
 			case UiModelPackage.UI_BINDING:
-				if(context == grammarAccess.getUiBindingRule()) {
-					sequence_UiBinding(context, (UiBinding) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiBinding(context, (UiBinding) semanticObject); 
+				return; 
 			case UiModelPackage.UI_BINDING_ENDPOINT_ALIAS:
-				if(context == grammarAccess.getUiBindingEndpointAliasRule()) {
-					sequence_UiBindingEndpointAlias(context, (UiBindingEndpointAlias) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiBindingEndpointAlias(context, (UiBindingEndpointAlias) semanticObject); 
+				return; 
 			case UiModelPackage.UI_BINDING_ENDPOINT_ASSIGNMENT:
-				if(context == grammarAccess.getUiBindingEndpointAssignmentRule()) {
-					sequence_UiBindingEndpointAssignment(context, (UiBindingEndpointAssignment) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiBindingEndpointAssignment(context, (UiBindingEndpointAssignment) semanticObject); 
+				return; 
 			case UiModelPackage.UI_BROWSER:
-				if(context == grammarAccess.getUiBrowserRule() ||
-				   context == grammarAccess.getUiEmbeddableRule() ||
-				   context == grammarAccess.getUiFieldRule() ||
-				   context == grammarAccess.getUiMobileEmbeddableRule() ||
-				   context == grammarAccess.getUiMobileFieldRule()) {
-					sequence_UiBrowser(context, (UiBrowser) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiBrowser(context, (UiBrowser) semanticObject); 
+				return; 
 			case UiModelPackage.UI_BUTTON:
-				if(context == grammarAccess.getUiActionRule() ||
-				   context == grammarAccess.getUiButtonRule() ||
-				   context == grammarAccess.getUiEmbeddableRule() ||
-				   context == grammarAccess.getUiMobileActionRule() ||
-				   context == grammarAccess.getUiMobileEmbeddableRule()) {
-					sequence_UiButton(context, (UiButton) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiButton(context, (UiButton) semanticObject); 
+				return; 
 			case UiModelPackage.UI_CHANGE_TRIGGER:
-				if(context == grammarAccess.getUiChangeTriggerRule()) {
-					sequence_UiChangeTrigger(context, (UiChangeTrigger) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiChangeTrigger(context, (UiChangeTrigger) semanticObject); 
+				return; 
 			case UiModelPackage.UI_CHECK_BOX:
-				if(context == grammarAccess.getUiCheckBoxRule() ||
-				   context == grammarAccess.getUiEmbeddableRule() ||
-				   context == grammarAccess.getUiFieldRule()) {
-					sequence_UiCheckBox(context, (UiCheckBox) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiCheckBox(context, (UiCheckBox) semanticObject); 
+				return; 
 			case UiModelPackage.UI_COLUMN:
-				if(context == grammarAccess.getUiColumnRule()) {
-					sequence_UiColumn(context, (UiColumn) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiColumn(context, (UiColumn) semanticObject); 
+				return; 
 			case UiModelPackage.UI_COLUMNS_ASSIGNMENT:
-				if(context == grammarAccess.getUiColumnsAssignmentRule()) {
-					sequence_UiColumnsAssignment(context, (UiColumnsAssignment) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiColumnsAssignment(context, (UiColumnsAssignment) semanticObject); 
+				return; 
 			case UiModelPackage.UI_COMBO_BOX:
-				if(context == grammarAccess.getUiComboBoxRule() ||
-				   context == grammarAccess.getUiEmbeddableRule() ||
-				   context == grammarAccess.getUiFieldRule() ||
-				   context == grammarAccess.getUiMobileEmbeddableRule() ||
-				   context == grammarAccess.getUiMobileFieldRule()) {
-					sequence_UiComboBox(context, (UiComboBox) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiComboBox(context, (UiComboBox) semanticObject); 
+				return; 
 			case UiModelPackage.UI_COMMAND_BINDABLE_DEF:
-				if(context == grammarAccess.getUiBindingEndpointAssignmentAccess().getUiBindingEndpointAssignmentTypedBindableDefAction_1_1() ||
-				   context == grammarAccess.getUiCommandBindableDefRule()) {
-					sequence_UiCommandBindableDef(context, (UiCommandBindableDef) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiCommandBindableDef(context, (UiCommandBindableDef) semanticObject); 
+				return; 
 			case UiModelPackage.UI_DATE_FIELD:
-				if(context == grammarAccess.getUiDateFieldRule() ||
-				   context == grammarAccess.getUiEmbeddableRule() ||
-				   context == grammarAccess.getUiFieldRule() ||
-				   context == grammarAccess.getUiMobileEmbeddableRule() ||
-				   context == grammarAccess.getUiMobileFieldRule()) {
-					sequence_UiDateField(context, (UiDateField) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiDateField(context, (UiDateField) semanticObject); 
+				return; 
 			case UiModelPackage.UI_DECIMAL_FIELD:
-				if(context == grammarAccess.getUiDecimalFieldRule() ||
-				   context == grammarAccess.getUiEmbeddableRule() ||
-				   context == grammarAccess.getUiFieldRule() ||
-				   context == grammarAccess.getUiMobileEmbeddableRule() ||
-				   context == grammarAccess.getUiMobileFieldRule()) {
-					sequence_UiDecimalField(context, (UiDecimalField) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiDecimalField(context, (UiDecimalField) semanticObject); 
+				return; 
 			case UiModelPackage.UI_DIALOG:
-				if(context == grammarAccess.getUiDialogRule()) {
-					sequence_UiDialog(context, (UiDialog) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiDialog(context, (UiDialog) semanticObject); 
+				return; 
 			case UiModelPackage.UI_DIALOG_ASSIGNMENT:
-				if(context == grammarAccess.getUiDialogAssignmentRule()) {
-					sequence_UiDialogAssignment(context, (UiDialogAssignment) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiDialogAssignment(context, (UiDialogAssignment) semanticObject); 
+				return; 
 			case UiModelPackage.UI_DIALOG_SEARCH_FIELD_ASSIGNMENT:
-				if(context == grammarAccess.getUiDialogSearchFieldAssignmentRule()) {
-					sequence_UiDialogSearchFieldAssignment(context, (UiDialogSearchFieldAssignment) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiDialogSearchFieldAssignment(context, (UiDialogSearchFieldAssignment) semanticObject); 
+				return; 
+			case UiModelPackage.UI_DISPLAY_VIEW:
+				sequence_UiDisplayView(context, (UiDisplayView) semanticObject); 
+				return; 
 			case UiModelPackage.UI_ERROR_CODE:
-				if(context == grammarAccess.getUiErrorCodeRule()) {
-					sequence_UiErrorCode(context, (UiErrorCode) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiErrorCode(context, (UiErrorCode) semanticObject); 
+				return; 
 			case UiModelPackage.UI_EXPOSED_ACTION:
-				if(context == grammarAccess.getUiExposedActionRule()) {
-					sequence_UiExposedAction(context, (UiExposedAction) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiExposedAction(context, (UiExposedAction) semanticObject); 
+				return; 
 			case UiModelPackage.UI_FORM_LAYOUT:
-				if(context == grammarAccess.getUiEmbeddableRule() ||
-				   context == grammarAccess.getUiFormLayoutRule() ||
-				   context == grammarAccess.getUiLayoutRule()) {
-					sequence_UiFormLayout(context, (UiFormLayout) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiFormLayout(context, (UiFormLayout) semanticObject); 
+				return; 
 			case UiModelPackage.UI_FORM_LAYOUT_ASSIGMENT:
-				if(context == grammarAccess.getUiFormLayoutAssigmentRule()) {
-					sequence_UiFormLayoutAssigment(context, (UiFormLayoutAssigment) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiFormLayoutAssigment(context, (UiFormLayoutAssigment) semanticObject); 
+				return; 
 			case UiModelPackage.UI_GRID_LAYOUT:
-				if(context == grammarAccess.getUiEmbeddableRule() ||
-				   context == grammarAccess.getUiGridLayoutRule() ||
-				   context == grammarAccess.getUiLayoutRule()) {
-					sequence_UiGridLayout(context, (UiGridLayout) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiGridLayout(context, (UiGridLayout) semanticObject); 
+				return; 
 			case UiModelPackage.UI_GRID_LAYOUT_ASSIGMENT:
-				if(context == grammarAccess.getUiGridLayoutAssigmentRule()) {
-					sequence_UiGridLayoutAssigment(context, (UiGridLayoutAssigment) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiGridLayoutAssigment(context, (UiGridLayoutAssigment) semanticObject); 
+				return; 
 			case UiModelPackage.UI_HORIZONTAL_BUTTON_GROUP:
-				if(context == grammarAccess.getUiMobileEmbeddableRule() ||
-				   context == grammarAccess.getUiMobileHorizontalButtonGroupRule() ||
-				   context == grammarAccess.getUiMobileLayoutRule()) {
-					sequence_UiMobileHorizontalButtonGroup(context, (UiHorizontalButtonGroup) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiMobileHorizontalButtonGroup(context, (UiHorizontalButtonGroup) semanticObject); 
+				return; 
 			case UiModelPackage.UI_HORIZONTAL_BUTTON_GROUP_ASSIGMENT:
-				if(context == grammarAccess.getUiMobileHorizontalButtonGroupAssigmentRule()) {
-					sequence_UiMobileHorizontalButtonGroupAssigment(context, (UiHorizontalButtonGroupAssigment) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiMobileHorizontalButtonGroupAssigment(context, (UiHorizontalButtonGroupAssigment) semanticObject); 
+				return; 
 			case UiModelPackage.UI_HORIZONTAL_LAYOUT:
-				if(context == grammarAccess.getUiEmbeddableRule() ||
-				   context == grammarAccess.getUiHorizontalLayoutRule() ||
-				   context == grammarAccess.getUiLayoutRule()) {
+				if (rule == grammarAccess.getUiHorizontalLayoutRule()
+						|| rule == grammarAccess.getUiEmbeddableRule()
+						|| rule == grammarAccess.getUiLayoutRule()) {
 					sequence_UiHorizontalLayout(context, (UiHorizontalLayout) semanticObject); 
 					return; 
 				}
-				else if(context == grammarAccess.getUiMobileEmbeddableRule() ||
-				   context == grammarAccess.getUiMobileHorizontalLayoutRule() ||
-				   context == grammarAccess.getUiMobileLayoutRule()) {
+				else if (rule == grammarAccess.getUiMobileHorizontalLayoutRule()
+						|| rule == grammarAccess.getUiMobileEmbeddableRule()
+						|| rule == grammarAccess.getUiMobileLayoutRule()) {
 					sequence_UiMobileHorizontalLayout(context, (UiHorizontalLayout) semanticObject); 
 					return; 
 				}
 				else break;
 			case UiModelPackage.UI_HORIZONTAL_LAYOUT_ASSIGMENT:
-				if(context == grammarAccess.getUiHorizontalLayoutAssigmentRule()) {
+				if (rule == grammarAccess.getUiHorizontalLayoutAssigmentRule()) {
 					sequence_UiHorizontalLayoutAssigment(context, (UiHorizontalLayoutAssigment) semanticObject); 
 					return; 
 				}
-				else if(context == grammarAccess.getUiMobileHorizontalLayoutAssigmentRule()) {
+				else if (rule == grammarAccess.getUiMobileHorizontalLayoutAssigmentRule()) {
 					sequence_UiMobileHorizontalLayoutAssigment(context, (UiHorizontalLayoutAssigment) semanticObject); 
 					return; 
 				}
 				else break;
 			case UiModelPackage.UI_I1_8N_INFO:
-				if(context == grammarAccess.getUiI18nInfoRule()) {
-					sequence_UiI18nInfo(context, (UiI18nInfo) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiI18nInfo(context, (UiI18nInfo) semanticObject); 
+				return; 
 			case UiModelPackage.UI_IDE_VIEW:
-				if(context == grammarAccess.getUiIDEViewRule() ||
-				   context == grammarAccess.getUiRootElementsRule() ||
-				   context == grammarAccess.getUiViewRule()) {
-					sequence_UiIDEView(context, (UiIDEView) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiIDEView(context, (UiIDEView) semanticObject); 
+				return; 
 			case UiModelPackage.UI_IMAGE:
-				if(context == grammarAccess.getUiEmbeddableRule() ||
-				   context == grammarAccess.getUiFieldRule() ||
-				   context == grammarAccess.getUiImageRule() ||
-				   context == grammarAccess.getUiMobileEmbeddableRule() ||
-				   context == grammarAccess.getUiMobileFieldRule()) {
-					sequence_UiImage(context, (UiImage) semanticObject); 
-					return; 
-				}
-				else break;
-			case UiModelPackage.UI_IMPORTS:
-				if(context == grammarAccess.getUiImportsRule()) {
-					sequence_UiImports(context, (UiImports) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiImage(context, (UiImage) semanticObject); 
+				return; 
 			case UiModelPackage.UI_LABEL:
-				if(context == grammarAccess.getUiEmbeddableRule() ||
-				   context == grammarAccess.getUiFieldRule() ||
-				   context == grammarAccess.getUiLabelRule() ||
-				   context == grammarAccess.getUiMobileEmbeddableRule() ||
-				   context == grammarAccess.getUiMobileFieldRule()) {
-					sequence_UiLabel(context, (UiLabel) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiLabel(context, (UiLabel) semanticObject); 
+				return; 
 			case UiModelPackage.UI_LIST:
-				if(context == grammarAccess.getUiEmbeddableRule() ||
-				   context == grammarAccess.getUiFieldRule() ||
-				   context == grammarAccess.getUiListRule()) {
-					sequence_UiList(context, (UiList) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiList(context, (UiList) semanticObject); 
+				return; 
 			case UiModelPackage.UI_MASKED_DECIMAL_FIELD:
-				if(context == grammarAccess.getUiEmbeddableRule() ||
-				   context == grammarAccess.getUiFieldRule() ||
-				   context == grammarAccess.getUiMaskedDecimalFieldRule() ||
-				   context == grammarAccess.getUiMobileEmbeddableRule() ||
-				   context == grammarAccess.getUiMobileFieldRule()) {
-					sequence_UiMaskedDecimalField(context, (UiMaskedDecimalField) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiMaskedDecimalField(context, (UiMaskedDecimalField) semanticObject); 
+				return; 
 			case UiModelPackage.UI_MASKED_NUMERIC_FIELD:
-				if(context == grammarAccess.getUiEmbeddableRule() ||
-				   context == grammarAccess.getUiFieldRule() ||
-				   context == grammarAccess.getUiMaskedNumericFieldRule() ||
-				   context == grammarAccess.getUiMobileEmbeddableRule() ||
-				   context == grammarAccess.getUiMobileFieldRule()) {
-					sequence_UiMaskedNumericField(context, (UiMaskedNumericField) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiMaskedNumericField(context, (UiMaskedNumericField) semanticObject); 
+				return; 
 			case UiModelPackage.UI_MASKED_TEXT_FIELD:
-				if(context == grammarAccess.getUiEmbeddableRule() ||
-				   context == grammarAccess.getUiFieldRule() ||
-				   context == grammarAccess.getUiMaskedTextFieldRule() ||
-				   context == grammarAccess.getUiMobileEmbeddableRule() ||
-				   context == grammarAccess.getUiMobileFieldRule()) {
-					sequence_UiMaskedTextField(context, (UiMaskedTextField) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiMaskedTextField(context, (UiMaskedTextField) semanticObject); 
+				return; 
 			case UiModelPackage.UI_MAX_LENGTH_VALIDATOR:
-				if(context == grammarAccess.getUiMaxLengthValidatorRule() ||
-				   context == grammarAccess.getUiValidatorRule()) {
-					sequence_UiMaxLengthValidator(context, (UiMaxLengthValidator) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiMaxLengthValidator(context, (UiMaxLengthValidator) semanticObject); 
+				return; 
 			case UiModelPackage.UI_MIN_LENGTH_VALIDATOR:
-				if(context == grammarAccess.getUiMinLengthValidatorRule() ||
-				   context == grammarAccess.getUiValidatorRule()) {
-					sequence_UiMinLengthValidator(context, (UiMinLengthValidator) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiMinLengthValidator(context, (UiMinLengthValidator) semanticObject); 
+				return; 
 			case UiModelPackage.UI_MOBILE_NAV_BAR_ACTION:
-				if(context == grammarAccess.getUiMobileNavBarActionRule()) {
-					sequence_UiMobileNavBarAction(context, (UiMobileNavBarAction) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiMobileNavBarAction(context, (UiMobileNavBarAction) semanticObject); 
+				return; 
 			case UiModelPackage.UI_MOBILE_NAVIGATION_BUTTON:
-				if(context == grammarAccess.getUiMobileActionRule() ||
-				   context == grammarAccess.getUiMobileEmbeddableRule() ||
-				   context == grammarAccess.getUiMobileNavigationButtonRule()) {
-					sequence_UiMobileNavigationButton(context, (UiMobileNavigationButton) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiMobileNavigationButton(context, (UiMobileNavigationButton) semanticObject); 
+				return; 
 			case UiModelPackage.UI_MOBILE_NAVIGATION_COMMAND:
-				if(context == grammarAccess.getUiCommandRule() ||
-				   context == grammarAccess.getUiMobileNavigationCommandRule()) {
-					sequence_UiMobileNavigationCommand(context, (UiMobileNavigationCommand) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiMobileNavigationCommand(context, (UiMobileNavigationCommand) semanticObject); 
+				return; 
 			case UiModelPackage.UI_MOBILE_NAVIGATION_PAGE:
-				if(context == grammarAccess.getUiMobileEmbeddableRule() ||
-				   context == grammarAccess.getUiMobileLayoutRule() ||
-				   context == grammarAccess.getUiMobileNavigationPageRule()) {
-					sequence_UiMobileNavigationPage(context, (UiMobileNavigationPage) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiMobileNavigationPage(context, (UiMobileNavigationPage) semanticObject); 
+				return; 
 			case UiModelPackage.UI_MOBILE_NAVIGATION_PAGE_ASSIGNMENT:
-				if(context == grammarAccess.getUiMobileNavigationPageAssignmentRule()) {
-					sequence_UiMobileNavigationPageAssignment(context, (UiMobileNavigationPageAssignment) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiMobileNavigationPageAssignment(context, (UiMobileNavigationPageAssignment) semanticObject); 
+				return; 
 			case UiModelPackage.UI_MOBILE_NAVIGATION_ROOT:
-				if(context == grammarAccess.getUiMobileEmbeddableRule() ||
-				   context == grammarAccess.getUiMobileLayoutRule() ||
-				   context == grammarAccess.getUiMobileNavigationRootRule()) {
-					sequence_UiMobileNavigationRoot(context, (UiMobileNavigationRoot) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiMobileNavigationRoot(context, (UiMobileNavigationRoot) semanticObject); 
+				return; 
 			case UiModelPackage.UI_MOBILE_NAVIGATION_ROOT_ASSIGMENT:
-				if(context == grammarAccess.getUiMobileNavigationRootAssigmentRule()) {
-					sequence_UiMobileNavigationRootAssigment(context, (UiMobileNavigationRootAssigment) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiMobileNavigationRootAssigment(context, (UiMobileNavigationRootAssigment) semanticObject); 
+				return; 
 			case UiModelPackage.UI_MOBILE_SEARCH_PANEL:
-				if(context == grammarAccess.getUiMobileEmbeddableRule() ||
-				   context == grammarAccess.getUiMobileLayoutRule() ||
-				   context == grammarAccess.getUiMobileSearchPanelRule()) {
-					sequence_UiMobileSearchPanel(context, (UiMobileSearchPanel) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiMobileSearchPanel(context, (UiMobileSearchPanel) semanticObject); 
+				return; 
 			case UiModelPackage.UI_MOBILE_TAB_ASSIGNMENT:
-				if(context == grammarAccess.getUiMobileTabAssignmentRule()) {
-					sequence_UiMobileTabAssignment(context, (UiMobileTabAssignment) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiMobileTabAssignment(context, (UiMobileTabAssignment) semanticObject); 
+				return; 
 			case UiModelPackage.UI_MOBILE_TAB_SHEET:
-				if(context == grammarAccess.getUiMobileEmbeddableRule() ||
-				   context == grammarAccess.getUiMobileTabSheetRule()) {
-					sequence_UiMobileTabSheet(context, (UiMobileTabSheet) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiMobileTabSheet(context, (UiMobileTabSheet) semanticObject); 
+				return; 
 			case UiModelPackage.UI_MOBILE_VIEW:
-				if(context == grammarAccess.getUiMobileViewRule() ||
-				   context == grammarAccess.getUiRootElementsRule()) {
-					sequence_UiMobileView(context, (UiMobileView) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiMobileView(context, (UiMobileView) semanticObject); 
+				return; 
 			case UiModelPackage.UI_MODEL:
-				if(context == grammarAccess.getUiModelRule()) {
-					sequence_UiModel(context, (UiModel) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiModel(context, (UiModel) semanticObject); 
+				return; 
 			case UiModelPackage.UI_NESTED_PROPERTY:
-				if(context == grammarAccess.getUiNestedPropertyRule()) {
-					sequence_UiNestedProperty(context, (UiNestedProperty) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiNestedProperty(context, (UiNestedProperty) semanticObject); 
+				return; 
 			case UiModelPackage.UI_NUMERIC_FIELD:
-				if(context == grammarAccess.getUiEmbeddableRule() ||
-				   context == grammarAccess.getUiFieldRule() ||
-				   context == grammarAccess.getUiMobileEmbeddableRule() ||
-				   context == grammarAccess.getUiMobileFieldRule() ||
-				   context == grammarAccess.getUiNumericFieldRule()) {
-					sequence_UiNumericField(context, (UiNumericField) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiNumericField(context, (UiNumericField) semanticObject); 
+				return; 
 			case UiModelPackage.UI_OPEN_DIALOG_COMMAND:
-				if(context == grammarAccess.getUiCommandRule() ||
-				   context == grammarAccess.getUiOpenDialogCommandRule()) {
-					sequence_UiOpenDialogCommand(context, (UiOpenDialogCommand) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiOpenDialogCommand(context, (UiOpenDialogCommand) semanticObject); 
+				return; 
 			case UiModelPackage.UI_OPTIONS_GROUP:
-				if(context == grammarAccess.getUiEmbeddableRule() ||
-				   context == grammarAccess.getUiFieldRule() ||
-				   context == grammarAccess.getUiMobileEmbeddableRule() ||
-				   context == grammarAccess.getUiMobileFieldRule() ||
-				   context == grammarAccess.getUiOptionsGroupRule()) {
-					sequence_UiOptionsGroup(context, (UiOptionsGroup) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiOptionsGroup(context, (UiOptionsGroup) semanticObject); 
+				return; 
 			case UiModelPackage.UI_PANEL:
-				if(context == grammarAccess.getUiEmbeddableRule() ||
-				   context == grammarAccess.getUiLayoutRule() ||
-				   context == grammarAccess.getUiPanelRule()) {
-					sequence_UiPanel(context, (UiPanel) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiPanel(context, (UiPanel) semanticObject); 
+				return; 
 			case UiModelPackage.UI_PASSWORD_FIELD:
-				if(context == grammarAccess.getUiEmbeddableRule() ||
-				   context == grammarAccess.getUiFieldRule() ||
-				   context == grammarAccess.getUiMobileEmbeddableRule() ||
-				   context == grammarAccess.getUiMobileFieldRule() ||
-				   context == grammarAccess.getUiPasswordFieldRule()) {
-					sequence_UiPasswordField(context, (UiPasswordField) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiPasswordField(context, (UiPasswordField) semanticObject); 
+				return; 
 			case UiModelPackage.UI_PATH_SEGMENT:
-				if(context == grammarAccess.getUiPathSegmentRule()) {
-					sequence_UiPathSegment(context, (UiPathSegment) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiPathSegment(context, (UiPathSegment) semanticObject); 
+				return; 
 			case UiModelPackage.UI_POINT:
-				if(context == grammarAccess.getUiPointRule()) {
-					sequence_UiPoint(context, (UiPoint) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiPoint(context, (UiPoint) semanticObject); 
+				return; 
 			case UiModelPackage.UI_PREFIX_TO_MASK_MAP_ENTRY:
-				if(context == grammarAccess.getUiPrefixToMaskMapEntryRule()) {
-					sequence_UiPrefixToMaskMapEntry(context, (Entry<?, ?>) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiPrefixToMaskMapEntry(context, (Map.Entry) semanticObject); 
+				return; 
 			case UiModelPackage.UI_PREFIXED_MASKED_TEXT_FIELD:
-				if(context == grammarAccess.getUiEmbeddableRule() ||
-				   context == grammarAccess.getUiFieldRule() ||
-				   context == grammarAccess.getUiMobileEmbeddableRule() ||
-				   context == grammarAccess.getUiMobileFieldRule() ||
-				   context == grammarAccess.getUiPrefixedMaskedTextFieldRule()) {
-					sequence_UiPrefixedMaskedTextField(context, (UiPrefixedMaskedTextField) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiPrefixedMaskedTextField(context, (UiPrefixedMaskedTextField) semanticObject); 
+				return; 
 			case UiModelPackage.UI_PROGRESS_BAR:
-				if(context == grammarAccess.getUiEmbeddableRule() ||
-				   context == grammarAccess.getUiFieldRule() ||
-				   context == grammarAccess.getUiMobileEmbeddableRule() ||
-				   context == grammarAccess.getUiMobileFieldRule() ||
-				   context == grammarAccess.getUiProgressBarRule()) {
-					sequence_UiProgressBar(context, (UiProgressBar) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiProgressBar(context, (UiProgressBar) semanticObject); 
+				return; 
 			case UiModelPackage.UI_RAW_BINDABLE_PATH_SEGMENT:
-				if(context == grammarAccess.getUiRawBindablePathSegmentRule()) {
-					sequence_UiRawBindablePathSegment(context, (UiRawBindablePathSegment) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiRawBindablePathSegment(context, (UiRawBindablePathSegment) semanticObject); 
+				return; 
 			case UiModelPackage.UI_REGEXP_VALIDATOR:
-				if(context == grammarAccess.getUiRegexpValidatorRule() ||
-				   context == grammarAccess.getUiValidatorRule()) {
-					sequence_UiRegexpValidator(context, (UiRegexpValidator) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiRegexpValidator(context, (UiRegexpValidator) semanticObject); 
+				return; 
 			case UiModelPackage.UI_REMOVE_FROM_TABLE_COMMAND:
-				if(context == grammarAccess.getUiCommandRule() ||
-				   context == grammarAccess.getUiRemoveFromTableCommandRule()) {
-					sequence_UiRemoveFromTableCommand(context, (UiRemoveFromTableCommand) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiRemoveFromTableCommand(context, (UiRemoveFromTableCommand) semanticObject); 
+				return; 
 			case UiModelPackage.UI_RICH_TEXT_AREA:
-				if(context == grammarAccess.getUiEmbeddableRule() ||
-				   context == grammarAccess.getUiFieldRule() ||
-				   context == grammarAccess.getUiMobileEmbeddableRule() ||
-				   context == grammarAccess.getUiMobileFieldRule() ||
-				   context == grammarAccess.getUiRichTextAreaRule()) {
-					sequence_UiRichTextArea(context, (UiRichTextArea) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiRichTextArea(context, (UiRichTextArea) semanticObject); 
+				return; 
 			case UiModelPackage.UI_SEARCH_DIALOG:
-				if(context == grammarAccess.getUiSearchDialogRule()) {
-					sequence_UiSearchDialog(context, (UiSearchDialog) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiSearchDialog(context, (UiSearchDialog) semanticObject); 
+				return; 
 			case UiModelPackage.UI_SEARCH_FIELD:
-				if(context == grammarAccess.getUiEmbeddableRule() ||
-				   context == grammarAccess.getUiFieldRule() ||
-				   context == grammarAccess.getUiMobileEmbeddableRule() ||
-				   context == grammarAccess.getUiMobileFieldRule() ||
-				   context == grammarAccess.getUiSearchFieldRule()) {
-					sequence_UiSearchField(context, (UiSearchField) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiSearchField(context, (UiSearchField) semanticObject); 
+				return; 
 			case UiModelPackage.UI_SEARCH_PANEL:
-				if(context == grammarAccess.getUiEmbeddableRule() ||
-				   context == grammarAccess.getUiLayoutRule() ||
-				   context == grammarAccess.getUiSearchPanelRule()) {
-					sequence_UiSearchPanel(context, (UiSearchPanel) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiSearchPanel(context, (UiSearchPanel) semanticObject); 
+				return; 
 			case UiModelPackage.UI_SEARCH_WITH_DIALOG_COMMAND:
-				if(context == grammarAccess.getUiCommandRule() ||
-				   context == grammarAccess.getUiSearchWithDialogCommandRule()) {
-					sequence_UiSearchWithDialogCommand(context, (UiSearchWithDialogCommand) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiSearchWithDialogCommand(context, (UiSearchWithDialogCommand) semanticObject); 
+				return; 
 			case UiModelPackage.UI_SEND_EVENT_COMMAND:
-				if(context == grammarAccess.getUiCommandRule() ||
-				   context == grammarAccess.getUiSendEventCommandRule()) {
-					sequence_UiSendEventCommand(context, (UiSendEventCommand) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiSendEventCommand(context, (UiSendEventCommand) semanticObject); 
+				return; 
 			case UiModelPackage.UI_SET_NEW_INSTANCE_COMMAND:
-				if(context == grammarAccess.getUiCommandRule() ||
-				   context == grammarAccess.getUiSetNewInstanceCommandRule()) {
-					sequence_UiSetNewInstanceCommand(context, (UiSetNewInstanceCommand) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiSetNewInstanceCommand(context, (UiSetNewInstanceCommand) semanticObject); 
+				return; 
 			case UiModelPackage.UI_SORT_ORDER:
-				if(context == grammarAccess.getUiSortOrderRule()) {
-					sequence_UiSortOrder(context, (UiSortOrder) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiSortOrder(context, (UiSortOrder) semanticObject); 
+				return; 
 			case UiModelPackage.UI_SORT_ORDER_ASSIGNMENT:
-				if(context == grammarAccess.getUiSortOrderAssignmentRule()) {
-					sequence_UiSortOrderAssignment(context, (UiSortOrderAssignment) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiSortOrderAssignment(context, (UiSortOrderAssignment) semanticObject); 
+				return; 
 			case UiModelPackage.UI_SPLITPANEL:
-				if(context == grammarAccess.getUiEmbeddableRule() ||
-				   context == grammarAccess.getUiLayoutRule() ||
-				   context == grammarAccess.getUiSplitpanelRule()) {
-					sequence_UiSplitpanel(context, (UiSplitpanel) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiSplitpanel(context, (UiSplitpanel) semanticObject); 
+				return; 
 			case UiModelPackage.UI_SPLITPANEL_ASSIGMENT:
-				if(context == grammarAccess.getUiSplitpanelAssigmentRule()) {
-					sequence_UiSplitpanelAssigment(context, (UiSplitpanelAssigment) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiSplitpanelAssigment(context, (UiSplitpanelAssigment) semanticObject); 
+				return; 
 			case UiModelPackage.UI_SUGGEST_TEXT_FIELD:
-				if(context == grammarAccess.getUiEmbeddableRule() ||
-				   context == grammarAccess.getUiFieldRule() ||
-				   context == grammarAccess.getUiMobileEmbeddableRule() ||
-				   context == grammarAccess.getUiMobileFieldRule() ||
-				   context == grammarAccess.getUiSuggestTextFieldRule()) {
-					sequence_UiSuggestTextField(context, (UiSuggestTextField) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiSuggestTextField(context, (UiSuggestTextField) semanticObject); 
+				return; 
 			case UiModelPackage.UI_SWITCH:
-				if(context == grammarAccess.getUiMobileEmbeddableRule() ||
-				   context == grammarAccess.getUiMobileFieldRule() ||
-				   context == grammarAccess.getUiMobileSwitchRule()) {
-					sequence_UiMobileSwitch(context, (UiSwitch) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiMobileSwitch(context, (UiSwitch) semanticObject); 
+				return; 
 			case UiModelPackage.UI_TAB_ASSIGNMENT:
-				if(context == grammarAccess.getUiTabAssignmentRule()) {
-					sequence_UiTabAssignment(context, (UiTabAssignment) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiTabAssignment(context, (UiTabAssignment) semanticObject); 
+				return; 
 			case UiModelPackage.UI_TAB_SHEET:
-				if(context == grammarAccess.getUiEmbeddableRule() ||
-				   context == grammarAccess.getUiTabSheetRule()) {
-					sequence_UiTabSheet(context, (UiTabSheet) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiTabSheet(context, (UiTabSheet) semanticObject); 
+				return; 
 			case UiModelPackage.UI_TABLE:
-				if(context == grammarAccess.getUiEmbeddableRule() ||
-				   context == grammarAccess.getUiFieldRule() ||
-				   context == grammarAccess.getUiMobileEmbeddableRule() ||
-				   context == grammarAccess.getUiMobileFieldRule() ||
-				   context == grammarAccess.getUiTableRule()) {
-					sequence_UiTable(context, (UiTable) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiTable(context, (UiTable) semanticObject); 
+				return; 
 			case UiModelPackage.UI_TEXT_AREA:
-				if(context == grammarAccess.getUiEmbeddableRule() ||
-				   context == grammarAccess.getUiFieldRule() ||
-				   context == grammarAccess.getUiMobileEmbeddableRule() ||
-				   context == grammarAccess.getUiMobileFieldRule() ||
-				   context == grammarAccess.getUiTextAreaRule()) {
-					sequence_UiTextArea(context, (UiTextArea) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiTextArea(context, (UiTextArea) semanticObject); 
+				return; 
 			case UiModelPackage.UI_TEXT_FIELD:
-				if(context == grammarAccess.getUiEmbeddableRule() ||
-				   context == grammarAccess.getUiFieldRule() ||
-				   context == grammarAccess.getUiMobileEmbeddableRule() ||
-				   context == grammarAccess.getUiMobileFieldRule() ||
-				   context == grammarAccess.getUiTextFieldRule()) {
-					sequence_UiTextField(context, (UiTextField) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiTextField(context, (UiTextField) semanticObject); 
+				return; 
 			case UiModelPackage.UI_TYPED_BINDABLE_DEF:
-				if(context == grammarAccess.getUiBindingEndpointAssignmentAccess().getUiBindingEndpointAssignmentTypedBindableDefAction_0_1() ||
-				   context == grammarAccess.getUiTypedBindableDefRule()) {
-					sequence_UiTypedBindableDef(context, (UiTypedBindableDef) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiTypedBindableDef(context, (UiTypedBindableDef) semanticObject); 
+				return; 
 			case UiModelPackage.UI_TYPED_BINDABLE_RAW_TYPE:
-				if(context == grammarAccess.getUiTypedBindableRawTypeRule()) {
-					sequence_UiTypedBindableRawType(context, (UiTypedBindableRawType) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiTypedBindableRawType(context, (UiTypedBindableRawType) semanticObject); 
+				return; 
 			case UiModelPackage.UI_TYPED_BINDABLE_RAW_TYPE_ALIAS:
-				if(context == grammarAccess.getUiTypedBindableRawTypeAliasRule()) {
-					sequence_UiTypedBindableRawTypeAlias(context, (UiTypedBindableRawTypeAlias) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiTypedBindableRawTypeAlias(context, (UiTypedBindableRawTypeAlias) semanticObject); 
+				return; 
 			case UiModelPackage.UI_VALIDATOR_ALIAS:
-				if(context == grammarAccess.getUiRootElementsRule() ||
-				   context == grammarAccess.getUiValidatorAliasRule()) {
-					sequence_UiValidatorAlias(context, (UiValidatorAlias) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiValidatorAlias(context, (UiValidatorAlias) semanticObject); 
+				return; 
 			case UiModelPackage.UI_VALIDATOR_ASSIGNMENT:
-				if(context == grammarAccess.getUiValidatorAssignmentRule()) {
-					sequence_UiValidatorAssignment(context, (UiValidatorAssignment) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiValidatorAssignment(context, (UiValidatorAssignment) semanticObject); 
+				return; 
 			case UiModelPackage.UI_VALIDATOR_DEF:
-				if(context == grammarAccess.getUiValidatorDefRule()) {
-					sequence_UiValidatorDef(context, (UiValidatorDef) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiValidatorDef(context, (UiValidatorDef) semanticObject); 
+				return; 
 			case UiModelPackage.UI_VERTICAL_COMPONENT_GROUP:
-				if(context == grammarAccess.getUiMobileEmbeddableRule() ||
-				   context == grammarAccess.getUiMobileLayoutRule() ||
-				   context == grammarAccess.getUiMobileVerticalComponentGroupRule()) {
-					sequence_UiMobileVerticalComponentGroup(context, (UiVerticalComponentGroup) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiMobileVerticalComponentGroup(context, (UiVerticalComponentGroup) semanticObject); 
+				return; 
 			case UiModelPackage.UI_VERTICAL_COMPONENT_GROUP_ASSIGMENT:
-				if(context == grammarAccess.getUiMobileVerticalComponentGroupAssigmentRule()) {
-					sequence_UiMobileVerticalComponentGroupAssigment(context, (UiVerticalComponentGroupAssigment) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiMobileVerticalComponentGroupAssigment(context, (UiVerticalComponentGroupAssigment) semanticObject); 
+				return; 
 			case UiModelPackage.UI_VERTICAL_LAYOUT:
-				if(context == grammarAccess.getUiMobileEmbeddableRule() ||
-				   context == grammarAccess.getUiMobileLayoutRule() ||
-				   context == grammarAccess.getUiMobileVerticalLayoutRule()) {
+				if (rule == grammarAccess.getUiMobileVerticalLayoutRule()
+						|| rule == grammarAccess.getUiMobileEmbeddableRule()
+						|| rule == grammarAccess.getUiMobileLayoutRule()) {
 					sequence_UiMobileVerticalLayout(context, (UiVerticalLayout) semanticObject); 
 					return; 
 				}
-				else if(context == grammarAccess.getUiEmbeddableRule() ||
-				   context == grammarAccess.getUiLayoutRule() ||
-				   context == grammarAccess.getUiVerticalLayoutRule()) {
+				else if (rule == grammarAccess.getUiVerticalLayoutRule()
+						|| rule == grammarAccess.getUiEmbeddableRule()
+						|| rule == grammarAccess.getUiLayoutRule()) {
 					sequence_UiVerticalLayout(context, (UiVerticalLayout) semanticObject); 
 					return; 
 				}
 				else break;
 			case UiModelPackage.UI_VERTICAL_LAYOUT_ASSIGMENT:
-				if(context == grammarAccess.getUiMobileVerticalLayoutAssigmentRule()) {
+				if (rule == grammarAccess.getUiMobileVerticalLayoutAssigmentRule()) {
 					sequence_UiMobileVerticalLayoutAssigment(context, (UiVerticalLayoutAssigment) semanticObject); 
 					return; 
 				}
-				else if(context == grammarAccess.getUiVerticalLayoutAssigmentRule()) {
+				else if (rule == grammarAccess.getUiVerticalLayoutAssigmentRule()) {
 					sequence_UiVerticalLayoutAssigment(context, (UiVerticalLayoutAssigment) semanticObject); 
 					return; 
 				}
 				else break;
 			case UiModelPackage.UI_VIEW_SET:
-				if(context == grammarAccess.getUiRootElementsRule() ||
-				   context == grammarAccess.getUiViewSetRule()) {
-					sequence_UiViewSet(context, (UiViewSet) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiViewSet(context, (UiViewSet) semanticObject); 
+				return; 
 			case UiModelPackage.UI_VISIBILITY_PROCESSOR:
-				if(context == grammarAccess.getUiVisibilityProcessorRule()) {
-					sequence_UiVisibilityProcessor(context, (UiVisibilityProcessor) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiVisibilityProcessor(context, (UiVisibilityProcessor) semanticObject); 
+				return; 
 			case UiModelPackage.UI_VISIBILITY_PROCESSOR_ASSIGNMENT:
-				if(context == grammarAccess.getUiVisibilityProcessorAssignmentRule()) {
-					sequence_UiVisibilityProcessorAssignment(context, (UiVisibilityProcessorAssignment) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiVisibilityProcessorAssignment(context, (UiVisibilityProcessorAssignment) semanticObject); 
+				return; 
 			case UiModelPackage.UI_XBASE_VALIDATOR:
-				if(context == grammarAccess.getUiValidatorRule() ||
-				   context == grammarAccess.getUiXbaseValidatorRule()) {
-					sequence_UiXbaseValidator(context, (UiXbaseValidator) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiXbaseValidator(context, (UiXbaseValidator) semanticObject); 
+				return; 
 			case UiModelPackage.UI_XBASE_VISIBILITY_RULE:
-				if(context == grammarAccess.getUiXbaseVisibilityRuleRule()) {
-					sequence_UiXbaseVisibilityRule(context, (UiXbaseVisibilityRule) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UiXbaseVisibilityRule(context, (UiXbaseVisibilityRule) semanticObject); 
+				return; 
 			}
-		else if(semanticObject.eClass().getEPackage() == XbasePackage.eINSTANCE) switch(semanticObject.eClass().getClassifierID()) {
+		else if (epackage == XAnnotationsPackage.eINSTANCE)
+			switch (semanticObject.eClass().getClassifierID()) {
+			case XAnnotationsPackage.XANNOTATION:
+				sequence_XAnnotation(context, (XAnnotation) semanticObject); 
+				return; 
+			case XAnnotationsPackage.XANNOTATION_ELEMENT_VALUE_PAIR:
+				sequence_XAnnotationElementValuePair(context, (XAnnotationElementValuePair) semanticObject); 
+				return; 
+			}
+		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.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.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.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.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.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.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.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.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.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.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.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.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.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); 
+				sequence_XRelationalExpression(context, (XInstanceOfExpression) semanticObject); 
+				return; 
+			case XbasePackage.XLIST_LITERAL:
+				if (rule == grammarAccess.getXAnnotationElementValueOrCommaListRule()) {
+					sequence_XAnnotationElementValueOrCommaList_XListLiteral(context, (XListLiteral) semanticObject); 
 					return; 
 				}
-				else break;
-			case XbasePackage.XLIST_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.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 (rule == grammarAccess.getXAnnotationElementValueRule()) {
+					sequence_XAnnotationElementValue_XListLiteral(context, (XListLiteral) semanticObject); 
+					return; 
+				}
+				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.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.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.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.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.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.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.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.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.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.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.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.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.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.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:
+	 *     UiCommand returns UiAddToTableCommand
+	 *     UiAddToTableCommand returns UiAddToTableCommand
+	 *
 	 * Constraint:
 	 *     table=[UiTable|ID]
 	 */
-	protected void sequence_UiAddToTableCommand(EObject context, UiAddToTableCommand semanticObject) {
-		genericSequencer.createSequence(context, semanticObject);
+	protected void sequence_UiAddToTableCommand(ISerializationContext context, UiAddToTableCommand semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_ADD_TO_TABLE_COMMAND__TABLE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_ADD_TO_TABLE_COMMAND__TABLE));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getUiAddToTableCommandAccess().getTableUiTableIDTerminalRuleCall_2_0_1(), semanticObject.eGet(UiModelPackage.Literals.UI_ADD_TO_TABLE_COMMAND__TABLE, false));
+		feeder.finish();
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiBeanReferenceField returns UiBeanReferenceField
+	 *     UiEmbeddable returns UiBeanReferenceField
+	 *     UiField returns UiBeanReferenceField
+	 *
 	 * Constraint:
 	 *     (
-	 *         (i18nInfo=UiI18nInfo? styles=STRING?)? 
+	 *         (i18nInfo=UiI18nInfo | styles=STRING)* 
 	 *         name=ID? 
+	 *         jvmType=JvmTypeReference? 
 	 *         (
-	 *             jvmType=JvmTypeReference? 
-	 *             (referenceSourceJvmType=JvmTypeReference referenceSourceField=[JvmField|ID])? 
-	 *             captionProperty=UiNestedProperty? 
-	 *             descriptionProperty=UiNestedProperty? 
-	 *             imageProperty=UiNestedProperty? 
-	 *             inMemoryBeanProvider=JvmTypeReference? 
-	 *             (validators+=UiValidator | bindings+=UiBinding)* 
-	 *             processorAssignments+=UiVisibilityProcessorAssignment*
-	 *         )?
+	 *             (
+	 *                 (referenceSourceJvmType=JvmTypeReference referenceSourceField=[JvmField|ID]) | 
+	 *                 captionProperty=UiNestedProperty | 
+	 *                 descriptionProperty=UiNestedProperty | 
+	 *                 imageProperty=UiNestedProperty | 
+	 *                 inMemoryBeanProvider=JvmTypeReference
+	 *             )? 
+	 *             jvmType=JvmTypeReference?
+	 *         )* 
+	 *         validators+=UiValidator? 
+	 *         (bindings+=UiBinding? validators+=UiValidator?)* 
+	 *         processorAssignments+=UiVisibilityProcessorAssignment*
 	 *     )
 	 */
-	protected void sequence_UiBeanReferenceField(EObject context, UiBeanReferenceField semanticObject) {
+	protected void sequence_UiBeanReferenceField(ISerializationContext context, UiBeanReferenceField semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiBeanSlot returns UiBeanSlot
+	 *
 	 * Constraint:
 	 *     (name=ID jvmType=JvmTypeReference eventTopic=STRING?)
 	 */
-	protected void sequence_UiBeanSlot(EObject context, UiBeanSlot semanticObject) {
+	protected void sequence_UiBeanSlot(ISerializationContext context, UiBeanSlot semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiValidator returns UiBeanValidationValidator
+	 *     UiBeanValidationValidator returns UiBeanValidationValidator
+	 *
 	 * Constraint:
-	 *     (name=ID?)
+	 *     name=ID?
 	 */
-	protected void sequence_UiBeanValidationValidator(EObject context, UiBeanValidationValidator semanticObject) {
+	protected void sequence_UiBeanValidationValidator(ISerializationContext context, UiBeanValidationValidator semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiBindingEndpointAlias returns UiBindingEndpointAlias
+	 *
 	 * Constraint:
 	 *     (endpoint=UiBindingEndpointAssignment alias=ID)
 	 */
-	protected void sequence_UiBindingEndpointAlias(EObject context, UiBindingEndpointAlias semanticObject) {
-		genericSequencer.createSequence(context, semanticObject);
+	protected void sequence_UiBindingEndpointAlias(ISerializationContext context, UiBindingEndpointAlias semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_BINDING_ENDPOINT_ALIAS__ENDPOINT) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_BINDING_ENDPOINT_ALIAS__ENDPOINT));
+			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_BINDING_ENDPOINT_ALIAS__ALIAS) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_BINDING_ENDPOINT_ALIAS__ALIAS));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getUiBindingEndpointAliasAccess().getEndpointUiBindingEndpointAssignmentParserRuleCall_1_0(), semanticObject.eGet(UiModelPackage.Literals.UI_BINDING_ENDPOINT_ALIAS__ENDPOINT, false));
+		feeder.accept(grammarAccess.getUiBindingEndpointAliasAccess().getAliasIDTerminalRuleCall_3_0(), semanticObject.getAlias());
+		feeder.finish();
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiBindingEndpointAssignment returns UiBindingEndpointAssignment
+	 *
 	 * Constraint:
 	 *     (
 	 *         (typedBindableDef=UiBindingEndpointAssignment_UiBindingEndpointAssignment_0_1 path=UiPathSegment?) | 
-	 *         typedBindableDef=UiBindingEndpointAssignment_UiBindingEndpointAssignment_0_1 | 
 	 *         typedBindableDef=UiBindingEndpointAssignment_UiBindingEndpointAssignment_1_1 | 
 	 *         (typedBindableAlias=[UiTypedBindable|ID] path=UiPathSegment?)
 	 *     )
 	 */
-	protected void sequence_UiBindingEndpointAssignment(EObject context, UiBindingEndpointAssignment semanticObject) {
+	protected void sequence_UiBindingEndpointAssignment(ISerializationContext context, UiBindingEndpointAssignment semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiBinding returns UiBinding
+	 *
 	 * Constraint:
 	 *     (listBinding?='list'? source=UiBindingEndpointAssignment targetToSource?='<'? sourceToTarget?='>'? target=UiBindingEndpointAssignment)
 	 */
-	protected void sequence_UiBinding(EObject context, UiBinding semanticObject) {
+	protected void sequence_UiBinding(ISerializationContext context, UiBinding semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiBrowser returns UiBrowser
+	 *     UiEmbeddable returns UiBrowser
+	 *     UiMobileEmbeddable returns UiBrowser
+	 *     UiMobileField returns UiBrowser
+	 *     UiField returns UiBrowser
+	 *
 	 * Constraint:
 	 *     (
-	 *         (i18nInfo=UiI18nInfo? readonly?='readonly'? styles=STRING?)? 
+	 *         (i18nInfo=UiI18nInfo | readonly?='readonly' | styles=STRING)* 
 	 *         name=ID? 
-	 *         ((validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment*)?
+	 *         validators+=UiValidator? 
+	 *         (bindings+=UiBinding? validators+=UiValidator?)* 
+	 *         processorAssignments+=UiVisibilityProcessorAssignment*
 	 *     )
 	 */
-	protected void sequence_UiBrowser(EObject context, UiBrowser semanticObject) {
+	protected void sequence_UiBrowser(ISerializationContext context, UiBrowser semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiButton returns UiButton
+	 *     UiEmbeddable returns UiButton
+	 *     UiMobileEmbeddable returns UiButton
+	 *     UiAction returns UiButton
+	 *     UiMobileAction returns UiButton
+	 *
 	 * Constraint:
-	 *     ((i18nInfo=UiI18nInfo? readonly?='readonly'? styles=STRING?)? name=ID?)
+	 *     ((i18nInfo=UiI18nInfo | readonly?='readonly' | styles=STRING)* name=ID?)
 	 */
-	protected void sequence_UiButton(EObject context, UiButton semanticObject) {
+	protected void sequence_UiButton(ISerializationContext context, UiButton semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiChangeTrigger returns UiChangeTrigger
+	 *
 	 * Constraint:
 	 *     (endpoint=UiBindingEndpointAssignment alias=ID)
 	 */
-	protected void sequence_UiChangeTrigger(EObject context, UiChangeTrigger semanticObject) {
-		genericSequencer.createSequence(context, semanticObject);
+	protected void sequence_UiChangeTrigger(ISerializationContext context, UiChangeTrigger semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_CHANGE_TRIGGER__ENDPOINT) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_CHANGE_TRIGGER__ENDPOINT));
+			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_CHANGE_TRIGGER__ALIAS) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_CHANGE_TRIGGER__ALIAS));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getUiChangeTriggerAccess().getEndpointUiBindingEndpointAssignmentParserRuleCall_1_0(), semanticObject.eGet(UiModelPackage.Literals.UI_CHANGE_TRIGGER__ENDPOINT, false));
+		feeder.accept(grammarAccess.getUiChangeTriggerAccess().getAliasIDTerminalRuleCall_3_0(), semanticObject.getAlias());
+		feeder.finish();
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiEmbeddable returns UiCheckBox
+	 *     UiField returns UiCheckBox
+	 *     UiCheckBox returns UiCheckBox
+	 *
 	 * Constraint:
 	 *     (
-	 *         (i18nInfo=UiI18nInfo? readonly?='readonly'? styles=STRING?)? 
+	 *         i18nInfo=UiI18nInfo? 
+	 *         ((readonly?='readonly' | styles=STRING)? i18nInfo=UiI18nInfo?)* 
 	 *         name=ID? 
-	 *         ((validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment*)?
+	 *         (validators+=UiValidator | bindings+=UiBinding)* 
+	 *         processorAssignments+=UiVisibilityProcessorAssignment*
 	 *     )
 	 */
-	protected void sequence_UiCheckBox(EObject context, UiCheckBox semanticObject) {
+	protected void sequence_UiCheckBox(ISerializationContext context, UiCheckBox semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiColumn returns UiColumn
+	 *
 	 * Constraint:
 	 *     (property=UiNestedProperty iconName=STRING?)
 	 */
-	protected void sequence_UiColumn(EObject context, UiColumn semanticObject) {
+	protected void sequence_UiColumn(ISerializationContext context, UiColumn semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiColumnsAssignment returns UiColumnsAssignment
+	 *
 	 * Constraint:
-	 *     (columns+=UiColumn*)
+	 *     columns+=UiColumn*
 	 */
-	protected void sequence_UiColumnsAssignment(EObject context, UiColumnsAssignment semanticObject) {
+	protected void sequence_UiColumnsAssignment(ISerializationContext context, UiColumnsAssignment semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiComboBox returns UiComboBox
+	 *     UiEmbeddable returns UiComboBox
+	 *     UiMobileEmbeddable returns UiComboBox
+	 *     UiMobileField returns UiComboBox
+	 *     UiField returns UiComboBox
+	 *
 	 * Constraint:
 	 *     (
-	 *         (i18nInfo=UiI18nInfo? styles=STRING?)? 
+	 *         (i18nInfo=UiI18nInfo | styles=STRING)* 
 	 *         name=ID? 
+	 *         jvmType=JvmTypeReference? 
 	 *         (
-	 *             jvmType=JvmTypeReference? 
-	 *             itemCaptionProperty=[JvmOperation|ID]? 
-	 *             descriptionProperty=UiNestedProperty? 
-	 *             itemImageProperty=[JvmOperation|ID]? 
-	 *             consumeBeanService?='useBeanService'? 
-	 *             readonly?='readonly'? 
-	 *             (validators+=UiValidator | bindings+=UiBinding)* 
-	 *             processorAssignments+=UiVisibilityProcessorAssignment*
-	 *         )?
+	 *             (
+	 *                 itemCaptionProperty=[JvmOperation|ID] | 
+	 *                 descriptionProperty=UiNestedProperty | 
+	 *                 itemImageProperty=[JvmOperation|ID] | 
+	 *                 consumeBeanService?='useBeanService' | 
+	 *                 readonly?='readonly'
+	 *             )? 
+	 *             jvmType=JvmTypeReference?
+	 *         )* 
+	 *         validators+=UiValidator? 
+	 *         (bindings+=UiBinding? validators+=UiValidator?)* 
+	 *         processorAssignments+=UiVisibilityProcessorAssignment*
 	 *     )
 	 */
-	protected void sequence_UiComboBox(EObject context, UiComboBox semanticObject) {
+	protected void sequence_UiComboBox(ISerializationContext context, UiComboBox semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiBindingEndpointAssignment.UiBindingEndpointAssignment_1_1 returns UiCommandBindableDef
+	 *     UiCommandBindableDef returns UiCommandBindableDef
+	 *
 	 * Constraint:
 	 *     command=UiCommand
 	 */
-	protected void sequence_UiCommandBindableDef(EObject context, UiCommandBindableDef semanticObject) {
-		genericSequencer.createSequence(context, semanticObject);
+	protected void sequence_UiCommandBindableDef(ISerializationContext context, UiCommandBindableDef semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_COMMAND_BINDABLE_DEF__COMMAND) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_COMMAND_BINDABLE_DEF__COMMAND));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getUiCommandBindableDefAccess().getCommandUiCommandParserRuleCall_1_0(), semanticObject.eGet(UiModelPackage.Literals.UI_COMMAND_BINDABLE_DEF__COMMAND, false));
+		feeder.finish();
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiDateField returns UiDateField
+	 *     UiEmbeddable returns UiDateField
+	 *     UiMobileEmbeddable returns UiDateField
+	 *     UiMobileField returns UiDateField
+	 *     UiField returns UiDateField
+	 *
 	 * Constraint:
 	 *     (
-	 *         (dateFormat=UiDateFormat? resolution=UiDateTimeResolution? styles=STRING? i18nInfo=UiI18nInfo? readonly?='readonly'?)? 
+	 *         (dateFormat=UiDateFormat | resolution=UiDateTimeResolution | styles=STRING | i18nInfo=UiI18nInfo | readonly?='readonly')* 
 	 *         name=ID? 
-	 *         ((validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment*)?
+	 *         validators+=UiValidator? 
+	 *         (bindings+=UiBinding? validators+=UiValidator?)* 
+	 *         processorAssignments+=UiVisibilityProcessorAssignment*
 	 *     )
 	 */
-	protected void sequence_UiDateField(EObject context, UiDateField semanticObject) {
+	protected void sequence_UiDateField(ISerializationContext context, UiDateField semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiDecimalField returns UiDecimalField
+	 *     UiEmbeddable returns UiDecimalField
+	 *     UiMobileEmbeddable returns UiDecimalField
+	 *     UiMobileField returns UiDecimalField
+	 *     UiField returns UiDecimalField
+	 *
 	 * Constraint:
 	 *     (
 	 *         (
-	 *             noGrouping?='noGrouping'? 
-	 *             noMarkNegative?='noMarkNegative'? 
-	 *             styles=STRING? 
-	 *             precision=INT? 
-	 *             i18nInfo=UiI18nInfo? 
-	 *             readonly?='readonly'?
-	 *         )? 
+	 *             noGrouping?='noGrouping' | 
+	 *             noMarkNegative?='noMarkNegative' | 
+	 *             styles=STRING | 
+	 *             precision=INT | 
+	 *             i18nInfo=UiI18nInfo | 
+	 *             readonly?='readonly'
+	 *         )* 
 	 *         name=ID? 
-	 *         ((validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment*)?
+	 *         validators+=UiValidator? 
+	 *         (bindings+=UiBinding? validators+=UiValidator?)* 
+	 *         processorAssignments+=UiVisibilityProcessorAssignment*
 	 *     )
 	 */
-	protected void sequence_UiDecimalField(EObject context, UiDecimalField semanticObject) {
+	protected void sequence_UiDecimalField(ISerializationContext context, UiDecimalField semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiDialogAssignment returns UiDialogAssignment
+	 *
 	 * Constraint:
 	 *     element=UiEmbeddable
 	 */
-	protected void sequence_UiDialogAssignment(EObject context, UiDialogAssignment semanticObject) {
-		genericSequencer.createSequence(context, semanticObject);
+	protected void sequence_UiDialogAssignment(ISerializationContext context, UiDialogAssignment semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_DIALOG_ASSIGNMENT__ELEMENT) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_DIALOG_ASSIGNMENT__ELEMENT));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getUiDialogAssignmentAccess().getElementUiEmbeddableParserRuleCall_0(), semanticObject.eGet(UiModelPackage.Literals.UI_DIALOG_ASSIGNMENT__ELEMENT, false));
+		feeder.finish();
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiDialogSearchFieldAssignment returns UiDialogSearchFieldAssignment
+	 *
 	 * Constraint:
 	 *     element=UiSearchField
 	 */
-	protected void sequence_UiDialogSearchFieldAssignment(EObject context, UiDialogSearchFieldAssignment semanticObject) {
-		genericSequencer.createSequence(context, semanticObject);
+	protected void sequence_UiDialogSearchFieldAssignment(ISerializationContext context, UiDialogSearchFieldAssignment semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_DIALOG_SEARCH_FIELD_ASSIGNMENT__ELEMENT) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_DIALOG_SEARCH_FIELD_ASSIGNMENT__ELEMENT));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getUiDialogSearchFieldAssignmentAccess().getElementUiSearchFieldParserRuleCall_0(), semanticObject.eGet(UiModelPackage.Literals.UI_DIALOG_SEARCH_FIELD_ASSIGNMENT__ELEMENT, false));
+		feeder.finish();
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiDialog returns UiDialog
+	 *
 	 * Constraint:
 	 *     (
-	 *         (i18nInfo=UiI18nInfo? styles=STRING?)? 
+	 *         (i18nInfo=UiI18nInfo | styles=STRING)* 
 	 *         name=ID? 
 	 *         jvmType=JvmTypeReference? 
 	 *         content=UiDialogAssignment? 
@@ -2286,125 +1215,20 @@
 	 *         processorAssignments+=UiVisibilityProcessorAssignment*
 	 *     )
 	 */
-	protected void sequence_UiDialog(EObject context, UiDialog semanticObject) {
+	protected void sequence_UiDialog(ISerializationContext context, UiDialog semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
-	 * Constraint:
-	 *     (name=ID defaultMessage=STRING?)
-	 */
-	protected void sequence_UiErrorCode(EObject context, UiErrorCode semanticObject) {
-		genericSequencer.createSequence(context, semanticObject);
-	}
-	
-	
-	/**
-	 * Constraint:
-	 *     (name=ID iconName=STRING? (actionReference=[UxAction|QualifiedName] | actionID=STRING) checkDirty?='checkDirty'? externalCommandId=STRING?)
-	 */
-	protected void sequence_UiExposedAction(EObject context, UiExposedAction semanticObject) {
-		genericSequencer.createSequence(context, semanticObject);
-	}
-	
-	
-	/**
-	 * Constraint:
-	 *     element=UiEmbeddable
-	 */
-	protected void sequence_UiFormLayoutAssigment(EObject context, UiFormLayoutAssigment semanticObject) {
-		genericSequencer.createSequence(context, semanticObject);
-	}
-	
-	
-	/**
-	 * Constraint:
-	 *     (
-	 *         (i18nInfo=UiI18nInfo? styles=STRING? readonly?='readonly'?)? 
-	 *         name=ID? 
-	 *         contents+=UiFormLayoutAssigment* 
-	 *         bindings+=UiBinding* 
-	 *         processorAssignments+=UiVisibilityProcessorAssignment*
-	 *     )
-	 */
-	protected void sequence_UiFormLayout(EObject context, UiFormLayout semanticObject) {
-		genericSequencer.createSequence(context, semanticObject);
-	}
-	
-	
-	/**
-	 * Constraint:
-	 *     (element=UiEmbeddable alignment=UiAlignment?)
-	 */
-	protected void sequence_UiGridLayoutAssigment(EObject context, UiGridLayoutAssigment semanticObject) {
-		genericSequencer.createSequence(context, semanticObject);
-	}
-	
-	
-	/**
-	 * Constraint:
-	 *     (
-	 *         (columns=INT? i18nInfo=UiI18nInfo? styles=STRING? readonly?='readonly'?)? 
-	 *         name=ID? 
-	 *         contents+=UiGridLayoutAssigment* 
-	 *         bindings+=UiBinding* 
-	 *         processorAssignments+=UiVisibilityProcessorAssignment*
-	 *     )
-	 */
-	protected void sequence_UiGridLayout(EObject context, UiGridLayout semanticObject) {
-		genericSequencer.createSequence(context, semanticObject);
-	}
-	
-	
-	/**
-	 * Constraint:
-	 *     (element=UiEmbeddable alignment=UiAlignment?)
-	 */
-	protected void sequence_UiHorizontalLayoutAssigment(EObject context, UiHorizontalLayoutAssigment semanticObject) {
-		genericSequencer.createSequence(context, semanticObject);
-	}
-	
-	
-	/**
-	 * Constraint:
-	 *     (
-	 *         (i18nInfo=UiI18nInfo? readonly?='readonly'? styles=STRING?)? 
-	 *         name=ID? 
-	 *         contents+=UiHorizontalLayoutAssigment* 
-	 *         bindings+=UiBinding* 
-	 *         processorAssignments+=UiVisibilityProcessorAssignment*
-	 *     )
-	 */
-	protected void sequence_UiHorizontalLayout(EObject context, UiHorizontalLayout semanticObject) {
-		genericSequencer.createSequence(context, semanticObject);
-	}
-	
-	
-	/**
-	 * Constraint:
-	 *     key=STRING
-	 */
-	protected void sequence_UiI18nInfo(EObject context, UiI18nInfo semanticObject) {
-		if(errorAcceptor != null) {
-			if(transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_I1_8N_INFO__KEY) == ValueTransient.YES)
-				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_I1_8N_INFO__KEY));
-		}
-		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
-		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
-		feeder.accept(grammarAccess.getUiI18nInfoAccess().getKeySTRINGTerminalRuleCall_1_0(), semanticObject.getKey());
-		feeder.finish();
-	}
-	
-	
-	/**
+	 * Contexts:
+	 *     UiRootElements returns UiDisplayView
+	 *     UiDisplayView returns UiDisplayView
+	 *
 	 * Constraint:
 	 *     (
 	 *         name=ID 
-	 *         sharedStateGroup=STRING? 
-	 *         viewCategory=[UxViewCategory|QualifiedName]? 
-	 *         jvmType=JvmTypeReference? 
-	 *         exposedActions+=UiExposedAction* 
+	 *         jvmType=JvmTypeReference 
 	 *         (beanSlots+=UiBeanSlot | bindingEndpointAlias+=UiBindingEndpointAlias | bindings+=UiBinding)* 
 	 *         content=UiEmbeddable 
 	 *         contentAlignment=UiAlignment? 
@@ -2416,210 +1240,473 @@
 	 *         )*
 	 *     )
 	 */
-	protected void sequence_UiIDEView(EObject context, UiIDEView semanticObject) {
+	protected void sequence_UiDisplayView(ISerializationContext context, UiDisplayView semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiErrorCode returns UiErrorCode
+	 *
 	 * Constraint:
-	 *     ((i18nInfo=UiI18nInfo? styles=STRING?)? name=ID? (value=STRING? bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment*)?)
+	 *     (name=ID defaultMessage=STRING?)
 	 */
-	protected void sequence_UiImage(EObject context, UiImage semanticObject) {
+	protected void sequence_UiErrorCode(ISerializationContext context, UiErrorCode semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiExposedAction returns UiExposedAction
+	 *
 	 * Constraint:
-	 *     importedNamespace=QualifiedNameWithWildcard
+	 *     (name=ID iconName=STRING? (actionReference=[UxAction|QualifiedName] | actionID=STRING) checkDirty?='checkDirty'? externalCommandId=STRING?)
 	 */
-	protected void sequence_UiImports(EObject context, UiImports semanticObject) {
+	protected void sequence_UiExposedAction(ISerializationContext context, UiExposedAction semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiFormLayoutAssigment returns UiFormLayoutAssigment
+	 *
 	 * Constraint:
-	 *     ((i18nInfo=UiI18nInfo? styles=STRING?)? name=ID? (processorAssignments+=UiVisibilityProcessorAssignment* bindings+=UiBinding*)?)
+	 *     element=UiEmbeddable
 	 */
-	protected void sequence_UiLabel(EObject context, UiLabel semanticObject) {
-		genericSequencer.createSequence(context, semanticObject);
+	protected void sequence_UiFormLayoutAssigment(ISerializationContext context, UiFormLayoutAssigment semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_FORM_LAYOUT_ASSIGMENT__ELEMENT) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_FORM_LAYOUT_ASSIGMENT__ELEMENT));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getUiFormLayoutAssigmentAccess().getElementUiEmbeddableParserRuleCall_0(), semanticObject.eGet(UiModelPackage.Literals.UI_FORM_LAYOUT_ASSIGMENT__ELEMENT, false));
+		feeder.finish();
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiFormLayout returns UiFormLayout
+	 *     UiEmbeddable returns UiFormLayout
+	 *     UiLayout returns UiFormLayout
+	 *
 	 * Constraint:
 	 *     (
-	 *         (i18nInfo=UiI18nInfo? styles=STRING?)? 
+	 *         (i18nInfo=UiI18nInfo | styles=STRING | readonly?='readonly')* 
 	 *         name=ID? 
+	 *         contents+=UiFormLayoutAssigment* 
+	 *         bindings+=UiBinding* 
+	 *         processorAssignments+=UiVisibilityProcessorAssignment*
+	 *     )
+	 */
+	protected void sequence_UiFormLayout(ISerializationContext context, UiFormLayout semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     UiGridLayoutAssigment returns UiGridLayoutAssigment
+	 *
+	 * Constraint:
+	 *     (element=UiEmbeddable alignment=UiAlignment?)
+	 */
+	protected void sequence_UiGridLayoutAssigment(ISerializationContext context, UiGridLayoutAssigment semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     UiGridLayout returns UiGridLayout
+	 *     UiEmbeddable returns UiGridLayout
+	 *     UiLayout returns UiGridLayout
+	 *
+	 * Constraint:
+	 *     (
+	 *         (columns=INT | i18nInfo=UiI18nInfo | styles=STRING | readonly?='readonly')* 
+	 *         name=ID? 
+	 *         contents+=UiGridLayoutAssigment* 
+	 *         bindings+=UiBinding* 
+	 *         processorAssignments+=UiVisibilityProcessorAssignment*
+	 *     )
+	 */
+	protected void sequence_UiGridLayout(ISerializationContext context, UiGridLayout semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     UiHorizontalLayoutAssigment returns UiHorizontalLayoutAssigment
+	 *
+	 * Constraint:
+	 *     (element=UiEmbeddable alignment=UiAlignment?)
+	 */
+	protected void sequence_UiHorizontalLayoutAssigment(ISerializationContext context, UiHorizontalLayoutAssigment semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     UiHorizontalLayout returns UiHorizontalLayout
+	 *     UiEmbeddable returns UiHorizontalLayout
+	 *     UiLayout returns UiHorizontalLayout
+	 *
+	 * Constraint:
+	 *     (
+	 *         (i18nInfo=UiI18nInfo | readonly?='readonly' | styles=STRING)* 
+	 *         name=ID? 
+	 *         contents+=UiHorizontalLayoutAssigment* 
+	 *         bindings+=UiBinding* 
+	 *         processorAssignments+=UiVisibilityProcessorAssignment*
+	 *     )
+	 */
+	protected void sequence_UiHorizontalLayout(ISerializationContext context, UiHorizontalLayout semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     UiI18nInfo returns UiI18nInfo
+	 *
+	 * Constraint:
+	 *     (noCaption?='noCaption' | key=STRING)
+	 */
+	protected void sequence_UiI18nInfo(ISerializationContext context, UiI18nInfo semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     UiRootElements returns UiIDEView
+	 *     UiView returns UiIDEView
+	 *     UiIDEView returns UiIDEView
+	 *
+	 * Constraint:
+	 *     (
+	 *         name=ID 
+	 *         sharedStateGroup=STRING? 
+	 *         ((viewCategory=[UxViewCategory|QualifiedName] | jvmType=JvmTypeReference | exposedActions+=UiExposedAction)? sharedStateGroup=STRING?)* 
+	 *         (beanSlots+=UiBeanSlot | bindingEndpointAlias+=UiBindingEndpointAlias | bindings+=UiBinding)* 
+	 *         content=UiEmbeddable 
+	 *         contentAlignment=UiAlignment? 
 	 *         (
-	 *             jvmType=JvmTypeReference? 
-	 *             selectionType=UiSelectionType? 
-	 *             itemCaptionProperty=[JvmOperation|ID]? 
-	 *             descriptionProperty=UiNestedProperty? 
-	 *             itemImageProperty=[JvmOperation|ID]? 
-	 *             consumeBeanService?='useBeanService'? 
-	 *             readonly?='readonly'? 
-	 *             (validators+=UiValidator | bindings+=UiBinding)* 
-	 *             processorAssignments+=UiVisibilityProcessorAssignment*
-	 *         )?
+	 *             bindingEndpointAlias+=UiBindingEndpointAlias | 
+	 *             bindings+=UiBinding | 
+	 *             validatorAssignments+=UiValidatorAssignment | 
+	 *             processorAssignments+=UiVisibilityProcessorAssignment
+	 *         )*
 	 *     )
 	 */
-	protected void sequence_UiList(EObject context, UiList semanticObject) {
+	protected void sequence_UiIDEView(ISerializationContext context, UiIDEView semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiImage returns UiImage
+	 *     UiEmbeddable returns UiImage
+	 *     UiMobileEmbeddable returns UiImage
+	 *     UiMobileField returns UiImage
+	 *     UiField returns UiImage
+	 *
+	 * Constraint:
+	 *     ((i18nInfo=UiI18nInfo | styles=STRING)* name=ID? value=STRING? bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment*)
+	 */
+	protected void sequence_UiImage(ISerializationContext context, UiImage semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     UiLabel returns UiLabel
+	 *     UiEmbeddable returns UiLabel
+	 *     UiMobileEmbeddable returns UiLabel
+	 *     UiMobileField returns UiLabel
+	 *     UiField returns UiLabel
+	 *
+	 * Constraint:
+	 *     ((i18nInfo=UiI18nInfo | styles=STRING)* name=ID? processorAssignments+=UiVisibilityProcessorAssignment* bindings+=UiBinding*)
+	 */
+	protected void sequence_UiLabel(ISerializationContext context, UiLabel semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     UiList returns UiList
+	 *     UiEmbeddable returns UiList
+	 *     UiField returns UiList
+	 *
 	 * Constraint:
 	 *     (
-	 *         (styles=STRING? mask=STRING? i18nInfo=UiI18nInfo? readonly?='readonly'?)? 
+	 *         (i18nInfo=UiI18nInfo | styles=STRING)* 
 	 *         name=ID? 
-	 *         ((validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment*)?
+	 *         jvmType=JvmTypeReference? 
+	 *         (
+	 *             (
+	 *                 selectionType=UiSelectionType | 
+	 *                 itemCaptionProperty=[JvmOperation|ID] | 
+	 *                 descriptionProperty=UiNestedProperty | 
+	 *                 itemImageProperty=[JvmOperation|ID] | 
+	 *                 consumeBeanService?='useBeanService' | 
+	 *                 readonly?='readonly'
+	 *             )? 
+	 *             jvmType=JvmTypeReference?
+	 *         )* 
+	 *         validators+=UiValidator? 
+	 *         (bindings+=UiBinding? validators+=UiValidator?)* 
+	 *         processorAssignments+=UiVisibilityProcessorAssignment*
 	 *     )
 	 */
-	protected void sequence_UiMaskedDecimalField(EObject context, UiMaskedDecimalField semanticObject) {
+	protected void sequence_UiList(ISerializationContext context, UiList semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiMaskedDecimalField returns UiMaskedDecimalField
+	 *     UiEmbeddable returns UiMaskedDecimalField
+	 *     UiMobileEmbeddable returns UiMaskedDecimalField
+	 *     UiMobileField returns UiMaskedDecimalField
+	 *     UiField returns UiMaskedDecimalField
+	 *
 	 * Constraint:
 	 *     (
-	 *         (styles=STRING? i18nInfo=UiI18nInfo? readonly?='readonly'?)? 
+	 *         (styles=STRING | mask=STRING | i18nInfo=UiI18nInfo | readonly?='readonly')* 
 	 *         name=ID? 
-	 *         ((validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment*)?
+	 *         validators+=UiValidator? 
+	 *         (bindings+=UiBinding? validators+=UiValidator?)* 
+	 *         processorAssignments+=UiVisibilityProcessorAssignment*
 	 *     )
 	 */
-	protected void sequence_UiMaskedNumericField(EObject context, UiMaskedNumericField semanticObject) {
+	protected void sequence_UiMaskedDecimalField(ISerializationContext context, UiMaskedDecimalField semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiMaskedNumericField returns UiMaskedNumericField
+	 *     UiEmbeddable returns UiMaskedNumericField
+	 *     UiMobileEmbeddable returns UiMaskedNumericField
+	 *     UiMobileField returns UiMaskedNumericField
+	 *     UiField returns UiMaskedNumericField
+	 *
 	 * Constraint:
 	 *     (
-	 *         (styles=STRING? mask=STRING? i18nInfo=UiI18nInfo? readonly?='readonly'?)? 
+	 *         (styles=STRING | i18nInfo=UiI18nInfo | readonly?='readonly')* 
 	 *         name=ID? 
-	 *         ((validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment*)?
+	 *         validators+=UiValidator? 
+	 *         (bindings+=UiBinding? validators+=UiValidator?)* 
+	 *         processorAssignments+=UiVisibilityProcessorAssignment*
 	 *     )
 	 */
-	protected void sequence_UiMaskedTextField(EObject context, UiMaskedTextField semanticObject) {
+	protected void sequence_UiMaskedNumericField(ISerializationContext context, UiMaskedNumericField semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiMaskedTextField returns UiMaskedTextField
+	 *     UiEmbeddable returns UiMaskedTextField
+	 *     UiMobileEmbeddable returns UiMaskedTextField
+	 *     UiMobileField returns UiMaskedTextField
+	 *     UiField returns UiMaskedTextField
+	 *
+	 * Constraint:
+	 *     (
+	 *         (styles=STRING | mask=STRING | i18nInfo=UiI18nInfo | readonly?='readonly')* 
+	 *         name=ID? 
+	 *         validators+=UiValidator? 
+	 *         (bindings+=UiBinding? validators+=UiValidator?)* 
+	 *         processorAssignments+=UiVisibilityProcessorAssignment*
+	 *     )
+	 */
+	protected void sequence_UiMaskedTextField(ISerializationContext context, UiMaskedTextField semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     UiValidator returns UiMaxLengthValidator
+	 *     UiMaxLengthValidator returns UiMaxLengthValidator
+	 *
 	 * Constraint:
 	 *     (name=ID? maxLength=INT errorCode=UiErrorCode?)
 	 */
-	protected void sequence_UiMaxLengthValidator(EObject context, UiMaxLengthValidator semanticObject) {
+	protected void sequence_UiMaxLengthValidator(ISerializationContext context, UiMaxLengthValidator semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiValidator returns UiMinLengthValidator
+	 *     UiMinLengthValidator returns UiMinLengthValidator
+	 *
 	 * Constraint:
 	 *     (name=ID? minLength=INT errorCode=UiErrorCode?)
 	 */
-	protected void sequence_UiMinLengthValidator(EObject context, UiMinLengthValidator semanticObject) {
+	protected void sequence_UiMinLengthValidator(ISerializationContext context, UiMinLengthValidator semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiMobileHorizontalButtonGroupAssigment returns UiHorizontalButtonGroupAssigment
+	 *
 	 * Constraint:
 	 *     element=UiMobileEmbeddable
 	 */
-	protected void sequence_UiMobileHorizontalButtonGroupAssigment(EObject context, UiHorizontalButtonGroupAssigment semanticObject) {
-		genericSequencer.createSequence(context, semanticObject);
+	protected void sequence_UiMobileHorizontalButtonGroupAssigment(ISerializationContext context, UiHorizontalButtonGroupAssigment semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_HORIZONTAL_BUTTON_GROUP_ASSIGMENT__ELEMENT) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_HORIZONTAL_BUTTON_GROUP_ASSIGMENT__ELEMENT));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getUiMobileHorizontalButtonGroupAssigmentAccess().getElementUiMobileEmbeddableParserRuleCall_0(), semanticObject.eGet(UiModelPackage.Literals.UI_HORIZONTAL_BUTTON_GROUP_ASSIGMENT__ELEMENT, false));
+		feeder.finish();
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiMobileHorizontalButtonGroup returns UiHorizontalButtonGroup
+	 *     UiMobileEmbeddable returns UiHorizontalButtonGroup
+	 *     UiMobileLayout returns UiHorizontalButtonGroup
+	 *
 	 * Constraint:
 	 *     (
-	 *         (i18nInfo=UiI18nInfo? styles=STRING? readonly?='readonly'?)? 
+	 *         (i18nInfo=UiI18nInfo | styles=STRING | readonly?='readonly')* 
 	 *         name=ID? 
 	 *         contents+=UiMobileHorizontalButtonGroupAssigment* 
 	 *         bindings+=UiBinding* 
 	 *         processorAssignments+=UiVisibilityProcessorAssignment*
 	 *     )
 	 */
-	protected void sequence_UiMobileHorizontalButtonGroup(EObject context, UiHorizontalButtonGroup semanticObject) {
+	protected void sequence_UiMobileHorizontalButtonGroup(ISerializationContext context, UiHorizontalButtonGroup semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiMobileHorizontalLayoutAssigment returns UiHorizontalLayoutAssigment
+	 *
 	 * Constraint:
 	 *     (element=UiMobileEmbeddable alignment=UiAlignment?)
 	 */
-	protected void sequence_UiMobileHorizontalLayoutAssigment(EObject context, UiHorizontalLayoutAssigment semanticObject) {
+	protected void sequence_UiMobileHorizontalLayoutAssigment(ISerializationContext context, UiHorizontalLayoutAssigment semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiMobileHorizontalLayout returns UiHorizontalLayout
+	 *     UiMobileEmbeddable returns UiHorizontalLayout
+	 *     UiMobileLayout returns UiHorizontalLayout
+	 *
 	 * Constraint:
 	 *     (
-	 *         (i18nInfo=UiI18nInfo? styles=STRING? readonly?='readonly'?)? 
+	 *         (i18nInfo=UiI18nInfo | styles=STRING | readonly?='readonly')* 
 	 *         name=ID? 
 	 *         contents+=UiMobileHorizontalLayoutAssigment* 
 	 *         bindings+=UiBinding* 
 	 *         processorAssignments+=UiVisibilityProcessorAssignment*
 	 *     )
 	 */
-	protected void sequence_UiMobileHorizontalLayout(EObject context, UiHorizontalLayout semanticObject) {
+	protected void sequence_UiMobileHorizontalLayout(ISerializationContext context, UiHorizontalLayout semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiMobileNavBarAction returns UiMobileNavBarAction
+	 *
 	 * Constraint:
 	 *     (name=ID iconName=STRING? (actionReference=[UxAction|QualifiedName] | actionID=STRING))
 	 */
-	protected void sequence_UiMobileNavBarAction(EObject context, UiMobileNavBarAction semanticObject) {
+	protected void sequence_UiMobileNavBarAction(ISerializationContext context, UiMobileNavBarAction semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiMobileNavigationButton returns UiMobileNavigationButton
+	 *     UiMobileEmbeddable returns UiMobileNavigationButton
+	 *     UiMobileAction returns UiMobileNavigationButton
+	 *
 	 * Constraint:
 	 *     (
-	 *         (i18nInfo=UiI18nInfo? readonly?='readonly'? styles=STRING?)? 
+	 *         i18nInfo=UiI18nInfo? 
+	 *         ((readonly?='readonly' | styles=STRING)? i18nInfo=UiI18nInfo?)* 
 	 *         name=ID? 
 	 *         (targetPage=UiMobileNavigationPage | targetPageAlias=[UiMobileNavigationPage|ID])
 	 *     )
 	 */
-	protected void sequence_UiMobileNavigationButton(EObject context, UiMobileNavigationButton semanticObject) {
+	protected void sequence_UiMobileNavigationButton(ISerializationContext context, UiMobileNavigationButton semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiCommand returns UiMobileNavigationCommand
+	 *     UiMobileNavigationCommand returns UiMobileNavigationCommand
+	 *
 	 * Constraint:
 	 *     targetPage=UiMobileNavigationPage
 	 */
-	protected void sequence_UiMobileNavigationCommand(EObject context, UiMobileNavigationCommand semanticObject) {
-		genericSequencer.createSequence(context, semanticObject);
+	protected void sequence_UiMobileNavigationCommand(ISerializationContext context, UiMobileNavigationCommand semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_MOBILE_NAVIGATION_COMMAND__TARGET_PAGE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_MOBILE_NAVIGATION_COMMAND__TARGET_PAGE));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getUiMobileNavigationCommandAccess().getTargetPageUiMobileNavigationPageParserRuleCall_2_0(), semanticObject.eGet(UiModelPackage.Literals.UI_MOBILE_NAVIGATION_COMMAND__TARGET_PAGE, false));
+		feeder.finish();
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiMobileNavigationPageAssignment returns UiMobileNavigationPageAssignment
+	 *
 	 * Constraint:
 	 *     (element=UiMobileEmbeddable alignment=UiAlignment?)
 	 */
-	protected void sequence_UiMobileNavigationPageAssignment(EObject context, UiMobileNavigationPageAssignment semanticObject) {
+	protected void sequence_UiMobileNavigationPageAssignment(ISerializationContext context, UiMobileNavigationPageAssignment semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiMobileNavigationPage returns UiMobileNavigationPage
+	 *     UiMobileEmbeddable returns UiMobileNavigationPage
+	 *     UiMobileLayout returns UiMobileNavigationPage
+	 *
 	 * Constraint:
 	 *     (
-	 *         (i18nInfo=UiI18nInfo? styles=STRING?)? 
+	 *         (i18nInfo=UiI18nInfo | styles=STRING)* 
 	 *         name=ID? 
 	 *         jvmType=JvmTypeReference? 
 	 *         barActions+=UiMobileNavBarAction* 
@@ -2628,33 +1715,52 @@
 	 *         processorAssignments+=UiVisibilityProcessorAssignment*
 	 *     )
 	 */
-	protected void sequence_UiMobileNavigationPage(EObject context, UiMobileNavigationPage semanticObject) {
+	protected void sequence_UiMobileNavigationPage(ISerializationContext context, UiMobileNavigationPage semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiMobileNavigationRootAssigment returns UiMobileNavigationRootAssigment
+	 *
 	 * Constraint:
 	 *     element=UiMobileNavigationPage
 	 */
-	protected void sequence_UiMobileNavigationRootAssigment(EObject context, UiMobileNavigationRootAssigment semanticObject) {
-		genericSequencer.createSequence(context, semanticObject);
+	protected void sequence_UiMobileNavigationRootAssigment(ISerializationContext context, UiMobileNavigationRootAssigment semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_MOBILE_NAVIGATION_ROOT_ASSIGMENT__ELEMENT) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_MOBILE_NAVIGATION_ROOT_ASSIGMENT__ELEMENT));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getUiMobileNavigationRootAssigmentAccess().getElementUiMobileNavigationPageParserRuleCall_0(), semanticObject.eGet(UiModelPackage.Literals.UI_MOBILE_NAVIGATION_ROOT_ASSIGMENT__ELEMENT, false));
+		feeder.finish();
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiMobileNavigationRoot returns UiMobileNavigationRoot
+	 *     UiMobileEmbeddable returns UiMobileNavigationRoot
+	 *     UiMobileLayout returns UiMobileNavigationRoot
+	 *
 	 * Constraint:
 	 *     (name=ID? contents+=UiMobileNavigationRootAssigment)
 	 */
-	protected void sequence_UiMobileNavigationRoot(EObject context, UiMobileNavigationRoot semanticObject) {
+	protected void sequence_UiMobileNavigationRoot(ISerializationContext context, UiMobileNavigationRoot semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiMobileSearchPanel returns UiMobileSearchPanel
+	 *     UiMobileEmbeddable returns UiMobileSearchPanel
+	 *     UiMobileLayout returns UiMobileSearchPanel
+	 *
 	 * Constraint:
 	 *     (
-	 *         (i18nInfo=UiI18nInfo? styles=STRING?)? 
+	 *         (i18nInfo=UiI18nInfo | styles=STRING)* 
 	 *         name=ID? 
 	 *         jvmType=JvmTypeReference 
 	 *         contents+=UiSearchField* 
@@ -2662,102 +1768,142 @@
 	 *         processorAssignments+=UiVisibilityProcessorAssignment*
 	 *     )
 	 */
-	protected void sequence_UiMobileSearchPanel(EObject context, UiMobileSearchPanel semanticObject) {
+	protected void sequence_UiMobileSearchPanel(ISerializationContext context, UiMobileSearchPanel semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiMobileSwitch returns UiSwitch
+	 *     UiMobileEmbeddable returns UiSwitch
+	 *     UiMobileField returns UiSwitch
+	 *
 	 * Constraint:
 	 *     (
-	 *         (i18nInfo=UiI18nInfo? readonly?='readonly'? styles=STRING?)? 
+	 *         (i18nInfo=UiI18nInfo | readonly?='readonly' | styles=STRING)* 
 	 *         name=ID? 
-	 *         (processorAssignments+=UiVisibilityProcessorAssignment* (validators+=UiValidator | bindings+=UiBinding)*)?
+	 *         processorAssignments+=UiVisibilityProcessorAssignment* 
+	 *         validators+=UiValidator? 
+	 *         (bindings+=UiBinding? validators+=UiValidator?)*
 	 *     )
 	 */
-	protected void sequence_UiMobileSwitch(EObject context, UiSwitch semanticObject) {
+	protected void sequence_UiMobileSwitch(ISerializationContext context, UiSwitch semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiMobileTabAssignment returns UiMobileTabAssignment
+	 *
 	 * Constraint:
 	 *     (name=ID? element=UiMobileEmbeddable)
 	 */
-	protected void sequence_UiMobileTabAssignment(EObject context, UiMobileTabAssignment semanticObject) {
+	protected void sequence_UiMobileTabAssignment(ISerializationContext context, UiMobileTabAssignment semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiMobileTabSheet returns UiMobileTabSheet
+	 *     UiMobileEmbeddable returns UiMobileTabSheet
+	 *
 	 * Constraint:
 	 *     (
-	 *         (i18nInfo=UiI18nInfo? styles=STRING?)? 
+	 *         (i18nInfo=UiI18nInfo | styles=STRING)* 
 	 *         name=ID? 
 	 *         tabs+=UiMobileTabAssignment* 
 	 *         bindings+=UiBinding* 
 	 *         processorAssignments+=UiVisibilityProcessorAssignment*
 	 *     )
 	 */
-	protected void sequence_UiMobileTabSheet(EObject context, UiMobileTabSheet semanticObject) {
+	protected void sequence_UiMobileTabSheet(ISerializationContext context, UiMobileTabSheet semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiMobileVerticalComponentGroupAssigment returns UiVerticalComponentGroupAssigment
+	 *
 	 * Constraint:
 	 *     element=UiMobileEmbeddable
 	 */
-	protected void sequence_UiMobileVerticalComponentGroupAssigment(EObject context, UiVerticalComponentGroupAssigment semanticObject) {
-		genericSequencer.createSequence(context, semanticObject);
+	protected void sequence_UiMobileVerticalComponentGroupAssigment(ISerializationContext context, UiVerticalComponentGroupAssigment semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_VERTICAL_COMPONENT_GROUP_ASSIGMENT__ELEMENT) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_VERTICAL_COMPONENT_GROUP_ASSIGMENT__ELEMENT));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getUiMobileVerticalComponentGroupAssigmentAccess().getElementUiMobileEmbeddableParserRuleCall_0(), semanticObject.eGet(UiModelPackage.Literals.UI_VERTICAL_COMPONENT_GROUP_ASSIGMENT__ELEMENT, false));
+		feeder.finish();
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiMobileVerticalComponentGroup returns UiVerticalComponentGroup
+	 *     UiMobileEmbeddable returns UiVerticalComponentGroup
+	 *     UiMobileLayout returns UiVerticalComponentGroup
+	 *
 	 * Constraint:
 	 *     (
-	 *         (i18nInfo=UiI18nInfo? readonly?='readonly'? styles=STRING?)? 
+	 *         (i18nInfo=UiI18nInfo | readonly?='readonly' | styles=STRING)* 
 	 *         name=ID? 
 	 *         contents+=UiMobileVerticalComponentGroupAssigment* 
 	 *         bindings+=UiBinding* 
 	 *         processorAssignments+=UiVisibilityProcessorAssignment*
 	 *     )
 	 */
-	protected void sequence_UiMobileVerticalComponentGroup(EObject context, UiVerticalComponentGroup semanticObject) {
+	protected void sequence_UiMobileVerticalComponentGroup(ISerializationContext context, UiVerticalComponentGroup semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiMobileVerticalLayoutAssigment returns UiVerticalLayoutAssigment
+	 *
 	 * Constraint:
 	 *     (element=UiMobileEmbeddable alignment=UiAlignment?)
 	 */
-	protected void sequence_UiMobileVerticalLayoutAssigment(EObject context, UiVerticalLayoutAssigment semanticObject) {
+	protected void sequence_UiMobileVerticalLayoutAssigment(ISerializationContext context, UiVerticalLayoutAssigment semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiMobileVerticalLayout returns UiVerticalLayout
+	 *     UiMobileEmbeddable returns UiVerticalLayout
+	 *     UiMobileLayout returns UiVerticalLayout
+	 *
 	 * Constraint:
 	 *     (
-	 *         (i18nInfo=UiI18nInfo? styles=STRING? readonly?='readonly'?)? 
+	 *         (i18nInfo=UiI18nInfo | styles=STRING | readonly?='readonly')* 
 	 *         name=ID? 
 	 *         contents+=UiMobileVerticalLayoutAssigment* 
 	 *         bindings+=UiBinding* 
 	 *         processorAssignments+=UiVisibilityProcessorAssignment*
 	 *     )
 	 */
-	protected void sequence_UiMobileVerticalLayout(EObject context, UiVerticalLayout semanticObject) {
+	protected void sequence_UiMobileVerticalLayout(ISerializationContext context, UiVerticalLayout semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiRootElements returns UiMobileView
+	 *     UiMobileView returns UiMobileView
+	 *
 	 * Constraint:
 	 *     (
 	 *         name=ID 
-	 *         sharedStateGroup=STRING? 
 	 *         jvmType=JvmTypeReference? 
+	 *         (sharedStateGroup=STRING? jvmType=JvmTypeReference?)* 
 	 *         (beanSlots+=UiBeanSlot | bindingEndpointAlias+=UiBindingEndpointAlias)* 
 	 *         content=UiMobileEmbeddable 
 	 *         contentAlignment=UiAlignment? 
@@ -2769,124 +1915,179 @@
 	 *         )*
 	 *     )
 	 */
-	protected void sequence_UiMobileView(EObject context, UiMobileView semanticObject) {
+	protected void sequence_UiMobileView(ISerializationContext context, UiMobileView semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiModel returns UiModel
+	 *
 	 * Constraint:
-	 *     (packageName=QualifiedName imports+=UiImports* roots+=UiRootElements*)
+	 *     (packageName=QualifiedName importSection=XImportSection? roots+=UiRootElements*)
 	 */
-	protected void sequence_UiModel(EObject context, UiModel semanticObject) {
+	protected void sequence_UiModel(ISerializationContext context, UiModel semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiNestedProperty returns UiNestedProperty
+	 *
 	 * Constraint:
 	 *     (getter=[JvmOperation|ID] path=UiPathSegment?)
 	 */
-	protected void sequence_UiNestedProperty(EObject context, UiNestedProperty semanticObject) {
+	protected void sequence_UiNestedProperty(ISerializationContext context, UiNestedProperty semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiEmbeddable returns UiNumericField
+	 *     UiMobileEmbeddable returns UiNumericField
+	 *     UiMobileField returns UiNumericField
+	 *     UiField returns UiNumericField
+	 *     UiNumericField returns UiNumericField
+	 *
 	 * Constraint:
 	 *     (
-	 *         (noGrouping?='noGrouping'? styles=STRING? noMarkNegative?='noMarkNegative'? i18nInfo=UiI18nInfo? readonly?='readonly'?)? 
+	 *         readonly?='readonly'? 
+	 *         ((noGrouping?='noGrouping' | styles=STRING | noMarkNegative?='noMarkNegative' | i18nInfo=UiI18nInfo)? readonly?='readonly'?)* 
 	 *         name=ID? 
-	 *         ((validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment*)?
+	 *         (validators+=UiValidator | bindings+=UiBinding)* 
+	 *         processorAssignments+=UiVisibilityProcessorAssignment*
 	 *     )
 	 */
-	protected void sequence_UiNumericField(EObject context, UiNumericField semanticObject) {
+	protected void sequence_UiNumericField(ISerializationContext context, UiNumericField semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiCommand returns UiOpenDialogCommand
+	 *     UiOpenDialogCommand returns UiOpenDialogCommand
+	 *
 	 * Constraint:
 	 *     dialog=UiDialog
 	 */
-	protected void sequence_UiOpenDialogCommand(EObject context, UiOpenDialogCommand semanticObject) {
-		genericSequencer.createSequence(context, semanticObject);
+	protected void sequence_UiOpenDialogCommand(ISerializationContext context, UiOpenDialogCommand semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_OPEN_DIALOG_COMMAND__DIALOG) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_OPEN_DIALOG_COMMAND__DIALOG));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getUiOpenDialogCommandAccess().getDialogUiDialogParserRuleCall_2_0(), semanticObject.eGet(UiModelPackage.Literals.UI_OPEN_DIALOG_COMMAND__DIALOG, false));
+		feeder.finish();
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiOptionsGroup returns UiOptionsGroup
+	 *     UiEmbeddable returns UiOptionsGroup
+	 *     UiMobileEmbeddable returns UiOptionsGroup
+	 *     UiMobileField returns UiOptionsGroup
+	 *     UiField returns UiOptionsGroup
+	 *
 	 * Constraint:
 	 *     (
-	 *         (i18nInfo=UiI18nInfo? styles=STRING?)? 
+	 *         (i18nInfo=UiI18nInfo | styles=STRING)* 
 	 *         name=ID? 
+	 *         jvmType=JvmTypeReference? 
 	 *         (
-	 *             jvmType=JvmTypeReference? 
-	 *             selectionType=UiSelectionType? 
-	 *             itemCaptionProperty=[JvmOperation|ID]? 
-	 *             descriptionProperty=UiNestedProperty? 
-	 *             itemImageProperty=[JvmOperation|ID]? 
-	 *             consumeBeanService?='useBeanService'? 
-	 *             readonly?='readonly'? 
-	 *             (validators+=UiValidator | bindings+=UiBinding)* 
-	 *             processorAssignments+=UiVisibilityProcessorAssignment*
-	 *         )?
+	 *             (
+	 *                 selectionType=UiSelectionType | 
+	 *                 itemCaptionProperty=[JvmOperation|ID] | 
+	 *                 descriptionProperty=UiNestedProperty | 
+	 *                 itemImageProperty=[JvmOperation|ID] | 
+	 *                 consumeBeanService?='useBeanService' | 
+	 *                 readonly?='readonly'
+	 *             )? 
+	 *             jvmType=JvmTypeReference?
+	 *         )* 
+	 *         validators+=UiValidator? 
+	 *         (bindings+=UiBinding? validators+=UiValidator?)* 
+	 *         processorAssignments+=UiVisibilityProcessorAssignment*
 	 *     )
 	 */
-	protected void sequence_UiOptionsGroup(EObject context, UiOptionsGroup semanticObject) {
+	protected void sequence_UiOptionsGroup(ISerializationContext context, UiOptionsGroup semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiPanel returns UiPanel
+	 *     UiEmbeddable returns UiPanel
+	 *     UiLayout returns UiPanel
+	 *
 	 * Constraint:
 	 *     (
-	 *         (i18nInfo=UiI18nInfo? readonly?='readonly'? styles=STRING?)? 
+	 *         (i18nInfo=UiI18nInfo | readonly?='readonly' | styles=STRING)* 
 	 *         name=ID 
 	 *         content=UiEmbeddable 
 	 *         bindings+=UiBinding* 
 	 *         processorAssignments+=UiVisibilityProcessorAssignment*
 	 *     )
 	 */
-	protected void sequence_UiPanel(EObject context, UiPanel semanticObject) {
+	protected void sequence_UiPanel(ISerializationContext context, UiPanel semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiPasswordField returns UiPasswordField
+	 *     UiEmbeddable returns UiPasswordField
+	 *     UiMobileEmbeddable returns UiPasswordField
+	 *     UiMobileField returns UiPasswordField
+	 *     UiField returns UiPasswordField
+	 *
 	 * Constraint:
 	 *     (
-	 *         (styles=STRING? i18nInfo=UiI18nInfo? readonly?='readonly'?)? 
+	 *         (styles=STRING | i18nInfo=UiI18nInfo | readonly?='readonly')* 
 	 *         name=ID? 
-	 *         ((validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment*)?
+	 *         validators+=UiValidator? 
+	 *         (bindings+=UiBinding? validators+=UiValidator?)* 
+	 *         processorAssignments+=UiVisibilityProcessorAssignment*
 	 *     )
 	 */
-	protected void sequence_UiPasswordField(EObject context, UiPasswordField semanticObject) {
+	protected void sequence_UiPasswordField(ISerializationContext context, UiPasswordField semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiPathSegment returns UiPathSegment
+	 *
 	 * Constraint:
 	 *     (getter=[JvmOperation|ID] path=UiPathSegment?)
 	 */
-	protected void sequence_UiPathSegment(EObject context, UiPathSegment semanticObject) {
+	protected void sequence_UiPathSegment(ISerializationContext context, UiPathSegment semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiPoint returns UiPoint
+	 *
 	 * Constraint:
 	 *     (x=INT y=INT)
 	 */
-	protected void sequence_UiPoint(EObject context, UiPoint semanticObject) {
-		if(errorAcceptor != null) {
-			if(transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_POINT__X) == ValueTransient.YES)
+	protected void sequence_UiPoint(ISerializationContext context, UiPoint semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_POINT__X) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_POINT__X));
-			if(transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_POINT__Y) == ValueTransient.YES)
+			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_POINT__Y) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_POINT__Y));
 		}
-		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
-		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
 		feeder.accept(grammarAccess.getUiPointAccess().getXINTTerminalRuleCall_0_0(), semanticObject.getX());
 		feeder.accept(grammarAccess.getUiPointAccess().getYINTTerminalRuleCall_2_0(), semanticObject.getY());
 		feeder.finish();
@@ -2894,18 +2095,20 @@
 	
 	
 	/**
+	 * Contexts:
+	 *     UiPrefixToMaskMapEntry returns UiPrefixToMaskMapEntry
+	 *
 	 * Constraint:
 	 *     (key=STRING value=STRING)
 	 */
-	protected void sequence_UiPrefixToMaskMapEntry(EObject context, Entry<?, ?> semanticObject) {
-		if(errorAcceptor != null) {
-			if(transientValues.isValueTransient((EObject)semanticObject, UiModelPackage.Literals.UI_PREFIX_TO_MASK_MAP_ENTRY__KEY) == ValueTransient.YES)
-				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing((EObject)semanticObject, UiModelPackage.Literals.UI_PREFIX_TO_MASK_MAP_ENTRY__KEY));
-			if(transientValues.isValueTransient((EObject)semanticObject, UiModelPackage.Literals.UI_PREFIX_TO_MASK_MAP_ENTRY__VALUE) == ValueTransient.YES)
-				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing((EObject)semanticObject, UiModelPackage.Literals.UI_PREFIX_TO_MASK_MAP_ENTRY__VALUE));
+	protected void sequence_UiPrefixToMaskMapEntry(ISerializationContext context, Map.Entry semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient((EObject) semanticObject, UiModelPackage.Literals.UI_PREFIX_TO_MASK_MAP_ENTRY__KEY) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing((EObject) semanticObject, UiModelPackage.Literals.UI_PREFIX_TO_MASK_MAP_ENTRY__KEY));
+			if (transientValues.isValueTransient((EObject) semanticObject, UiModelPackage.Literals.UI_PREFIX_TO_MASK_MAP_ENTRY__VALUE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing((EObject) semanticObject, UiModelPackage.Literals.UI_PREFIX_TO_MASK_MAP_ENTRY__VALUE));
 		}
-		INodesForEObjectProvider nodes = createNodeProvider((EObject)semanticObject);
-		SequenceFeeder feeder = createSequencerFeeder((EObject)semanticObject, nodes);
+		SequenceFeeder feeder = createSequencerFeeder(context, (EObject) semanticObject);
 		feeder.accept(grammarAccess.getUiPrefixToMaskMapEntryAccess().getKeySTRINGTerminalRuleCall_2_0(), semanticObject.getKey());
 		feeder.accept(grammarAccess.getUiPrefixToMaskMapEntryAccess().getValueSTRINGTerminalRuleCall_4_0(), semanticObject.getValue());
 		feeder.finish();
@@ -2913,81 +2116,125 @@
 	
 	
 	/**
+	 * Contexts:
+	 *     UiPrefixedMaskedTextField returns UiPrefixedMaskedTextField
+	 *     UiEmbeddable returns UiPrefixedMaskedTextField
+	 *     UiMobileEmbeddable returns UiPrefixedMaskedTextField
+	 *     UiMobileField returns UiPrefixedMaskedTextField
+	 *     UiField returns UiPrefixedMaskedTextField
+	 *
 	 * Constraint:
 	 *     (
 	 *         (
-	 *             styles=STRING? 
-	 *             mask=STRING? 
-	 *             (prefixMasks+=UiPrefixToMaskMapEntry prefixMasks+=UiPrefixToMaskMapEntry*)? 
-	 *             i18nInfo=UiI18nInfo? 
-	 *             readonly?='readonly'?
-	 *         )? 
+	 *             (styles=STRING | mask=STRING | i18nInfo=UiI18nInfo | readonly?='readonly')? 
+	 *             (prefixMasks+=UiPrefixToMaskMapEntry prefixMasks+=UiPrefixToMaskMapEntry*)?
+	 *         )+ 
 	 *         name=ID? 
-	 *         ((validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment*)?
+	 *         validators+=UiValidator? 
+	 *         (bindings+=UiBinding? validators+=UiValidator?)* 
+	 *         processorAssignments+=UiVisibilityProcessorAssignment*
 	 *     )
 	 */
-	protected void sequence_UiPrefixedMaskedTextField(EObject context, UiPrefixedMaskedTextField semanticObject) {
+	protected void sequence_UiPrefixedMaskedTextField(ISerializationContext context, UiPrefixedMaskedTextField semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiProgressBar returns UiProgressBar
+	 *     UiEmbeddable returns UiProgressBar
+	 *     UiMobileEmbeddable returns UiProgressBar
+	 *     UiMobileField returns UiProgressBar
+	 *     UiField returns UiProgressBar
+	 *
 	 * Constraint:
 	 *     (
-	 *         (i18nInfo=UiI18nInfo? styles=STRING?)? 
+	 *         (i18nInfo=UiI18nInfo | styles=STRING)* 
 	 *         name=ID? 
-	 *         ((validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment*)?
+	 *         validators+=UiValidator? 
+	 *         (bindings+=UiBinding? validators+=UiValidator?)* 
+	 *         processorAssignments+=UiVisibilityProcessorAssignment*
 	 *     )
 	 */
-	protected void sequence_UiProgressBar(EObject context, UiProgressBar semanticObject) {
+	protected void sequence_UiProgressBar(ISerializationContext context, UiProgressBar semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiRawBindablePathSegment returns UiRawBindablePathSegment
+	 *
 	 * Constraint:
 	 *     (toParent?='..'? rawBindable=[UiRawBindable|ID] path=UiRawBindablePathSegment?)
 	 */
-	protected void sequence_UiRawBindablePathSegment(EObject context, UiRawBindablePathSegment semanticObject) {
+	protected void sequence_UiRawBindablePathSegment(ISerializationContext context, UiRawBindablePathSegment semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiValidator returns UiRegexpValidator
+	 *     UiRegexpValidator returns UiRegexpValidator
+	 *
 	 * Constraint:
 	 *     (name=ID? regExpression=STRING errorCode=UiErrorCode?)
 	 */
-	protected void sequence_UiRegexpValidator(EObject context, UiRegexpValidator semanticObject) {
+	protected void sequence_UiRegexpValidator(ISerializationContext context, UiRegexpValidator semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiCommand returns UiRemoveFromTableCommand
+	 *     UiRemoveFromTableCommand returns UiRemoveFromTableCommand
+	 *
 	 * Constraint:
 	 *     table=[UiTable|ID]
 	 */
-	protected void sequence_UiRemoveFromTableCommand(EObject context, UiRemoveFromTableCommand semanticObject) {
-		genericSequencer.createSequence(context, semanticObject);
+	protected void sequence_UiRemoveFromTableCommand(ISerializationContext context, UiRemoveFromTableCommand semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_REMOVE_FROM_TABLE_COMMAND__TABLE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_REMOVE_FROM_TABLE_COMMAND__TABLE));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getUiRemoveFromTableCommandAccess().getTableUiTableIDTerminalRuleCall_2_0_1(), semanticObject.eGet(UiModelPackage.Literals.UI_REMOVE_FROM_TABLE_COMMAND__TABLE, false));
+		feeder.finish();
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiRichTextArea returns UiRichTextArea
+	 *     UiEmbeddable returns UiRichTextArea
+	 *     UiMobileEmbeddable returns UiRichTextArea
+	 *     UiMobileField returns UiRichTextArea
+	 *     UiField returns UiRichTextArea
+	 *
 	 * Constraint:
 	 *     (
-	 *         (styles=STRING? i18nInfo=UiI18nInfo? asBlob?='asBlob'? readonly?='readonly'?)? 
+	 *         (styles=STRING | i18nInfo=UiI18nInfo | asBlob?='asBlob' | readonly?='readonly')* 
 	 *         name=ID? 
-	 *         ((validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment*)?
+	 *         validators+=UiValidator? 
+	 *         (bindings+=UiBinding? validators+=UiValidator?)* 
+	 *         processorAssignments+=UiVisibilityProcessorAssignment*
 	 *     )
 	 */
-	protected void sequence_UiRichTextArea(EObject context, UiRichTextArea semanticObject) {
+	protected void sequence_UiRichTextArea(ISerializationContext context, UiRichTextArea semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiSearchDialog returns UiSearchDialog
+	 *
 	 * Constraint:
 	 *     (
-	 *         (i18nInfo=UiI18nInfo? styles=STRING?)? 
+	 *         (i18nInfo=UiI18nInfo | styles=STRING)* 
 	 *         name=ID? 
 	 *         jvmType=JvmTypeReference? 
 	 *         searchFields+=UiDialogSearchFieldAssignment* 
@@ -2996,24 +2243,36 @@
 	 *         processorAssignments+=UiVisibilityProcessorAssignment*
 	 *     )
 	 */
-	protected void sequence_UiSearchDialog(EObject context, UiSearchDialog semanticObject) {
+	protected void sequence_UiSearchDialog(ISerializationContext context, UiSearchDialog semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiSearchField returns UiSearchField
+	 *     UiEmbeddable returns UiSearchField
+	 *     UiMobileEmbeddable returns UiSearchField
+	 *     UiMobileField returns UiSearchField
+	 *     UiField returns UiSearchField
+	 *
 	 * Constraint:
-	 *     ((i18nInfo=UiI18nInfo? styles=STRING?)? property=UiNestedProperty)
+	 *     ((i18nInfo=UiI18nInfo | styles=STRING)* property=UiNestedProperty)
 	 */
-	protected void sequence_UiSearchField(EObject context, UiSearchField semanticObject) {
+	protected void sequence_UiSearchField(ISerializationContext context, UiSearchField semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiSearchPanel returns UiSearchPanel
+	 *     UiEmbeddable returns UiSearchPanel
+	 *     UiLayout returns UiSearchPanel
+	 *
 	 * Constraint:
 	 *     (
-	 *         (i18nInfo=UiI18nInfo? styles=STRING?)? 
+	 *         (i18nInfo=UiI18nInfo | styles=STRING)* 
 	 *         name=ID? 
 	 *         jvmType=JvmTypeReference 
 	 *         contents+=UiSearchField* 
@@ -3021,282 +2280,433 @@
 	 *         processorAssignments+=UiVisibilityProcessorAssignment*
 	 *     )
 	 */
-	protected void sequence_UiSearchPanel(EObject context, UiSearchPanel semanticObject) {
+	protected void sequence_UiSearchPanel(ISerializationContext context, UiSearchPanel semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiCommand returns UiSearchWithDialogCommand
+	 *     UiSearchWithDialogCommand returns UiSearchWithDialogCommand
+	 *
 	 * Constraint:
 	 *     dialog=UiSearchDialog
 	 */
-	protected void sequence_UiSearchWithDialogCommand(EObject context, UiSearchWithDialogCommand semanticObject) {
-		genericSequencer.createSequence(context, semanticObject);
+	protected void sequence_UiSearchWithDialogCommand(ISerializationContext context, UiSearchWithDialogCommand semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_SEARCH_WITH_DIALOG_COMMAND__DIALOG) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_SEARCH_WITH_DIALOG_COMMAND__DIALOG));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getUiSearchWithDialogCommandAccess().getDialogUiSearchDialogParserRuleCall_2_0(), semanticObject.eGet(UiModelPackage.Literals.UI_SEARCH_WITH_DIALOG_COMMAND__DIALOG, false));
+		feeder.finish();
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiCommand returns UiSendEventCommand
+	 *     UiSendEventCommand returns UiSendEventCommand
+	 *
 	 * Constraint:
 	 *     (noAutoTrigger?='noAutoTrigger'? eventTopic=STRING)
 	 */
-	protected void sequence_UiSendEventCommand(EObject context, UiSendEventCommand semanticObject) {
+	protected void sequence_UiSendEventCommand(ISerializationContext context, UiSendEventCommand semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiCommand returns UiSetNewInstanceCommand
+	 *     UiSetNewInstanceCommand returns UiSetNewInstanceCommand
+	 *
 	 * Constraint:
 	 *     (jvmType=JvmTypeReference? target=UiBindingEndpointAssignment)
 	 */
-	protected void sequence_UiSetNewInstanceCommand(EObject context, UiSetNewInstanceCommand semanticObject) {
+	protected void sequence_UiSetNewInstanceCommand(ISerializationContext context, UiSetNewInstanceCommand semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiSortOrderAssignment returns UiSortOrderAssignment
+	 *
 	 * Constraint:
-	 *     (columns+=UiSortOrder*)
+	 *     columns+=UiSortOrder*
 	 */
-	protected void sequence_UiSortOrderAssignment(EObject context, UiSortOrderAssignment semanticObject) {
+	protected void sequence_UiSortOrderAssignment(ISerializationContext context, UiSortOrderAssignment semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiSortOrder returns UiSortOrder
+	 *
 	 * Constraint:
 	 *     (property=UiNestedProperty asc?='asc'?)
 	 */
-	protected void sequence_UiSortOrder(EObject context, UiSortOrder semanticObject) {
+	protected void sequence_UiSortOrder(ISerializationContext context, UiSortOrder semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiSplitpanelAssigment returns UiSplitpanelAssigment
+	 *
 	 * Constraint:
 	 *     element=UiEmbeddable
 	 */
-	protected void sequence_UiSplitpanelAssigment(EObject context, UiSplitpanelAssigment semanticObject) {
-		genericSequencer.createSequence(context, semanticObject);
+	protected void sequence_UiSplitpanelAssigment(ISerializationContext context, UiSplitpanelAssigment semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_SPLITPANEL_ASSIGMENT__ELEMENT) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_SPLITPANEL_ASSIGMENT__ELEMENT));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getUiSplitpanelAssigmentAccess().getElementUiEmbeddableParserRuleCall_0(), semanticObject.eGet(UiModelPackage.Literals.UI_SPLITPANEL_ASSIGMENT__ELEMENT, false));
+		feeder.finish();
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiSplitpanel returns UiSplitpanel
+	 *     UiEmbeddable returns UiSplitpanel
+	 *     UiLayout returns UiSplitpanel
+	 *
 	 * Constraint:
 	 *     (
-	 *         (i18nInfo=UiI18nInfo? styles=STRING?)? 
+	 *         (i18nInfo=UiI18nInfo | styles=STRING)* 
 	 *         name=ID 
-	 *         firstContent=UiSplitpanelAssigment 
-	 *         secondContent=UiSplitpanelAssigment 
-	 *         splitPosition=INT? 
-	 *         readonly?='readonly'? 
+	 *         (firstContent=UiSplitpanelAssigment | secondContent=UiSplitpanelAssigment | splitPosition=INT | readonly?='readonly')* 
 	 *         bindings+=UiBinding* 
 	 *         processorAssignments+=UiVisibilityProcessorAssignment*
 	 *     )
 	 */
-	protected void sequence_UiSplitpanel(EObject context, UiSplitpanel semanticObject) {
+	protected void sequence_UiSplitpanel(ISerializationContext context, UiSplitpanel semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiSuggestTextField returns UiSuggestTextField
+	 *     UiEmbeddable returns UiSuggestTextField
+	 *     UiMobileEmbeddable returns UiSuggestTextField
+	 *     UiMobileField returns UiSuggestTextField
+	 *     UiField returns UiSuggestTextField
+	 *
 	 * Constraint:
 	 *     (
-	 *         (i18nInfo=UiI18nInfo? styles=STRING?)? 
+	 *         (i18nInfo=UiI18nInfo | styles=STRING)* 
 	 *         name=ID? 
+	 *         jvmType=JvmTypeReference? 
 	 *         (
-	 *             jvmType=JvmTypeReference? 
-	 *             itemCaptionProperty=[JvmOperation|ID]? 
-	 *             itemFilterProperty=[JvmOperation|ID]? 
-	 *             itemUUIDProperty=[JvmOperation|ID]? 
-	 *             autoHidePopup?='autoHidePopup'? 
-	 *             readonly?='readonly'? 
-	 *             (validators+=UiValidator | bindings+=UiBinding)* 
-	 *             processorAssignments+=UiVisibilityProcessorAssignment*
-	 *         )?
+	 *             (
+	 *                 itemCaptionProperty=[JvmOperation|ID] | 
+	 *                 itemFilterProperty=[JvmOperation|ID] | 
+	 *                 itemUUIDProperty=[JvmOperation|ID] | 
+	 *                 autoHidePopup?='autoHidePopup' | 
+	 *                 readonly?='readonly'
+	 *             )? 
+	 *             jvmType=JvmTypeReference?
+	 *         )* 
+	 *         validators+=UiValidator? 
+	 *         (bindings+=UiBinding? validators+=UiValidator?)* 
+	 *         processorAssignments+=UiVisibilityProcessorAssignment*
 	 *     )
 	 */
-	protected void sequence_UiSuggestTextField(EObject context, UiSuggestTextField semanticObject) {
+	protected void sequence_UiSuggestTextField(ISerializationContext context, UiSuggestTextField semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiTabAssignment returns UiTabAssignment
+	 *
 	 * Constraint:
 	 *     (name=ID? element=UiEmbeddable)
 	 */
-	protected void sequence_UiTabAssignment(EObject context, UiTabAssignment semanticObject) {
+	protected void sequence_UiTabAssignment(ISerializationContext context, UiTabAssignment semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiTabSheet returns UiTabSheet
+	 *     UiEmbeddable returns UiTabSheet
+	 *
 	 * Constraint:
 	 *     (
-	 *         (i18nInfo=UiI18nInfo? styles=STRING?)? 
+	 *         (i18nInfo=UiI18nInfo | styles=STRING)* 
 	 *         name=ID? 
 	 *         tabs+=UiTabAssignment* 
 	 *         bindings+=UiBinding* 
 	 *         processorAssignments+=UiVisibilityProcessorAssignment*
 	 *     )
 	 */
-	protected void sequence_UiTabSheet(EObject context, UiTabSheet semanticObject) {
+	protected void sequence_UiTabSheet(ISerializationContext context, UiTabSheet semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiTable returns UiTable
+	 *     UiEmbeddable returns UiTable
+	 *     UiMobileEmbeddable returns UiTable
+	 *     UiMobileField returns UiTable
+	 *     UiField returns UiTable
+	 *
 	 * Constraint:
 	 *     (
-	 *         (i18nInfo=UiI18nInfo? styles=STRING?)? 
+	 *         (i18nInfo=UiI18nInfo | styles=STRING)* 
 	 *         name=ID? 
+	 *         jvmType=JvmTypeReference? 
 	 *         (
-	 *             jvmType=JvmTypeReference? 
-	 *             selectionType=UiSelectionType? 
-	 *             itemImageProperty=[JvmOperation|ID]? 
-	 *             consumeBeanService?='useBeanService'? 
-	 *             readonly?='readonly'? 
-	 *             columnAssignment=UiColumnsAssignment? 
-	 *             sortOrderAssignment=UiSortOrderAssignment? 
-	 *             (validators+=UiValidator | bindings+=UiBinding)* 
-	 *             processorAssignments+=UiVisibilityProcessorAssignment*
-	 *         )?
+	 *             (
+	 *                 selectionType=UiSelectionType | 
+	 *                 itemImageProperty=[JvmOperation|ID] | 
+	 *                 consumeBeanService?='useBeanService' | 
+	 *                 scrollToBottom?='scrollToBottom' | 
+	 *                 readonly?='readonly'
+	 *             )? 
+	 *             jvmType=JvmTypeReference?
+	 *         )* 
+	 *         columnAssignment=UiColumnsAssignment? 
+	 *         sortOrderAssignment=UiSortOrderAssignment? 
+	 *         validators+=UiValidator? 
+	 *         (bindings+=UiBinding? validators+=UiValidator?)* 
+	 *         processorAssignments+=UiVisibilityProcessorAssignment*
 	 *     )
 	 */
-	protected void sequence_UiTable(EObject context, UiTable semanticObject) {
+	protected void sequence_UiTable(ISerializationContext context, UiTable semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiTextArea returns UiTextArea
+	 *     UiEmbeddable returns UiTextArea
+	 *     UiMobileEmbeddable returns UiTextArea
+	 *     UiMobileField returns UiTextArea
+	 *     UiField returns UiTextArea
+	 *
 	 * Constraint:
 	 *     (
-	 *         (i18nInfo=UiI18nInfo? readonly?='readonly'? styles=STRING?)? 
+	 *         (i18nInfo=UiI18nInfo | readonly?='readonly' | styles=STRING)* 
 	 *         name=ID? 
-	 *         ((validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment*)?
+	 *         validators+=UiValidator? 
+	 *         (bindings+=UiBinding? validators+=UiValidator?)* 
+	 *         processorAssignments+=UiVisibilityProcessorAssignment*
 	 *     )
 	 */
-	protected void sequence_UiTextArea(EObject context, UiTextArea semanticObject) {
+	protected void sequence_UiTextArea(ISerializationContext context, UiTextArea semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiTextField returns UiTextField
+	 *     UiEmbeddable returns UiTextField
+	 *     UiMobileEmbeddable returns UiTextField
+	 *     UiMobileField returns UiTextField
+	 *     UiField returns UiTextField
+	 *
 	 * Constraint:
 	 *     (
 	 *         (
-	 *             maxLength=INT? 
-	 *             minLength=INT? 
-	 *             regex=STRING? 
-	 *             styles=STRING? 
-	 *             i18nInfo=UiI18nInfo? 
-	 *             readonly?='readonly'?
-	 *         )? 
+	 *             maxLength=INT | 
+	 *             minLength=INT | 
+	 *             regex=STRING | 
+	 *             styles=STRING | 
+	 *             i18nInfo=UiI18nInfo | 
+	 *             readonly?='readonly'
+	 *         )* 
 	 *         name=ID? 
-	 *         ((validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment*)?
+	 *         validators+=UiValidator? 
+	 *         (bindings+=UiBinding? validators+=UiValidator?)* 
+	 *         processorAssignments+=UiVisibilityProcessorAssignment*
 	 *     )
 	 */
-	protected void sequence_UiTextField(EObject context, UiTextField semanticObject) {
+	protected void sequence_UiTextField(ISerializationContext context, UiTextField semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiBindingEndpointAssignment.UiBindingEndpointAssignment_0_1 returns UiTypedBindableDef
+	 *     UiTypedBindableDef returns UiTypedBindableDef
+	 *
 	 * Constraint:
 	 *     (rawBindable=[UiRawBindable|ID] rawBindablePath=UiRawBindablePathSegment? method=[UxEndpointDef|ID])
 	 */
-	protected void sequence_UiTypedBindableDef(EObject context, UiTypedBindableDef semanticObject) {
+	protected void sequence_UiTypedBindableDef(ISerializationContext context, UiTypedBindableDef semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiTypedBindableRawTypeAlias returns UiTypedBindableRawTypeAlias
+	 *
 	 * Constraint:
 	 *     (type=UiTypedBindableRawType alias=ID)
 	 */
-	protected void sequence_UiTypedBindableRawTypeAlias(EObject context, UiTypedBindableRawTypeAlias semanticObject) {
-		genericSequencer.createSequence(context, semanticObject);
+	protected void sequence_UiTypedBindableRawTypeAlias(ISerializationContext context, UiTypedBindableRawTypeAlias semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_TYPED_BINDABLE_RAW_TYPE_ALIAS__TYPE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_TYPED_BINDABLE_RAW_TYPE_ALIAS__TYPE));
+			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_TYPED_BINDABLE_RAW_TYPE_ALIAS__ALIAS) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_TYPED_BINDABLE_RAW_TYPE_ALIAS__ALIAS));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getUiTypedBindableRawTypeAliasAccess().getTypeUiTypedBindableRawTypeParserRuleCall_1_0(), semanticObject.eGet(UiModelPackage.Literals.UI_TYPED_BINDABLE_RAW_TYPE_ALIAS__TYPE, false));
+		feeder.accept(grammarAccess.getUiTypedBindableRawTypeAliasAccess().getAliasIDTerminalRuleCall_3_0(), semanticObject.getAlias());
+		feeder.finish();
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiTypedBindableRawType returns UiTypedBindableRawType
+	 *
 	 * Constraint:
 	 *     (rawBindable=[UiRawBindable|ID] rawBindablePath=UiRawBindablePathSegment?)
 	 */
-	protected void sequence_UiTypedBindableRawType(EObject context, UiTypedBindableRawType semanticObject) {
+	protected void sequence_UiTypedBindableRawType(ISerializationContext context, UiTypedBindableRawType semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiRootElements returns UiValidatorAlias
+	 *     UiValidatorAlias returns UiValidatorAlias
+	 *
 	 * Constraint:
 	 *     (validator=UiValidator alias=ID)
 	 */
-	protected void sequence_UiValidatorAlias(EObject context, UiValidatorAlias semanticObject) {
-		genericSequencer.createSequence(context, semanticObject);
+	protected void sequence_UiValidatorAlias(ISerializationContext context, UiValidatorAlias semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_VALIDATOR_ALIAS__VALIDATOR) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_VALIDATOR_ALIAS__VALIDATOR));
+			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_VALIDATOR_ALIAS__ALIAS) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_VALIDATOR_ALIAS__ALIAS));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getUiValidatorAliasAccess().getValidatorUiValidatorParserRuleCall_1_0(), semanticObject.eGet(UiModelPackage.Literals.UI_VALIDATOR_ALIAS__VALIDATOR, false));
+		feeder.accept(grammarAccess.getUiValidatorAliasAccess().getAliasIDTerminalRuleCall_3_0(), semanticObject.getAlias());
+		feeder.finish();
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiValidatorAssignment returns UiValidatorAssignment
+	 *
 	 * Constraint:
 	 *     (field=[UiField|ID] (validatorDef=UiValidatorDef | validatorAlias=[UiValidatorAlias|QualifiedName]))
 	 */
-	protected void sequence_UiValidatorAssignment(EObject context, UiValidatorAssignment semanticObject) {
+	protected void sequence_UiValidatorAssignment(ISerializationContext context, UiValidatorAssignment semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiValidatorDef returns UiValidatorDef
+	 *
 	 * Constraint:
 	 *     validator=UiValidator
 	 */
-	protected void sequence_UiValidatorDef(EObject context, UiValidatorDef semanticObject) {
-		genericSequencer.createSequence(context, semanticObject);
+	protected void sequence_UiValidatorDef(ISerializationContext context, UiValidatorDef semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_VALIDATOR_DEF__VALIDATOR) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_VALIDATOR_DEF__VALIDATOR));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getUiValidatorDefAccess().getValidatorUiValidatorParserRuleCall_0(), semanticObject.eGet(UiModelPackage.Literals.UI_VALIDATOR_DEF__VALIDATOR, false));
+		feeder.finish();
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiVerticalLayoutAssigment returns UiVerticalLayoutAssigment
+	 *
 	 * Constraint:
 	 *     (element=UiEmbeddable alignment=UiAlignment?)
 	 */
-	protected void sequence_UiVerticalLayoutAssigment(EObject context, UiVerticalLayoutAssigment semanticObject) {
+	protected void sequence_UiVerticalLayoutAssigment(ISerializationContext context, UiVerticalLayoutAssigment semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiVerticalLayout returns UiVerticalLayout
+	 *     UiEmbeddable returns UiVerticalLayout
+	 *     UiLayout returns UiVerticalLayout
+	 *
 	 * Constraint:
 	 *     (
-	 *         (i18nInfo=UiI18nInfo? styles=STRING? readonly?='readonly'?)? 
+	 *         (i18nInfo=UiI18nInfo | styles=STRING | readonly?='readonly')* 
 	 *         name=ID? 
 	 *         contents+=UiVerticalLayoutAssigment* 
 	 *         bindings+=UiBinding* 
 	 *         processorAssignments+=UiVisibilityProcessorAssignment*
 	 *     )
 	 */
-	protected void sequence_UiVerticalLayout(EObject context, UiVerticalLayout semanticObject) {
+	protected void sequence_UiVerticalLayout(ISerializationContext context, UiVerticalLayout semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiRootElements returns UiViewSet
+	 *     UiViewSet returns UiViewSet
+	 *
 	 * Constraint:
 	 *     (name=ID beanSlots+=UiBeanSlot* bindingEndpointAlias+=UiBindingEndpointAlias*)
 	 */
-	protected void sequence_UiViewSet(EObject context, UiViewSet semanticObject) {
+	protected void sequence_UiViewSet(ISerializationContext context, UiViewSet semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiVisibilityProcessorAssignment returns UiVisibilityProcessorAssignment
+	 *
 	 * Constraint:
 	 *     processor=UiVisibilityProcessor
 	 */
-	protected void sequence_UiVisibilityProcessorAssignment(EObject context, UiVisibilityProcessorAssignment semanticObject) {
-		genericSequencer.createSequence(context, semanticObject);
+	protected void sequence_UiVisibilityProcessorAssignment(ISerializationContext context, UiVisibilityProcessorAssignment semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_VISIBILITY_PROCESSOR_ASSIGNMENT__PROCESSOR) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_VISIBILITY_PROCESSOR_ASSIGNMENT__PROCESSOR));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getUiVisibilityProcessorAssignmentAccess().getProcessorUiVisibilityProcessorParserRuleCall_1_0(), semanticObject.eGet(UiModelPackage.Literals.UI_VISIBILITY_PROCESSOR_ASSIGNMENT__PROCESSOR, false));
+		feeder.finish();
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiVisibilityProcessor returns UiVisibilityProcessor
+	 *
 	 * Constraint:
 	 *     (
 	 *         name=ID 
@@ -3304,25 +2714,40 @@
 	 *         rule=UiXbaseVisibilityRule?
 	 *     )
 	 */
-	protected void sequence_UiVisibilityProcessor(EObject context, UiVisibilityProcessor semanticObject) {
+	protected void sequence_UiVisibilityProcessor(ISerializationContext context, UiVisibilityProcessor semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiValidator returns UiXbaseValidator
+	 *     UiXbaseValidator returns UiXbaseValidator
+	 *
 	 * Constraint:
 	 *     (name=ID jvmType=JvmTypeReference errorCodes+=UiErrorCode* expression=XBlockExpression?)
 	 */
-	protected void sequence_UiXbaseValidator(EObject context, UiXbaseValidator semanticObject) {
+	protected void sequence_UiXbaseValidator(ISerializationContext context, UiXbaseValidator semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UiXbaseVisibilityRule returns UiXbaseVisibilityRule
+	 *
 	 * Constraint:
 	 *     expression=XBlockExpression
 	 */
-	protected void sequence_UiXbaseVisibilityRule(EObject context, UiXbaseVisibilityRule semanticObject) {
-		genericSequencer.createSequence(context, semanticObject);
+	protected void sequence_UiXbaseVisibilityRule(ISerializationContext context, UiXbaseVisibilityRule semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_XBASE_VISIBILITY_RULE__EXPRESSION) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_XBASE_VISIBILITY_RULE__EXPRESSION));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getUiXbaseVisibilityRuleAccess().getExpressionXBlockExpressionParserRuleCall_0(), semanticObject.eGet(UiModelPackage.Literals.UI_XBASE_VISIBILITY_RULE__EXPRESSION, false));
+		feeder.finish();
 	}
+	
+	
 }
diff --git a/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/serializer/UIGrammarSyntacticSequencer.java b/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/serializer/UIGrammarSyntacticSequencer.java
index fadeb3a..d6b21b4 100644
--- a/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/serializer/UIGrammarSyntacticSequencer.java
+++ b/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/serializer/UIGrammarSyntacticSequencer.java
@@ -7,6 +7,9 @@
  *
  * Contributors:
  *         Florian Pirchner - Initial implementation
+ *
+ * generated by Xtext 2.11.0
+ *
  */
 
 package org.eclipse.osbp.ecview.dsl.serializer;
@@ -80,7 +83,6 @@
 	protected AbstractElementAlias match_UiImage_SemicolonKeyword_4_1_2_q;
 	protected AbstractElementAlias match_UiImage___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_4__q;
 	protected AbstractElementAlias match_UiImage___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q;
-	protected AbstractElementAlias match_UiImports_SemicolonKeyword_2_q;
 	protected AbstractElementAlias match_UiLabel___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q;
 	protected AbstractElementAlias match_UiLabel___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q;
 	protected AbstractElementAlias match_UiList_SemicolonKeyword_4_1_3_2_q;
@@ -152,6 +154,7 @@
 	protected AbstractElementAlias match_UiTable_SemicolonKeyword_4_1_1_2_q;
 	protected AbstractElementAlias match_UiTable_SemicolonKeyword_4_1_2_2_q;
 	protected AbstractElementAlias match_UiTable_SemicolonKeyword_4_1_3_1_q;
+	protected AbstractElementAlias match_UiTable_SemicolonKeyword_4_1_4_1_q;
 	protected AbstractElementAlias match_UiTable___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_6__q;
 	protected AbstractElementAlias match_UiTable___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q;
 	protected AbstractElementAlias match_UiTextArea___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q;
@@ -165,10 +168,11 @@
 	protected AbstractElementAlias match_UiVerticalLayout___RightParenthesisKeyword_2_2_1_LeftParenthesisKeyword_2_0_0_a__p;
 	protected AbstractElementAlias match_UiVerticalLayout___RightParenthesisKeyword_2_2_1_a_LeftParenthesisKeyword_2_0_0__p;
 	protected AbstractElementAlias match_UiVerticalLayout___RightParenthesisKeyword_2_2_1_p_LeftParenthesisKeyword_2_0_0_p__p;
+	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;
 	
@@ -225,7 +229,6 @@
 		match_UiImage_SemicolonKeyword_4_1_2_q = new TokenAlias(false, true, grammarAccess.getUiImageAccess().getSemicolonKeyword_4_1_2());
 		match_UiImage___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_4__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getUiImageAccess().getLeftCurlyBracketKeyword_4_0()), new TokenAlias(false, false, grammarAccess.getUiImageAccess().getRightCurlyBracketKeyword_4_4()));
 		match_UiImage___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getUiImageAccess().getLeftParenthesisKeyword_2_0()), new TokenAlias(false, false, grammarAccess.getUiImageAccess().getRightParenthesisKeyword_2_2()));
-		match_UiImports_SemicolonKeyword_2_q = new TokenAlias(false, true, grammarAccess.getUiImportsAccess().getSemicolonKeyword_2());
 		match_UiLabel___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getUiLabelAccess().getLeftCurlyBracketKeyword_4_0()), new TokenAlias(false, false, grammarAccess.getUiLabelAccess().getRightCurlyBracketKeyword_4_3()));
 		match_UiLabel___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getUiLabelAccess().getLeftParenthesisKeyword_2_0()), new TokenAlias(false, false, grammarAccess.getUiLabelAccess().getRightParenthesisKeyword_2_2()));
 		match_UiList_SemicolonKeyword_4_1_3_2_q = new TokenAlias(false, true, grammarAccess.getUiListAccess().getSemicolonKeyword_4_1_3_2());
@@ -297,6 +300,7 @@
 		match_UiTable_SemicolonKeyword_4_1_1_2_q = new TokenAlias(false, true, grammarAccess.getUiTableAccess().getSemicolonKeyword_4_1_1_2());
 		match_UiTable_SemicolonKeyword_4_1_2_2_q = new TokenAlias(false, true, grammarAccess.getUiTableAccess().getSemicolonKeyword_4_1_2_2());
 		match_UiTable_SemicolonKeyword_4_1_3_1_q = new TokenAlias(false, true, grammarAccess.getUiTableAccess().getSemicolonKeyword_4_1_3_1());
+		match_UiTable_SemicolonKeyword_4_1_4_1_q = new TokenAlias(false, true, grammarAccess.getUiTableAccess().getSemicolonKeyword_4_1_4_1());
 		match_UiTable___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_6__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getUiTableAccess().getLeftCurlyBracketKeyword_4_0()), new TokenAlias(false, false, grammarAccess.getUiTableAccess().getRightCurlyBracketKeyword_4_6()));
 		match_UiTable___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getUiTableAccess().getLeftParenthesisKeyword_2_0()), new TokenAlias(false, false, grammarAccess.getUiTableAccess().getRightParenthesisKeyword_2_2()));
 		match_UiTextArea___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getUiTextAreaAccess().getLeftCurlyBracketKeyword_4_0()), new TokenAlias(false, false, grammarAccess.getUiTextAreaAccess().getRightCurlyBracketKeyword_4_3()));
@@ -310,19 +314,20 @@
 		match_UiVerticalLayout___RightParenthesisKeyword_2_2_1_LeftParenthesisKeyword_2_0_0_a__p = new GroupAlias(true, false, new TokenAlias(false, false, grammarAccess.getUiVerticalLayoutAccess().getRightParenthesisKeyword_2_2_1()), new TokenAlias(true, true, grammarAccess.getUiVerticalLayoutAccess().getLeftParenthesisKeyword_2_0_0()));
 		match_UiVerticalLayout___RightParenthesisKeyword_2_2_1_a_LeftParenthesisKeyword_2_0_0__p = new GroupAlias(true, false, new TokenAlias(true, true, grammarAccess.getUiVerticalLayoutAccess().getRightParenthesisKeyword_2_2_1()), new TokenAlias(false, false, grammarAccess.getUiVerticalLayoutAccess().getLeftParenthesisKeyword_2_0_0()));
 		match_UiVerticalLayout___RightParenthesisKeyword_2_2_1_p_LeftParenthesisKeyword_2_0_0_p__p = new GroupAlias(true, false, new TokenAlias(true, false, grammarAccess.getUiVerticalLayoutAccess().getRightParenthesisKeyword_2_2_1()), new TokenAlias(true, false, grammarAccess.getUiVerticalLayoutAccess().getLeftParenthesisKeyword_2_0_0()));
+		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 "";
 	}
@@ -355,1415 +360,2715 @@
 		List<INode> transitionNodes = collectNodes(fromNode, toNode);
 		for (AbstractElementAlias syntax : transition.getAmbiguousSyntaxes()) {
 			List<INode> syntaxNodes = getNodesFor(transitionNodes, syntax);
-			if(match_UiBeanReferenceField_SemicolonKeyword_4_1_0_2_q.equals(syntax))
+			if (match_UiBeanReferenceField_SemicolonKeyword_4_1_0_2_q.equals(syntax))
 				emit_UiBeanReferenceField_SemicolonKeyword_4_1_0_2_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiBeanReferenceField_SemicolonKeyword_4_1_1_4_q.equals(syntax))
+			else if (match_UiBeanReferenceField_SemicolonKeyword_4_1_1_4_q.equals(syntax))
 				emit_UiBeanReferenceField_SemicolonKeyword_4_1_1_4_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiBeanReferenceField_SemicolonKeyword_4_1_2_2_q.equals(syntax))
+			else if (match_UiBeanReferenceField_SemicolonKeyword_4_1_2_2_q.equals(syntax))
 				emit_UiBeanReferenceField_SemicolonKeyword_4_1_2_2_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiBeanReferenceField_SemicolonKeyword_4_1_3_2_q.equals(syntax))
+			else if (match_UiBeanReferenceField_SemicolonKeyword_4_1_3_2_q.equals(syntax))
 				emit_UiBeanReferenceField_SemicolonKeyword_4_1_3_2_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiBeanReferenceField_SemicolonKeyword_4_1_4_2_q.equals(syntax))
+			else if (match_UiBeanReferenceField_SemicolonKeyword_4_1_4_2_q.equals(syntax))
 				emit_UiBeanReferenceField_SemicolonKeyword_4_1_4_2_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiBeanReferenceField_SemicolonKeyword_4_1_5_2_q.equals(syntax))
+			else if (match_UiBeanReferenceField_SemicolonKeyword_4_1_5_2_q.equals(syntax))
 				emit_UiBeanReferenceField_SemicolonKeyword_4_1_5_2_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiBeanReferenceField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_4__q.equals(syntax))
+			else if (match_UiBeanReferenceField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_4__q.equals(syntax))
 				emit_UiBeanReferenceField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_4__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiBeanReferenceField___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
+			else if (match_UiBeanReferenceField___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
 				emit_UiBeanReferenceField___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiBeanSlot_SemicolonKeyword_5_q.equals(syntax))
+			else if (match_UiBeanSlot_SemicolonKeyword_5_q.equals(syntax))
 				emit_UiBeanSlot_SemicolonKeyword_5_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiBindingEndpointAlias_SemicolonKeyword_4_q.equals(syntax))
+			else if (match_UiBindingEndpointAlias_SemicolonKeyword_4_q.equals(syntax))
 				emit_UiBindingEndpointAlias_SemicolonKeyword_4_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiBinding_SemicolonKeyword_5_q.equals(syntax))
+			else if (match_UiBinding_SemicolonKeyword_5_q.equals(syntax))
 				emit_UiBinding_SemicolonKeyword_5_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiBrowser___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q.equals(syntax))
+			else if (match_UiBrowser___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q.equals(syntax))
 				emit_UiBrowser___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiBrowser___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
+			else if (match_UiBrowser___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
 				emit_UiBrowser___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiButton___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
+			else if (match_UiButton___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
 				emit_UiButton___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiChangeTrigger_SemicolonKeyword_4_q.equals(syntax))
+			else if (match_UiChangeTrigger_SemicolonKeyword_4_q.equals(syntax))
 				emit_UiChangeTrigger_SemicolonKeyword_4_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiCheckBox___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q.equals(syntax))
+			else if (match_UiCheckBox___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q.equals(syntax))
 				emit_UiCheckBox___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiCheckBox___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
+			else if (match_UiCheckBox___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
 				emit_UiCheckBox___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiColumn_SemicolonKeyword_4_q.equals(syntax))
+			else if (match_UiColumn_SemicolonKeyword_4_q.equals(syntax))
 				emit_UiColumn_SemicolonKeyword_4_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiComboBox_SemicolonKeyword_4_1_0_2_q.equals(syntax))
+			else if (match_UiComboBox_SemicolonKeyword_4_1_0_2_q.equals(syntax))
 				emit_UiComboBox_SemicolonKeyword_4_1_0_2_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiComboBox_SemicolonKeyword_4_1_1_2_q.equals(syntax))
+			else if (match_UiComboBox_SemicolonKeyword_4_1_1_2_q.equals(syntax))
 				emit_UiComboBox_SemicolonKeyword_4_1_1_2_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiComboBox_SemicolonKeyword_4_1_2_2_q.equals(syntax))
+			else if (match_UiComboBox_SemicolonKeyword_4_1_2_2_q.equals(syntax))
 				emit_UiComboBox_SemicolonKeyword_4_1_2_2_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiComboBox_SemicolonKeyword_4_1_3_2_q.equals(syntax))
+			else if (match_UiComboBox_SemicolonKeyword_4_1_3_2_q.equals(syntax))
 				emit_UiComboBox_SemicolonKeyword_4_1_3_2_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiComboBox_SemicolonKeyword_4_1_4_1_q.equals(syntax))
+			else if (match_UiComboBox_SemicolonKeyword_4_1_4_1_q.equals(syntax))
 				emit_UiComboBox_SemicolonKeyword_4_1_4_1_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiComboBox___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_4__q.equals(syntax))
+			else if (match_UiComboBox___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_4__q.equals(syntax))
 				emit_UiComboBox___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_4__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiComboBox___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
+			else if (match_UiComboBox___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
 				emit_UiComboBox___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiDateField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q.equals(syntax))
+			else if (match_UiDateField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q.equals(syntax))
 				emit_UiDateField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiDateField___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
+			else if (match_UiDateField___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
 				emit_UiDateField___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiDecimalField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q.equals(syntax))
+			else if (match_UiDecimalField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q.equals(syntax))
 				emit_UiDecimalField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiDecimalField___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
+			else if (match_UiDecimalField___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
 				emit_UiDecimalField___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiDialog_SemicolonKeyword_5_2_q.equals(syntax))
+			else if (match_UiDialog_SemicolonKeyword_5_2_q.equals(syntax))
 				emit_UiDialog_SemicolonKeyword_5_2_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiDialog_SemicolonKeyword_6_1_q.equals(syntax))
+			else if (match_UiDialog_SemicolonKeyword_6_1_q.equals(syntax))
 				emit_UiDialog_SemicolonKeyword_6_1_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiDialog___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
+			else if (match_UiDialog___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
 				emit_UiDialog___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiExposedAction_SemicolonKeyword_6_q.equals(syntax))
+			else if (match_UiExposedAction_SemicolonKeyword_6_q.equals(syntax))
 				emit_UiExposedAction_SemicolonKeyword_6_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiFormLayout___LeftParenthesisKeyword_2_0_0_or_RightParenthesisKeyword_2_2_1__a.equals(syntax))
+			else if (match_UiFormLayout___LeftParenthesisKeyword_2_0_0_or_RightParenthesisKeyword_2_2_1__a.equals(syntax))
 				emit_UiFormLayout___LeftParenthesisKeyword_2_0_0_or_RightParenthesisKeyword_2_2_1__a(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiFormLayout___RightParenthesisKeyword_2_2_1_LeftParenthesisKeyword_2_0_0_a__p.equals(syntax))
+			else if (match_UiFormLayout___RightParenthesisKeyword_2_2_1_LeftParenthesisKeyword_2_0_0_a__p.equals(syntax))
 				emit_UiFormLayout___RightParenthesisKeyword_2_2_1_LeftParenthesisKeyword_2_0_0_a__p(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiFormLayout___RightParenthesisKeyword_2_2_1_a_LeftParenthesisKeyword_2_0_0__p.equals(syntax))
+			else if (match_UiFormLayout___RightParenthesisKeyword_2_2_1_a_LeftParenthesisKeyword_2_0_0__p.equals(syntax))
 				emit_UiFormLayout___RightParenthesisKeyword_2_2_1_a_LeftParenthesisKeyword_2_0_0__p(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiFormLayout___RightParenthesisKeyword_2_2_1_p_LeftParenthesisKeyword_2_0_0_p__p.equals(syntax))
+			else if (match_UiFormLayout___RightParenthesisKeyword_2_2_1_p_LeftParenthesisKeyword_2_0_0_p__p.equals(syntax))
 				emit_UiFormLayout___RightParenthesisKeyword_2_2_1_p_LeftParenthesisKeyword_2_0_0_p__p(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiGridLayout___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
+			else if (match_UiGridLayout___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
 				emit_UiGridLayout___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiHorizontalLayout___LeftParenthesisKeyword_2_0_0_or_RightParenthesisKeyword_2_2_1__a.equals(syntax))
+			else if (match_UiHorizontalLayout___LeftParenthesisKeyword_2_0_0_or_RightParenthesisKeyword_2_2_1__a.equals(syntax))
 				emit_UiHorizontalLayout___LeftParenthesisKeyword_2_0_0_or_RightParenthesisKeyword_2_2_1__a(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiHorizontalLayout___RightParenthesisKeyword_2_2_1_LeftParenthesisKeyword_2_0_0_a__p.equals(syntax))
+			else if (match_UiHorizontalLayout___RightParenthesisKeyword_2_2_1_LeftParenthesisKeyword_2_0_0_a__p.equals(syntax))
 				emit_UiHorizontalLayout___RightParenthesisKeyword_2_2_1_LeftParenthesisKeyword_2_0_0_a__p(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiHorizontalLayout___RightParenthesisKeyword_2_2_1_a_LeftParenthesisKeyword_2_0_0__p.equals(syntax))
+			else if (match_UiHorizontalLayout___RightParenthesisKeyword_2_2_1_a_LeftParenthesisKeyword_2_0_0__p.equals(syntax))
 				emit_UiHorizontalLayout___RightParenthesisKeyword_2_2_1_a_LeftParenthesisKeyword_2_0_0__p(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiHorizontalLayout___RightParenthesisKeyword_2_2_1_p_LeftParenthesisKeyword_2_0_0_p__p.equals(syntax))
+			else if (match_UiHorizontalLayout___RightParenthesisKeyword_2_2_1_p_LeftParenthesisKeyword_2_0_0_p__p.equals(syntax))
 				emit_UiHorizontalLayout___RightParenthesisKeyword_2_2_1_p_LeftParenthesisKeyword_2_0_0_p__p(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiIDEView_SemicolonKeyword_3_0_2_q.equals(syntax))
+			else if (match_UiIDEView_SemicolonKeyword_3_0_2_q.equals(syntax))
 				emit_UiIDEView_SemicolonKeyword_3_0_2_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiIDEView_SemicolonKeyword_3_1_2_q.equals(syntax))
+			else if (match_UiIDEView_SemicolonKeyword_3_1_2_q.equals(syntax))
 				emit_UiIDEView_SemicolonKeyword_3_1_2_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiIDEView_SemicolonKeyword_3_2_2_q.equals(syntax))
+			else if (match_UiIDEView_SemicolonKeyword_3_2_2_q.equals(syntax))
 				emit_UiIDEView_SemicolonKeyword_3_2_2_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiIDEView___ExposedActionsKeyword_3_3_0_LeftCurlyBracketKeyword_3_3_1_RightCurlyBracketKeyword_3_3_3__a.equals(syntax))
+			else if (match_UiIDEView___ExposedActionsKeyword_3_3_0_LeftCurlyBracketKeyword_3_3_1_RightCurlyBracketKeyword_3_3_3__a.equals(syntax))
 				emit_UiIDEView___ExposedActionsKeyword_3_3_0_LeftCurlyBracketKeyword_3_3_1_RightCurlyBracketKeyword_3_3_3__a(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiIDEView___RightCurlyBracketKeyword_3_3_3_ExposedActionsKeyword_3_3_0_LeftCurlyBracketKeyword_3_3_1__a.equals(syntax))
+			else if (match_UiIDEView___RightCurlyBracketKeyword_3_3_3_ExposedActionsKeyword_3_3_0_LeftCurlyBracketKeyword_3_3_1__a.equals(syntax))
 				emit_UiIDEView___RightCurlyBracketKeyword_3_3_3_ExposedActionsKeyword_3_3_0_LeftCurlyBracketKeyword_3_3_1__a(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiImage_SemicolonKeyword_4_1_2_q.equals(syntax))
+			else if (match_UiImage_SemicolonKeyword_4_1_2_q.equals(syntax))
 				emit_UiImage_SemicolonKeyword_4_1_2_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiImage___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_4__q.equals(syntax))
+			else if (match_UiImage___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_4__q.equals(syntax))
 				emit_UiImage___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_4__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiImage___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
+			else if (match_UiImage___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
 				emit_UiImage___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiImports_SemicolonKeyword_2_q.equals(syntax))
-				emit_UiImports_SemicolonKeyword_2_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiLabel___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q.equals(syntax))
+			else if (match_UiLabel___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q.equals(syntax))
 				emit_UiLabel___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiLabel___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
+			else if (match_UiLabel___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
 				emit_UiLabel___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiList_SemicolonKeyword_4_1_3_2_q.equals(syntax))
+			else if (match_UiList_SemicolonKeyword_4_1_3_2_q.equals(syntax))
 				emit_UiList_SemicolonKeyword_4_1_3_2_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiList_SemicolonKeyword_4_1_5_1_q.equals(syntax))
+			else if (match_UiList_SemicolonKeyword_4_1_5_1_q.equals(syntax))
 				emit_UiList_SemicolonKeyword_4_1_5_1_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiList___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_4__q.equals(syntax))
+			else if (match_UiList___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_4__q.equals(syntax))
 				emit_UiList___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_4__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiList___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
+			else if (match_UiList___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
 				emit_UiList___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiMaskedDecimalField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q.equals(syntax))
+			else if (match_UiMaskedDecimalField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q.equals(syntax))
 				emit_UiMaskedDecimalField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiMaskedDecimalField___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
+			else if (match_UiMaskedDecimalField___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
 				emit_UiMaskedDecimalField___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiMaskedNumericField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q.equals(syntax))
+			else if (match_UiMaskedNumericField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q.equals(syntax))
 				emit_UiMaskedNumericField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiMaskedNumericField___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
+			else if (match_UiMaskedNumericField___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
 				emit_UiMaskedNumericField___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiMaskedTextField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q.equals(syntax))
+			else if (match_UiMaskedTextField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q.equals(syntax))
 				emit_UiMaskedTextField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiMaskedTextField___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
+			else if (match_UiMaskedTextField___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
 				emit_UiMaskedTextField___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiMobileHorizontalButtonGroup___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
+			else if (match_UiMobileHorizontalButtonGroup___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
 				emit_UiMobileHorizontalButtonGroup___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiMobileHorizontalLayout___LeftParenthesisKeyword_2_0_0_or_RightParenthesisKeyword_2_2_1__a.equals(syntax))
+			else if (match_UiMobileHorizontalLayout___LeftParenthesisKeyword_2_0_0_or_RightParenthesisKeyword_2_2_1__a.equals(syntax))
 				emit_UiMobileHorizontalLayout___LeftParenthesisKeyword_2_0_0_or_RightParenthesisKeyword_2_2_1__a(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiMobileHorizontalLayout___RightParenthesisKeyword_2_2_1_LeftParenthesisKeyword_2_0_0_a__p.equals(syntax))
+			else if (match_UiMobileHorizontalLayout___RightParenthesisKeyword_2_2_1_LeftParenthesisKeyword_2_0_0_a__p.equals(syntax))
 				emit_UiMobileHorizontalLayout___RightParenthesisKeyword_2_2_1_LeftParenthesisKeyword_2_0_0_a__p(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiMobileHorizontalLayout___RightParenthesisKeyword_2_2_1_a_LeftParenthesisKeyword_2_0_0__p.equals(syntax))
+			else if (match_UiMobileHorizontalLayout___RightParenthesisKeyword_2_2_1_a_LeftParenthesisKeyword_2_0_0__p.equals(syntax))
 				emit_UiMobileHorizontalLayout___RightParenthesisKeyword_2_2_1_a_LeftParenthesisKeyword_2_0_0__p(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiMobileHorizontalLayout___RightParenthesisKeyword_2_2_1_p_LeftParenthesisKeyword_2_0_0_p__p.equals(syntax))
+			else if (match_UiMobileHorizontalLayout___RightParenthesisKeyword_2_2_1_p_LeftParenthesisKeyword_2_0_0_p__p.equals(syntax))
 				emit_UiMobileHorizontalLayout___RightParenthesisKeyword_2_2_1_p_LeftParenthesisKeyword_2_0_0_p__p(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiMobileNavBarAction_SemicolonKeyword_4_q.equals(syntax))
+			else if (match_UiMobileNavBarAction_SemicolonKeyword_4_q.equals(syntax))
 				emit_UiMobileNavBarAction_SemicolonKeyword_4_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiMobileNavigationButton___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
+			else if (match_UiMobileNavigationButton___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
 				emit_UiMobileNavigationButton___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiMobileNavigationPage_SemicolonKeyword_5_2_q.equals(syntax))
+			else if (match_UiMobileNavigationPage_SemicolonKeyword_5_2_q.equals(syntax))
 				emit_UiMobileNavigationPage_SemicolonKeyword_5_2_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiMobileNavigationPage___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
+			else if (match_UiMobileNavigationPage___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
 				emit_UiMobileNavigationPage___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiMobileNavigationPage___NavbarActionsKeyword_6_0_LeftCurlyBracketKeyword_6_1_RightCurlyBracketKeyword_6_3__q.equals(syntax))
+			else if (match_UiMobileNavigationPage___NavbarActionsKeyword_6_0_LeftCurlyBracketKeyword_6_1_RightCurlyBracketKeyword_6_3__q.equals(syntax))
 				emit_UiMobileNavigationPage___NavbarActionsKeyword_6_0_LeftCurlyBracketKeyword_6_1_RightCurlyBracketKeyword_6_3__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiMobileSearchPanel_SemicolonKeyword_7_q.equals(syntax))
+			else if (match_UiMobileSearchPanel_SemicolonKeyword_7_q.equals(syntax))
 				emit_UiMobileSearchPanel_SemicolonKeyword_7_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiMobileSearchPanel___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
+			else if (match_UiMobileSearchPanel___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
 				emit_UiMobileSearchPanel___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiMobileSwitch___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q.equals(syntax))
+			else if (match_UiMobileSwitch___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q.equals(syntax))
 				emit_UiMobileSwitch___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiMobileSwitch___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
+			else if (match_UiMobileSwitch___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
 				emit_UiMobileSwitch___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiMobileTabSheet___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
+			else if (match_UiMobileTabSheet___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
 				emit_UiMobileTabSheet___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiMobileVerticalComponentGroup___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
+			else if (match_UiMobileVerticalComponentGroup___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
 				emit_UiMobileVerticalComponentGroup___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiMobileVerticalLayout___LeftParenthesisKeyword_2_0_0_or_RightParenthesisKeyword_2_2_1__a.equals(syntax))
+			else if (match_UiMobileVerticalLayout___LeftParenthesisKeyword_2_0_0_or_RightParenthesisKeyword_2_2_1__a.equals(syntax))
 				emit_UiMobileVerticalLayout___LeftParenthesisKeyword_2_0_0_or_RightParenthesisKeyword_2_2_1__a(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiMobileVerticalLayout___RightParenthesisKeyword_2_2_1_LeftParenthesisKeyword_2_0_0_a__p.equals(syntax))
+			else if (match_UiMobileVerticalLayout___RightParenthesisKeyword_2_2_1_LeftParenthesisKeyword_2_0_0_a__p.equals(syntax))
 				emit_UiMobileVerticalLayout___RightParenthesisKeyword_2_2_1_LeftParenthesisKeyword_2_0_0_a__p(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiMobileVerticalLayout___RightParenthesisKeyword_2_2_1_a_LeftParenthesisKeyword_2_0_0__p.equals(syntax))
+			else if (match_UiMobileVerticalLayout___RightParenthesisKeyword_2_2_1_a_LeftParenthesisKeyword_2_0_0__p.equals(syntax))
 				emit_UiMobileVerticalLayout___RightParenthesisKeyword_2_2_1_a_LeftParenthesisKeyword_2_0_0__p(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiMobileVerticalLayout___RightParenthesisKeyword_2_2_1_p_LeftParenthesisKeyword_2_0_0_p__p.equals(syntax))
+			else if (match_UiMobileVerticalLayout___RightParenthesisKeyword_2_2_1_p_LeftParenthesisKeyword_2_0_0_p__p.equals(syntax))
 				emit_UiMobileVerticalLayout___RightParenthesisKeyword_2_2_1_p_LeftParenthesisKeyword_2_0_0_p__p(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiMobileView_SemicolonKeyword_3_0_2_q.equals(syntax))
+			else if (match_UiMobileView_SemicolonKeyword_3_0_2_q.equals(syntax))
 				emit_UiMobileView_SemicolonKeyword_3_0_2_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiMobileView_SemicolonKeyword_3_1_2_q.equals(syntax))
+			else if (match_UiMobileView_SemicolonKeyword_3_1_2_q.equals(syntax))
 				emit_UiMobileView_SemicolonKeyword_3_1_2_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiNumericField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q.equals(syntax))
+			else if (match_UiNumericField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q.equals(syntax))
 				emit_UiNumericField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiNumericField___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
+			else if (match_UiNumericField___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
 				emit_UiNumericField___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiOptionsGroup_SemicolonKeyword_4_1_3_2_q.equals(syntax))
+			else if (match_UiOptionsGroup_SemicolonKeyword_4_1_3_2_q.equals(syntax))
 				emit_UiOptionsGroup_SemicolonKeyword_4_1_3_2_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiOptionsGroup_SemicolonKeyword_4_1_5_1_q.equals(syntax))
+			else if (match_UiOptionsGroup_SemicolonKeyword_4_1_5_1_q.equals(syntax))
 				emit_UiOptionsGroup_SemicolonKeyword_4_1_5_1_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiOptionsGroup___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_4__q.equals(syntax))
+			else if (match_UiOptionsGroup___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_4__q.equals(syntax))
 				emit_UiOptionsGroup___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_4__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiOptionsGroup___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
+			else if (match_UiOptionsGroup___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
 				emit_UiOptionsGroup___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiPanel___LeftParenthesisKeyword_1_0_RightParenthesisKeyword_1_2__q.equals(syntax))
+			else if (match_UiPanel___LeftParenthesisKeyword_1_0_RightParenthesisKeyword_1_2__q.equals(syntax))
 				emit_UiPanel___LeftParenthesisKeyword_1_0_RightParenthesisKeyword_1_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiPasswordField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q.equals(syntax))
+			else if (match_UiPasswordField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q.equals(syntax))
 				emit_UiPasswordField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiPasswordField___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
+			else if (match_UiPasswordField___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
 				emit_UiPasswordField___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiPrefixedMaskedTextField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q.equals(syntax))
+			else if (match_UiPrefixedMaskedTextField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q.equals(syntax))
 				emit_UiPrefixedMaskedTextField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiPrefixedMaskedTextField___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
+			else if (match_UiPrefixedMaskedTextField___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
 				emit_UiPrefixedMaskedTextField___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiProgressBar___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q.equals(syntax))
+			else if (match_UiProgressBar___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q.equals(syntax))
 				emit_UiProgressBar___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiProgressBar___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
+			else if (match_UiProgressBar___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
 				emit_UiProgressBar___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiRichTextArea___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q.equals(syntax))
+			else if (match_UiRichTextArea___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q.equals(syntax))
 				emit_UiRichTextArea___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiRichTextArea___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
+			else if (match_UiRichTextArea___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
 				emit_UiRichTextArea___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiSearchDialog___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
+			else if (match_UiSearchDialog___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
 				emit_UiSearchDialog___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiSearchDialog___SearchKeyword_6_0_LeftCurlyBracketKeyword_6_1_RightCurlyBracketKeyword_6_3__q.equals(syntax))
+			else if (match_UiSearchDialog___SearchKeyword_6_0_LeftCurlyBracketKeyword_6_1_RightCurlyBracketKeyword_6_3__q.equals(syntax))
 				emit_UiSearchDialog___SearchKeyword_6_0_LeftCurlyBracketKeyword_6_1_RightCurlyBracketKeyword_6_3__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiSearchField___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
+			else if (match_UiSearchField___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
 				emit_UiSearchField___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiSearchPanel_SemicolonKeyword_7_q.equals(syntax))
+			else if (match_UiSearchPanel_SemicolonKeyword_7_q.equals(syntax))
 				emit_UiSearchPanel_SemicolonKeyword_7_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiSearchPanel___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
+			else if (match_UiSearchPanel___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
 				emit_UiSearchPanel___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiSortOrder_DescKeyword_2_0_q.equals(syntax))
+			else if (match_UiSortOrder_DescKeyword_2_0_q.equals(syntax))
 				emit_UiSortOrder_DescKeyword_2_0_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiSortOrder_SemicolonKeyword_3_q.equals(syntax))
+			else if (match_UiSortOrder_SemicolonKeyword_3_q.equals(syntax))
 				emit_UiSortOrder_SemicolonKeyword_3_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiSplitpanel___LeftParenthesisKeyword_1_0_0_or_RightParenthesisKeyword_1_1_1__a.equals(syntax))
+			else if (match_UiSplitpanel___LeftParenthesisKeyword_1_0_0_or_RightParenthesisKeyword_1_1_1__a.equals(syntax))
 				emit_UiSplitpanel___LeftParenthesisKeyword_1_0_0_or_RightParenthesisKeyword_1_1_1__a(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiSplitpanel___RightParenthesisKeyword_1_1_1_LeftParenthesisKeyword_1_0_0_a__p.equals(syntax))
+			else if (match_UiSplitpanel___RightParenthesisKeyword_1_1_1_LeftParenthesisKeyword_1_0_0_a__p.equals(syntax))
 				emit_UiSplitpanel___RightParenthesisKeyword_1_1_1_LeftParenthesisKeyword_1_0_0_a__p(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiSplitpanel___RightParenthesisKeyword_1_1_1_a_LeftParenthesisKeyword_1_0_0__p.equals(syntax))
+			else if (match_UiSplitpanel___RightParenthesisKeyword_1_1_1_a_LeftParenthesisKeyword_1_0_0__p.equals(syntax))
 				emit_UiSplitpanel___RightParenthesisKeyword_1_1_1_a_LeftParenthesisKeyword_1_0_0__p(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiSplitpanel___RightParenthesisKeyword_1_1_1_p_LeftParenthesisKeyword_1_0_0_p__p.equals(syntax))
+			else if (match_UiSplitpanel___RightParenthesisKeyword_1_1_1_p_LeftParenthesisKeyword_1_0_0_p__p.equals(syntax))
 				emit_UiSplitpanel___RightParenthesisKeyword_1_1_1_p_LeftParenthesisKeyword_1_0_0_p__p(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiSuggestTextField_SemicolonKeyword_4_1_0_2_q.equals(syntax))
+			else if (match_UiSuggestTextField_SemicolonKeyword_4_1_0_2_q.equals(syntax))
 				emit_UiSuggestTextField_SemicolonKeyword_4_1_0_2_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiSuggestTextField_SemicolonKeyword_4_1_1_2_q.equals(syntax))
+			else if (match_UiSuggestTextField_SemicolonKeyword_4_1_1_2_q.equals(syntax))
 				emit_UiSuggestTextField_SemicolonKeyword_4_1_1_2_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiSuggestTextField_SemicolonKeyword_4_1_2_2_q.equals(syntax))
+			else if (match_UiSuggestTextField_SemicolonKeyword_4_1_2_2_q.equals(syntax))
 				emit_UiSuggestTextField_SemicolonKeyword_4_1_2_2_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiSuggestTextField_SemicolonKeyword_4_1_3_2_q.equals(syntax))
+			else if (match_UiSuggestTextField_SemicolonKeyword_4_1_3_2_q.equals(syntax))
 				emit_UiSuggestTextField_SemicolonKeyword_4_1_3_2_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiSuggestTextField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_4__q.equals(syntax))
+			else if (match_UiSuggestTextField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_4__q.equals(syntax))
 				emit_UiSuggestTextField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_4__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiSuggestTextField___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
+			else if (match_UiSuggestTextField___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
 				emit_UiSuggestTextField___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiTabSheet___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
+			else if (match_UiTabSheet___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
 				emit_UiTabSheet___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiTable_SemicolonKeyword_4_1_0_2_q.equals(syntax))
+			else if (match_UiTable_SemicolonKeyword_4_1_0_2_q.equals(syntax))
 				emit_UiTable_SemicolonKeyword_4_1_0_2_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiTable_SemicolonKeyword_4_1_1_2_q.equals(syntax))
+			else if (match_UiTable_SemicolonKeyword_4_1_1_2_q.equals(syntax))
 				emit_UiTable_SemicolonKeyword_4_1_1_2_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiTable_SemicolonKeyword_4_1_2_2_q.equals(syntax))
+			else if (match_UiTable_SemicolonKeyword_4_1_2_2_q.equals(syntax))
 				emit_UiTable_SemicolonKeyword_4_1_2_2_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiTable_SemicolonKeyword_4_1_3_1_q.equals(syntax))
+			else if (match_UiTable_SemicolonKeyword_4_1_3_1_q.equals(syntax))
 				emit_UiTable_SemicolonKeyword_4_1_3_1_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiTable___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_6__q.equals(syntax))
+			else if (match_UiTable_SemicolonKeyword_4_1_4_1_q.equals(syntax))
+				emit_UiTable_SemicolonKeyword_4_1_4_1_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_UiTable___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_6__q.equals(syntax))
 				emit_UiTable___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_6__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiTable___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
+			else if (match_UiTable___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
 				emit_UiTable___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiTextArea___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q.equals(syntax))
+			else if (match_UiTextArea___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q.equals(syntax))
 				emit_UiTextArea___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiTextArea___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
+			else if (match_UiTextArea___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
 				emit_UiTextArea___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiTextField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q.equals(syntax))
+			else if (match_UiTextField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q.equals(syntax))
 				emit_UiTextField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiTextField___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
+			else if (match_UiTextField___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
 				emit_UiTextField___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiTypedBindableRawTypeAlias_SemicolonKeyword_4_q.equals(syntax))
+			else if (match_UiTypedBindableRawTypeAlias_SemicolonKeyword_4_q.equals(syntax))
 				emit_UiTypedBindableRawTypeAlias_SemicolonKeyword_4_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiValidatorAlias_SemicolonKeyword_4_q.equals(syntax))
+			else if (match_UiValidatorAlias_SemicolonKeyword_4_q.equals(syntax))
 				emit_UiValidatorAlias_SemicolonKeyword_4_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiValidatorAssignment_SemicolonKeyword_3_1_1_q.equals(syntax))
+			else if (match_UiValidatorAssignment_SemicolonKeyword_3_1_1_q.equals(syntax))
 				emit_UiValidatorAssignment_SemicolonKeyword_3_1_1_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiVerticalLayout___LeftParenthesisKeyword_2_0_0_or_RightParenthesisKeyword_2_2_1__a.equals(syntax))
+			else if (match_UiVerticalLayout___LeftParenthesisKeyword_2_0_0_or_RightParenthesisKeyword_2_2_1__a.equals(syntax))
 				emit_UiVerticalLayout___LeftParenthesisKeyword_2_0_0_or_RightParenthesisKeyword_2_2_1__a(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiVerticalLayout___RightParenthesisKeyword_2_2_1_LeftParenthesisKeyword_2_0_0_a__p.equals(syntax))
+			else if (match_UiVerticalLayout___RightParenthesisKeyword_2_2_1_LeftParenthesisKeyword_2_0_0_a__p.equals(syntax))
 				emit_UiVerticalLayout___RightParenthesisKeyword_2_2_1_LeftParenthesisKeyword_2_0_0_a__p(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiVerticalLayout___RightParenthesisKeyword_2_2_1_a_LeftParenthesisKeyword_2_0_0__p.equals(syntax))
+			else if (match_UiVerticalLayout___RightParenthesisKeyword_2_2_1_a_LeftParenthesisKeyword_2_0_0__p.equals(syntax))
 				emit_UiVerticalLayout___RightParenthesisKeyword_2_2_1_a_LeftParenthesisKeyword_2_0_0__p(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UiVerticalLayout___RightParenthesisKeyword_2_2_1_p_LeftParenthesisKeyword_2_0_0_p__p.equals(syntax))
+			else if (match_UiVerticalLayout___RightParenthesisKeyword_2_2_1_p_LeftParenthesisKeyword_2_0_0_p__p.equals(syntax))
 				emit_UiVerticalLayout___RightParenthesisKeyword_2_2_1_p_LeftParenthesisKeyword_2_0_0_p__p(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_XBlockExpression_SemicolonKeyword_2_1_q.equals(syntax))
+			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))
 				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:
+	 * Ambiguous syntax:
 	 *     ';'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     jvmType=JvmTypeReference (ambiguity) 'captionField' captionProperty=UiNestedProperty
+	 *     jvmType=JvmTypeReference (ambiguity) 'descriptionField' descriptionProperty=UiNestedProperty
+	 *     jvmType=JvmTypeReference (ambiguity) 'imageField' imageProperty=UiNestedProperty
+	 *     jvmType=JvmTypeReference (ambiguity) 'inMemoryService' inMemoryBeanProvider=JvmTypeReference
+	 *     jvmType=JvmTypeReference (ambiguity) 'refSource' referenceSourceJvmType=JvmTypeReference
+	 *     jvmType=JvmTypeReference (ambiguity) 'type' jvmType=JvmTypeReference
+	 *     jvmType=JvmTypeReference (ambiguity) '}' (rule end)
+	 *     jvmType=JvmTypeReference (ambiguity) bindings+=UiBinding
+	 *     jvmType=JvmTypeReference (ambiguity) processorAssignments+=UiVisibilityProcessorAssignment
+	 *     jvmType=JvmTypeReference (ambiguity) validators+=UiValidator
 	 */
 	protected void emit_UiBeanReferenceField_SemicolonKeyword_4_1_0_2_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ';'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     referenceSourceField=[JvmField|ID] (ambiguity) 'captionField' captionProperty=UiNestedProperty
+	 *     referenceSourceField=[JvmField|ID] (ambiguity) 'descriptionField' descriptionProperty=UiNestedProperty
+	 *     referenceSourceField=[JvmField|ID] (ambiguity) 'imageField' imageProperty=UiNestedProperty
+	 *     referenceSourceField=[JvmField|ID] (ambiguity) 'inMemoryService' inMemoryBeanProvider=JvmTypeReference
+	 *     referenceSourceField=[JvmField|ID] (ambiguity) 'refSource' referenceSourceJvmType=JvmTypeReference
+	 *     referenceSourceField=[JvmField|ID] (ambiguity) 'type' jvmType=JvmTypeReference
+	 *     referenceSourceField=[JvmField|ID] (ambiguity) '}' (rule end)
+	 *     referenceSourceField=[JvmField|ID] (ambiguity) bindings+=UiBinding
+	 *     referenceSourceField=[JvmField|ID] (ambiguity) processorAssignments+=UiVisibilityProcessorAssignment
+	 *     referenceSourceField=[JvmField|ID] (ambiguity) validators+=UiValidator
 	 */
 	protected void emit_UiBeanReferenceField_SemicolonKeyword_4_1_1_4_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ';'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     captionProperty=UiNestedProperty (ambiguity) 'captionField' captionProperty=UiNestedProperty
+	 *     captionProperty=UiNestedProperty (ambiguity) 'descriptionField' descriptionProperty=UiNestedProperty
+	 *     captionProperty=UiNestedProperty (ambiguity) 'imageField' imageProperty=UiNestedProperty
+	 *     captionProperty=UiNestedProperty (ambiguity) 'inMemoryService' inMemoryBeanProvider=JvmTypeReference
+	 *     captionProperty=UiNestedProperty (ambiguity) 'refSource' referenceSourceJvmType=JvmTypeReference
+	 *     captionProperty=UiNestedProperty (ambiguity) 'type' jvmType=JvmTypeReference
+	 *     captionProperty=UiNestedProperty (ambiguity) '}' (rule end)
+	 *     captionProperty=UiNestedProperty (ambiguity) bindings+=UiBinding
+	 *     captionProperty=UiNestedProperty (ambiguity) processorAssignments+=UiVisibilityProcessorAssignment
+	 *     captionProperty=UiNestedProperty (ambiguity) validators+=UiValidator
 	 */
 	protected void emit_UiBeanReferenceField_SemicolonKeyword_4_1_2_2_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ';'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     descriptionProperty=UiNestedProperty (ambiguity) 'captionField' captionProperty=UiNestedProperty
+	 *     descriptionProperty=UiNestedProperty (ambiguity) 'descriptionField' descriptionProperty=UiNestedProperty
+	 *     descriptionProperty=UiNestedProperty (ambiguity) 'imageField' imageProperty=UiNestedProperty
+	 *     descriptionProperty=UiNestedProperty (ambiguity) 'inMemoryService' inMemoryBeanProvider=JvmTypeReference
+	 *     descriptionProperty=UiNestedProperty (ambiguity) 'refSource' referenceSourceJvmType=JvmTypeReference
+	 *     descriptionProperty=UiNestedProperty (ambiguity) 'type' jvmType=JvmTypeReference
+	 *     descriptionProperty=UiNestedProperty (ambiguity) '}' (rule end)
+	 *     descriptionProperty=UiNestedProperty (ambiguity) bindings+=UiBinding
+	 *     descriptionProperty=UiNestedProperty (ambiguity) processorAssignments+=UiVisibilityProcessorAssignment
+	 *     descriptionProperty=UiNestedProperty (ambiguity) validators+=UiValidator
 	 */
 	protected void emit_UiBeanReferenceField_SemicolonKeyword_4_1_3_2_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ';'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     imageProperty=UiNestedProperty (ambiguity) 'captionField' captionProperty=UiNestedProperty
+	 *     imageProperty=UiNestedProperty (ambiguity) 'descriptionField' descriptionProperty=UiNestedProperty
+	 *     imageProperty=UiNestedProperty (ambiguity) 'imageField' imageProperty=UiNestedProperty
+	 *     imageProperty=UiNestedProperty (ambiguity) 'inMemoryService' inMemoryBeanProvider=JvmTypeReference
+	 *     imageProperty=UiNestedProperty (ambiguity) 'refSource' referenceSourceJvmType=JvmTypeReference
+	 *     imageProperty=UiNestedProperty (ambiguity) 'type' jvmType=JvmTypeReference
+	 *     imageProperty=UiNestedProperty (ambiguity) '}' (rule end)
+	 *     imageProperty=UiNestedProperty (ambiguity) bindings+=UiBinding
+	 *     imageProperty=UiNestedProperty (ambiguity) processorAssignments+=UiVisibilityProcessorAssignment
+	 *     imageProperty=UiNestedProperty (ambiguity) validators+=UiValidator
 	 */
 	protected void emit_UiBeanReferenceField_SemicolonKeyword_4_1_4_2_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ';'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     inMemoryBeanProvider=JvmTypeReference (ambiguity) 'captionField' captionProperty=UiNestedProperty
+	 *     inMemoryBeanProvider=JvmTypeReference (ambiguity) 'descriptionField' descriptionProperty=UiNestedProperty
+	 *     inMemoryBeanProvider=JvmTypeReference (ambiguity) 'imageField' imageProperty=UiNestedProperty
+	 *     inMemoryBeanProvider=JvmTypeReference (ambiguity) 'inMemoryService' inMemoryBeanProvider=JvmTypeReference
+	 *     inMemoryBeanProvider=JvmTypeReference (ambiguity) 'refSource' referenceSourceJvmType=JvmTypeReference
+	 *     inMemoryBeanProvider=JvmTypeReference (ambiguity) 'type' jvmType=JvmTypeReference
+	 *     inMemoryBeanProvider=JvmTypeReference (ambiguity) '}' (rule end)
+	 *     inMemoryBeanProvider=JvmTypeReference (ambiguity) bindings+=UiBinding
+	 *     inMemoryBeanProvider=JvmTypeReference (ambiguity) processorAssignments+=UiVisibilityProcessorAssignment
+	 *     inMemoryBeanProvider=JvmTypeReference (ambiguity) validators+=UiValidator
 	 */
 	protected void emit_UiBeanReferenceField_SemicolonKeyword_4_1_5_2_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('{' '}')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'referenceField' ('(' ')')? (ambiguity) (rule start)
+	 *     i18nInfo=UiI18nInfo ')' (ambiguity) (rule end)
+	 *     name=ID (ambiguity) (rule end)
+	 *     styles=STRING ')' (ambiguity) (rule end)
 	 */
 	protected void emit_UiBeanReferenceField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_4__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('(' ')')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'referenceField' (ambiguity) '{' 'captionField' captionProperty=UiNestedProperty
+	 *     (rule start) 'referenceField' (ambiguity) '{' 'descriptionField' descriptionProperty=UiNestedProperty
+	 *     (rule start) 'referenceField' (ambiguity) '{' 'imageField' imageProperty=UiNestedProperty
+	 *     (rule start) 'referenceField' (ambiguity) '{' 'inMemoryService' inMemoryBeanProvider=JvmTypeReference
+	 *     (rule start) 'referenceField' (ambiguity) '{' 'refSource' referenceSourceJvmType=JvmTypeReference
+	 *     (rule start) 'referenceField' (ambiguity) '{' 'type' jvmType=JvmTypeReference
+	 *     (rule start) 'referenceField' (ambiguity) '{' bindings+=UiBinding
+	 *     (rule start) 'referenceField' (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     (rule start) 'referenceField' (ambiguity) '{' validators+=UiValidator
+	 *     (rule start) 'referenceField' (ambiguity) ('{' '}')? (rule start)
+	 *     (rule start) 'referenceField' (ambiguity) name=ID
 	 */
 	protected void emit_UiBeanReferenceField___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:
+	 *     eventTopic=STRING (ambiguity) (rule end)
+	 *     jvmType=JvmTypeReference (ambiguity) (rule end)
 	 */
 	protected void emit_UiBeanSlot_SemicolonKeyword_5_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ';'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     alias=ID (ambiguity) (rule end)
 	 */
 	protected void emit_UiBindingEndpointAlias_SemicolonKeyword_4_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ';'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     target=UiBindingEndpointAssignment (ambiguity) (rule end)
 	 */
 	protected void emit_UiBinding_SemicolonKeyword_5_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('{' '}')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'browser' ('(' ')')? (ambiguity) (rule start)
+	 *     i18nInfo=UiI18nInfo ')' (ambiguity) (rule end)
+	 *     name=ID (ambiguity) (rule end)
+	 *     readonly?='readonly' ')' (ambiguity) (rule end)
+	 *     styles=STRING ')' (ambiguity) (rule end)
 	 */
 	protected void emit_UiBrowser___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('(' ')')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'browser' (ambiguity) '{' bindings+=UiBinding
+	 *     (rule start) 'browser' (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     (rule start) 'browser' (ambiguity) '{' validators+=UiValidator
+	 *     (rule start) 'browser' (ambiguity) ('{' '}')? (rule start)
+	 *     (rule start) 'browser' (ambiguity) name=ID
 	 */
 	protected void emit_UiBrowser___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:
+	 *     (rule start) 'button' (ambiguity) (rule start)
+	 *     (rule start) 'button' (ambiguity) name=ID
 	 */
 	protected void emit_UiButton___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:
+	 *     alias=ID (ambiguity) (rule end)
 	 */
 	protected void emit_UiChangeTrigger_SemicolonKeyword_4_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('{' '}')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'checkbox' ('(' ')')? (ambiguity) (rule start)
+	 *     i18nInfo=UiI18nInfo ')' (ambiguity) (rule end)
+	 *     name=ID (ambiguity) (rule end)
+	 *     readonly?='readonly' ')' (ambiguity) (rule end)
+	 *     styles=STRING ')' (ambiguity) (rule end)
 	 */
 	protected void emit_UiCheckBox___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('(' ')')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'checkbox' (ambiguity) '{' bindings+=UiBinding
+	 *     (rule start) 'checkbox' (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     (rule start) 'checkbox' (ambiguity) '{' validators+=UiValidator
+	 *     (rule start) 'checkbox' (ambiguity) ('{' '}')? (rule start)
+	 *     (rule start) 'checkbox' (ambiguity) name=ID
 	 */
 	protected void emit_UiCheckBox___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:
+	 *     iconName=STRING (ambiguity) (rule end)
+	 *     property=UiNestedProperty (ambiguity) (rule end)
 	 */
 	protected void emit_UiColumn_SemicolonKeyword_4_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ';'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     jvmType=JvmTypeReference (ambiguity) 'captionField' itemCaptionProperty=[JvmOperation|ID]
+	 *     jvmType=JvmTypeReference (ambiguity) 'descriptionField' descriptionProperty=UiNestedProperty
+	 *     jvmType=JvmTypeReference (ambiguity) 'imageField' itemImageProperty=[JvmOperation|ID]
+	 *     jvmType=JvmTypeReference (ambiguity) 'type' jvmType=JvmTypeReference
+	 *     jvmType=JvmTypeReference (ambiguity) '}' (rule end)
+	 *     jvmType=JvmTypeReference (ambiguity) bindings+=UiBinding
+	 *     jvmType=JvmTypeReference (ambiguity) consumeBeanService?='useBeanService'
+	 *     jvmType=JvmTypeReference (ambiguity) processorAssignments+=UiVisibilityProcessorAssignment
+	 *     jvmType=JvmTypeReference (ambiguity) readonly?='readonly'
+	 *     jvmType=JvmTypeReference (ambiguity) validators+=UiValidator
 	 */
 	protected void emit_UiComboBox_SemicolonKeyword_4_1_0_2_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ';'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     itemCaptionProperty=[JvmOperation|ID] (ambiguity) 'captionField' itemCaptionProperty=[JvmOperation|ID]
+	 *     itemCaptionProperty=[JvmOperation|ID] (ambiguity) 'descriptionField' descriptionProperty=UiNestedProperty
+	 *     itemCaptionProperty=[JvmOperation|ID] (ambiguity) 'imageField' itemImageProperty=[JvmOperation|ID]
+	 *     itemCaptionProperty=[JvmOperation|ID] (ambiguity) 'type' jvmType=JvmTypeReference
+	 *     itemCaptionProperty=[JvmOperation|ID] (ambiguity) '}' (rule end)
+	 *     itemCaptionProperty=[JvmOperation|ID] (ambiguity) bindings+=UiBinding
+	 *     itemCaptionProperty=[JvmOperation|ID] (ambiguity) consumeBeanService?='useBeanService'
+	 *     itemCaptionProperty=[JvmOperation|ID] (ambiguity) processorAssignments+=UiVisibilityProcessorAssignment
+	 *     itemCaptionProperty=[JvmOperation|ID] (ambiguity) readonly?='readonly'
+	 *     itemCaptionProperty=[JvmOperation|ID] (ambiguity) validators+=UiValidator
 	 */
 	protected void emit_UiComboBox_SemicolonKeyword_4_1_1_2_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ';'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     descriptionProperty=UiNestedProperty (ambiguity) 'captionField' itemCaptionProperty=[JvmOperation|ID]
+	 *     descriptionProperty=UiNestedProperty (ambiguity) 'descriptionField' descriptionProperty=UiNestedProperty
+	 *     descriptionProperty=UiNestedProperty (ambiguity) 'imageField' itemImageProperty=[JvmOperation|ID]
+	 *     descriptionProperty=UiNestedProperty (ambiguity) 'type' jvmType=JvmTypeReference
+	 *     descriptionProperty=UiNestedProperty (ambiguity) '}' (rule end)
+	 *     descriptionProperty=UiNestedProperty (ambiguity) bindings+=UiBinding
+	 *     descriptionProperty=UiNestedProperty (ambiguity) consumeBeanService?='useBeanService'
+	 *     descriptionProperty=UiNestedProperty (ambiguity) processorAssignments+=UiVisibilityProcessorAssignment
+	 *     descriptionProperty=UiNestedProperty (ambiguity) readonly?='readonly'
+	 *     descriptionProperty=UiNestedProperty (ambiguity) validators+=UiValidator
 	 */
 	protected void emit_UiComboBox_SemicolonKeyword_4_1_2_2_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ';'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     itemImageProperty=[JvmOperation|ID] (ambiguity) 'captionField' itemCaptionProperty=[JvmOperation|ID]
+	 *     itemImageProperty=[JvmOperation|ID] (ambiguity) 'descriptionField' descriptionProperty=UiNestedProperty
+	 *     itemImageProperty=[JvmOperation|ID] (ambiguity) 'imageField' itemImageProperty=[JvmOperation|ID]
+	 *     itemImageProperty=[JvmOperation|ID] (ambiguity) 'type' jvmType=JvmTypeReference
+	 *     itemImageProperty=[JvmOperation|ID] (ambiguity) '}' (rule end)
+	 *     itemImageProperty=[JvmOperation|ID] (ambiguity) bindings+=UiBinding
+	 *     itemImageProperty=[JvmOperation|ID] (ambiguity) consumeBeanService?='useBeanService'
+	 *     itemImageProperty=[JvmOperation|ID] (ambiguity) processorAssignments+=UiVisibilityProcessorAssignment
+	 *     itemImageProperty=[JvmOperation|ID] (ambiguity) readonly?='readonly'
+	 *     itemImageProperty=[JvmOperation|ID] (ambiguity) validators+=UiValidator
 	 */
 	protected void emit_UiComboBox_SemicolonKeyword_4_1_3_2_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ';'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     consumeBeanService?='useBeanService' (ambiguity) 'captionField' itemCaptionProperty=[JvmOperation|ID]
+	 *     consumeBeanService?='useBeanService' (ambiguity) 'descriptionField' descriptionProperty=UiNestedProperty
+	 *     consumeBeanService?='useBeanService' (ambiguity) 'imageField' itemImageProperty=[JvmOperation|ID]
+	 *     consumeBeanService?='useBeanService' (ambiguity) 'type' jvmType=JvmTypeReference
+	 *     consumeBeanService?='useBeanService' (ambiguity) '}' (rule end)
+	 *     consumeBeanService?='useBeanService' (ambiguity) bindings+=UiBinding
+	 *     consumeBeanService?='useBeanService' (ambiguity) consumeBeanService?='useBeanService'
+	 *     consumeBeanService?='useBeanService' (ambiguity) processorAssignments+=UiVisibilityProcessorAssignment
+	 *     consumeBeanService?='useBeanService' (ambiguity) readonly?='readonly'
+	 *     consumeBeanService?='useBeanService' (ambiguity) validators+=UiValidator
 	 */
 	protected void emit_UiComboBox_SemicolonKeyword_4_1_4_1_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('{' '}')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'combo' ('(' ')')? (ambiguity) (rule start)
+	 *     i18nInfo=UiI18nInfo ')' (ambiguity) (rule end)
+	 *     name=ID (ambiguity) (rule end)
+	 *     styles=STRING ')' (ambiguity) (rule end)
 	 */
 	protected void emit_UiComboBox___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_4__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('(' ')')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'combo' (ambiguity) '{' 'captionField' itemCaptionProperty=[JvmOperation|ID]
+	 *     (rule start) 'combo' (ambiguity) '{' 'descriptionField' descriptionProperty=UiNestedProperty
+	 *     (rule start) 'combo' (ambiguity) '{' 'imageField' itemImageProperty=[JvmOperation|ID]
+	 *     (rule start) 'combo' (ambiguity) '{' 'type' jvmType=JvmTypeReference
+	 *     (rule start) 'combo' (ambiguity) '{' bindings+=UiBinding
+	 *     (rule start) 'combo' (ambiguity) '{' consumeBeanService?='useBeanService'
+	 *     (rule start) 'combo' (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     (rule start) 'combo' (ambiguity) '{' readonly?='readonly'
+	 *     (rule start) 'combo' (ambiguity) '{' validators+=UiValidator
+	 *     (rule start) 'combo' (ambiguity) ('{' '}')? (rule start)
+	 *     (rule start) 'combo' (ambiguity) name=ID
 	 */
 	protected void emit_UiComboBox___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:
+	 *     (rule start) 'datefield' ('(' ')')? (ambiguity) (rule start)
+	 *     dateFormat=UiDateFormat ')' (ambiguity) (rule end)
+	 *     i18nInfo=UiI18nInfo ')' (ambiguity) (rule end)
+	 *     name=ID (ambiguity) (rule end)
+	 *     readonly?='readonly' ')' (ambiguity) (rule end)
+	 *     resolution=UiDateTimeResolution ')' (ambiguity) (rule end)
+	 *     styles=STRING ')' (ambiguity) (rule end)
 	 */
 	protected void emit_UiDateField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('(' ')')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'datefield' (ambiguity) '{' bindings+=UiBinding
+	 *     (rule start) 'datefield' (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     (rule start) 'datefield' (ambiguity) '{' validators+=UiValidator
+	 *     (rule start) 'datefield' (ambiguity) ('{' '}')? (rule start)
+	 *     (rule start) 'datefield' (ambiguity) name=ID
 	 */
 	protected void emit_UiDateField___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:
+	 *     (rule start) 'decimalField' ('(' ')')? (ambiguity) (rule start)
+	 *     i18nInfo=UiI18nInfo ')' (ambiguity) (rule end)
+	 *     name=ID (ambiguity) (rule end)
+	 *     noGrouping?='noGrouping' ')' (ambiguity) (rule end)
+	 *     noMarkNegative?='noMarkNegative' ')' (ambiguity) (rule end)
+	 *     precision=INT ')' (ambiguity) (rule end)
+	 *     readonly?='readonly' ')' (ambiguity) (rule end)
+	 *     styles=STRING ')' (ambiguity) (rule end)
 	 */
 	protected void emit_UiDecimalField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('(' ')')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'decimalField' (ambiguity) '{' bindings+=UiBinding
+	 *     (rule start) 'decimalField' (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     (rule start) 'decimalField' (ambiguity) '{' validators+=UiValidator
+	 *     (rule start) 'decimalField' (ambiguity) ('{' '}')? (rule start)
+	 *     (rule start) 'decimalField' (ambiguity) name=ID
 	 */
 	protected void emit_UiDecimalField___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:
+	 *     jvmType=JvmTypeReference (ambiguity) '}' (rule end)
+	 *     jvmType=JvmTypeReference (ambiguity) bindings+=UiBinding
+	 *     jvmType=JvmTypeReference (ambiguity) content=UiDialogAssignment
+	 *     jvmType=JvmTypeReference (ambiguity) processorAssignments+=UiVisibilityProcessorAssignment
 	 */
 	protected void emit_UiDialog_SemicolonKeyword_5_2_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ';'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     content=UiDialogAssignment (ambiguity) '}' (rule end)
+	 *     content=UiDialogAssignment (ambiguity) bindings+=UiBinding
+	 *     content=UiDialogAssignment (ambiguity) processorAssignments+=UiVisibilityProcessorAssignment
 	 */
 	protected void emit_UiDialog_SemicolonKeyword_6_1_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('(' ')')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'dialog' (ambiguity) '{' 'type' jvmType=JvmTypeReference
+	 *     (rule start) 'dialog' (ambiguity) '{' '}' (rule start)
+	 *     (rule start) 'dialog' (ambiguity) '{' bindings+=UiBinding
+	 *     (rule start) 'dialog' (ambiguity) '{' content=UiDialogAssignment
+	 *     (rule start) 'dialog' (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     (rule start) 'dialog' (ambiguity) name=ID
 	 */
 	protected void emit_UiDialog___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:
+	 *     actionID=STRING (ambiguity) (rule end)
+	 *     actionReference=[UxAction|QualifiedName] (ambiguity) (rule end)
+	 *     checkDirty?='checkDirty' (ambiguity) (rule end)
+	 *     externalCommandId=STRING (ambiguity) (rule end)
 	 */
 	protected void emit_UiExposedAction_SemicolonKeyword_6_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('(' | ')')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'form' (ambiguity) 'styles' styles=STRING
+	 *     (rule start) 'form' (ambiguity) '{' '}' (rule start)
+	 *     (rule start) 'form' (ambiguity) '{' bindings+=UiBinding
+	 *     (rule start) 'form' (ambiguity) '{' contents+=UiFormLayoutAssigment
+	 *     (rule start) 'form' (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     (rule start) 'form' (ambiguity) name=ID
+	 *     (rule start) 'form' (ambiguity) readonly?='readonly'
+	 *     i18nInfo=UiI18nInfo (ambiguity) 'styles' styles=STRING
+	 *     i18nInfo=UiI18nInfo (ambiguity) '{' '}' (rule end)
+	 *     i18nInfo=UiI18nInfo (ambiguity) '{' bindings+=UiBinding
+	 *     i18nInfo=UiI18nInfo (ambiguity) '{' contents+=UiFormLayoutAssigment
+	 *     i18nInfo=UiI18nInfo (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     i18nInfo=UiI18nInfo (ambiguity) name=ID
+	 *     i18nInfo=UiI18nInfo (ambiguity) readonly?='readonly'
+	 *     styles=STRING (ambiguity) 'styles' styles=STRING
+	 *     styles=STRING (ambiguity) '{' '}' (rule end)
+	 *     styles=STRING (ambiguity) '{' bindings+=UiBinding
+	 *     styles=STRING (ambiguity) '{' contents+=UiFormLayoutAssigment
+	 *     styles=STRING (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     styles=STRING (ambiguity) name=ID
+	 *     styles=STRING (ambiguity) readonly?='readonly'
 	 */
 	protected void emit_UiFormLayout___LeftParenthesisKeyword_2_0_0_or_RightParenthesisKeyword_2_2_1__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     (')' '('*)+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     readonly?='readonly' (ambiguity) 'styles' styles=STRING
+	 *     readonly?='readonly' (ambiguity) '{' '}' (rule end)
+	 *     readonly?='readonly' (ambiguity) '{' bindings+=UiBinding
+	 *     readonly?='readonly' (ambiguity) '{' contents+=UiFormLayoutAssigment
+	 *     readonly?='readonly' (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     readonly?='readonly' (ambiguity) name=ID
+	 *     readonly?='readonly' (ambiguity) readonly?='readonly'
 	 */
 	protected void emit_UiFormLayout___RightParenthesisKeyword_2_2_1_LeftParenthesisKeyword_2_0_0_a__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     (')'* '(')+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'form' (ambiguity) i18nInfo=UiI18nInfo
+	 *     i18nInfo=UiI18nInfo (ambiguity) i18nInfo=UiI18nInfo
+	 *     styles=STRING (ambiguity) i18nInfo=UiI18nInfo
 	 */
 	protected void emit_UiFormLayout___RightParenthesisKeyword_2_2_1_a_LeftParenthesisKeyword_2_0_0__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     (')'+ '('+)+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     readonly?='readonly' (ambiguity) i18nInfo=UiI18nInfo
 	 */
 	protected void emit_UiFormLayout___RightParenthesisKeyword_2_2_1_p_LeftParenthesisKeyword_2_0_0_p__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('(' ')')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'gridlayout' (ambiguity) '{' '}' (rule start)
+	 *     (rule start) 'gridlayout' (ambiguity) '{' bindings+=UiBinding
+	 *     (rule start) 'gridlayout' (ambiguity) '{' contents+=UiGridLayoutAssigment
+	 *     (rule start) 'gridlayout' (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     (rule start) 'gridlayout' (ambiguity) name=ID
 	 */
 	protected void emit_UiGridLayout___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:
+	 *     (rule start) 'horizontalLayout' (ambiguity) 'styles' styles=STRING
+	 *     (rule start) 'horizontalLayout' (ambiguity) '{' '}' (rule start)
+	 *     (rule start) 'horizontalLayout' (ambiguity) '{' bindings+=UiBinding
+	 *     (rule start) 'horizontalLayout' (ambiguity) '{' contents+=UiHorizontalLayoutAssigment
+	 *     (rule start) 'horizontalLayout' (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     (rule start) 'horizontalLayout' (ambiguity) name=ID
+	 *     (rule start) 'horizontalLayout' (ambiguity) readonly?='readonly'
+	 *     i18nInfo=UiI18nInfo (ambiguity) 'styles' styles=STRING
+	 *     i18nInfo=UiI18nInfo (ambiguity) '{' '}' (rule end)
+	 *     i18nInfo=UiI18nInfo (ambiguity) '{' bindings+=UiBinding
+	 *     i18nInfo=UiI18nInfo (ambiguity) '{' contents+=UiHorizontalLayoutAssigment
+	 *     i18nInfo=UiI18nInfo (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     i18nInfo=UiI18nInfo (ambiguity) name=ID
+	 *     i18nInfo=UiI18nInfo (ambiguity) readonly?='readonly'
+	 *     readonly?='readonly' (ambiguity) 'styles' styles=STRING
+	 *     readonly?='readonly' (ambiguity) '{' '}' (rule end)
+	 *     readonly?='readonly' (ambiguity) '{' bindings+=UiBinding
+	 *     readonly?='readonly' (ambiguity) '{' contents+=UiHorizontalLayoutAssigment
+	 *     readonly?='readonly' (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     readonly?='readonly' (ambiguity) name=ID
+	 *     readonly?='readonly' (ambiguity) readonly?='readonly'
 	 */
 	protected void emit_UiHorizontalLayout___LeftParenthesisKeyword_2_0_0_or_RightParenthesisKeyword_2_2_1__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     (')' '('*)+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     styles=STRING (ambiguity) 'styles' styles=STRING
+	 *     styles=STRING (ambiguity) '{' '}' (rule end)
+	 *     styles=STRING (ambiguity) '{' bindings+=UiBinding
+	 *     styles=STRING (ambiguity) '{' contents+=UiHorizontalLayoutAssigment
+	 *     styles=STRING (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     styles=STRING (ambiguity) name=ID
+	 *     styles=STRING (ambiguity) readonly?='readonly'
 	 */
 	protected void emit_UiHorizontalLayout___RightParenthesisKeyword_2_2_1_LeftParenthesisKeyword_2_0_0_a__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     (')'* '(')+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'horizontalLayout' (ambiguity) i18nInfo=UiI18nInfo
+	 *     i18nInfo=UiI18nInfo (ambiguity) i18nInfo=UiI18nInfo
+	 *     readonly?='readonly' (ambiguity) i18nInfo=UiI18nInfo
 	 */
 	protected void emit_UiHorizontalLayout___RightParenthesisKeyword_2_2_1_a_LeftParenthesisKeyword_2_0_0__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     (')'+ '('+)+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     styles=STRING (ambiguity) i18nInfo=UiI18nInfo
 	 */
 	protected void emit_UiHorizontalLayout___RightParenthesisKeyword_2_2_1_p_LeftParenthesisKeyword_2_0_0_p__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ';'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     sharedStateGroup=STRING (ambiguity) 'exposedActions' '{' ('}' 'exposedActions' '{')* exposedActions+=UiExposedAction
+	 *     sharedStateGroup=STRING (ambiguity) ('exposedActions' '{' '}')* 'category' viewCategory=[UxViewCategory|QualifiedName]
+	 *     sharedStateGroup=STRING (ambiguity) ('exposedActions' '{' '}')* 'rootType' jvmType=JvmTypeReference
+	 *     sharedStateGroup=STRING (ambiguity) ('exposedActions' '{' '}')* 'sharedStateGroup' sharedStateGroup=STRING
+	 *     sharedStateGroup=STRING (ambiguity) ('exposedActions' '{' '}')* beanSlots+=UiBeanSlot
+	 *     sharedStateGroup=STRING (ambiguity) ('exposedActions' '{' '}')* bindingEndpointAlias+=UiBindingEndpointAlias
+	 *     sharedStateGroup=STRING (ambiguity) ('exposedActions' '{' '}')* bindings+=UiBinding
+	 *     sharedStateGroup=STRING (ambiguity) ('exposedActions' '{' '}')* content=UiEmbeddable
 	 */
 	protected void emit_UiIDEView_SemicolonKeyword_3_0_2_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ';'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     viewCategory=[UxViewCategory|QualifiedName] (ambiguity) 'exposedActions' '{' ('}' 'exposedActions' '{')* exposedActions+=UiExposedAction
+	 *     viewCategory=[UxViewCategory|QualifiedName] (ambiguity) ('exposedActions' '{' '}')* 'category' viewCategory=[UxViewCategory|QualifiedName]
+	 *     viewCategory=[UxViewCategory|QualifiedName] (ambiguity) ('exposedActions' '{' '}')* 'rootType' jvmType=JvmTypeReference
+	 *     viewCategory=[UxViewCategory|QualifiedName] (ambiguity) ('exposedActions' '{' '}')* 'sharedStateGroup' sharedStateGroup=STRING
+	 *     viewCategory=[UxViewCategory|QualifiedName] (ambiguity) ('exposedActions' '{' '}')* beanSlots+=UiBeanSlot
+	 *     viewCategory=[UxViewCategory|QualifiedName] (ambiguity) ('exposedActions' '{' '}')* bindingEndpointAlias+=UiBindingEndpointAlias
+	 *     viewCategory=[UxViewCategory|QualifiedName] (ambiguity) ('exposedActions' '{' '}')* bindings+=UiBinding
+	 *     viewCategory=[UxViewCategory|QualifiedName] (ambiguity) ('exposedActions' '{' '}')* content=UiEmbeddable
 	 */
 	protected void emit_UiIDEView_SemicolonKeyword_3_1_2_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ';'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     jvmType=JvmTypeReference (ambiguity) 'exposedActions' '{' ('}' 'exposedActions' '{')* exposedActions+=UiExposedAction
+	 *     jvmType=JvmTypeReference (ambiguity) ('exposedActions' '{' '}')* 'category' viewCategory=[UxViewCategory|QualifiedName]
+	 *     jvmType=JvmTypeReference (ambiguity) ('exposedActions' '{' '}')* 'rootType' jvmType=JvmTypeReference
+	 *     jvmType=JvmTypeReference (ambiguity) ('exposedActions' '{' '}')* 'sharedStateGroup' sharedStateGroup=STRING
+	 *     jvmType=JvmTypeReference (ambiguity) ('exposedActions' '{' '}')* beanSlots+=UiBeanSlot
+	 *     jvmType=JvmTypeReference (ambiguity) ('exposedActions' '{' '}')* bindingEndpointAlias+=UiBindingEndpointAlias
+	 *     jvmType=JvmTypeReference (ambiguity) ('exposedActions' '{' '}')* bindings+=UiBinding
+	 *     jvmType=JvmTypeReference (ambiguity) ('exposedActions' '{' '}')* content=UiEmbeddable
 	 */
 	protected void emit_UiIDEView_SemicolonKeyword_3_2_2_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('exposedActions' '{' '}')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     exposedActions+=UiExposedAction '}' (ambiguity) 'category' viewCategory=[UxViewCategory|QualifiedName]
+	 *     exposedActions+=UiExposedAction '}' (ambiguity) 'rootType' jvmType=JvmTypeReference
+	 *     exposedActions+=UiExposedAction '}' (ambiguity) 'sharedStateGroup' sharedStateGroup=STRING
+	 *     exposedActions+=UiExposedAction '}' (ambiguity) beanSlots+=UiBeanSlot
+	 *     exposedActions+=UiExposedAction '}' (ambiguity) bindingEndpointAlias+=UiBindingEndpointAlias
+	 *     exposedActions+=UiExposedAction '}' (ambiguity) bindings+=UiBinding
+	 *     exposedActions+=UiExposedAction '}' (ambiguity) content=UiEmbeddable
+	 *     jvmType=JvmTypeReference ';'? (ambiguity) 'category' viewCategory=[UxViewCategory|QualifiedName]
+	 *     jvmType=JvmTypeReference ';'? (ambiguity) 'rootType' jvmType=JvmTypeReference
+	 *     jvmType=JvmTypeReference ';'? (ambiguity) 'sharedStateGroup' sharedStateGroup=STRING
+	 *     jvmType=JvmTypeReference ';'? (ambiguity) beanSlots+=UiBeanSlot
+	 *     jvmType=JvmTypeReference ';'? (ambiguity) bindingEndpointAlias+=UiBindingEndpointAlias
+	 *     jvmType=JvmTypeReference ';'? (ambiguity) bindings+=UiBinding
+	 *     jvmType=JvmTypeReference ';'? (ambiguity) content=UiEmbeddable
+	 *     name=ID '{' (ambiguity) 'category' viewCategory=[UxViewCategory|QualifiedName]
+	 *     name=ID '{' (ambiguity) 'rootType' jvmType=JvmTypeReference
+	 *     name=ID '{' (ambiguity) 'sharedStateGroup' sharedStateGroup=STRING
+	 *     name=ID '{' (ambiguity) beanSlots+=UiBeanSlot
+	 *     name=ID '{' (ambiguity) bindingEndpointAlias+=UiBindingEndpointAlias
+	 *     name=ID '{' (ambiguity) bindings+=UiBinding
+	 *     name=ID '{' (ambiguity) content=UiEmbeddable
+	 *     sharedStateGroup=STRING ';'? (ambiguity) 'category' viewCategory=[UxViewCategory|QualifiedName]
+	 *     sharedStateGroup=STRING ';'? (ambiguity) 'rootType' jvmType=JvmTypeReference
+	 *     sharedStateGroup=STRING ';'? (ambiguity) 'sharedStateGroup' sharedStateGroup=STRING
+	 *     sharedStateGroup=STRING ';'? (ambiguity) beanSlots+=UiBeanSlot
+	 *     sharedStateGroup=STRING ';'? (ambiguity) bindingEndpointAlias+=UiBindingEndpointAlias
+	 *     sharedStateGroup=STRING ';'? (ambiguity) bindings+=UiBinding
+	 *     sharedStateGroup=STRING ';'? (ambiguity) content=UiEmbeddable
+	 *     viewCategory=[UxViewCategory|QualifiedName] ';'? (ambiguity) 'category' viewCategory=[UxViewCategory|QualifiedName]
+	 *     viewCategory=[UxViewCategory|QualifiedName] ';'? (ambiguity) 'rootType' jvmType=JvmTypeReference
+	 *     viewCategory=[UxViewCategory|QualifiedName] ';'? (ambiguity) 'sharedStateGroup' sharedStateGroup=STRING
+	 *     viewCategory=[UxViewCategory|QualifiedName] ';'? (ambiguity) beanSlots+=UiBeanSlot
+	 *     viewCategory=[UxViewCategory|QualifiedName] ';'? (ambiguity) bindingEndpointAlias+=UiBindingEndpointAlias
+	 *     viewCategory=[UxViewCategory|QualifiedName] ';'? (ambiguity) bindings+=UiBinding
+	 *     viewCategory=[UxViewCategory|QualifiedName] ';'? (ambiguity) content=UiEmbeddable
 	 */
 	protected void emit_UiIDEView___ExposedActionsKeyword_3_3_0_LeftCurlyBracketKeyword_3_3_1_RightCurlyBracketKeyword_3_3_3__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('}' 'exposedActions' '{')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     exposedActions+=UiExposedAction (ambiguity) exposedActions+=UiExposedAction
+	 *     jvmType=JvmTypeReference ';'? 'exposedActions' '{' (ambiguity) exposedActions+=UiExposedAction
+	 *     name=ID '{' 'exposedActions' '{' (ambiguity) exposedActions+=UiExposedAction
+	 *     sharedStateGroup=STRING ';'? 'exposedActions' '{' (ambiguity) exposedActions+=UiExposedAction
+	 *     viewCategory=[UxViewCategory|QualifiedName] ';'? 'exposedActions' '{' (ambiguity) exposedActions+=UiExposedAction
 	 */
 	protected void emit_UiIDEView___RightCurlyBracketKeyword_3_3_3_ExposedActionsKeyword_3_3_0_LeftCurlyBracketKeyword_3_3_1__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ';'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     value=STRING (ambiguity) '}' (rule end)
+	 *     value=STRING (ambiguity) bindings+=UiBinding
+	 *     value=STRING (ambiguity) processorAssignments+=UiVisibilityProcessorAssignment
 	 */
 	protected void emit_UiImage_SemicolonKeyword_4_1_2_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('{' '}')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'image' ('(' ')')? (ambiguity) (rule start)
+	 *     i18nInfo=UiI18nInfo ')' (ambiguity) (rule end)
+	 *     name=ID (ambiguity) (rule end)
+	 *     styles=STRING ')' (ambiguity) (rule end)
 	 */
 	protected void emit_UiImage___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_4__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('(' ')')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'image' (ambiguity) '{' 'iconPath' value=STRING
+	 *     (rule start) 'image' (ambiguity) '{' bindings+=UiBinding
+	 *     (rule start) 'image' (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     (rule start) 'image' (ambiguity) ('{' '}')? (rule start)
+	 *     (rule start) 'image' (ambiguity) name=ID
 	 */
 	protected void emit_UiImage___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
-	 *     ';'?
-	 */
-	protected void emit_UiImports_SemicolonKeyword_2_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
-		acceptNodes(transition, nodes);
-	}
-	
-	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('{' '}')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'label' ('(' ')')? (ambiguity) (rule start)
+	 *     i18nInfo=UiI18nInfo ')' (ambiguity) (rule end)
+	 *     name=ID (ambiguity) (rule end)
+	 *     styles=STRING ')' (ambiguity) (rule end)
 	 */
 	protected void emit_UiLabel___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('(' ')')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'label' (ambiguity) '{' bindings+=UiBinding
+	 *     (rule start) 'label' (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     (rule start) 'label' (ambiguity) ('{' '}')? (rule start)
+	 *     (rule start) 'label' (ambiguity) name=ID
 	 */
 	protected void emit_UiLabel___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:
+	 *     descriptionProperty=UiNestedProperty (ambiguity) 'captionField' itemCaptionProperty=[JvmOperation|ID]
+	 *     descriptionProperty=UiNestedProperty (ambiguity) 'descriptionField' descriptionProperty=UiNestedProperty
+	 *     descriptionProperty=UiNestedProperty (ambiguity) 'imageField' itemImageProperty=[JvmOperation|ID]
+	 *     descriptionProperty=UiNestedProperty (ambiguity) 'selectionType' selectionType=UiSelectionType
+	 *     descriptionProperty=UiNestedProperty (ambiguity) 'type' jvmType=JvmTypeReference
+	 *     descriptionProperty=UiNestedProperty (ambiguity) '}' (rule end)
+	 *     descriptionProperty=UiNestedProperty (ambiguity) bindings+=UiBinding
+	 *     descriptionProperty=UiNestedProperty (ambiguity) consumeBeanService?='useBeanService'
+	 *     descriptionProperty=UiNestedProperty (ambiguity) processorAssignments+=UiVisibilityProcessorAssignment
+	 *     descriptionProperty=UiNestedProperty (ambiguity) readonly?='readonly'
+	 *     descriptionProperty=UiNestedProperty (ambiguity) validators+=UiValidator
 	 */
 	protected void emit_UiList_SemicolonKeyword_4_1_3_2_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ';'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     consumeBeanService?='useBeanService' (ambiguity) 'captionField' itemCaptionProperty=[JvmOperation|ID]
+	 *     consumeBeanService?='useBeanService' (ambiguity) 'descriptionField' descriptionProperty=UiNestedProperty
+	 *     consumeBeanService?='useBeanService' (ambiguity) 'imageField' itemImageProperty=[JvmOperation|ID]
+	 *     consumeBeanService?='useBeanService' (ambiguity) 'selectionType' selectionType=UiSelectionType
+	 *     consumeBeanService?='useBeanService' (ambiguity) 'type' jvmType=JvmTypeReference
+	 *     consumeBeanService?='useBeanService' (ambiguity) '}' (rule end)
+	 *     consumeBeanService?='useBeanService' (ambiguity) bindings+=UiBinding
+	 *     consumeBeanService?='useBeanService' (ambiguity) consumeBeanService?='useBeanService'
+	 *     consumeBeanService?='useBeanService' (ambiguity) processorAssignments+=UiVisibilityProcessorAssignment
+	 *     consumeBeanService?='useBeanService' (ambiguity) readonly?='readonly'
+	 *     consumeBeanService?='useBeanService' (ambiguity) validators+=UiValidator
 	 */
 	protected void emit_UiList_SemicolonKeyword_4_1_5_1_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('{' '}')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'listSelect' ('(' ')')? (ambiguity) (rule start)
+	 *     i18nInfo=UiI18nInfo ')' (ambiguity) (rule end)
+	 *     name=ID (ambiguity) (rule end)
+	 *     styles=STRING ')' (ambiguity) (rule end)
 	 */
 	protected void emit_UiList___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_4__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('(' ')')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'listSelect' (ambiguity) '{' 'captionField' itemCaptionProperty=[JvmOperation|ID]
+	 *     (rule start) 'listSelect' (ambiguity) '{' 'descriptionField' descriptionProperty=UiNestedProperty
+	 *     (rule start) 'listSelect' (ambiguity) '{' 'imageField' itemImageProperty=[JvmOperation|ID]
+	 *     (rule start) 'listSelect' (ambiguity) '{' 'selectionType' selectionType=UiSelectionType
+	 *     (rule start) 'listSelect' (ambiguity) '{' 'type' jvmType=JvmTypeReference
+	 *     (rule start) 'listSelect' (ambiguity) '{' bindings+=UiBinding
+	 *     (rule start) 'listSelect' (ambiguity) '{' consumeBeanService?='useBeanService'
+	 *     (rule start) 'listSelect' (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     (rule start) 'listSelect' (ambiguity) '{' readonly?='readonly'
+	 *     (rule start) 'listSelect' (ambiguity) '{' validators+=UiValidator
+	 *     (rule start) 'listSelect' (ambiguity) ('{' '}')? (rule start)
+	 *     (rule start) 'listSelect' (ambiguity) name=ID
 	 */
 	protected void emit_UiList___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:
+	 *     (rule start) 'maskedDecimal' ('(' ')')? (ambiguity) (rule start)
+	 *     i18nInfo=UiI18nInfo ')' (ambiguity) (rule end)
+	 *     mask=STRING ')' (ambiguity) (rule end)
+	 *     name=ID (ambiguity) (rule end)
+	 *     readonly?='readonly' ')' (ambiguity) (rule end)
+	 *     styles=STRING ')' (ambiguity) (rule end)
 	 */
 	protected void emit_UiMaskedDecimalField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('(' ')')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'maskedDecimal' (ambiguity) '{' bindings+=UiBinding
+	 *     (rule start) 'maskedDecimal' (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     (rule start) 'maskedDecimal' (ambiguity) '{' validators+=UiValidator
+	 *     (rule start) 'maskedDecimal' (ambiguity) ('{' '}')? (rule start)
+	 *     (rule start) 'maskedDecimal' (ambiguity) name=ID
 	 */
 	protected void emit_UiMaskedDecimalField___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:
+	 *     (rule start) 'maskedNumeric' ('(' ')')? (ambiguity) (rule start)
+	 *     i18nInfo=UiI18nInfo ')' (ambiguity) (rule end)
+	 *     name=ID (ambiguity) (rule end)
+	 *     readonly?='readonly' ')' (ambiguity) (rule end)
+	 *     styles=STRING ')' (ambiguity) (rule end)
 	 */
 	protected void emit_UiMaskedNumericField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('(' ')')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'maskedNumeric' (ambiguity) '{' bindings+=UiBinding
+	 *     (rule start) 'maskedNumeric' (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     (rule start) 'maskedNumeric' (ambiguity) '{' validators+=UiValidator
+	 *     (rule start) 'maskedNumeric' (ambiguity) ('{' '}')? (rule start)
+	 *     (rule start) 'maskedNumeric' (ambiguity) name=ID
 	 */
 	protected void emit_UiMaskedNumericField___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:
+	 *     (rule start) 'maskedText' ('(' ')')? (ambiguity) (rule start)
+	 *     i18nInfo=UiI18nInfo ')' (ambiguity) (rule end)
+	 *     mask=STRING ')' (ambiguity) (rule end)
+	 *     name=ID (ambiguity) (rule end)
+	 *     readonly?='readonly' ')' (ambiguity) (rule end)
+	 *     styles=STRING ')' (ambiguity) (rule end)
 	 */
 	protected void emit_UiMaskedTextField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('(' ')')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'maskedText' (ambiguity) '{' bindings+=UiBinding
+	 *     (rule start) 'maskedText' (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     (rule start) 'maskedText' (ambiguity) '{' validators+=UiValidator
+	 *     (rule start) 'maskedText' (ambiguity) ('{' '}')? (rule start)
+	 *     (rule start) 'maskedText' (ambiguity) name=ID
 	 */
 	protected void emit_UiMaskedTextField___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:
+	 *     (rule start) 'horizontalButtonGroup' (ambiguity) '{' '}' (rule start)
+	 *     (rule start) 'horizontalButtonGroup' (ambiguity) '{' bindings+=UiBinding
+	 *     (rule start) 'horizontalButtonGroup' (ambiguity) '{' contents+=UiMobileHorizontalButtonGroupAssigment
+	 *     (rule start) 'horizontalButtonGroup' (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     (rule start) 'horizontalButtonGroup' (ambiguity) name=ID
 	 */
 	protected void emit_UiMobileHorizontalButtonGroup___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:
+	 *     (rule start) 'mobileHorizontalLayout' (ambiguity) 'styles' styles=STRING
+	 *     (rule start) 'mobileHorizontalLayout' (ambiguity) '{' '}' (rule start)
+	 *     (rule start) 'mobileHorizontalLayout' (ambiguity) '{' bindings+=UiBinding
+	 *     (rule start) 'mobileHorizontalLayout' (ambiguity) '{' contents+=UiMobileHorizontalLayoutAssigment
+	 *     (rule start) 'mobileHorizontalLayout' (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     (rule start) 'mobileHorizontalLayout' (ambiguity) name=ID
+	 *     (rule start) 'mobileHorizontalLayout' (ambiguity) readonly?='readonly'
+	 *     i18nInfo=UiI18nInfo (ambiguity) 'styles' styles=STRING
+	 *     i18nInfo=UiI18nInfo (ambiguity) '{' '}' (rule end)
+	 *     i18nInfo=UiI18nInfo (ambiguity) '{' bindings+=UiBinding
+	 *     i18nInfo=UiI18nInfo (ambiguity) '{' contents+=UiMobileHorizontalLayoutAssigment
+	 *     i18nInfo=UiI18nInfo (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     i18nInfo=UiI18nInfo (ambiguity) name=ID
+	 *     i18nInfo=UiI18nInfo (ambiguity) readonly?='readonly'
+	 *     styles=STRING (ambiguity) 'styles' styles=STRING
+	 *     styles=STRING (ambiguity) '{' '}' (rule end)
+	 *     styles=STRING (ambiguity) '{' bindings+=UiBinding
+	 *     styles=STRING (ambiguity) '{' contents+=UiMobileHorizontalLayoutAssigment
+	 *     styles=STRING (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     styles=STRING (ambiguity) name=ID
+	 *     styles=STRING (ambiguity) readonly?='readonly'
 	 */
 	protected void emit_UiMobileHorizontalLayout___LeftParenthesisKeyword_2_0_0_or_RightParenthesisKeyword_2_2_1__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     (')' '('*)+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     readonly?='readonly' (ambiguity) 'styles' styles=STRING
+	 *     readonly?='readonly' (ambiguity) '{' '}' (rule end)
+	 *     readonly?='readonly' (ambiguity) '{' bindings+=UiBinding
+	 *     readonly?='readonly' (ambiguity) '{' contents+=UiMobileHorizontalLayoutAssigment
+	 *     readonly?='readonly' (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     readonly?='readonly' (ambiguity) name=ID
+	 *     readonly?='readonly' (ambiguity) readonly?='readonly'
 	 */
 	protected void emit_UiMobileHorizontalLayout___RightParenthesisKeyword_2_2_1_LeftParenthesisKeyword_2_0_0_a__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     (')'* '(')+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'mobileHorizontalLayout' (ambiguity) i18nInfo=UiI18nInfo
+	 *     i18nInfo=UiI18nInfo (ambiguity) i18nInfo=UiI18nInfo
+	 *     styles=STRING (ambiguity) i18nInfo=UiI18nInfo
 	 */
 	protected void emit_UiMobileHorizontalLayout___RightParenthesisKeyword_2_2_1_a_LeftParenthesisKeyword_2_0_0__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     (')'+ '('+)+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     readonly?='readonly' (ambiguity) i18nInfo=UiI18nInfo
 	 */
 	protected void emit_UiMobileHorizontalLayout___RightParenthesisKeyword_2_2_1_p_LeftParenthesisKeyword_2_0_0_p__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ';'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     actionID=STRING (ambiguity) (rule end)
+	 *     actionReference=[UxAction|QualifiedName] (ambiguity) (rule end)
 	 */
 	protected void emit_UiMobileNavBarAction_SemicolonKeyword_4_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('(' ')')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'navButton' (ambiguity) 'alias' targetPageAlias=[UiMobileNavigationPage|ID]
+	 *     (rule start) 'navButton' (ambiguity) name=ID
+	 *     (rule start) 'navButton' (ambiguity) targetPage=UiMobileNavigationPage
 	 */
 	protected void emit_UiMobileNavigationButton___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:
+	 *     jvmType=JvmTypeReference (ambiguity) 'navbarActions' '{' barActions+=UiMobileNavBarAction
+	 *     jvmType=JvmTypeReference (ambiguity) ('navbarActions' '{' '}')? '}' (rule end)
+	 *     jvmType=JvmTypeReference (ambiguity) ('navbarActions' '{' '}')? bindings+=UiBinding
+	 *     jvmType=JvmTypeReference (ambiguity) ('navbarActions' '{' '}')? contents+=UiMobileNavigationPageAssignment
+	 *     jvmType=JvmTypeReference (ambiguity) ('navbarActions' '{' '}')? processorAssignments+=UiVisibilityProcessorAssignment
 	 */
 	protected void emit_UiMobileNavigationPage_SemicolonKeyword_5_2_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('(' ')')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'navPage' (ambiguity) '{' 'navbarActions' '{' barActions+=UiMobileNavBarAction
+	 *     (rule start) 'navPage' (ambiguity) '{' 'type' jvmType=JvmTypeReference
+	 *     (rule start) 'navPage' (ambiguity) '{' ('navbarActions' '{' '}')? '}' (rule start)
+	 *     (rule start) 'navPage' (ambiguity) '{' ('navbarActions' '{' '}')? bindings+=UiBinding
+	 *     (rule start) 'navPage' (ambiguity) '{' ('navbarActions' '{' '}')? contents+=UiMobileNavigationPageAssignment
+	 *     (rule start) 'navPage' (ambiguity) '{' ('navbarActions' '{' '}')? processorAssignments+=UiVisibilityProcessorAssignment
+	 *     (rule start) 'navPage' (ambiguity) name=ID
 	 */
 	protected void emit_UiMobileNavigationPage___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('navbarActions' '{' '}')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'navPage' ('(' ')')? '{' (ambiguity) '}' (rule start)
+	 *     (rule start) 'navPage' ('(' ')')? '{' (ambiguity) bindings+=UiBinding
+	 *     (rule start) 'navPage' ('(' ')')? '{' (ambiguity) contents+=UiMobileNavigationPageAssignment
+	 *     (rule start) 'navPage' ('(' ')')? '{' (ambiguity) processorAssignments+=UiVisibilityProcessorAssignment
+	 *     i18nInfo=UiI18nInfo ')' '{' (ambiguity) '}' (rule end)
+	 *     i18nInfo=UiI18nInfo ')' '{' (ambiguity) bindings+=UiBinding
+	 *     i18nInfo=UiI18nInfo ')' '{' (ambiguity) contents+=UiMobileNavigationPageAssignment
+	 *     i18nInfo=UiI18nInfo ')' '{' (ambiguity) processorAssignments+=UiVisibilityProcessorAssignment
+	 *     jvmType=JvmTypeReference ';'? (ambiguity) '}' (rule end)
+	 *     jvmType=JvmTypeReference ';'? (ambiguity) bindings+=UiBinding
+	 *     jvmType=JvmTypeReference ';'? (ambiguity) contents+=UiMobileNavigationPageAssignment
+	 *     jvmType=JvmTypeReference ';'? (ambiguity) processorAssignments+=UiVisibilityProcessorAssignment
+	 *     name=ID '{' (ambiguity) '}' (rule end)
+	 *     name=ID '{' (ambiguity) bindings+=UiBinding
+	 *     name=ID '{' (ambiguity) contents+=UiMobileNavigationPageAssignment
+	 *     name=ID '{' (ambiguity) processorAssignments+=UiVisibilityProcessorAssignment
+	 *     styles=STRING ')' '{' (ambiguity) '}' (rule end)
+	 *     styles=STRING ')' '{' (ambiguity) bindings+=UiBinding
+	 *     styles=STRING ')' '{' (ambiguity) contents+=UiMobileNavigationPageAssignment
+	 *     styles=STRING ')' '{' (ambiguity) processorAssignments+=UiVisibilityProcessorAssignment
 	 */
 	protected void emit_UiMobileNavigationPage___NavbarActionsKeyword_6_0_LeftCurlyBracketKeyword_6_1_RightCurlyBracketKeyword_6_3__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ';'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     jvmType=JvmTypeReference (ambiguity) '}' (rule end)
+	 *     jvmType=JvmTypeReference (ambiguity) bindings+=UiBinding
+	 *     jvmType=JvmTypeReference (ambiguity) contents+=UiSearchField
+	 *     jvmType=JvmTypeReference (ambiguity) processorAssignments+=UiVisibilityProcessorAssignment
 	 */
 	protected void emit_UiMobileSearchPanel_SemicolonKeyword_7_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('(' ')')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'mobileSearchPanel' (ambiguity) '{' 'type' jvmType=JvmTypeReference
+	 *     (rule start) 'mobileSearchPanel' (ambiguity) name=ID
 	 */
 	protected void emit_UiMobileSearchPanel___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:
+	 *     (rule start) 'switchIt' ('(' ')')? (ambiguity) (rule start)
+	 *     i18nInfo=UiI18nInfo ')' (ambiguity) (rule end)
+	 *     name=ID (ambiguity) (rule end)
+	 *     readonly?='readonly' ')' (ambiguity) (rule end)
+	 *     styles=STRING ')' (ambiguity) (rule end)
 	 */
 	protected void emit_UiMobileSwitch___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('(' ')')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'switchIt' (ambiguity) '{' bindings+=UiBinding
+	 *     (rule start) 'switchIt' (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     (rule start) 'switchIt' (ambiguity) '{' validators+=UiValidator
+	 *     (rule start) 'switchIt' (ambiguity) ('{' '}')? (rule start)
+	 *     (rule start) 'switchIt' (ambiguity) name=ID
 	 */
 	protected void emit_UiMobileSwitch___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:
+	 *     (rule start) 'mobileTab' (ambiguity) '{' '}' (rule start)
+	 *     (rule start) 'mobileTab' (ambiguity) '{' bindings+=UiBinding
+	 *     (rule start) 'mobileTab' (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     (rule start) 'mobileTab' (ambiguity) '{' tabs+=UiMobileTabAssignment
+	 *     (rule start) 'mobileTab' (ambiguity) name=ID
 	 */
 	protected void emit_UiMobileTabSheet___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:
+	 *     (rule start) 'verticalGroup' (ambiguity) '{' '}' (rule start)
+	 *     (rule start) 'verticalGroup' (ambiguity) '{' bindings+=UiBinding
+	 *     (rule start) 'verticalGroup' (ambiguity) '{' contents+=UiMobileVerticalComponentGroupAssigment
+	 *     (rule start) 'verticalGroup' (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     (rule start) 'verticalGroup' (ambiguity) name=ID
 	 */
 	protected void emit_UiMobileVerticalComponentGroup___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:
+	 *     (rule start) 'mobileVerticalLayout' (ambiguity) 'styles' styles=STRING
+	 *     (rule start) 'mobileVerticalLayout' (ambiguity) '{' '}' (rule start)
+	 *     (rule start) 'mobileVerticalLayout' (ambiguity) '{' bindings+=UiBinding
+	 *     (rule start) 'mobileVerticalLayout' (ambiguity) '{' contents+=UiMobileVerticalLayoutAssigment
+	 *     (rule start) 'mobileVerticalLayout' (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     (rule start) 'mobileVerticalLayout' (ambiguity) name=ID
+	 *     (rule start) 'mobileVerticalLayout' (ambiguity) readonly?='readonly'
+	 *     i18nInfo=UiI18nInfo (ambiguity) 'styles' styles=STRING
+	 *     i18nInfo=UiI18nInfo (ambiguity) '{' '}' (rule end)
+	 *     i18nInfo=UiI18nInfo (ambiguity) '{' bindings+=UiBinding
+	 *     i18nInfo=UiI18nInfo (ambiguity) '{' contents+=UiMobileVerticalLayoutAssigment
+	 *     i18nInfo=UiI18nInfo (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     i18nInfo=UiI18nInfo (ambiguity) name=ID
+	 *     i18nInfo=UiI18nInfo (ambiguity) readonly?='readonly'
+	 *     styles=STRING (ambiguity) 'styles' styles=STRING
+	 *     styles=STRING (ambiguity) '{' '}' (rule end)
+	 *     styles=STRING (ambiguity) '{' bindings+=UiBinding
+	 *     styles=STRING (ambiguity) '{' contents+=UiMobileVerticalLayoutAssigment
+	 *     styles=STRING (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     styles=STRING (ambiguity) name=ID
+	 *     styles=STRING (ambiguity) readonly?='readonly'
 	 */
 	protected void emit_UiMobileVerticalLayout___LeftParenthesisKeyword_2_0_0_or_RightParenthesisKeyword_2_2_1__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     (')' '('*)+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     readonly?='readonly' (ambiguity) 'styles' styles=STRING
+	 *     readonly?='readonly' (ambiguity) '{' '}' (rule end)
+	 *     readonly?='readonly' (ambiguity) '{' bindings+=UiBinding
+	 *     readonly?='readonly' (ambiguity) '{' contents+=UiMobileVerticalLayoutAssigment
+	 *     readonly?='readonly' (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     readonly?='readonly' (ambiguity) name=ID
+	 *     readonly?='readonly' (ambiguity) readonly?='readonly'
 	 */
 	protected void emit_UiMobileVerticalLayout___RightParenthesisKeyword_2_2_1_LeftParenthesisKeyword_2_0_0_a__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     (')'* '(')+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'mobileVerticalLayout' (ambiguity) i18nInfo=UiI18nInfo
+	 *     i18nInfo=UiI18nInfo (ambiguity) i18nInfo=UiI18nInfo
+	 *     styles=STRING (ambiguity) i18nInfo=UiI18nInfo
 	 */
 	protected void emit_UiMobileVerticalLayout___RightParenthesisKeyword_2_2_1_a_LeftParenthesisKeyword_2_0_0__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     (')'+ '('+)+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     readonly?='readonly' (ambiguity) i18nInfo=UiI18nInfo
 	 */
 	protected void emit_UiMobileVerticalLayout___RightParenthesisKeyword_2_2_1_p_LeftParenthesisKeyword_2_0_0_p__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ';'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     sharedStateGroup=STRING (ambiguity) 'rootType' jvmType=JvmTypeReference
+	 *     sharedStateGroup=STRING (ambiguity) 'sharedStateGroup' sharedStateGroup=STRING
+	 *     sharedStateGroup=STRING (ambiguity) beanSlots+=UiBeanSlot
+	 *     sharedStateGroup=STRING (ambiguity) bindingEndpointAlias+=UiBindingEndpointAlias
+	 *     sharedStateGroup=STRING (ambiguity) content=UiMobileEmbeddable
 	 */
 	protected void emit_UiMobileView_SemicolonKeyword_3_0_2_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ';'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     jvmType=JvmTypeReference (ambiguity) 'rootType' jvmType=JvmTypeReference
+	 *     jvmType=JvmTypeReference (ambiguity) 'sharedStateGroup' sharedStateGroup=STRING
+	 *     jvmType=JvmTypeReference (ambiguity) beanSlots+=UiBeanSlot
+	 *     jvmType=JvmTypeReference (ambiguity) bindingEndpointAlias+=UiBindingEndpointAlias
+	 *     jvmType=JvmTypeReference (ambiguity) content=UiMobileEmbeddable
 	 */
 	protected void emit_UiMobileView_SemicolonKeyword_3_1_2_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('{' '}')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'numericField' ('(' ')')? (ambiguity) (rule start)
+	 *     i18nInfo=UiI18nInfo ')' (ambiguity) (rule end)
+	 *     name=ID (ambiguity) (rule end)
+	 *     noGrouping?='noGrouping' ')' (ambiguity) (rule end)
+	 *     noMarkNegative?='noMarkNegative' ')' (ambiguity) (rule end)
+	 *     readonly?='readonly' ')' (ambiguity) (rule end)
+	 *     styles=STRING ')' (ambiguity) (rule end)
 	 */
 	protected void emit_UiNumericField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('(' ')')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'numericField' (ambiguity) '{' bindings+=UiBinding
+	 *     (rule start) 'numericField' (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     (rule start) 'numericField' (ambiguity) '{' validators+=UiValidator
+	 *     (rule start) 'numericField' (ambiguity) ('{' '}')? (rule start)
+	 *     (rule start) 'numericField' (ambiguity) name=ID
 	 */
 	protected void emit_UiNumericField___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:
+	 *     descriptionProperty=UiNestedProperty (ambiguity) 'captionField' itemCaptionProperty=[JvmOperation|ID]
+	 *     descriptionProperty=UiNestedProperty (ambiguity) 'descriptionField' descriptionProperty=UiNestedProperty
+	 *     descriptionProperty=UiNestedProperty (ambiguity) 'imageField' itemImageProperty=[JvmOperation|ID]
+	 *     descriptionProperty=UiNestedProperty (ambiguity) 'selectionType' selectionType=UiSelectionType
+	 *     descriptionProperty=UiNestedProperty (ambiguity) 'type' jvmType=JvmTypeReference
+	 *     descriptionProperty=UiNestedProperty (ambiguity) '}' (rule end)
+	 *     descriptionProperty=UiNestedProperty (ambiguity) bindings+=UiBinding
+	 *     descriptionProperty=UiNestedProperty (ambiguity) consumeBeanService?='useBeanService'
+	 *     descriptionProperty=UiNestedProperty (ambiguity) processorAssignments+=UiVisibilityProcessorAssignment
+	 *     descriptionProperty=UiNestedProperty (ambiguity) readonly?='readonly'
+	 *     descriptionProperty=UiNestedProperty (ambiguity) validators+=UiValidator
 	 */
 	protected void emit_UiOptionsGroup_SemicolonKeyword_4_1_3_2_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ';'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     consumeBeanService?='useBeanService' (ambiguity) 'captionField' itemCaptionProperty=[JvmOperation|ID]
+	 *     consumeBeanService?='useBeanService' (ambiguity) 'descriptionField' descriptionProperty=UiNestedProperty
+	 *     consumeBeanService?='useBeanService' (ambiguity) 'imageField' itemImageProperty=[JvmOperation|ID]
+	 *     consumeBeanService?='useBeanService' (ambiguity) 'selectionType' selectionType=UiSelectionType
+	 *     consumeBeanService?='useBeanService' (ambiguity) 'type' jvmType=JvmTypeReference
+	 *     consumeBeanService?='useBeanService' (ambiguity) '}' (rule end)
+	 *     consumeBeanService?='useBeanService' (ambiguity) bindings+=UiBinding
+	 *     consumeBeanService?='useBeanService' (ambiguity) consumeBeanService?='useBeanService'
+	 *     consumeBeanService?='useBeanService' (ambiguity) processorAssignments+=UiVisibilityProcessorAssignment
+	 *     consumeBeanService?='useBeanService' (ambiguity) readonly?='readonly'
+	 *     consumeBeanService?='useBeanService' (ambiguity) validators+=UiValidator
 	 */
 	protected void emit_UiOptionsGroup_SemicolonKeyword_4_1_5_1_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('{' '}')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'optionsgroup' ('(' ')')? (ambiguity) (rule start)
+	 *     i18nInfo=UiI18nInfo ')' (ambiguity) (rule end)
+	 *     name=ID (ambiguity) (rule end)
+	 *     styles=STRING ')' (ambiguity) (rule end)
 	 */
 	protected void emit_UiOptionsGroup___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_4__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('(' ')')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'optionsgroup' (ambiguity) '{' 'captionField' itemCaptionProperty=[JvmOperation|ID]
+	 *     (rule start) 'optionsgroup' (ambiguity) '{' 'descriptionField' descriptionProperty=UiNestedProperty
+	 *     (rule start) 'optionsgroup' (ambiguity) '{' 'imageField' itemImageProperty=[JvmOperation|ID]
+	 *     (rule start) 'optionsgroup' (ambiguity) '{' 'selectionType' selectionType=UiSelectionType
+	 *     (rule start) 'optionsgroup' (ambiguity) '{' 'type' jvmType=JvmTypeReference
+	 *     (rule start) 'optionsgroup' (ambiguity) '{' bindings+=UiBinding
+	 *     (rule start) 'optionsgroup' (ambiguity) '{' consumeBeanService?='useBeanService'
+	 *     (rule start) 'optionsgroup' (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     (rule start) 'optionsgroup' (ambiguity) '{' readonly?='readonly'
+	 *     (rule start) 'optionsgroup' (ambiguity) '{' validators+=UiValidator
+	 *     (rule start) 'optionsgroup' (ambiguity) ('{' '}')? (rule start)
+	 *     (rule start) 'optionsgroup' (ambiguity) name=ID
 	 */
 	protected void emit_UiOptionsGroup___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:
+	 *     (rule start) 'panel' (ambiguity) name=ID
 	 */
 	protected void emit_UiPanel___LeftParenthesisKeyword_1_0_RightParenthesisKeyword_1_2__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('{' '}')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'passwordField' ('(' ')')? (ambiguity) (rule start)
+	 *     i18nInfo=UiI18nInfo ')' (ambiguity) (rule end)
+	 *     name=ID (ambiguity) (rule end)
+	 *     readonly?='readonly' ')' (ambiguity) (rule end)
+	 *     styles=STRING ')' (ambiguity) (rule end)
 	 */
 	protected void emit_UiPasswordField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('(' ')')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'passwordField' (ambiguity) '{' bindings+=UiBinding
+	 *     (rule start) 'passwordField' (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     (rule start) 'passwordField' (ambiguity) '{' validators+=UiValidator
+	 *     (rule start) 'passwordField' (ambiguity) ('{' '}')? (rule start)
+	 *     (rule start) 'passwordField' (ambiguity) name=ID
 	 */
 	protected void emit_UiPasswordField___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:
+	 *     (rule start) 'maskedTextWithPrefix' ('(' ')')? (ambiguity) (rule start)
+	 *     i18nInfo=UiI18nInfo ')' (ambiguity) (rule end)
+	 *     mask=STRING ')' (ambiguity) (rule end)
+	 *     name=ID (ambiguity) (rule end)
+	 *     prefixMasks+=UiPrefixToMaskMapEntry ')' ')' (ambiguity) (rule end)
+	 *     readonly?='readonly' ')' (ambiguity) (rule end)
+	 *     styles=STRING ')' (ambiguity) (rule end)
 	 */
 	protected void emit_UiPrefixedMaskedTextField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('(' ')')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'maskedTextWithPrefix' (ambiguity) '{' bindings+=UiBinding
+	 *     (rule start) 'maskedTextWithPrefix' (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     (rule start) 'maskedTextWithPrefix' (ambiguity) '{' validators+=UiValidator
+	 *     (rule start) 'maskedTextWithPrefix' (ambiguity) ('{' '}')? (rule start)
+	 *     (rule start) 'maskedTextWithPrefix' (ambiguity) name=ID
 	 */
 	protected void emit_UiPrefixedMaskedTextField___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:
+	 *     (rule start) 'progressbar' ('(' ')')? (ambiguity) (rule start)
+	 *     i18nInfo=UiI18nInfo ')' (ambiguity) (rule end)
+	 *     name=ID (ambiguity) (rule end)
+	 *     styles=STRING ')' (ambiguity) (rule end)
 	 */
 	protected void emit_UiProgressBar___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('(' ')')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'progressbar' (ambiguity) '{' bindings+=UiBinding
+	 *     (rule start) 'progressbar' (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     (rule start) 'progressbar' (ambiguity) '{' validators+=UiValidator
+	 *     (rule start) 'progressbar' (ambiguity) ('{' '}')? (rule start)
+	 *     (rule start) 'progressbar' (ambiguity) name=ID
 	 */
 	protected void emit_UiProgressBar___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:
+	 *     (rule start) 'richtextArea' ('(' ')')? (ambiguity) (rule start)
+	 *     asBlob?='asBlob' ')' (ambiguity) (rule end)
+	 *     i18nInfo=UiI18nInfo ')' (ambiguity) (rule end)
+	 *     name=ID (ambiguity) (rule end)
+	 *     readonly?='readonly' ')' (ambiguity) (rule end)
+	 *     styles=STRING ')' (ambiguity) (rule end)
 	 */
 	protected void emit_UiRichTextArea___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('(' ')')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'richtextArea' (ambiguity) '{' bindings+=UiBinding
+	 *     (rule start) 'richtextArea' (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     (rule start) 'richtextArea' (ambiguity) '{' validators+=UiValidator
+	 *     (rule start) 'richtextArea' (ambiguity) ('{' '}')? (rule start)
+	 *     (rule start) 'richtextArea' (ambiguity) name=ID
 	 */
 	protected void emit_UiRichTextArea___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:
+	 *     (rule start) 'searchdialog' (ambiguity) '{' 'search' '{' searchFields+=UiDialogSearchFieldAssignment
+	 *     (rule start) 'searchdialog' (ambiguity) '{' 'type' jvmType=JvmTypeReference
+	 *     (rule start) 'searchdialog' (ambiguity) '{' ('search' '{' '}')? 'content' '{' content=UiDialogAssignment
+	 *     (rule start) 'searchdialog' (ambiguity) '{' ('search' '{' '}')? '}' (rule start)
+	 *     (rule start) 'searchdialog' (ambiguity) '{' ('search' '{' '}')? bindings+=UiBinding
+	 *     (rule start) 'searchdialog' (ambiguity) '{' ('search' '{' '}')? processorAssignments+=UiVisibilityProcessorAssignment
+	 *     (rule start) 'searchdialog' (ambiguity) name=ID
 	 */
 	protected void emit_UiSearchDialog___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('search' '{' '}')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'searchdialog' ('(' ')')? '{' (ambiguity) 'content' '{' content=UiDialogAssignment
+	 *     (rule start) 'searchdialog' ('(' ')')? '{' (ambiguity) '}' (rule start)
+	 *     (rule start) 'searchdialog' ('(' ')')? '{' (ambiguity) bindings+=UiBinding
+	 *     (rule start) 'searchdialog' ('(' ')')? '{' (ambiguity) processorAssignments+=UiVisibilityProcessorAssignment
+	 *     i18nInfo=UiI18nInfo ')' '{' (ambiguity) 'content' '{' content=UiDialogAssignment
+	 *     i18nInfo=UiI18nInfo ')' '{' (ambiguity) '}' (rule end)
+	 *     i18nInfo=UiI18nInfo ')' '{' (ambiguity) bindings+=UiBinding
+	 *     i18nInfo=UiI18nInfo ')' '{' (ambiguity) processorAssignments+=UiVisibilityProcessorAssignment
+	 *     jvmType=JvmTypeReference (ambiguity) 'content' '{' content=UiDialogAssignment
+	 *     jvmType=JvmTypeReference (ambiguity) '}' (rule end)
+	 *     jvmType=JvmTypeReference (ambiguity) bindings+=UiBinding
+	 *     jvmType=JvmTypeReference (ambiguity) processorAssignments+=UiVisibilityProcessorAssignment
+	 *     name=ID '{' (ambiguity) 'content' '{' content=UiDialogAssignment
+	 *     name=ID '{' (ambiguity) '}' (rule end)
+	 *     name=ID '{' (ambiguity) bindings+=UiBinding
+	 *     name=ID '{' (ambiguity) processorAssignments+=UiVisibilityProcessorAssignment
+	 *     styles=STRING ')' '{' (ambiguity) 'content' '{' content=UiDialogAssignment
+	 *     styles=STRING ')' '{' (ambiguity) '}' (rule end)
+	 *     styles=STRING ')' '{' (ambiguity) bindings+=UiBinding
+	 *     styles=STRING ')' '{' (ambiguity) processorAssignments+=UiVisibilityProcessorAssignment
 	 */
 	protected void emit_UiSearchDialog___SearchKeyword_6_0_LeftCurlyBracketKeyword_6_1_RightCurlyBracketKeyword_6_3__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('(' ')')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'searchfield' (ambiguity) property=UiNestedProperty
 	 */
 	protected void emit_UiSearchField___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:
+	 *     jvmType=JvmTypeReference (ambiguity) '}' (rule end)
+	 *     jvmType=JvmTypeReference (ambiguity) bindings+=UiBinding
+	 *     jvmType=JvmTypeReference (ambiguity) contents+=UiSearchField
+	 *     jvmType=JvmTypeReference (ambiguity) processorAssignments+=UiVisibilityProcessorAssignment
 	 */
 	protected void emit_UiSearchPanel_SemicolonKeyword_7_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('(' ')')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'searchPanel' (ambiguity) '{' 'type' jvmType=JvmTypeReference
+	 *     (rule start) 'searchPanel' (ambiguity) name=ID
 	 */
 	protected void emit_UiSearchPanel___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     'desc'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     property=UiNestedProperty (ambiguity) ';'? (rule end)
 	 */
 	protected void emit_UiSortOrder_DescKeyword_2_0_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ';'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     asc?='asc' (ambiguity) (rule end)
+	 *     property=UiNestedProperty 'desc'? (ambiguity) (rule end)
 	 */
 	protected void emit_UiSortOrder_SemicolonKeyword_3_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('(' | ')')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'splitter' (ambiguity) 'styles' styles=STRING
+	 *     (rule start) 'splitter' (ambiguity) name=ID
+	 *     i18nInfo=UiI18nInfo (ambiguity) 'styles' styles=STRING
+	 *     i18nInfo=UiI18nInfo (ambiguity) name=ID
 	 */
 	protected void emit_UiSplitpanel___LeftParenthesisKeyword_1_0_0_or_RightParenthesisKeyword_1_1_1__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     (')' '('*)+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     styles=STRING (ambiguity) 'styles' styles=STRING
+	 *     styles=STRING (ambiguity) name=ID
 	 */
 	protected void emit_UiSplitpanel___RightParenthesisKeyword_1_1_1_LeftParenthesisKeyword_1_0_0_a__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     (')'* '(')+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'splitter' (ambiguity) i18nInfo=UiI18nInfo
+	 *     i18nInfo=UiI18nInfo (ambiguity) i18nInfo=UiI18nInfo
 	 */
 	protected void emit_UiSplitpanel___RightParenthesisKeyword_1_1_1_a_LeftParenthesisKeyword_1_0_0__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     (')'+ '('+)+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     styles=STRING (ambiguity) i18nInfo=UiI18nInfo
 	 */
 	protected void emit_UiSplitpanel___RightParenthesisKeyword_1_1_1_p_LeftParenthesisKeyword_1_0_0_p__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ';'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     jvmType=JvmTypeReference (ambiguity) 'captionField' itemCaptionProperty=[JvmOperation|ID]
+	 *     jvmType=JvmTypeReference (ambiguity) 'filterField' itemFilterProperty=[JvmOperation|ID]
+	 *     jvmType=JvmTypeReference (ambiguity) 'type' jvmType=JvmTypeReference
+	 *     jvmType=JvmTypeReference (ambiguity) 'uuidField' itemUUIDProperty=[JvmOperation|ID]
+	 *     jvmType=JvmTypeReference (ambiguity) '}' (rule end)
+	 *     jvmType=JvmTypeReference (ambiguity) autoHidePopup?='autoHidePopup'
+	 *     jvmType=JvmTypeReference (ambiguity) bindings+=UiBinding
+	 *     jvmType=JvmTypeReference (ambiguity) processorAssignments+=UiVisibilityProcessorAssignment
+	 *     jvmType=JvmTypeReference (ambiguity) readonly?='readonly'
+	 *     jvmType=JvmTypeReference (ambiguity) validators+=UiValidator
 	 */
 	protected void emit_UiSuggestTextField_SemicolonKeyword_4_1_0_2_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ';'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     itemCaptionProperty=[JvmOperation|ID] (ambiguity) 'captionField' itemCaptionProperty=[JvmOperation|ID]
+	 *     itemCaptionProperty=[JvmOperation|ID] (ambiguity) 'filterField' itemFilterProperty=[JvmOperation|ID]
+	 *     itemCaptionProperty=[JvmOperation|ID] (ambiguity) 'type' jvmType=JvmTypeReference
+	 *     itemCaptionProperty=[JvmOperation|ID] (ambiguity) 'uuidField' itemUUIDProperty=[JvmOperation|ID]
+	 *     itemCaptionProperty=[JvmOperation|ID] (ambiguity) '}' (rule end)
+	 *     itemCaptionProperty=[JvmOperation|ID] (ambiguity) autoHidePopup?='autoHidePopup'
+	 *     itemCaptionProperty=[JvmOperation|ID] (ambiguity) bindings+=UiBinding
+	 *     itemCaptionProperty=[JvmOperation|ID] (ambiguity) processorAssignments+=UiVisibilityProcessorAssignment
+	 *     itemCaptionProperty=[JvmOperation|ID] (ambiguity) readonly?='readonly'
+	 *     itemCaptionProperty=[JvmOperation|ID] (ambiguity) validators+=UiValidator
 	 */
 	protected void emit_UiSuggestTextField_SemicolonKeyword_4_1_1_2_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ';'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     itemFilterProperty=[JvmOperation|ID] (ambiguity) 'captionField' itemCaptionProperty=[JvmOperation|ID]
+	 *     itemFilterProperty=[JvmOperation|ID] (ambiguity) 'filterField' itemFilterProperty=[JvmOperation|ID]
+	 *     itemFilterProperty=[JvmOperation|ID] (ambiguity) 'type' jvmType=JvmTypeReference
+	 *     itemFilterProperty=[JvmOperation|ID] (ambiguity) 'uuidField' itemUUIDProperty=[JvmOperation|ID]
+	 *     itemFilterProperty=[JvmOperation|ID] (ambiguity) '}' (rule end)
+	 *     itemFilterProperty=[JvmOperation|ID] (ambiguity) autoHidePopup?='autoHidePopup'
+	 *     itemFilterProperty=[JvmOperation|ID] (ambiguity) bindings+=UiBinding
+	 *     itemFilterProperty=[JvmOperation|ID] (ambiguity) processorAssignments+=UiVisibilityProcessorAssignment
+	 *     itemFilterProperty=[JvmOperation|ID] (ambiguity) readonly?='readonly'
+	 *     itemFilterProperty=[JvmOperation|ID] (ambiguity) validators+=UiValidator
 	 */
 	protected void emit_UiSuggestTextField_SemicolonKeyword_4_1_2_2_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ';'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     itemUUIDProperty=[JvmOperation|ID] (ambiguity) 'captionField' itemCaptionProperty=[JvmOperation|ID]
+	 *     itemUUIDProperty=[JvmOperation|ID] (ambiguity) 'filterField' itemFilterProperty=[JvmOperation|ID]
+	 *     itemUUIDProperty=[JvmOperation|ID] (ambiguity) 'type' jvmType=JvmTypeReference
+	 *     itemUUIDProperty=[JvmOperation|ID] (ambiguity) 'uuidField' itemUUIDProperty=[JvmOperation|ID]
+	 *     itemUUIDProperty=[JvmOperation|ID] (ambiguity) '}' (rule end)
+	 *     itemUUIDProperty=[JvmOperation|ID] (ambiguity) autoHidePopup?='autoHidePopup'
+	 *     itemUUIDProperty=[JvmOperation|ID] (ambiguity) bindings+=UiBinding
+	 *     itemUUIDProperty=[JvmOperation|ID] (ambiguity) processorAssignments+=UiVisibilityProcessorAssignment
+	 *     itemUUIDProperty=[JvmOperation|ID] (ambiguity) readonly?='readonly'
+	 *     itemUUIDProperty=[JvmOperation|ID] (ambiguity) validators+=UiValidator
 	 */
 	protected void emit_UiSuggestTextField_SemicolonKeyword_4_1_3_2_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('{' '}')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'suggestText' ('(' ')')? (ambiguity) (rule start)
+	 *     i18nInfo=UiI18nInfo ')' (ambiguity) (rule end)
+	 *     name=ID (ambiguity) (rule end)
+	 *     styles=STRING ')' (ambiguity) (rule end)
 	 */
 	protected void emit_UiSuggestTextField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_4__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('(' ')')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'suggestText' (ambiguity) '{' 'captionField' itemCaptionProperty=[JvmOperation|ID]
+	 *     (rule start) 'suggestText' (ambiguity) '{' 'filterField' itemFilterProperty=[JvmOperation|ID]
+	 *     (rule start) 'suggestText' (ambiguity) '{' 'type' jvmType=JvmTypeReference
+	 *     (rule start) 'suggestText' (ambiguity) '{' 'uuidField' itemUUIDProperty=[JvmOperation|ID]
+	 *     (rule start) 'suggestText' (ambiguity) '{' autoHidePopup?='autoHidePopup'
+	 *     (rule start) 'suggestText' (ambiguity) '{' bindings+=UiBinding
+	 *     (rule start) 'suggestText' (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     (rule start) 'suggestText' (ambiguity) '{' readonly?='readonly'
+	 *     (rule start) 'suggestText' (ambiguity) '{' validators+=UiValidator
+	 *     (rule start) 'suggestText' (ambiguity) ('{' '}')? (rule start)
+	 *     (rule start) 'suggestText' (ambiguity) name=ID
 	 */
 	protected void emit_UiSuggestTextField___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:
+	 *     (rule start) 'tabsheet' (ambiguity) '{' '}' (rule start)
+	 *     (rule start) 'tabsheet' (ambiguity) '{' bindings+=UiBinding
+	 *     (rule start) 'tabsheet' (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     (rule start) 'tabsheet' (ambiguity) '{' tabs+=UiTabAssignment
+	 *     (rule start) 'tabsheet' (ambiguity) name=ID
 	 */
 	protected void emit_UiTabSheet___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:
+	 *     jvmType=JvmTypeReference (ambiguity) 'imageField' itemImageProperty=[JvmOperation|ID]
+	 *     jvmType=JvmTypeReference (ambiguity) 'selectionType' selectionType=UiSelectionType
+	 *     jvmType=JvmTypeReference (ambiguity) 'type' jvmType=JvmTypeReference
+	 *     jvmType=JvmTypeReference (ambiguity) '}' (rule end)
+	 *     jvmType=JvmTypeReference (ambiguity) bindings+=UiBinding
+	 *     jvmType=JvmTypeReference (ambiguity) columnAssignment=UiColumnsAssignment
+	 *     jvmType=JvmTypeReference (ambiguity) consumeBeanService?='useBeanService'
+	 *     jvmType=JvmTypeReference (ambiguity) processorAssignments+=UiVisibilityProcessorAssignment
+	 *     jvmType=JvmTypeReference (ambiguity) readonly?='readonly'
+	 *     jvmType=JvmTypeReference (ambiguity) scrollToBottom?='scrollToBottom'
+	 *     jvmType=JvmTypeReference (ambiguity) sortOrderAssignment=UiSortOrderAssignment
+	 *     jvmType=JvmTypeReference (ambiguity) validators+=UiValidator
 	 */
 	protected void emit_UiTable_SemicolonKeyword_4_1_0_2_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ';'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     selectionType=UiSelectionType (ambiguity) 'imageField' itemImageProperty=[JvmOperation|ID]
+	 *     selectionType=UiSelectionType (ambiguity) 'selectionType' selectionType=UiSelectionType
+	 *     selectionType=UiSelectionType (ambiguity) 'type' jvmType=JvmTypeReference
+	 *     selectionType=UiSelectionType (ambiguity) '}' (rule end)
+	 *     selectionType=UiSelectionType (ambiguity) bindings+=UiBinding
+	 *     selectionType=UiSelectionType (ambiguity) columnAssignment=UiColumnsAssignment
+	 *     selectionType=UiSelectionType (ambiguity) consumeBeanService?='useBeanService'
+	 *     selectionType=UiSelectionType (ambiguity) processorAssignments+=UiVisibilityProcessorAssignment
+	 *     selectionType=UiSelectionType (ambiguity) readonly?='readonly'
+	 *     selectionType=UiSelectionType (ambiguity) scrollToBottom?='scrollToBottom'
+	 *     selectionType=UiSelectionType (ambiguity) sortOrderAssignment=UiSortOrderAssignment
+	 *     selectionType=UiSelectionType (ambiguity) validators+=UiValidator
 	 */
 	protected void emit_UiTable_SemicolonKeyword_4_1_1_2_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ';'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     itemImageProperty=[JvmOperation|ID] (ambiguity) 'imageField' itemImageProperty=[JvmOperation|ID]
+	 *     itemImageProperty=[JvmOperation|ID] (ambiguity) 'selectionType' selectionType=UiSelectionType
+	 *     itemImageProperty=[JvmOperation|ID] (ambiguity) 'type' jvmType=JvmTypeReference
+	 *     itemImageProperty=[JvmOperation|ID] (ambiguity) '}' (rule end)
+	 *     itemImageProperty=[JvmOperation|ID] (ambiguity) bindings+=UiBinding
+	 *     itemImageProperty=[JvmOperation|ID] (ambiguity) columnAssignment=UiColumnsAssignment
+	 *     itemImageProperty=[JvmOperation|ID] (ambiguity) consumeBeanService?='useBeanService'
+	 *     itemImageProperty=[JvmOperation|ID] (ambiguity) processorAssignments+=UiVisibilityProcessorAssignment
+	 *     itemImageProperty=[JvmOperation|ID] (ambiguity) readonly?='readonly'
+	 *     itemImageProperty=[JvmOperation|ID] (ambiguity) scrollToBottom?='scrollToBottom'
+	 *     itemImageProperty=[JvmOperation|ID] (ambiguity) sortOrderAssignment=UiSortOrderAssignment
+	 *     itemImageProperty=[JvmOperation|ID] (ambiguity) validators+=UiValidator
 	 */
 	protected void emit_UiTable_SemicolonKeyword_4_1_2_2_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ';'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     consumeBeanService?='useBeanService' (ambiguity) 'imageField' itemImageProperty=[JvmOperation|ID]
+	 *     consumeBeanService?='useBeanService' (ambiguity) 'selectionType' selectionType=UiSelectionType
+	 *     consumeBeanService?='useBeanService' (ambiguity) 'type' jvmType=JvmTypeReference
+	 *     consumeBeanService?='useBeanService' (ambiguity) '}' (rule end)
+	 *     consumeBeanService?='useBeanService' (ambiguity) bindings+=UiBinding
+	 *     consumeBeanService?='useBeanService' (ambiguity) columnAssignment=UiColumnsAssignment
+	 *     consumeBeanService?='useBeanService' (ambiguity) consumeBeanService?='useBeanService'
+	 *     consumeBeanService?='useBeanService' (ambiguity) processorAssignments+=UiVisibilityProcessorAssignment
+	 *     consumeBeanService?='useBeanService' (ambiguity) readonly?='readonly'
+	 *     consumeBeanService?='useBeanService' (ambiguity) scrollToBottom?='scrollToBottom'
+	 *     consumeBeanService?='useBeanService' (ambiguity) sortOrderAssignment=UiSortOrderAssignment
+	 *     consumeBeanService?='useBeanService' (ambiguity) validators+=UiValidator
 	 */
 	protected void emit_UiTable_SemicolonKeyword_4_1_3_1_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
+	 *     ';'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     scrollToBottom?='scrollToBottom' (ambiguity) 'imageField' itemImageProperty=[JvmOperation|ID]
+	 *     scrollToBottom?='scrollToBottom' (ambiguity) 'selectionType' selectionType=UiSelectionType
+	 *     scrollToBottom?='scrollToBottom' (ambiguity) 'type' jvmType=JvmTypeReference
+	 *     scrollToBottom?='scrollToBottom' (ambiguity) '}' (rule end)
+	 *     scrollToBottom?='scrollToBottom' (ambiguity) bindings+=UiBinding
+	 *     scrollToBottom?='scrollToBottom' (ambiguity) columnAssignment=UiColumnsAssignment
+	 *     scrollToBottom?='scrollToBottom' (ambiguity) consumeBeanService?='useBeanService'
+	 *     scrollToBottom?='scrollToBottom' (ambiguity) processorAssignments+=UiVisibilityProcessorAssignment
+	 *     scrollToBottom?='scrollToBottom' (ambiguity) readonly?='readonly'
+	 *     scrollToBottom?='scrollToBottom' (ambiguity) scrollToBottom?='scrollToBottom'
+	 *     scrollToBottom?='scrollToBottom' (ambiguity) sortOrderAssignment=UiSortOrderAssignment
+	 *     scrollToBottom?='scrollToBottom' (ambiguity) validators+=UiValidator
+	 */
+	protected void emit_UiTable_SemicolonKeyword_4_1_4_1_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
 	 *     ('{' '}')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'table' ('(' ')')? (ambiguity) (rule start)
+	 *     i18nInfo=UiI18nInfo ')' (ambiguity) (rule end)
+	 *     name=ID (ambiguity) (rule end)
+	 *     styles=STRING ')' (ambiguity) (rule end)
 	 */
 	protected void emit_UiTable___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_6__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('(' ')')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'table' (ambiguity) '{' 'imageField' itemImageProperty=[JvmOperation|ID]
+	 *     (rule start) 'table' (ambiguity) '{' 'selectionType' selectionType=UiSelectionType
+	 *     (rule start) 'table' (ambiguity) '{' 'type' jvmType=JvmTypeReference
+	 *     (rule start) 'table' (ambiguity) '{' bindings+=UiBinding
+	 *     (rule start) 'table' (ambiguity) '{' columnAssignment=UiColumnsAssignment
+	 *     (rule start) 'table' (ambiguity) '{' consumeBeanService?='useBeanService'
+	 *     (rule start) 'table' (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     (rule start) 'table' (ambiguity) '{' readonly?='readonly'
+	 *     (rule start) 'table' (ambiguity) '{' scrollToBottom?='scrollToBottom'
+	 *     (rule start) 'table' (ambiguity) '{' sortOrderAssignment=UiSortOrderAssignment
+	 *     (rule start) 'table' (ambiguity) '{' validators+=UiValidator
+	 *     (rule start) 'table' (ambiguity) ('{' '}')? (rule start)
+	 *     (rule start) 'table' (ambiguity) name=ID
 	 */
 	protected void emit_UiTable___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:
+	 *     (rule start) 'textarea' ('(' ')')? (ambiguity) (rule start)
+	 *     i18nInfo=UiI18nInfo ')' (ambiguity) (rule end)
+	 *     name=ID (ambiguity) (rule end)
+	 *     readonly?='readonly' ')' (ambiguity) (rule end)
+	 *     styles=STRING ')' (ambiguity) (rule end)
 	 */
 	protected void emit_UiTextArea___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('(' ')')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'textarea' (ambiguity) '{' bindings+=UiBinding
+	 *     (rule start) 'textarea' (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     (rule start) 'textarea' (ambiguity) '{' validators+=UiValidator
+	 *     (rule start) 'textarea' (ambiguity) ('{' '}')? (rule start)
+	 *     (rule start) 'textarea' (ambiguity) name=ID
 	 */
 	protected void emit_UiTextArea___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:
+	 *     (rule start) 'textfield' ('(' ')')? (ambiguity) (rule start)
+	 *     i18nInfo=UiI18nInfo ')' (ambiguity) (rule end)
+	 *     maxLength=INT ')' (ambiguity) (rule end)
+	 *     minLength=INT ')' (ambiguity) (rule end)
+	 *     name=ID (ambiguity) (rule end)
+	 *     readonly?='readonly' ')' (ambiguity) (rule end)
+	 *     regex=STRING ')' (ambiguity) (rule end)
+	 *     styles=STRING ')' (ambiguity) (rule end)
 	 */
 	protected void emit_UiTextField___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_3__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('(' ')')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'textfield' (ambiguity) '{' bindings+=UiBinding
+	 *     (rule start) 'textfield' (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     (rule start) 'textfield' (ambiguity) '{' validators+=UiValidator
+	 *     (rule start) 'textfield' (ambiguity) ('{' '}')? (rule start)
+	 *     (rule start) 'textfield' (ambiguity) name=ID
 	 */
 	protected void emit_UiTextField___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:
+	 *     alias=ID (ambiguity) (rule end)
 	 */
 	protected void emit_UiTypedBindableRawTypeAlias_SemicolonKeyword_4_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ';'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     alias=ID (ambiguity) (rule end)
 	 */
 	protected void emit_UiValidatorAlias_SemicolonKeyword_4_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ';'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     validatorAlias=[UiValidatorAlias|QualifiedName] (ambiguity) (rule end)
 	 */
 	protected void emit_UiValidatorAssignment_SemicolonKeyword_3_1_1_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('(' | ')')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'verticalLayout' (ambiguity) 'styles' styles=STRING
+	 *     (rule start) 'verticalLayout' (ambiguity) '{' '}' (rule start)
+	 *     (rule start) 'verticalLayout' (ambiguity) '{' bindings+=UiBinding
+	 *     (rule start) 'verticalLayout' (ambiguity) '{' contents+=UiVerticalLayoutAssigment
+	 *     (rule start) 'verticalLayout' (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     (rule start) 'verticalLayout' (ambiguity) name=ID
+	 *     (rule start) 'verticalLayout' (ambiguity) readonly?='readonly'
+	 *     i18nInfo=UiI18nInfo (ambiguity) 'styles' styles=STRING
+	 *     i18nInfo=UiI18nInfo (ambiguity) '{' '}' (rule end)
+	 *     i18nInfo=UiI18nInfo (ambiguity) '{' bindings+=UiBinding
+	 *     i18nInfo=UiI18nInfo (ambiguity) '{' contents+=UiVerticalLayoutAssigment
+	 *     i18nInfo=UiI18nInfo (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     i18nInfo=UiI18nInfo (ambiguity) name=ID
+	 *     i18nInfo=UiI18nInfo (ambiguity) readonly?='readonly'
+	 *     styles=STRING (ambiguity) 'styles' styles=STRING
+	 *     styles=STRING (ambiguity) '{' '}' (rule end)
+	 *     styles=STRING (ambiguity) '{' bindings+=UiBinding
+	 *     styles=STRING (ambiguity) '{' contents+=UiVerticalLayoutAssigment
+	 *     styles=STRING (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     styles=STRING (ambiguity) name=ID
+	 *     styles=STRING (ambiguity) readonly?='readonly'
 	 */
 	protected void emit_UiVerticalLayout___LeftParenthesisKeyword_2_0_0_or_RightParenthesisKeyword_2_2_1__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     (')' '('*)+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     readonly?='readonly' (ambiguity) 'styles' styles=STRING
+	 *     readonly?='readonly' (ambiguity) '{' '}' (rule end)
+	 *     readonly?='readonly' (ambiguity) '{' bindings+=UiBinding
+	 *     readonly?='readonly' (ambiguity) '{' contents+=UiVerticalLayoutAssigment
+	 *     readonly?='readonly' (ambiguity) '{' processorAssignments+=UiVisibilityProcessorAssignment
+	 *     readonly?='readonly' (ambiguity) name=ID
+	 *     readonly?='readonly' (ambiguity) readonly?='readonly'
 	 */
 	protected void emit_UiVerticalLayout___RightParenthesisKeyword_2_2_1_LeftParenthesisKeyword_2_0_0_a__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     (')'* '(')+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'verticalLayout' (ambiguity) i18nInfo=UiI18nInfo
+	 *     i18nInfo=UiI18nInfo (ambiguity) i18nInfo=UiI18nInfo
+	 *     styles=STRING (ambiguity) i18nInfo=UiI18nInfo
 	 */
 	protected void emit_UiVerticalLayout___RightParenthesisKeyword_2_2_1_a_LeftParenthesisKeyword_2_0_0__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     (')'+ '('+)+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     readonly?='readonly' (ambiguity) i18nInfo=UiI18nInfo
 	 */
 	protected void emit_UiVerticalLayout___RightParenthesisKeyword_2_2_1_p_LeftParenthesisKeyword_2_0_0_p__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * 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);
+	}
+	
+	/**
+	 * 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.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/services/UIGrammarGrammarAccess.java b/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/services/UIGrammarGrammarAccess.java
index 7f7f58c..34f957d 100644
--- a/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/services/UIGrammarGrammarAccess.java
+++ b/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/services/UIGrammarGrammarAccess.java
@@ -7,124 +7,115 @@
  *
  * Contributors:
  *         Florian Pirchner - Initial implementation
+ *
+ * generated by Xtext 2.11.0
+ *
  */
 
 package org.eclipse.osbp.ecview.dsl.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;
 
 @Singleton
 public class UIGrammarGrammarAccess extends AbstractGrammarElementFinder {
 	
-	
 	public class UiModelElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiModel");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiModel");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cPackageKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cPackageNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
 		private final RuleCall cPackageNameQualifiedNameParserRuleCall_1_0 = (RuleCall)cPackageNameAssignment_1.eContents().get(0);
-		private final Assignment cImportsAssignment_2 = (Assignment)cGroup.eContents().get(2);
-		private final RuleCall cImportsUiImportsParserRuleCall_2_0 = (RuleCall)cImportsAssignment_2.eContents().get(0);
+		private final Assignment cImportSectionAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cImportSectionXImportSectionParserRuleCall_2_0 = (RuleCall)cImportSectionAssignment_2.eContents().get(0);
 		private final Assignment cRootsAssignment_3 = (Assignment)cGroup.eContents().get(3);
 		private final RuleCall cRootsUiRootElementsParserRuleCall_3_0 = (RuleCall)cRootsAssignment_3.eContents().get(0);
 		
 		//UiModel:
-		//	"package" packageName=QualifiedName imports+=UiImports* roots+=UiRootElements*;
-		public ParserRule getRule() { return rule; }
-
-		//"package" packageName=QualifiedName imports+=UiImports* roots+=UiRootElements*
+		//	'package' packageName=QualifiedName
+		//	importSection=XImportSection?
+		//	roots+=UiRootElements*;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'package' packageName=QualifiedName importSection=XImportSection? roots+=UiRootElements*
 		public Group getGroup() { return cGroup; }
-
-		//"package"
+		
+		//'package'
 		public Keyword getPackageKeyword_0() { return cPackageKeyword_0; }
-
+		
 		//packageName=QualifiedName
 		public Assignment getPackageNameAssignment_1() { return cPackageNameAssignment_1; }
-
+		
 		//QualifiedName
 		public RuleCall getPackageNameQualifiedNameParserRuleCall_1_0() { return cPackageNameQualifiedNameParserRuleCall_1_0; }
-
-		//imports+=UiImports*
-		public Assignment getImportsAssignment_2() { return cImportsAssignment_2; }
-
-		//UiImports
-		public RuleCall getImportsUiImportsParserRuleCall_2_0() { return cImportsUiImportsParserRuleCall_2_0; }
-
+		
+		//importSection=XImportSection?
+		public Assignment getImportSectionAssignment_2() { return cImportSectionAssignment_2; }
+		
+		//XImportSection
+		public RuleCall getImportSectionXImportSectionParserRuleCall_2_0() { return cImportSectionXImportSectionParserRuleCall_2_0; }
+		
 		//roots+=UiRootElements*
 		public Assignment getRootsAssignment_3() { return cRootsAssignment_3; }
-
+		
 		//UiRootElements
 		public RuleCall getRootsUiRootElementsParserRuleCall_3_0() { return cRootsUiRootElementsParserRuleCall_3_0; }
 	}
-
-	public class UiImportsElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiImports");
-		private final Group cGroup = (Group)rule.eContents().get(1);
-		private final Keyword cImportKeyword_0 = (Keyword)cGroup.eContents().get(0);
-		private final Assignment cImportedNamespaceAssignment_1 = (Assignment)cGroup.eContents().get(1);
-		private final RuleCall cImportedNamespaceQualifiedNameWithWildcardParserRuleCall_1_0 = (RuleCall)cImportedNamespaceAssignment_1.eContents().get(0);
-		private final Keyword cSemicolonKeyword_2 = (Keyword)cGroup.eContents().get(2);
-		
-		//UiImports:
-		//	"import" importedNamespace=QualifiedNameWithWildcard ";"?;
-		public ParserRule getRule() { return rule; }
-
-		//"import" importedNamespace=QualifiedNameWithWildcard ";"?
-		public Group getGroup() { return cGroup; }
-
-		//"import"
-		public Keyword getImportKeyword_0() { return cImportKeyword_0; }
-
-		//importedNamespace=QualifiedNameWithWildcard
-		public Assignment getImportedNamespaceAssignment_1() { return cImportedNamespaceAssignment_1; }
-
-		//QualifiedNameWithWildcard
-		public RuleCall getImportedNamespaceQualifiedNameWithWildcardParserRuleCall_1_0() { return cImportedNamespaceQualifiedNameWithWildcardParserRuleCall_1_0; }
-
-		//";"?
-		public Keyword getSemicolonKeyword_2() { return cSemicolonKeyword_2; }
-	}
-
 	public class UiRootElementsElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiRootElements");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiRootElements");
 		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
 		private final RuleCall cUiViewParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
-		private final RuleCall cUiViewSetParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
-		private final RuleCall cUiValidatorAliasParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
-		private final RuleCall cUiMobileViewParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
+		private final RuleCall cUiDisplayViewParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		private final RuleCall cUiViewSetParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
+		private final RuleCall cUiValidatorAliasParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
+		private final RuleCall cUiMobileViewParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
 		
 		//UiRootElements:
-		//	UiView | UiViewSet | UiValidatorAlias | UiMobileView;
-		public ParserRule getRule() { return rule; }
-
-		//UiView | UiViewSet | UiValidatorAlias | UiMobileView
+		//	UiView | UiDisplayView | UiViewSet | UiValidatorAlias | UiMobileView;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//UiView | UiDisplayView | UiViewSet | UiValidatorAlias | UiMobileView
 		public Alternatives getAlternatives() { return cAlternatives; }
-
+		
 		//UiView
 		public RuleCall getUiViewParserRuleCall_0() { return cUiViewParserRuleCall_0; }
-
+		
+		//UiDisplayView
+		public RuleCall getUiDisplayViewParserRuleCall_1() { return cUiDisplayViewParserRuleCall_1; }
+		
 		//UiViewSet
-		public RuleCall getUiViewSetParserRuleCall_1() { return cUiViewSetParserRuleCall_1; }
-
+		public RuleCall getUiViewSetParserRuleCall_2() { return cUiViewSetParserRuleCall_2; }
+		
 		//UiValidatorAlias
-		public RuleCall getUiValidatorAliasParserRuleCall_2() { return cUiValidatorAliasParserRuleCall_2; }
-
+		public RuleCall getUiValidatorAliasParserRuleCall_3() { return cUiValidatorAliasParserRuleCall_3; }
+		
 		//UiMobileView
-		public RuleCall getUiMobileViewParserRuleCall_3() { return cUiMobileViewParserRuleCall_3; }
+		public RuleCall getUiMobileViewParserRuleCall_4() { return cUiMobileViewParserRuleCall_4; }
 	}
-
 	public class UiValidatorAliasElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiValidatorAlias");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidatorAlias");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cValidatorAliasKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cValidatorAssignment_1 = (Assignment)cGroup.eContents().get(1);
@@ -135,36 +126,35 @@
 		private final Keyword cSemicolonKeyword_4 = (Keyword)cGroup.eContents().get(4);
 		
 		//UiValidatorAlias:
-		//	"validatorAlias" validator=UiValidator "as" alias=ID ";"?;
-		public ParserRule getRule() { return rule; }
-
-		//"validatorAlias" validator=UiValidator "as" alias=ID ";"?
+		//	'validatorAlias' validator=UiValidator 'as' alias=ID ';'?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'validatorAlias' validator=UiValidator 'as' alias=ID ';'?
 		public Group getGroup() { return cGroup; }
-
-		//"validatorAlias"
+		
+		//'validatorAlias'
 		public Keyword getValidatorAliasKeyword_0() { return cValidatorAliasKeyword_0; }
-
+		
 		//validator=UiValidator
 		public Assignment getValidatorAssignment_1() { return cValidatorAssignment_1; }
-
+		
 		//UiValidator
 		public RuleCall getValidatorUiValidatorParserRuleCall_1_0() { return cValidatorUiValidatorParserRuleCall_1_0; }
-
-		//"as"
+		
+		//'as'
 		public Keyword getAsKeyword_2() { return cAsKeyword_2; }
-
+		
 		//alias=ID
 		public Assignment getAliasAssignment_3() { return cAliasAssignment_3; }
-
+		
 		//ID
 		public RuleCall getAliasIDTerminalRuleCall_3_0() { return cAliasIDTerminalRuleCall_3_0; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_4() { return cSemicolonKeyword_4; }
 	}
-
 	public class UiValidatorAssignmentElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiValidatorAssignment");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidatorAssignment");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cFieldValidationKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cFieldAssignment_1 = (Assignment)cGroup.eContents().get(1);
@@ -181,72 +171,70 @@
 		private final Keyword cSemicolonKeyword_3_1_1 = (Keyword)cGroup_3_1.eContents().get(1);
 		
 		//UiValidatorAssignment:
-		//	"fieldValidation" field=[UiField] "+=" (validatorDef=UiValidatorDef | validatorAlias=[UiValidatorAlias|QualifiedName]
-		//	";"?);
-		public ParserRule getRule() { return rule; }
-
-		//"fieldValidation" field=[UiField] "+=" (validatorDef=UiValidatorDef | validatorAlias=[UiValidatorAlias|QualifiedName]
-		//";"?)
+		//	'fieldValidation' field=[UiField] '+=' (validatorDef=UiValidatorDef | validatorAlias=[UiValidatorAlias|QualifiedName]
+		//	';'?);
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'fieldValidation' field=[UiField] '+=' (validatorDef=UiValidatorDef | validatorAlias=[UiValidatorAlias|QualifiedName]
+		//';'?)
 		public Group getGroup() { return cGroup; }
-
-		//"fieldValidation"
+		
+		//'fieldValidation'
 		public Keyword getFieldValidationKeyword_0() { return cFieldValidationKeyword_0; }
-
+		
 		//field=[UiField]
 		public Assignment getFieldAssignment_1() { return cFieldAssignment_1; }
-
+		
 		//[UiField]
 		public CrossReference getFieldUiFieldCrossReference_1_0() { return cFieldUiFieldCrossReference_1_0; }
-
+		
 		//ID
 		public RuleCall getFieldUiFieldIDTerminalRuleCall_1_0_1() { return cFieldUiFieldIDTerminalRuleCall_1_0_1; }
-
-		//"+="
+		
+		//'+='
 		public Keyword getPlusSignEqualsSignKeyword_2() { return cPlusSignEqualsSignKeyword_2; }
-
-		//validatorDef=UiValidatorDef | validatorAlias=[UiValidatorAlias|QualifiedName] ";"?
+		
+		//validatorDef=UiValidatorDef | validatorAlias=[UiValidatorAlias|QualifiedName] ';'?
 		public Alternatives getAlternatives_3() { return cAlternatives_3; }
-
+		
 		//validatorDef=UiValidatorDef
 		public Assignment getValidatorDefAssignment_3_0() { return cValidatorDefAssignment_3_0; }
-
+		
 		//UiValidatorDef
 		public RuleCall getValidatorDefUiValidatorDefParserRuleCall_3_0_0() { return cValidatorDefUiValidatorDefParserRuleCall_3_0_0; }
-
-		//validatorAlias=[UiValidatorAlias|QualifiedName] ";"?
+		
+		//validatorAlias=[UiValidatorAlias|QualifiedName] ';'?
 		public Group getGroup_3_1() { return cGroup_3_1; }
-
+		
 		//validatorAlias=[UiValidatorAlias|QualifiedName]
 		public Assignment getValidatorAliasAssignment_3_1_0() { return cValidatorAliasAssignment_3_1_0; }
-
+		
 		//[UiValidatorAlias|QualifiedName]
 		public CrossReference getValidatorAliasUiValidatorAliasCrossReference_3_1_0_0() { return cValidatorAliasUiValidatorAliasCrossReference_3_1_0_0; }
-
+		
 		//QualifiedName
 		public RuleCall getValidatorAliasUiValidatorAliasQualifiedNameParserRuleCall_3_1_0_0_1() { return cValidatorAliasUiValidatorAliasQualifiedNameParserRuleCall_3_1_0_0_1; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_3_1_1() { return cSemicolonKeyword_3_1_1; }
 	}
-
 	public class UiValidatorDefElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiValidatorDef");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidatorDef");
 		private final Assignment cValidatorAssignment = (Assignment)rule.eContents().get(1);
 		private final RuleCall cValidatorUiValidatorParserRuleCall_0 = (RuleCall)cValidatorAssignment.eContents().get(0);
 		
 		//UiValidatorDef:
 		//	validator=UiValidator;
-		public ParserRule getRule() { return rule; }
-
+		@Override public ParserRule getRule() { return rule; }
+		
 		//validator=UiValidator
 		public Assignment getValidatorAssignment() { return cValidatorAssignment; }
-
+		
 		//UiValidator
 		public RuleCall getValidatorUiValidatorParserRuleCall_0() { return cValidatorUiValidatorParserRuleCall_0; }
 	}
-
 	public class UiViewSetElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiViewSet");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiViewSet");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cViewsetKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
@@ -259,42 +247,44 @@
 		private final Keyword cRightCurlyBracketKeyword_5 = (Keyword)cGroup.eContents().get(5);
 		
 		//UiViewSet:
-		//	"viewset" name=ID "{" beanSlots+=UiBeanSlot* bindingEndpointAlias+=UiBindingEndpointAlias* "}";
-		public ParserRule getRule() { return rule; }
-
-		//"viewset" name=ID "{" beanSlots+=UiBeanSlot* bindingEndpointAlias+=UiBindingEndpointAlias* "}"
+		//	'viewset' name=ID '{'
+		//	beanSlots+=UiBeanSlot*
+		//	bindingEndpointAlias+=UiBindingEndpointAlias*
+		//	'}';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'viewset' name=ID '{' beanSlots+=UiBeanSlot* bindingEndpointAlias+=UiBindingEndpointAlias* '}'
 		public Group getGroup() { return cGroup; }
-
-		//"viewset"
+		
+		//'viewset'
 		public Keyword getViewsetKeyword_0() { return cViewsetKeyword_0; }
-
+		
 		//name=ID
 		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
-
+		
 		//beanSlots+=UiBeanSlot*
 		public Assignment getBeanSlotsAssignment_3() { return cBeanSlotsAssignment_3; }
-
+		
 		//UiBeanSlot
 		public RuleCall getBeanSlotsUiBeanSlotParserRuleCall_3_0() { return cBeanSlotsUiBeanSlotParserRuleCall_3_0; }
-
+		
 		//bindingEndpointAlias+=UiBindingEndpointAlias*
 		public Assignment getBindingEndpointAliasAssignment_4() { return cBindingEndpointAliasAssignment_4; }
-
+		
 		//UiBindingEndpointAlias
 		public RuleCall getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_4_0() { return cBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_4_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_5() { return cRightCurlyBracketKeyword_5; }
 	}
-
 	public class UiBindingEndpointAliasElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiBindingEndpointAlias");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAlias");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cDataAliasKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cEndpointAssignment_1 = (Assignment)cGroup.eContents().get(1);
@@ -305,36 +295,35 @@
 		private final Keyword cSemicolonKeyword_4 = (Keyword)cGroup.eContents().get(4);
 		
 		//UiBindingEndpointAlias:
-		//	"dataAlias" endpoint=UiBindingEndpointAssignment "as" alias=ID ";"?;
-		public ParserRule getRule() { return rule; }
-
-		//"dataAlias" endpoint=UiBindingEndpointAssignment "as" alias=ID ";"?
+		//	'dataAlias' endpoint=UiBindingEndpointAssignment 'as' alias=ID ';'?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'dataAlias' endpoint=UiBindingEndpointAssignment 'as' alias=ID ';'?
 		public Group getGroup() { return cGroup; }
-
-		//"dataAlias"
+		
+		//'dataAlias'
 		public Keyword getDataAliasKeyword_0() { return cDataAliasKeyword_0; }
-
+		
 		//endpoint=UiBindingEndpointAssignment
 		public Assignment getEndpointAssignment_1() { return cEndpointAssignment_1; }
-
+		
 		//UiBindingEndpointAssignment
 		public RuleCall getEndpointUiBindingEndpointAssignmentParserRuleCall_1_0() { return cEndpointUiBindingEndpointAssignmentParserRuleCall_1_0; }
-
-		//"as"
+		
+		//'as'
 		public Keyword getAsKeyword_2() { return cAsKeyword_2; }
-
+		
 		//alias=ID
 		public Assignment getAliasAssignment_3() { return cAliasAssignment_3; }
-
+		
 		//ID
 		public RuleCall getAliasIDTerminalRuleCall_3_0() { return cAliasIDTerminalRuleCall_3_0; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_4() { return cSemicolonKeyword_4; }
 	}
-
 	public class UiBeanSlotElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiBeanSlot");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiBeanSlot");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cDatasourceKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
@@ -349,48 +338,47 @@
 		private final Keyword cSemicolonKeyword_5 = (Keyword)cGroup.eContents().get(5);
 		
 		//UiBeanSlot:
-		//	"datasource" name=ID ":" jvmType=JvmTypeReference ("eventTopic" eventTopic=STRING)? ";"?;
-		public ParserRule getRule() { return rule; }
-
-		//"datasource" name=ID ":" jvmType=JvmTypeReference ("eventTopic" eventTopic=STRING)? ";"?
+		//	'datasource' name=ID ':' jvmType=JvmTypeReference ('eventTopic' eventTopic=STRING)? ';'?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'datasource' name=ID ':' jvmType=JvmTypeReference ('eventTopic' eventTopic=STRING)? ';'?
 		public Group getGroup() { return cGroup; }
-
-		//"datasource"
+		
+		//'datasource'
 		public Keyword getDatasourceKeyword_0() { return cDatasourceKeyword_0; }
-
+		
 		//name=ID
 		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
-
-		//":"
+		
+		//':'
 		public Keyword getColonKeyword_2() { return cColonKeyword_2; }
-
+		
 		//jvmType=JvmTypeReference
 		public Assignment getJvmTypeAssignment_3() { return cJvmTypeAssignment_3; }
-
+		
 		//JvmTypeReference
 		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_3_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_3_0; }
-
-		//("eventTopic" eventTopic=STRING)?
+		
+		//('eventTopic' eventTopic=STRING)?
 		public Group getGroup_4() { return cGroup_4; }
-
-		//"eventTopic"
+		
+		//'eventTopic'
 		public Keyword getEventTopicKeyword_4_0() { return cEventTopicKeyword_4_0; }
-
+		
 		//eventTopic=STRING
 		public Assignment getEventTopicAssignment_4_1() { return cEventTopicAssignment_4_1; }
-
+		
 		//STRING
 		public RuleCall getEventTopicSTRINGTerminalRuleCall_4_1_0() { return cEventTopicSTRINGTerminalRuleCall_4_1_0; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_5() { return cSemicolonKeyword_5; }
 	}
-
 	public class UiBindingElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiBinding");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cBindKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cListBindingAssignment_1 = (Assignment)cGroup.eContents().get(1);
@@ -408,59 +396,58 @@
 		private final Keyword cSemicolonKeyword_5 = (Keyword)cGroup.eContents().get(5);
 		
 		//UiBinding:
-		//	"bind" listBinding?="list"? source=UiBindingEndpointAssignment (targetToSource?="<"? "--" sourceToTarget?=">"?)
-		//	target=UiBindingEndpointAssignment ";"?;
-		public ParserRule getRule() { return rule; }
-
-		//"bind" listBinding?="list"? source=UiBindingEndpointAssignment (targetToSource?="<"? "--" sourceToTarget?=">"?)
-		//target=UiBindingEndpointAssignment ";"?
+		//	'bind' listBinding?='list'? source=UiBindingEndpointAssignment (targetToSource?='<'? '--'
+		//	sourceToTarget?='>'?) target=UiBindingEndpointAssignment ';'?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'bind' listBinding?='list'? source=UiBindingEndpointAssignment (targetToSource?='<'? '--' sourceToTarget?='>'?)
+		//target=UiBindingEndpointAssignment ';'?
 		public Group getGroup() { return cGroup; }
-
-		//"bind"
+		
+		//'bind'
 		public Keyword getBindKeyword_0() { return cBindKeyword_0; }
-
-		//listBinding?="list"?
+		
+		//listBinding?='list'?
 		public Assignment getListBindingAssignment_1() { return cListBindingAssignment_1; }
-
-		//"list"
+		
+		//'list'
 		public Keyword getListBindingListKeyword_1_0() { return cListBindingListKeyword_1_0; }
-
+		
 		//source=UiBindingEndpointAssignment
 		public Assignment getSourceAssignment_2() { return cSourceAssignment_2; }
-
+		
 		//UiBindingEndpointAssignment
 		public RuleCall getSourceUiBindingEndpointAssignmentParserRuleCall_2_0() { return cSourceUiBindingEndpointAssignmentParserRuleCall_2_0; }
-
-		//targetToSource?="<"? "--" sourceToTarget?=">"?
+		
+		//targetToSource?='<'? '--' sourceToTarget?='>'?
 		public Group getGroup_3() { return cGroup_3; }
-
-		//targetToSource?="<"?
+		
+		//targetToSource?='<'?
 		public Assignment getTargetToSourceAssignment_3_0() { return cTargetToSourceAssignment_3_0; }
-
-		//"<"
+		
+		//'<'
 		public Keyword getTargetToSourceLessThanSignKeyword_3_0_0() { return cTargetToSourceLessThanSignKeyword_3_0_0; }
-
-		//"--"
+		
+		//'--'
 		public Keyword getHyphenMinusHyphenMinusKeyword_3_1() { return cHyphenMinusHyphenMinusKeyword_3_1; }
-
-		//sourceToTarget?=">"?
+		
+		//sourceToTarget?='>'?
 		public Assignment getSourceToTargetAssignment_3_2() { return cSourceToTargetAssignment_3_2; }
-
-		//">"
+		
+		//'>'
 		public Keyword getSourceToTargetGreaterThanSignKeyword_3_2_0() { return cSourceToTargetGreaterThanSignKeyword_3_2_0; }
-
+		
 		//target=UiBindingEndpointAssignment
 		public Assignment getTargetAssignment_4() { return cTargetAssignment_4; }
-
+		
 		//UiBindingEndpointAssignment
 		public RuleCall getTargetUiBindingEndpointAssignmentParserRuleCall_4_0() { return cTargetUiBindingEndpointAssignmentParserRuleCall_4_0; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_5() { return cSemicolonKeyword_5; }
 	}
-
 	public class UiBindingEndpointAssignmentElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiBindingEndpointAssignment");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAssignment");
 		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
 		private final Group cGroup_0 = (Group)cAlternatives.eContents().get(0);
 		private final RuleCall cUiTypedBindableDefParserRuleCall_0_0 = (RuleCall)cGroup_0.eContents().get(0);
@@ -478,65 +465,64 @@
 		private final Assignment cPathAssignment_2_2 = (Assignment)cGroup_2.eContents().get(2);
 		private final RuleCall cPathUiPathSegmentParserRuleCall_2_2_0 = (RuleCall)cPathAssignment_2_2.eContents().get(0);
 		
-		//UiBindingEndpointAssignment returns UiBindingExpression:
+		//UiBindingEndpointAssignment UiBindingExpression:
 		//	UiTypedBindableDef {UiBindingEndpointAssignment.typedBindableDef=current} path=UiPathSegment? | UiCommandBindableDef
 		//	{UiBindingEndpointAssignment.typedBindableDef=current} | {UiBindingEndpointAssignment}
 		//	typedBindableAlias=[UiTypedBindable] path=UiPathSegment?;
-		public ParserRule getRule() { return rule; }
-
+		@Override public ParserRule getRule() { return rule; }
+		
 		//UiTypedBindableDef {UiBindingEndpointAssignment.typedBindableDef=current} path=UiPathSegment? | UiCommandBindableDef
 		//{UiBindingEndpointAssignment.typedBindableDef=current} | {UiBindingEndpointAssignment}
 		//typedBindableAlias=[UiTypedBindable] path=UiPathSegment?
 		public Alternatives getAlternatives() { return cAlternatives; }
-
+		
 		//UiTypedBindableDef {UiBindingEndpointAssignment.typedBindableDef=current} path=UiPathSegment?
 		public Group getGroup_0() { return cGroup_0; }
-
+		
 		//UiTypedBindableDef
 		public RuleCall getUiTypedBindableDefParserRuleCall_0_0() { return cUiTypedBindableDefParserRuleCall_0_0; }
-
+		
 		//{UiBindingEndpointAssignment.typedBindableDef=current}
 		public Action getUiBindingEndpointAssignmentTypedBindableDefAction_0_1() { return cUiBindingEndpointAssignmentTypedBindableDefAction_0_1; }
-
+		
 		//path=UiPathSegment?
 		public Assignment getPathAssignment_0_2() { return cPathAssignment_0_2; }
-
+		
 		//UiPathSegment
 		public RuleCall getPathUiPathSegmentParserRuleCall_0_2_0() { return cPathUiPathSegmentParserRuleCall_0_2_0; }
-
+		
 		//UiCommandBindableDef {UiBindingEndpointAssignment.typedBindableDef=current}
 		public Group getGroup_1() { return cGroup_1; }
-
+		
 		//UiCommandBindableDef
 		public RuleCall getUiCommandBindableDefParserRuleCall_1_0() { return cUiCommandBindableDefParserRuleCall_1_0; }
-
+		
 		//{UiBindingEndpointAssignment.typedBindableDef=current}
 		public Action getUiBindingEndpointAssignmentTypedBindableDefAction_1_1() { return cUiBindingEndpointAssignmentTypedBindableDefAction_1_1; }
-
+		
 		//{UiBindingEndpointAssignment} typedBindableAlias=[UiTypedBindable] path=UiPathSegment?
 		public Group getGroup_2() { return cGroup_2; }
-
+		
 		//{UiBindingEndpointAssignment}
 		public Action getUiBindingEndpointAssignmentAction_2_0() { return cUiBindingEndpointAssignmentAction_2_0; }
-
+		
 		//typedBindableAlias=[UiTypedBindable]
 		public Assignment getTypedBindableAliasAssignment_2_1() { return cTypedBindableAliasAssignment_2_1; }
-
+		
 		//[UiTypedBindable]
 		public CrossReference getTypedBindableAliasUiTypedBindableCrossReference_2_1_0() { return cTypedBindableAliasUiTypedBindableCrossReference_2_1_0; }
-
+		
 		//ID
 		public RuleCall getTypedBindableAliasUiTypedBindableIDTerminalRuleCall_2_1_0_1() { return cTypedBindableAliasUiTypedBindableIDTerminalRuleCall_2_1_0_1; }
-
+		
 		//path=UiPathSegment?
 		public Assignment getPathAssignment_2_2() { return cPathAssignment_2_2; }
-
+		
 		//UiPathSegment
 		public RuleCall getPathUiPathSegmentParserRuleCall_2_2_0() { return cPathUiPathSegmentParserRuleCall_2_2_0; }
 	}
-
 	public class UiPathSegmentElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiPathSegment");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiPathSegment");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiPathSegmentAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cFullStopKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -547,36 +533,36 @@
 		private final RuleCall cPathUiPathSegmentParserRuleCall_3_0 = (RuleCall)cPathAssignment_3.eContents().get(0);
 		
 		//UiPathSegment:
-		//	{UiPathSegment} "." getter=[JvmOperation] path=UiPathSegment?;
-		public ParserRule getRule() { return rule; }
-
-		//{UiPathSegment} "." getter=[JvmOperation] path=UiPathSegment?
+		//	{UiPathSegment}
+		//	'.' getter=[JvmOperation] path=UiPathSegment?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiPathSegment} '.' getter=[JvmOperation] path=UiPathSegment?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiPathSegment}
 		public Action getUiPathSegmentAction_0() { return cUiPathSegmentAction_0; }
-
-		//"."
+		
+		//'.'
 		public Keyword getFullStopKeyword_1() { return cFullStopKeyword_1; }
-
+		
 		//getter=[JvmOperation]
 		public Assignment getGetterAssignment_2() { return cGetterAssignment_2; }
-
+		
 		//[JvmOperation]
 		public CrossReference getGetterJvmOperationCrossReference_2_0() { return cGetterJvmOperationCrossReference_2_0; }
-
+		
 		//ID
 		public RuleCall getGetterJvmOperationIDTerminalRuleCall_2_0_1() { return cGetterJvmOperationIDTerminalRuleCall_2_0_1; }
-
+		
 		//path=UiPathSegment?
 		public Assignment getPathAssignment_3() { return cPathAssignment_3; }
-
+		
 		//UiPathSegment
 		public RuleCall getPathUiPathSegmentParserRuleCall_3_0() { return cPathUiPathSegmentParserRuleCall_3_0; }
 	}
-
 	public class UiNestedPropertyElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiNestedProperty");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiNestedProperty");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiNestedPropertyAction_0 = (Action)cGroup.eContents().get(0);
 		private final Assignment cGetterAssignment_1 = (Assignment)cGroup.eContents().get(1);
@@ -587,32 +573,31 @@
 		
 		//UiNestedProperty:
 		//	{UiNestedProperty} getter=[JvmOperation] path=UiPathSegment?;
-		public ParserRule getRule() { return rule; }
-
+		@Override public ParserRule getRule() { return rule; }
+		
 		//{UiNestedProperty} getter=[JvmOperation] path=UiPathSegment?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiNestedProperty}
 		public Action getUiNestedPropertyAction_0() { return cUiNestedPropertyAction_0; }
-
+		
 		//getter=[JvmOperation]
 		public Assignment getGetterAssignment_1() { return cGetterAssignment_1; }
-
+		
 		//[JvmOperation]
 		public CrossReference getGetterJvmOperationCrossReference_1_0() { return cGetterJvmOperationCrossReference_1_0; }
-
+		
 		//ID
 		public RuleCall getGetterJvmOperationIDTerminalRuleCall_1_0_1() { return cGetterJvmOperationIDTerminalRuleCall_1_0_1; }
-
+		
 		//path=UiPathSegment?
 		public Assignment getPathAssignment_2() { return cPathAssignment_2; }
-
+		
 		//UiPathSegment
 		public RuleCall getPathUiPathSegmentParserRuleCall_2_0() { return cPathUiPathSegmentParserRuleCall_2_0; }
 	}
-
 	public class UiTypedBindableDefElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiTypedBindableDef");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiTypedBindableDef");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiTypedBindableDefAction_0 = (Action)cGroup.eContents().get(0);
 		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
@@ -628,57 +613,56 @@
 		private final CrossReference cMethodUxEndpointDefCrossReference_1_5_0 = (CrossReference)cMethodAssignment_1_5.eContents().get(0);
 		private final RuleCall cMethodUxEndpointDefIDTerminalRuleCall_1_5_0_1 = (RuleCall)cMethodUxEndpointDefCrossReference_1_5_0.eContents().get(1);
 		
-		//UiTypedBindableDef returns UiBindingExpression:
-		//	{UiTypedBindableDef} ("[" rawBindable=[UiRawBindable] rawBindablePath=UiRawBindablePathSegment? "]" "."
+		//UiTypedBindableDef UiBindingExpression:
+		//	{UiTypedBindableDef} ('[' rawBindable=[UiRawBindable] rawBindablePath=UiRawBindablePathSegment? ']' '.'
 		//	method=[cfg::UxEndpointDef]);
-		public ParserRule getRule() { return rule; }
-
-		//{UiTypedBindableDef} ("[" rawBindable=[UiRawBindable] rawBindablePath=UiRawBindablePathSegment? "]" "."
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiTypedBindableDef} ('[' rawBindable=[UiRawBindable] rawBindablePath=UiRawBindablePathSegment? ']' '.'
 		//method=[cfg::UxEndpointDef])
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiTypedBindableDef}
 		public Action getUiTypedBindableDefAction_0() { return cUiTypedBindableDefAction_0; }
-
-		//"[" rawBindable=[UiRawBindable] rawBindablePath=UiRawBindablePathSegment? "]" "." method=[cfg::UxEndpointDef]
+		
+		//'[' rawBindable=[UiRawBindable] rawBindablePath=UiRawBindablePathSegment? ']' '.' method=[cfg::UxEndpointDef]
 		public Group getGroup_1() { return cGroup_1; }
-
-		//"["
+		
+		//'['
 		public Keyword getLeftSquareBracketKeyword_1_0() { return cLeftSquareBracketKeyword_1_0; }
-
+		
 		//rawBindable=[UiRawBindable]
 		public Assignment getRawBindableAssignment_1_1() { return cRawBindableAssignment_1_1; }
-
+		
 		//[UiRawBindable]
 		public CrossReference getRawBindableUiRawBindableCrossReference_1_1_0() { return cRawBindableUiRawBindableCrossReference_1_1_0; }
-
+		
 		//ID
 		public RuleCall getRawBindableUiRawBindableIDTerminalRuleCall_1_1_0_1() { return cRawBindableUiRawBindableIDTerminalRuleCall_1_1_0_1; }
-
+		
 		//rawBindablePath=UiRawBindablePathSegment?
 		public Assignment getRawBindablePathAssignment_1_2() { return cRawBindablePathAssignment_1_2; }
-
+		
 		//UiRawBindablePathSegment
 		public RuleCall getRawBindablePathUiRawBindablePathSegmentParserRuleCall_1_2_0() { return cRawBindablePathUiRawBindablePathSegmentParserRuleCall_1_2_0; }
-
-		//"]"
+		
+		//']'
 		public Keyword getRightSquareBracketKeyword_1_3() { return cRightSquareBracketKeyword_1_3; }
-
-		//"."
+		
+		//'.'
 		public Keyword getFullStopKeyword_1_4() { return cFullStopKeyword_1_4; }
-
+		
 		//method=[cfg::UxEndpointDef]
 		public Assignment getMethodAssignment_1_5() { return cMethodAssignment_1_5; }
-
+		
 		//[cfg::UxEndpointDef]
 		public CrossReference getMethodUxEndpointDefCrossReference_1_5_0() { return cMethodUxEndpointDefCrossReference_1_5_0; }
-
+		
 		//ID
 		public RuleCall getMethodUxEndpointDefIDTerminalRuleCall_1_5_0_1() { return cMethodUxEndpointDefIDTerminalRuleCall_1_5_0_1; }
 	}
-
 	public class UiTypedBindableRawTypeElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiTypedBindableRawType");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiTypedBindableRawType");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiTypedBindableRawTypeAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cLeftSquareBracketKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -689,40 +673,40 @@
 		private final RuleCall cRawBindablePathUiRawBindablePathSegmentParserRuleCall_3_0 = (RuleCall)cRawBindablePathAssignment_3.eContents().get(0);
 		private final Keyword cRightSquareBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
 		
-		//UiTypedBindableRawType returns UiBindingExpression:
-		//	{UiTypedBindableRawType} "[" rawBindable=[UiRawBindable] rawBindablePath=UiRawBindablePathSegment? "]";
-		public ParserRule getRule() { return rule; }
-
-		//{UiTypedBindableRawType} "[" rawBindable=[UiRawBindable] rawBindablePath=UiRawBindablePathSegment? "]"
+		//UiTypedBindableRawType UiBindingExpression:
+		//	{UiTypedBindableRawType}
+		//	'[' rawBindable=[UiRawBindable] rawBindablePath=UiRawBindablePathSegment? ']';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiTypedBindableRawType} '[' rawBindable=[UiRawBindable] rawBindablePath=UiRawBindablePathSegment? ']'
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiTypedBindableRawType}
 		public Action getUiTypedBindableRawTypeAction_0() { return cUiTypedBindableRawTypeAction_0; }
-
-		//"["
+		
+		//'['
 		public Keyword getLeftSquareBracketKeyword_1() { return cLeftSquareBracketKeyword_1; }
-
+		
 		//rawBindable=[UiRawBindable]
 		public Assignment getRawBindableAssignment_2() { return cRawBindableAssignment_2; }
-
+		
 		//[UiRawBindable]
 		public CrossReference getRawBindableUiRawBindableCrossReference_2_0() { return cRawBindableUiRawBindableCrossReference_2_0; }
-
+		
 		//ID
 		public RuleCall getRawBindableUiRawBindableIDTerminalRuleCall_2_0_1() { return cRawBindableUiRawBindableIDTerminalRuleCall_2_0_1; }
-
+		
 		//rawBindablePath=UiRawBindablePathSegment?
 		public Assignment getRawBindablePathAssignment_3() { return cRawBindablePathAssignment_3; }
-
+		
 		//UiRawBindablePathSegment
 		public RuleCall getRawBindablePathUiRawBindablePathSegmentParserRuleCall_3_0() { return cRawBindablePathUiRawBindablePathSegmentParserRuleCall_3_0; }
-
-		//"]"
+		
+		//']'
 		public Keyword getRightSquareBracketKeyword_4() { return cRightSquareBracketKeyword_4; }
 	}
-
 	public class UiTypedBindableRawTypeAliasElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiTypedBindableRawTypeAlias");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiTypedBindableRawTypeAlias");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cUiKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cTypeAssignment_1 = (Assignment)cGroup.eContents().get(1);
@@ -733,36 +717,35 @@
 		private final Keyword cSemicolonKeyword_4 = (Keyword)cGroup.eContents().get(4);
 		
 		//UiTypedBindableRawTypeAlias:
-		//	"ui" type=UiTypedBindableRawType "as" alias=ID ";"?;
-		public ParserRule getRule() { return rule; }
-
-		//"ui" type=UiTypedBindableRawType "as" alias=ID ";"?
+		//	'ui' type=UiTypedBindableRawType 'as' alias=ID ';'?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'ui' type=UiTypedBindableRawType 'as' alias=ID ';'?
 		public Group getGroup() { return cGroup; }
-
-		//"ui"
+		
+		//'ui'
 		public Keyword getUiKeyword_0() { return cUiKeyword_0; }
-
+		
 		//type=UiTypedBindableRawType
 		public Assignment getTypeAssignment_1() { return cTypeAssignment_1; }
-
+		
 		//UiTypedBindableRawType
 		public RuleCall getTypeUiTypedBindableRawTypeParserRuleCall_1_0() { return cTypeUiTypedBindableRawTypeParserRuleCall_1_0; }
-
-		//"as"
+		
+		//'as'
 		public Keyword getAsKeyword_2() { return cAsKeyword_2; }
-
+		
 		//alias=ID
 		public Assignment getAliasAssignment_3() { return cAliasAssignment_3; }
-
+		
 		//ID
 		public RuleCall getAliasIDTerminalRuleCall_3_0() { return cAliasIDTerminalRuleCall_3_0; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_4() { return cSemicolonKeyword_4; }
 	}
-
 	public class UiRawBindablePathSegmentElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiRawBindablePathSegment");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiRawBindablePathSegment");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiRawBindablePathSegmentAction_0 = (Action)cGroup.eContents().get(0);
 		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
@@ -776,45 +759,44 @@
 		private final RuleCall cPathUiRawBindablePathSegmentParserRuleCall_3_0 = (RuleCall)cPathAssignment_3.eContents().get(0);
 		
 		//UiRawBindablePathSegment:
-		//	{UiRawBindablePathSegment} ("." | toParent?="..") rawBindable=[UiRawBindable] path=UiRawBindablePathSegment?;
-		public ParserRule getRule() { return rule; }
-
-		//{UiRawBindablePathSegment} ("." | toParent?="..") rawBindable=[UiRawBindable] path=UiRawBindablePathSegment?
+		//	{UiRawBindablePathSegment} ('.' | toParent?='..') rawBindable=[UiRawBindable] path=UiRawBindablePathSegment?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiRawBindablePathSegment} ('.' | toParent?='..') rawBindable=[UiRawBindable] path=UiRawBindablePathSegment?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiRawBindablePathSegment}
 		public Action getUiRawBindablePathSegmentAction_0() { return cUiRawBindablePathSegmentAction_0; }
-
-		//"." | toParent?=".."
+		
+		//'.' | toParent?='..'
 		public Alternatives getAlternatives_1() { return cAlternatives_1; }
-
-		//"."
+		
+		//'.'
 		public Keyword getFullStopKeyword_1_0() { return cFullStopKeyword_1_0; }
-
-		//toParent?=".."
+		
+		//toParent?='..'
 		public Assignment getToParentAssignment_1_1() { return cToParentAssignment_1_1; }
-
-		//".."
+		
+		//'..'
 		public Keyword getToParentFullStopFullStopKeyword_1_1_0() { return cToParentFullStopFullStopKeyword_1_1_0; }
-
+		
 		//rawBindable=[UiRawBindable]
 		public Assignment getRawBindableAssignment_2() { return cRawBindableAssignment_2; }
-
+		
 		//[UiRawBindable]
 		public CrossReference getRawBindableUiRawBindableCrossReference_2_0() { return cRawBindableUiRawBindableCrossReference_2_0; }
-
+		
 		//ID
 		public RuleCall getRawBindableUiRawBindableIDTerminalRuleCall_2_0_1() { return cRawBindableUiRawBindableIDTerminalRuleCall_2_0_1; }
-
+		
 		//path=UiRawBindablePathSegment?
 		public Assignment getPathAssignment_3() { return cPathAssignment_3; }
-
+		
 		//UiRawBindablePathSegment
 		public RuleCall getPathUiRawBindablePathSegmentParserRuleCall_3_0() { return cPathUiRawBindablePathSegmentParserRuleCall_3_0; }
 	}
-
 	public class UiCommandBindableDefElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiCommandBindableDef");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiCommandBindableDef");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiCommandBindableDefAction_0 = (Action)cGroup.eContents().get(0);
 		private final Assignment cCommandAssignment_1 = (Assignment)cGroup.eContents().get(1);
@@ -822,23 +804,22 @@
 		
 		//UiCommandBindableDef:
 		//	{UiCommandBindableDef} command=UiCommand;
-		public ParserRule getRule() { return rule; }
-
+		@Override public ParserRule getRule() { return rule; }
+		
 		//{UiCommandBindableDef} command=UiCommand
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiCommandBindableDef}
 		public Action getUiCommandBindableDefAction_0() { return cUiCommandBindableDefAction_0; }
-
+		
 		//command=UiCommand
 		public Assignment getCommandAssignment_1() { return cCommandAssignment_1; }
-
+		
 		//UiCommand
 		public RuleCall getCommandUiCommandParserRuleCall_1_0() { return cCommandUiCommandParserRuleCall_1_0; }
 	}
-
 	public class UiCommandElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiCommand");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiCommand");
 		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
 		private final RuleCall cUiMobileNavigationCommandParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
 		private final RuleCall cUiOpenDialogCommandParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
@@ -851,36 +832,35 @@
 		//UiCommand:
 		//	UiMobileNavigationCommand | UiOpenDialogCommand | UiSearchWithDialogCommand | UiAddToTableCommand |
 		//	UiRemoveFromTableCommand | UiSendEventCommand | UiSetNewInstanceCommand;
-		public ParserRule getRule() { return rule; }
-
+		@Override public ParserRule getRule() { return rule; }
+		
 		//UiMobileNavigationCommand | UiOpenDialogCommand | UiSearchWithDialogCommand | UiAddToTableCommand |
 		//UiRemoveFromTableCommand | UiSendEventCommand | UiSetNewInstanceCommand
 		public Alternatives getAlternatives() { return cAlternatives; }
-
+		
 		//UiMobileNavigationCommand
 		public RuleCall getUiMobileNavigationCommandParserRuleCall_0() { return cUiMobileNavigationCommandParserRuleCall_0; }
-
+		
 		//UiOpenDialogCommand
 		public RuleCall getUiOpenDialogCommandParserRuleCall_1() { return cUiOpenDialogCommandParserRuleCall_1; }
-
+		
 		//UiSearchWithDialogCommand
 		public RuleCall getUiSearchWithDialogCommandParserRuleCall_2() { return cUiSearchWithDialogCommandParserRuleCall_2; }
-
+		
 		//UiAddToTableCommand
 		public RuleCall getUiAddToTableCommandParserRuleCall_3() { return cUiAddToTableCommandParserRuleCall_3; }
-
+		
 		//UiRemoveFromTableCommand
 		public RuleCall getUiRemoveFromTableCommandParserRuleCall_4() { return cUiRemoveFromTableCommandParserRuleCall_4; }
-
+		
 		//UiSendEventCommand
 		public RuleCall getUiSendEventCommandParserRuleCall_5() { return cUiSendEventCommandParserRuleCall_5; }
-
+		
 		//UiSetNewInstanceCommand
 		public RuleCall getUiSetNewInstanceCommandParserRuleCall_6() { return cUiSetNewInstanceCommandParserRuleCall_6; }
 	}
-
 	public class UiMobileNavigationCommandElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileNavigationCommand");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileNavigationCommand");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiMobileNavigationCommandAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cNavigateToKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -888,27 +868,27 @@
 		private final RuleCall cTargetPageUiMobileNavigationPageParserRuleCall_2_0 = (RuleCall)cTargetPageAssignment_2.eContents().get(0);
 		
 		//UiMobileNavigationCommand:
-		//	{UiMobileNavigationCommand} "navigateTo" targetPage=UiMobileNavigationPage;
-		public ParserRule getRule() { return rule; }
-
-		//{UiMobileNavigationCommand} "navigateTo" targetPage=UiMobileNavigationPage
+		//	{UiMobileNavigationCommand}
+		//	'navigateTo' targetPage=UiMobileNavigationPage;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiMobileNavigationCommand} 'navigateTo' targetPage=UiMobileNavigationPage
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiMobileNavigationCommand}
 		public Action getUiMobileNavigationCommandAction_0() { return cUiMobileNavigationCommandAction_0; }
-
-		//"navigateTo"
+		
+		//'navigateTo'
 		public Keyword getNavigateToKeyword_1() { return cNavigateToKeyword_1; }
-
+		
 		//targetPage=UiMobileNavigationPage
 		public Assignment getTargetPageAssignment_2() { return cTargetPageAssignment_2; }
-
+		
 		//UiMobileNavigationPage
 		public RuleCall getTargetPageUiMobileNavigationPageParserRuleCall_2_0() { return cTargetPageUiMobileNavigationPageParserRuleCall_2_0; }
 	}
-
 	public class UiOpenDialogCommandElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiOpenDialogCommand");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiOpenDialogCommand");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiOpenDialogCommandAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cOpenDialogKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -916,27 +896,27 @@
 		private final RuleCall cDialogUiDialogParserRuleCall_2_0 = (RuleCall)cDialogAssignment_2.eContents().get(0);
 		
 		//UiOpenDialogCommand:
-		//	{UiOpenDialogCommand} "openDialog" dialog=UiDialog;
-		public ParserRule getRule() { return rule; }
-
-		//{UiOpenDialogCommand} "openDialog" dialog=UiDialog
+		//	{UiOpenDialogCommand}
+		//	'openDialog' dialog=UiDialog;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiOpenDialogCommand} 'openDialog' dialog=UiDialog
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiOpenDialogCommand}
 		public Action getUiOpenDialogCommandAction_0() { return cUiOpenDialogCommandAction_0; }
-
-		//"openDialog"
+		
+		//'openDialog'
 		public Keyword getOpenDialogKeyword_1() { return cOpenDialogKeyword_1; }
-
+		
 		//dialog=UiDialog
 		public Assignment getDialogAssignment_2() { return cDialogAssignment_2; }
-
+		
 		//UiDialog
 		public RuleCall getDialogUiDialogParserRuleCall_2_0() { return cDialogUiDialogParserRuleCall_2_0; }
 	}
-
 	public class UiSearchWithDialogCommandElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiSearchWithDialogCommand");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiSearchWithDialogCommand");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiSearchWithDialogCommandAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cSearchWithKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -944,27 +924,27 @@
 		private final RuleCall cDialogUiSearchDialogParserRuleCall_2_0 = (RuleCall)cDialogAssignment_2.eContents().get(0);
 		
 		//UiSearchWithDialogCommand:
-		//	{UiSearchWithDialogCommand} "searchWith" dialog=UiSearchDialog;
-		public ParserRule getRule() { return rule; }
-
-		//{UiSearchWithDialogCommand} "searchWith" dialog=UiSearchDialog
+		//	{UiSearchWithDialogCommand}
+		//	'searchWith' dialog=UiSearchDialog;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiSearchWithDialogCommand} 'searchWith' dialog=UiSearchDialog
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiSearchWithDialogCommand}
 		public Action getUiSearchWithDialogCommandAction_0() { return cUiSearchWithDialogCommandAction_0; }
-
-		//"searchWith"
+		
+		//'searchWith'
 		public Keyword getSearchWithKeyword_1() { return cSearchWithKeyword_1; }
-
+		
 		//dialog=UiSearchDialog
 		public Assignment getDialogAssignment_2() { return cDialogAssignment_2; }
-
+		
 		//UiSearchDialog
 		public RuleCall getDialogUiSearchDialogParserRuleCall_2_0() { return cDialogUiSearchDialogParserRuleCall_2_0; }
 	}
-
 	public class UiAddToTableCommandElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiAddToTableCommand");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiAddToTableCommand");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiAddToTableCommandAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cAddToTableKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -973,30 +953,30 @@
 		private final RuleCall cTableUiTableIDTerminalRuleCall_2_0_1 = (RuleCall)cTableUiTableCrossReference_2_0.eContents().get(1);
 		
 		//UiAddToTableCommand:
-		//	{UiAddToTableCommand} "addToTable" table=[UiTable];
-		public ParserRule getRule() { return rule; }
-
-		//{UiAddToTableCommand} "addToTable" table=[UiTable]
+		//	{UiAddToTableCommand}
+		//	'addToTable' table=[UiTable];
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiAddToTableCommand} 'addToTable' table=[UiTable]
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiAddToTableCommand}
 		public Action getUiAddToTableCommandAction_0() { return cUiAddToTableCommandAction_0; }
-
-		//"addToTable"
+		
+		//'addToTable'
 		public Keyword getAddToTableKeyword_1() { return cAddToTableKeyword_1; }
-
+		
 		//table=[UiTable]
 		public Assignment getTableAssignment_2() { return cTableAssignment_2; }
-
+		
 		//[UiTable]
 		public CrossReference getTableUiTableCrossReference_2_0() { return cTableUiTableCrossReference_2_0; }
-
+		
 		//ID
 		public RuleCall getTableUiTableIDTerminalRuleCall_2_0_1() { return cTableUiTableIDTerminalRuleCall_2_0_1; }
 	}
-
 	public class UiRemoveFromTableCommandElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiRemoveFromTableCommand");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiRemoveFromTableCommand");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiRemoveFromTableCommandAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cRemoveFromTableKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -1005,30 +985,30 @@
 		private final RuleCall cTableUiTableIDTerminalRuleCall_2_0_1 = (RuleCall)cTableUiTableCrossReference_2_0.eContents().get(1);
 		
 		//UiRemoveFromTableCommand:
-		//	{UiRemoveFromTableCommand} "removeFromTable" table=[UiTable];
-		public ParserRule getRule() { return rule; }
-
-		//{UiRemoveFromTableCommand} "removeFromTable" table=[UiTable]
+		//	{UiRemoveFromTableCommand}
+		//	'removeFromTable' table=[UiTable];
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiRemoveFromTableCommand} 'removeFromTable' table=[UiTable]
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiRemoveFromTableCommand}
 		public Action getUiRemoveFromTableCommandAction_0() { return cUiRemoveFromTableCommandAction_0; }
-
-		//"removeFromTable"
+		
+		//'removeFromTable'
 		public Keyword getRemoveFromTableKeyword_1() { return cRemoveFromTableKeyword_1; }
-
+		
 		//table=[UiTable]
 		public Assignment getTableAssignment_2() { return cTableAssignment_2; }
-
+		
 		//[UiTable]
 		public CrossReference getTableUiTableCrossReference_2_0() { return cTableUiTableCrossReference_2_0; }
-
+		
 		//ID
 		public RuleCall getTableUiTableIDTerminalRuleCall_2_0_1() { return cTableUiTableIDTerminalRuleCall_2_0_1; }
 	}
-
 	public class UiSetNewInstanceCommandElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiSetNewInstanceCommand");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiSetNewInstanceCommand");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiSetNewInstanceCommandAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cNewInstanceKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -1042,45 +1022,45 @@
 		private final RuleCall cTargetUiBindingEndpointAssignmentParserRuleCall_3_1_0 = (RuleCall)cTargetAssignment_3_1.eContents().get(0);
 		
 		//UiSetNewInstanceCommand:
-		//	{UiSetNewInstanceCommand} "newInstance" ("for" jvmType=JvmTypeReference)? ("at" target=UiBindingEndpointAssignment);
-		public ParserRule getRule() { return rule; }
-
-		//{UiSetNewInstanceCommand} "newInstance" ("for" jvmType=JvmTypeReference)? ("at" target=UiBindingEndpointAssignment)
+		//	{UiSetNewInstanceCommand}
+		//	'newInstance' ('for' jvmType=JvmTypeReference)? ('at' target=UiBindingEndpointAssignment);
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiSetNewInstanceCommand} 'newInstance' ('for' jvmType=JvmTypeReference)? ('at' target=UiBindingEndpointAssignment)
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiSetNewInstanceCommand}
 		public Action getUiSetNewInstanceCommandAction_0() { return cUiSetNewInstanceCommandAction_0; }
-
-		//"newInstance"
+		
+		//'newInstance'
 		public Keyword getNewInstanceKeyword_1() { return cNewInstanceKeyword_1; }
-
-		//("for" jvmType=JvmTypeReference)?
+		
+		//('for' jvmType=JvmTypeReference)?
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"for"
+		
+		//'for'
 		public Keyword getForKeyword_2_0() { return cForKeyword_2_0; }
-
+		
 		//jvmType=JvmTypeReference
 		public Assignment getJvmTypeAssignment_2_1() { return cJvmTypeAssignment_2_1; }
-
+		
 		//JvmTypeReference
 		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_2_1_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_2_1_0; }
-
-		//"at" target=UiBindingEndpointAssignment
+		
+		//'at' target=UiBindingEndpointAssignment
 		public Group getGroup_3() { return cGroup_3; }
-
-		//"at"
+		
+		//'at'
 		public Keyword getAtKeyword_3_0() { return cAtKeyword_3_0; }
-
+		
 		//target=UiBindingEndpointAssignment
 		public Assignment getTargetAssignment_3_1() { return cTargetAssignment_3_1; }
-
+		
 		//UiBindingEndpointAssignment
 		public RuleCall getTargetUiBindingEndpointAssignmentParserRuleCall_3_1_0() { return cTargetUiBindingEndpointAssignmentParserRuleCall_3_1_0; }
 	}
-
 	public class UiSendEventCommandElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiSendEventCommand");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiSendEventCommand");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiSendEventCommandAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cSendEventKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -1092,51 +1072,50 @@
 		private final Keyword cRightParenthesisKeyword_5 = (Keyword)cGroup.eContents().get(5);
 		
 		//UiSendEventCommand:
-		//	{UiSendEventCommand} "sendEvent" "(" noAutoTrigger?="noAutoTrigger"? eventTopic=STRING ")";
-		public ParserRule getRule() { return rule; }
-
-		//{UiSendEventCommand} "sendEvent" "(" noAutoTrigger?="noAutoTrigger"? eventTopic=STRING ")"
+		//	{UiSendEventCommand}
+		//	'sendEvent' '(' noAutoTrigger?='noAutoTrigger'? eventTopic=STRING ')';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiSendEventCommand} 'sendEvent' '(' noAutoTrigger?='noAutoTrigger'? eventTopic=STRING ')'
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiSendEventCommand}
 		public Action getUiSendEventCommandAction_0() { return cUiSendEventCommandAction_0; }
-
-		//"sendEvent"
+		
+		//'sendEvent'
 		public Keyword getSendEventKeyword_1() { return cSendEventKeyword_1; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2() { return cLeftParenthesisKeyword_2; }
-
-		//noAutoTrigger?="noAutoTrigger"?
+		
+		//noAutoTrigger?='noAutoTrigger'?
 		public Assignment getNoAutoTriggerAssignment_3() { return cNoAutoTriggerAssignment_3; }
-
-		//"noAutoTrigger"
+		
+		//'noAutoTrigger'
 		public Keyword getNoAutoTriggerNoAutoTriggerKeyword_3_0() { return cNoAutoTriggerNoAutoTriggerKeyword_3_0; }
-
+		
 		//eventTopic=STRING
 		public Assignment getEventTopicAssignment_4() { return cEventTopicAssignment_4; }
-
+		
 		//STRING
 		public RuleCall getEventTopicSTRINGTerminalRuleCall_4_0() { return cEventTopicSTRINGTerminalRuleCall_4_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_5() { return cRightParenthesisKeyword_5; }
 	}
-
 	public class UiViewElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiView");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiView");
 		private final RuleCall cUiIDEViewParserRuleCall = (RuleCall)rule.eContents().get(1);
 		
 		//UiView:
 		//	UiIDEView;
-		public ParserRule getRule() { return rule; }
-
+		@Override public ParserRule getRule() { return rule; }
+		
 		//UiIDEView
 		public RuleCall getUiIDEViewParserRuleCall() { return cUiIDEViewParserRuleCall; }
 	}
-
 	public class UiIDEViewElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiIDEView");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiIDEView");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cIdeviewKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
@@ -1190,177 +1169,323 @@
 		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
 		
 		//UiIDEView:
-		//	"ideview" name=ID "{" (("sharedStateGroup" sharedStateGroup=STRING ";"?)? & ("category"
-		//	viewCategory=[cfg::UxViewCategory|QualifiedName] ";"?)? & ("rootType" jvmType=JvmTypeReference ";"?)? &
-		//	("exposedActions" "{" exposedActions+=UiExposedAction* "}")?) (beanSlots+=UiBeanSlot |
-		//	bindingEndpointAlias+=UiBindingEndpointAlias | bindings+=UiBinding)* content=UiEmbeddable ("align"
-		//	contentAlignment=UiAlignment)? (bindingEndpointAlias+=UiBindingEndpointAlias | bindings+=UiBinding |
-		//	validatorAssignments+=UiValidatorAssignment | processorAssignments+=UiVisibilityProcessorAssignment)* "}";
-		public ParserRule getRule() { return rule; }
-
-		//"ideview" name=ID "{" (("sharedStateGroup" sharedStateGroup=STRING ";"?)? & ("category"
-		//viewCategory=[cfg::UxViewCategory|QualifiedName] ";"?)? & ("rootType" jvmType=JvmTypeReference ";"?)? &
-		//("exposedActions" "{" exposedActions+=UiExposedAction* "}")?) (beanSlots+=UiBeanSlot |
-		//bindingEndpointAlias+=UiBindingEndpointAlias | bindings+=UiBinding)* content=UiEmbeddable ("align"
+		//	'ideview' name=ID
+		//	'{' (('sharedStateGroup' sharedStateGroup=STRING ';'?)?
+		//	& ('category' viewCategory=[cfg::UxViewCategory|QualifiedName] ';'?)?
+		//	& ('rootType' jvmType=JvmTypeReference ';'?)?
+		//	& ('exposedActions' '{'
+		//	exposedActions+=UiExposedAction*
+		//	'}')?) (beanSlots+=UiBeanSlot | bindingEndpointAlias+=UiBindingEndpointAlias | bindings+=UiBinding)*
+		//	content=UiEmbeddable ('align' contentAlignment=UiAlignment)? (bindingEndpointAlias+=UiBindingEndpointAlias |
+		//	bindings+=UiBinding | validatorAssignments+=UiValidatorAssignment |
+		//	processorAssignments+=UiVisibilityProcessorAssignment)*
+		//	'}';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'ideview' name=ID '{' (('sharedStateGroup' sharedStateGroup=STRING ';'?)? & ('category'
+		//viewCategory=[cfg::UxViewCategory|QualifiedName] ';'?)? & ('rootType' jvmType=JvmTypeReference ';'?)? &
+		//('exposedActions' '{' exposedActions+=UiExposedAction* '}')?) (beanSlots+=UiBeanSlot |
+		//bindingEndpointAlias+=UiBindingEndpointAlias | bindings+=UiBinding)* content=UiEmbeddable ('align'
 		//contentAlignment=UiAlignment)? (bindingEndpointAlias+=UiBindingEndpointAlias | bindings+=UiBinding |
-		//validatorAssignments+=UiValidatorAssignment | processorAssignments+=UiVisibilityProcessorAssignment)* "}"
+		//validatorAssignments+=UiValidatorAssignment | processorAssignments+=UiVisibilityProcessorAssignment)* '}'
 		public Group getGroup() { return cGroup; }
-
-		//"ideview"
+		
+		//'ideview'
 		public Keyword getIdeviewKeyword_0() { return cIdeviewKeyword_0; }
-
+		
 		//name=ID
 		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
-
-		//("sharedStateGroup" sharedStateGroup=STRING ";"?)? & ("category" viewCategory=[cfg::UxViewCategory|QualifiedName] ";"?)?
-		//& ("rootType" jvmType=JvmTypeReference ";"?)? & ("exposedActions" "{" exposedActions+=UiExposedAction* "}")?
+		
+		//('sharedStateGroup' sharedStateGroup=STRING ';'?)? & ('category' viewCategory=[cfg::UxViewCategory|QualifiedName] ';'?)?
+		//& ('rootType' jvmType=JvmTypeReference ';'?)? & ('exposedActions' '{' exposedActions+=UiExposedAction* '}')?
 		public UnorderedGroup getUnorderedGroup_3() { return cUnorderedGroup_3; }
-
-		//("sharedStateGroup" sharedStateGroup=STRING ";"?)?
+		
+		//('sharedStateGroup' sharedStateGroup=STRING ';'?)?
 		public Group getGroup_3_0() { return cGroup_3_0; }
-
-		//"sharedStateGroup"
+		
+		//'sharedStateGroup'
 		public Keyword getSharedStateGroupKeyword_3_0_0() { return cSharedStateGroupKeyword_3_0_0; }
-
+		
 		//sharedStateGroup=STRING
 		public Assignment getSharedStateGroupAssignment_3_0_1() { return cSharedStateGroupAssignment_3_0_1; }
-
+		
 		//STRING
 		public RuleCall getSharedStateGroupSTRINGTerminalRuleCall_3_0_1_0() { return cSharedStateGroupSTRINGTerminalRuleCall_3_0_1_0; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_3_0_2() { return cSemicolonKeyword_3_0_2; }
-
-		//("category" viewCategory=[cfg::UxViewCategory|QualifiedName] ";"?)?
+		
+		//('category' viewCategory=[cfg::UxViewCategory|QualifiedName] ';'?)?
 		public Group getGroup_3_1() { return cGroup_3_1; }
-
-		//"category"
+		
+		//'category'
 		public Keyword getCategoryKeyword_3_1_0() { return cCategoryKeyword_3_1_0; }
-
+		
 		//viewCategory=[cfg::UxViewCategory|QualifiedName]
 		public Assignment getViewCategoryAssignment_3_1_1() { return cViewCategoryAssignment_3_1_1; }
-
+		
 		//[cfg::UxViewCategory|QualifiedName]
 		public CrossReference getViewCategoryUxViewCategoryCrossReference_3_1_1_0() { return cViewCategoryUxViewCategoryCrossReference_3_1_1_0; }
-
+		
 		//QualifiedName
 		public RuleCall getViewCategoryUxViewCategoryQualifiedNameParserRuleCall_3_1_1_0_1() { return cViewCategoryUxViewCategoryQualifiedNameParserRuleCall_3_1_1_0_1; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_3_1_2() { return cSemicolonKeyword_3_1_2; }
-
-		//("rootType" jvmType=JvmTypeReference ";"?)?
+		
+		//('rootType' jvmType=JvmTypeReference ';'?)?
 		public Group getGroup_3_2() { return cGroup_3_2; }
-
-		//"rootType"
+		
+		//'rootType'
 		public Keyword getRootTypeKeyword_3_2_0() { return cRootTypeKeyword_3_2_0; }
-
+		
 		//jvmType=JvmTypeReference
 		public Assignment getJvmTypeAssignment_3_2_1() { return cJvmTypeAssignment_3_2_1; }
-
+		
 		//JvmTypeReference
 		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_3_2_1_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_3_2_1_0; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_3_2_2() { return cSemicolonKeyword_3_2_2; }
-
-		//("exposedActions" "{" exposedActions+=UiExposedAction* "}")?
+		
+		//('exposedActions' '{' exposedActions+=UiExposedAction* '}')?
 		public Group getGroup_3_3() { return cGroup_3_3; }
-
-		//"exposedActions"
+		
+		//'exposedActions'
 		public Keyword getExposedActionsKeyword_3_3_0() { return cExposedActionsKeyword_3_3_0; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_3_3_1() { return cLeftCurlyBracketKeyword_3_3_1; }
-
+		
 		//exposedActions+=UiExposedAction*
 		public Assignment getExposedActionsAssignment_3_3_2() { return cExposedActionsAssignment_3_3_2; }
-
+		
 		//UiExposedAction
 		public RuleCall getExposedActionsUiExposedActionParserRuleCall_3_3_2_0() { return cExposedActionsUiExposedActionParserRuleCall_3_3_2_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_3_3_3() { return cRightCurlyBracketKeyword_3_3_3; }
-
+		
 		//(beanSlots+=UiBeanSlot | bindingEndpointAlias+=UiBindingEndpointAlias | bindings+=UiBinding)*
 		public Alternatives getAlternatives_4() { return cAlternatives_4; }
-
+		
 		//beanSlots+=UiBeanSlot
 		public Assignment getBeanSlotsAssignment_4_0() { return cBeanSlotsAssignment_4_0; }
-
+		
 		//UiBeanSlot
 		public RuleCall getBeanSlotsUiBeanSlotParserRuleCall_4_0_0() { return cBeanSlotsUiBeanSlotParserRuleCall_4_0_0; }
-
+		
 		//bindingEndpointAlias+=UiBindingEndpointAlias
 		public Assignment getBindingEndpointAliasAssignment_4_1() { return cBindingEndpointAliasAssignment_4_1; }
-
+		
 		//UiBindingEndpointAlias
 		public RuleCall getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_4_1_0() { return cBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_4_1_0; }
-
+		
 		//bindings+=UiBinding
 		public Assignment getBindingsAssignment_4_2() { return cBindingsAssignment_4_2; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_4_2_0() { return cBindingsUiBindingParserRuleCall_4_2_0; }
-
+		
 		//content=UiEmbeddable
 		public Assignment getContentAssignment_5() { return cContentAssignment_5; }
-
+		
 		//UiEmbeddable
 		public RuleCall getContentUiEmbeddableParserRuleCall_5_0() { return cContentUiEmbeddableParserRuleCall_5_0; }
-
-		//("align" contentAlignment=UiAlignment)?
+		
+		//('align' contentAlignment=UiAlignment)?
 		public Group getGroup_6() { return cGroup_6; }
-
-		//"align"
+		
+		//'align'
 		public Keyword getAlignKeyword_6_0() { return cAlignKeyword_6_0; }
-
+		
 		//contentAlignment=UiAlignment
 		public Assignment getContentAlignmentAssignment_6_1() { return cContentAlignmentAssignment_6_1; }
-
+		
 		//UiAlignment
 		public RuleCall getContentAlignmentUiAlignmentEnumRuleCall_6_1_0() { return cContentAlignmentUiAlignmentEnumRuleCall_6_1_0; }
-
+		
 		//(bindingEndpointAlias+=UiBindingEndpointAlias | bindings+=UiBinding | validatorAssignments+=UiValidatorAssignment |
 		//processorAssignments+=UiVisibilityProcessorAssignment)*
 		public Alternatives getAlternatives_7() { return cAlternatives_7; }
-
+		
 		//bindingEndpointAlias+=UiBindingEndpointAlias
 		public Assignment getBindingEndpointAliasAssignment_7_0() { return cBindingEndpointAliasAssignment_7_0; }
-
+		
 		//UiBindingEndpointAlias
 		public RuleCall getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_7_0_0() { return cBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_7_0_0; }
-
+		
 		//bindings+=UiBinding
 		public Assignment getBindingsAssignment_7_1() { return cBindingsAssignment_7_1; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_7_1_0() { return cBindingsUiBindingParserRuleCall_7_1_0; }
-
+		
 		//validatorAssignments+=UiValidatorAssignment
 		public Assignment getValidatorAssignmentsAssignment_7_2() { return cValidatorAssignmentsAssignment_7_2; }
-
+		
 		//UiValidatorAssignment
 		public RuleCall getValidatorAssignmentsUiValidatorAssignmentParserRuleCall_7_2_0() { return cValidatorAssignmentsUiValidatorAssignmentParserRuleCall_7_2_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment
 		public Assignment getProcessorAssignmentsAssignment_7_3() { return cProcessorAssignmentsAssignment_7_3; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_3_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_3_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
 	}
-
+	public class UiDisplayViewElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiDisplayView");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cDisplayKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Keyword cRootTypeKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		private final Assignment cJvmTypeAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cJvmTypeJvmTypeReferenceParserRuleCall_4_0 = (RuleCall)cJvmTypeAssignment_4.eContents().get(0);
+		private final Alternatives cAlternatives_5 = (Alternatives)cGroup.eContents().get(5);
+		private final Assignment cBeanSlotsAssignment_5_0 = (Assignment)cAlternatives_5.eContents().get(0);
+		private final RuleCall cBeanSlotsUiBeanSlotParserRuleCall_5_0_0 = (RuleCall)cBeanSlotsAssignment_5_0.eContents().get(0);
+		private final Assignment cBindingEndpointAliasAssignment_5_1 = (Assignment)cAlternatives_5.eContents().get(1);
+		private final RuleCall cBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_5_1_0 = (RuleCall)cBindingEndpointAliasAssignment_5_1.eContents().get(0);
+		private final Assignment cBindingsAssignment_5_2 = (Assignment)cAlternatives_5.eContents().get(2);
+		private final RuleCall cBindingsUiBindingParserRuleCall_5_2_0 = (RuleCall)cBindingsAssignment_5_2.eContents().get(0);
+		private final Assignment cContentAssignment_6 = (Assignment)cGroup.eContents().get(6);
+		private final RuleCall cContentUiEmbeddableParserRuleCall_6_0 = (RuleCall)cContentAssignment_6.eContents().get(0);
+		private final Group cGroup_7 = (Group)cGroup.eContents().get(7);
+		private final Keyword cAlignKeyword_7_0 = (Keyword)cGroup_7.eContents().get(0);
+		private final Assignment cContentAlignmentAssignment_7_1 = (Assignment)cGroup_7.eContents().get(1);
+		private final RuleCall cContentAlignmentUiAlignmentEnumRuleCall_7_1_0 = (RuleCall)cContentAlignmentAssignment_7_1.eContents().get(0);
+		private final Alternatives cAlternatives_8 = (Alternatives)cGroup.eContents().get(8);
+		private final Assignment cBindingEndpointAliasAssignment_8_0 = (Assignment)cAlternatives_8.eContents().get(0);
+		private final RuleCall cBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_8_0_0 = (RuleCall)cBindingEndpointAliasAssignment_8_0.eContents().get(0);
+		private final Assignment cBindingsAssignment_8_1 = (Assignment)cAlternatives_8.eContents().get(1);
+		private final RuleCall cBindingsUiBindingParserRuleCall_8_1_0 = (RuleCall)cBindingsAssignment_8_1.eContents().get(0);
+		private final Assignment cValidatorAssignmentsAssignment_8_2 = (Assignment)cAlternatives_8.eContents().get(2);
+		private final RuleCall cValidatorAssignmentsUiValidatorAssignmentParserRuleCall_8_2_0 = (RuleCall)cValidatorAssignmentsAssignment_8_2.eContents().get(0);
+		private final Assignment cProcessorAssignmentsAssignment_8_3 = (Assignment)cAlternatives_8.eContents().get(3);
+		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_8_3_0 = (RuleCall)cProcessorAssignmentsAssignment_8_3.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_9 = (Keyword)cGroup.eContents().get(9);
+		
+		//UiDisplayView:
+		//	'display' name=ID
+		//	'{'
+		//	'rootType' jvmType=JvmTypeReference (beanSlots+=UiBeanSlot | bindingEndpointAlias+=UiBindingEndpointAlias |
+		//	bindings+=UiBinding)*
+		//	content=UiEmbeddable ('align' contentAlignment=UiAlignment)? (bindingEndpointAlias+=UiBindingEndpointAlias |
+		//	bindings+=UiBinding | validatorAssignments+=UiValidatorAssignment |
+		//	processorAssignments+=UiVisibilityProcessorAssignment)*
+		//	'}';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'display' name=ID '{' 'rootType' jvmType=JvmTypeReference (beanSlots+=UiBeanSlot |
+		//bindingEndpointAlias+=UiBindingEndpointAlias | bindings+=UiBinding)* content=UiEmbeddable ('align'
+		//contentAlignment=UiAlignment)? (bindingEndpointAlias+=UiBindingEndpointAlias | bindings+=UiBinding |
+		//validatorAssignments+=UiValidatorAssignment | processorAssignments+=UiVisibilityProcessorAssignment)* '}'
+		public Group getGroup() { return cGroup; }
+		
+		//'display'
+		public Keyword getDisplayKeyword_0() { return cDisplayKeyword_0; }
+		
+		//name=ID
+		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+		
+		//ID
+		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
+		
+		//'rootType'
+		public Keyword getRootTypeKeyword_3() { return cRootTypeKeyword_3; }
+		
+		//jvmType=JvmTypeReference
+		public Assignment getJvmTypeAssignment_4() { return cJvmTypeAssignment_4; }
+		
+		//JvmTypeReference
+		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_4_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_4_0; }
+		
+		//(beanSlots+=UiBeanSlot | bindingEndpointAlias+=UiBindingEndpointAlias | bindings+=UiBinding)*
+		public Alternatives getAlternatives_5() { return cAlternatives_5; }
+		
+		//beanSlots+=UiBeanSlot
+		public Assignment getBeanSlotsAssignment_5_0() { return cBeanSlotsAssignment_5_0; }
+		
+		//UiBeanSlot
+		public RuleCall getBeanSlotsUiBeanSlotParserRuleCall_5_0_0() { return cBeanSlotsUiBeanSlotParserRuleCall_5_0_0; }
+		
+		//bindingEndpointAlias+=UiBindingEndpointAlias
+		public Assignment getBindingEndpointAliasAssignment_5_1() { return cBindingEndpointAliasAssignment_5_1; }
+		
+		//UiBindingEndpointAlias
+		public RuleCall getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_5_1_0() { return cBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_5_1_0; }
+		
+		//bindings+=UiBinding
+		public Assignment getBindingsAssignment_5_2() { return cBindingsAssignment_5_2; }
+		
+		//UiBinding
+		public RuleCall getBindingsUiBindingParserRuleCall_5_2_0() { return cBindingsUiBindingParserRuleCall_5_2_0; }
+		
+		//content=UiEmbeddable
+		public Assignment getContentAssignment_6() { return cContentAssignment_6; }
+		
+		//UiEmbeddable
+		public RuleCall getContentUiEmbeddableParserRuleCall_6_0() { return cContentUiEmbeddableParserRuleCall_6_0; }
+		
+		//('align' contentAlignment=UiAlignment)?
+		public Group getGroup_7() { return cGroup_7; }
+		
+		//'align'
+		public Keyword getAlignKeyword_7_0() { return cAlignKeyword_7_0; }
+		
+		//contentAlignment=UiAlignment
+		public Assignment getContentAlignmentAssignment_7_1() { return cContentAlignmentAssignment_7_1; }
+		
+		//UiAlignment
+		public RuleCall getContentAlignmentUiAlignmentEnumRuleCall_7_1_0() { return cContentAlignmentUiAlignmentEnumRuleCall_7_1_0; }
+		
+		//(bindingEndpointAlias+=UiBindingEndpointAlias | bindings+=UiBinding | validatorAssignments+=UiValidatorAssignment |
+		//processorAssignments+=UiVisibilityProcessorAssignment)*
+		public Alternatives getAlternatives_8() { return cAlternatives_8; }
+		
+		//bindingEndpointAlias+=UiBindingEndpointAlias
+		public Assignment getBindingEndpointAliasAssignment_8_0() { return cBindingEndpointAliasAssignment_8_0; }
+		
+		//UiBindingEndpointAlias
+		public RuleCall getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_8_0_0() { return cBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_8_0_0; }
+		
+		//bindings+=UiBinding
+		public Assignment getBindingsAssignment_8_1() { return cBindingsAssignment_8_1; }
+		
+		//UiBinding
+		public RuleCall getBindingsUiBindingParserRuleCall_8_1_0() { return cBindingsUiBindingParserRuleCall_8_1_0; }
+		
+		//validatorAssignments+=UiValidatorAssignment
+		public Assignment getValidatorAssignmentsAssignment_8_2() { return cValidatorAssignmentsAssignment_8_2; }
+		
+		//UiValidatorAssignment
+		public RuleCall getValidatorAssignmentsUiValidatorAssignmentParserRuleCall_8_2_0() { return cValidatorAssignmentsUiValidatorAssignmentParserRuleCall_8_2_0; }
+		
+		//processorAssignments+=UiVisibilityProcessorAssignment
+		public Assignment getProcessorAssignmentsAssignment_8_3() { return cProcessorAssignmentsAssignment_8_3; }
+		
+		//UiVisibilityProcessorAssignment
+		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_8_3_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_8_3_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_9() { return cRightCurlyBracketKeyword_9; }
+	}
 	public class UiExposedActionElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiExposedAction");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiExposedAction");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Assignment cNameAssignment_0 = (Assignment)cGroup.eContents().get(0);
 		private final RuleCall cNameIDTerminalRuleCall_0_0 = (RuleCall)cNameAssignment_0.eContents().get(0);
@@ -1384,77 +1509,76 @@
 		private final Keyword cSemicolonKeyword_6 = (Keyword)cGroup.eContents().get(6);
 		
 		//UiExposedAction:
-		//	name=ID ("icon" iconName=STRING)? "id" (=> actionReference=[cfg::UxAction|QualifiedName] | actionID=STRING)
-		//	checkDirty?="checkDirty"? ("externalCommand" externalCommandId=STRING)? ";"?;
-		public ParserRule getRule() { return rule; }
-
-		//name=ID ("icon" iconName=STRING)? "id" (=> actionReference=[cfg::UxAction|QualifiedName] | actionID=STRING)
-		//checkDirty?="checkDirty"? ("externalCommand" externalCommandId=STRING)? ";"?
+		//	name=ID ('icon' iconName=STRING)? 'id' (=> actionReference=[cfg::UxAction|QualifiedName] | actionID=STRING)
+		//	checkDirty?='checkDirty'? ('externalCommand' externalCommandId=STRING)? ';'?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//name=ID ('icon' iconName=STRING)? 'id' (=> actionReference=[cfg::UxAction|QualifiedName] | actionID=STRING)
+		//checkDirty?='checkDirty'? ('externalCommand' externalCommandId=STRING)? ';'?
 		public Group getGroup() { return cGroup; }
-
+		
 		//name=ID
 		public Assignment getNameAssignment_0() { return cNameAssignment_0; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_0_0() { return cNameIDTerminalRuleCall_0_0; }
-
-		//("icon" iconName=STRING)?
+		
+		//('icon' iconName=STRING)?
 		public Group getGroup_1() { return cGroup_1; }
-
-		//"icon"
+		
+		//'icon'
 		public Keyword getIconKeyword_1_0() { return cIconKeyword_1_0; }
-
+		
 		//iconName=STRING
 		public Assignment getIconNameAssignment_1_1() { return cIconNameAssignment_1_1; }
-
+		
 		//STRING
 		public RuleCall getIconNameSTRINGTerminalRuleCall_1_1_0() { return cIconNameSTRINGTerminalRuleCall_1_1_0; }
-
-		//"id"
+		
+		//'id'
 		public Keyword getIdKeyword_2() { return cIdKeyword_2; }
-
+		
 		//=> actionReference=[cfg::UxAction|QualifiedName] | actionID=STRING
 		public Alternatives getAlternatives_3() { return cAlternatives_3; }
-
+		
 		//=> actionReference=[cfg::UxAction|QualifiedName]
 		public Assignment getActionReferenceAssignment_3_0() { return cActionReferenceAssignment_3_0; }
-
+		
 		//[cfg::UxAction|QualifiedName]
 		public CrossReference getActionReferenceUxActionCrossReference_3_0_0() { return cActionReferenceUxActionCrossReference_3_0_0; }
-
+		
 		//QualifiedName
 		public RuleCall getActionReferenceUxActionQualifiedNameParserRuleCall_3_0_0_1() { return cActionReferenceUxActionQualifiedNameParserRuleCall_3_0_0_1; }
-
+		
 		//actionID=STRING
 		public Assignment getActionIDAssignment_3_1() { return cActionIDAssignment_3_1; }
-
+		
 		//STRING
 		public RuleCall getActionIDSTRINGTerminalRuleCall_3_1_0() { return cActionIDSTRINGTerminalRuleCall_3_1_0; }
-
-		//checkDirty?="checkDirty"?
+		
+		//checkDirty?='checkDirty'?
 		public Assignment getCheckDirtyAssignment_4() { return cCheckDirtyAssignment_4; }
-
-		//"checkDirty"
+		
+		//'checkDirty'
 		public Keyword getCheckDirtyCheckDirtyKeyword_4_0() { return cCheckDirtyCheckDirtyKeyword_4_0; }
-
-		//("externalCommand" externalCommandId=STRING)?
+		
+		//('externalCommand' externalCommandId=STRING)?
 		public Group getGroup_5() { return cGroup_5; }
-
-		//"externalCommand"
+		
+		//'externalCommand'
 		public Keyword getExternalCommandKeyword_5_0() { return cExternalCommandKeyword_5_0; }
-
+		
 		//externalCommandId=STRING
 		public Assignment getExternalCommandIdAssignment_5_1() { return cExternalCommandIdAssignment_5_1; }
-
+		
 		//STRING
 		public RuleCall getExternalCommandIdSTRINGTerminalRuleCall_5_1_0() { return cExternalCommandIdSTRINGTerminalRuleCall_5_1_0; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_6() { return cSemicolonKeyword_6; }
 	}
-
 	public class UiMobileNavBarActionElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileNavBarAction");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileNavBarAction");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Assignment cNameAssignment_0 = (Assignment)cGroup.eContents().get(0);
 		private final RuleCall cNameIDTerminalRuleCall_0_0 = (RuleCall)cNameAssignment_0.eContents().get(0);
@@ -1472,57 +1596,56 @@
 		private final Keyword cSemicolonKeyword_4 = (Keyword)cGroup.eContents().get(4);
 		
 		//UiMobileNavBarAction:
-		//	name=ID ("icon" iconName=STRING)? "id" (=> actionReference=[cfg::UxAction|QualifiedName] | actionID=STRING) ";"?;
-		public ParserRule getRule() { return rule; }
-
-		//name=ID ("icon" iconName=STRING)? "id" (=> actionReference=[cfg::UxAction|QualifiedName] | actionID=STRING) ";"?
+		//	name=ID ('icon' iconName=STRING)? 'id' (=> actionReference=[cfg::UxAction|QualifiedName] | actionID=STRING) ';'?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//name=ID ('icon' iconName=STRING)? 'id' (=> actionReference=[cfg::UxAction|QualifiedName] | actionID=STRING) ';'?
 		public Group getGroup() { return cGroup; }
-
+		
 		//name=ID
 		public Assignment getNameAssignment_0() { return cNameAssignment_0; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_0_0() { return cNameIDTerminalRuleCall_0_0; }
-
-		//("icon" iconName=STRING)?
+		
+		//('icon' iconName=STRING)?
 		public Group getGroup_1() { return cGroup_1; }
-
-		//"icon"
+		
+		//'icon'
 		public Keyword getIconKeyword_1_0() { return cIconKeyword_1_0; }
-
+		
 		//iconName=STRING
 		public Assignment getIconNameAssignment_1_1() { return cIconNameAssignment_1_1; }
-
+		
 		//STRING
 		public RuleCall getIconNameSTRINGTerminalRuleCall_1_1_0() { return cIconNameSTRINGTerminalRuleCall_1_1_0; }
-
-		//"id"
+		
+		//'id'
 		public Keyword getIdKeyword_2() { return cIdKeyword_2; }
-
+		
 		//=> actionReference=[cfg::UxAction|QualifiedName] | actionID=STRING
 		public Alternatives getAlternatives_3() { return cAlternatives_3; }
-
+		
 		//=> actionReference=[cfg::UxAction|QualifiedName]
 		public Assignment getActionReferenceAssignment_3_0() { return cActionReferenceAssignment_3_0; }
-
+		
 		//[cfg::UxAction|QualifiedName]
 		public CrossReference getActionReferenceUxActionCrossReference_3_0_0() { return cActionReferenceUxActionCrossReference_3_0_0; }
-
+		
 		//QualifiedName
 		public RuleCall getActionReferenceUxActionQualifiedNameParserRuleCall_3_0_0_1() { return cActionReferenceUxActionQualifiedNameParserRuleCall_3_0_0_1; }
-
+		
 		//actionID=STRING
 		public Assignment getActionIDAssignment_3_1() { return cActionIDAssignment_3_1; }
-
+		
 		//STRING
 		public RuleCall getActionIDSTRINGTerminalRuleCall_3_1_0() { return cActionIDSTRINGTerminalRuleCall_3_1_0; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_4() { return cSemicolonKeyword_4; }
 	}
-
 	public class UiMobileViewElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileView");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileView");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cMobileKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
@@ -1562,154 +1685,167 @@
 		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
 		
 		//UiMobileView:
-		//	"mobile" name=ID "{" (("sharedStateGroup" sharedStateGroup=STRING ";"?)? & ("rootType" jvmType=JvmTypeReference
-		//	";"?)?) (beanSlots+=UiBeanSlot | bindingEndpointAlias+=UiBindingEndpointAlias)* content=UiMobileEmbeddable ("align"
-		//	contentAlignment=UiAlignment)? (bindingEndpointAlias+=UiBindingEndpointAlias | bindings+=UiBinding |
-		//	validatorAssignments+=UiValidatorAssignment | processorAssignments+=UiVisibilityProcessorAssignment)* "}";
-		public ParserRule getRule() { return rule; }
-
-		//"mobile" name=ID "{" (("sharedStateGroup" sharedStateGroup=STRING ";"?)? & ("rootType" jvmType=JvmTypeReference ";"?)?)
-		//(beanSlots+=UiBeanSlot | bindingEndpointAlias+=UiBindingEndpointAlias)* content=UiMobileEmbeddable ("align"
+		//	'mobile' name=ID
+		//	'{' (('sharedStateGroup' sharedStateGroup=STRING ';'?)?
+		//	& ('rootType' jvmType=JvmTypeReference ';'?)?) (beanSlots+=UiBeanSlot | bindingEndpointAlias+=UiBindingEndpointAlias)*
+		//	content=UiMobileEmbeddable ('align' contentAlignment=UiAlignment)? (bindingEndpointAlias+=UiBindingEndpointAlias |
+		//	bindings+=UiBinding | validatorAssignments+=UiValidatorAssignment |
+		//	processorAssignments+=UiVisibilityProcessorAssignment)*
+		//	'}';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'mobile' name=ID '{' (('sharedStateGroup' sharedStateGroup=STRING ';'?)? & ('rootType' jvmType=JvmTypeReference ';'?)?)
+		//(beanSlots+=UiBeanSlot | bindingEndpointAlias+=UiBindingEndpointAlias)* content=UiMobileEmbeddable ('align'
 		//contentAlignment=UiAlignment)? (bindingEndpointAlias+=UiBindingEndpointAlias | bindings+=UiBinding |
-		//validatorAssignments+=UiValidatorAssignment | processorAssignments+=UiVisibilityProcessorAssignment)* "}"
+		//validatorAssignments+=UiValidatorAssignment | processorAssignments+=UiVisibilityProcessorAssignment)* '}'
 		public Group getGroup() { return cGroup; }
-
-		//"mobile"
+		
+		//'mobile'
 		public Keyword getMobileKeyword_0() { return cMobileKeyword_0; }
-
+		
 		//name=ID
 		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
-
-		//("sharedStateGroup" sharedStateGroup=STRING ";"?)? & ("rootType" jvmType=JvmTypeReference ";"?)?
+		
+		//('sharedStateGroup' sharedStateGroup=STRING ';'?)? & ('rootType' jvmType=JvmTypeReference ';'?)?
 		public UnorderedGroup getUnorderedGroup_3() { return cUnorderedGroup_3; }
-
-		//("sharedStateGroup" sharedStateGroup=STRING ";"?)?
+		
+		//('sharedStateGroup' sharedStateGroup=STRING ';'?)?
 		public Group getGroup_3_0() { return cGroup_3_0; }
-
-		//"sharedStateGroup"
+		
+		//'sharedStateGroup'
 		public Keyword getSharedStateGroupKeyword_3_0_0() { return cSharedStateGroupKeyword_3_0_0; }
-
+		
 		//sharedStateGroup=STRING
 		public Assignment getSharedStateGroupAssignment_3_0_1() { return cSharedStateGroupAssignment_3_0_1; }
-
+		
 		//STRING
 		public RuleCall getSharedStateGroupSTRINGTerminalRuleCall_3_0_1_0() { return cSharedStateGroupSTRINGTerminalRuleCall_3_0_1_0; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_3_0_2() { return cSemicolonKeyword_3_0_2; }
-
-		//("rootType" jvmType=JvmTypeReference ";"?)?
+		
+		//('rootType' jvmType=JvmTypeReference ';'?)?
 		public Group getGroup_3_1() { return cGroup_3_1; }
-
-		//"rootType"
+		
+		//'rootType'
 		public Keyword getRootTypeKeyword_3_1_0() { return cRootTypeKeyword_3_1_0; }
-
+		
 		//jvmType=JvmTypeReference
 		public Assignment getJvmTypeAssignment_3_1_1() { return cJvmTypeAssignment_3_1_1; }
-
+		
 		//JvmTypeReference
 		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_3_1_1_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_3_1_1_0; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_3_1_2() { return cSemicolonKeyword_3_1_2; }
-
+		
 		//(beanSlots+=UiBeanSlot | bindingEndpointAlias+=UiBindingEndpointAlias)*
 		public Alternatives getAlternatives_4() { return cAlternatives_4; }
-
+		
 		//beanSlots+=UiBeanSlot
 		public Assignment getBeanSlotsAssignment_4_0() { return cBeanSlotsAssignment_4_0; }
-
+		
 		//UiBeanSlot
 		public RuleCall getBeanSlotsUiBeanSlotParserRuleCall_4_0_0() { return cBeanSlotsUiBeanSlotParserRuleCall_4_0_0; }
-
+		
 		//bindingEndpointAlias+=UiBindingEndpointAlias
 		public Assignment getBindingEndpointAliasAssignment_4_1() { return cBindingEndpointAliasAssignment_4_1; }
-
+		
 		//UiBindingEndpointAlias
 		public RuleCall getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_4_1_0() { return cBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_4_1_0; }
-
+		
 		//content=UiMobileEmbeddable
 		public Assignment getContentAssignment_5() { return cContentAssignment_5; }
-
+		
 		//UiMobileEmbeddable
 		public RuleCall getContentUiMobileEmbeddableParserRuleCall_5_0() { return cContentUiMobileEmbeddableParserRuleCall_5_0; }
-
-		//("align" contentAlignment=UiAlignment)?
+		
+		//('align' contentAlignment=UiAlignment)?
 		public Group getGroup_6() { return cGroup_6; }
-
-		//"align"
+		
+		//'align'
 		public Keyword getAlignKeyword_6_0() { return cAlignKeyword_6_0; }
-
+		
 		//contentAlignment=UiAlignment
 		public Assignment getContentAlignmentAssignment_6_1() { return cContentAlignmentAssignment_6_1; }
-
+		
 		//UiAlignment
 		public RuleCall getContentAlignmentUiAlignmentEnumRuleCall_6_1_0() { return cContentAlignmentUiAlignmentEnumRuleCall_6_1_0; }
-
+		
 		//(bindingEndpointAlias+=UiBindingEndpointAlias | bindings+=UiBinding | validatorAssignments+=UiValidatorAssignment |
 		//processorAssignments+=UiVisibilityProcessorAssignment)*
 		public Alternatives getAlternatives_7() { return cAlternatives_7; }
-
+		
 		//bindingEndpointAlias+=UiBindingEndpointAlias
 		public Assignment getBindingEndpointAliasAssignment_7_0() { return cBindingEndpointAliasAssignment_7_0; }
-
+		
 		//UiBindingEndpointAlias
 		public RuleCall getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_7_0_0() { return cBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_7_0_0; }
-
+		
 		//bindings+=UiBinding
 		public Assignment getBindingsAssignment_7_1() { return cBindingsAssignment_7_1; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_7_1_0() { return cBindingsUiBindingParserRuleCall_7_1_0; }
-
+		
 		//validatorAssignments+=UiValidatorAssignment
 		public Assignment getValidatorAssignmentsAssignment_7_2() { return cValidatorAssignmentsAssignment_7_2; }
-
+		
 		//UiValidatorAssignment
 		public RuleCall getValidatorAssignmentsUiValidatorAssignmentParserRuleCall_7_2_0() { return cValidatorAssignmentsUiValidatorAssignmentParserRuleCall_7_2_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment
 		public Assignment getProcessorAssignmentsAssignment_7_3() { return cProcessorAssignmentsAssignment_7_3; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_3_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_3_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
 	}
-
 	public class UiI18nInfoElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiI18nInfo");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cI18nKeyword_0 = (Keyword)cGroup.eContents().get(0);
-		private final Assignment cKeyAssignment_1 = (Assignment)cGroup.eContents().get(1);
-		private final RuleCall cKeySTRINGTerminalRuleCall_1_0 = (RuleCall)cKeyAssignment_1.eContents().get(0);
+		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
+		private final Assignment cNoCaptionAssignment_1_0 = (Assignment)cAlternatives_1.eContents().get(0);
+		private final Keyword cNoCaptionNoCaptionKeyword_1_0_0 = (Keyword)cNoCaptionAssignment_1_0.eContents().get(0);
+		private final Assignment cKeyAssignment_1_1 = (Assignment)cAlternatives_1.eContents().get(1);
+		private final RuleCall cKeySTRINGTerminalRuleCall_1_1_0 = (RuleCall)cKeyAssignment_1_1.eContents().get(0);
 		
 		//UiI18nInfo:
-		//	"i18n" key=STRING;
-		public ParserRule getRule() { return rule; }
-
-		//"i18n" key=STRING
+		//	'i18n' (noCaption?='noCaption' | key=STRING);
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'i18n' (noCaption?='noCaption' | key=STRING)
 		public Group getGroup() { return cGroup; }
-
-		//"i18n"
+		
+		//'i18n'
 		public Keyword getI18nKeyword_0() { return cI18nKeyword_0; }
-
+		
+		//noCaption?='noCaption' | key=STRING
+		public Alternatives getAlternatives_1() { return cAlternatives_1; }
+		
+		//noCaption?='noCaption'
+		public Assignment getNoCaptionAssignment_1_0() { return cNoCaptionAssignment_1_0; }
+		
+		//'noCaption'
+		public Keyword getNoCaptionNoCaptionKeyword_1_0_0() { return cNoCaptionNoCaptionKeyword_1_0_0; }
+		
 		//key=STRING
-		public Assignment getKeyAssignment_1() { return cKeyAssignment_1; }
-
+		public Assignment getKeyAssignment_1_1() { return cKeyAssignment_1_1; }
+		
 		//STRING
-		public RuleCall getKeySTRINGTerminalRuleCall_1_0() { return cKeySTRINGTerminalRuleCall_1_0; }
+		public RuleCall getKeySTRINGTerminalRuleCall_1_1_0() { return cKeySTRINGTerminalRuleCall_1_1_0; }
 	}
-
 	public class UiGridLayoutElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiGridLayout");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiGridLayout");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiGridLayoutAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cGridlayoutKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -1741,103 +1877,111 @@
 		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
 		
 		//UiGridLayout:
-		//	{UiGridLayout} "gridlayout" ("(" (("columns=" columns=INT)? & i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? &
-		//	readonly?="readonly"?) ")")? name=ID? "{" contents+=UiGridLayoutAssigment* bindings+=UiBinding*
-		//	processorAssignments+=UiVisibilityProcessorAssignment* "}";
-		public ParserRule getRule() { return rule; }
-
-		//{UiGridLayout} "gridlayout" ("(" (("columns=" columns=INT)? & i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? &
-		//readonly?="readonly"?) ")")? name=ID? "{" contents+=UiGridLayoutAssigment* bindings+=UiBinding*
-		//processorAssignments+=UiVisibilityProcessorAssignment* "}"
+		//	{UiGridLayout}
+		//	'gridlayout' ('(' (('columns=' columns=INT)?
+		//	& i18nInfo=UiI18nInfo?
+		//	& ('styles' styles=STRING)?
+		//	& readonly?="readonly"?)
+		//	')')?
+		//	name=ID?
+		//	'{'
+		//	contents+=UiGridLayoutAssigment*
+		//	bindings+=UiBinding*
+		//	processorAssignments+=UiVisibilityProcessorAssignment*
+		//	'}';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiGridLayout} 'gridlayout' ('(' (('columns=' columns=INT)? & i18nInfo=UiI18nInfo? & ('styles' styles=STRING)? &
+		//readonly?="readonly"?) ')')? name=ID? '{' contents+=UiGridLayoutAssigment* bindings+=UiBinding*
+		//processorAssignments+=UiVisibilityProcessorAssignment* '}'
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiGridLayout}
 		public Action getUiGridLayoutAction_0() { return cUiGridLayoutAction_0; }
-
-		//"gridlayout"
+		
+		//'gridlayout'
 		public Keyword getGridlayoutKeyword_1() { return cGridlayoutKeyword_1; }
-
-		//("(" (("columns=" columns=INT)? & i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? & readonly?="readonly"?) ")")?
+		
+		//('(' (('columns=' columns=INT)? & i18nInfo=UiI18nInfo? & ('styles' styles=STRING)? & readonly?="readonly"?) ')')?
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
-
-		//("columns=" columns=INT)? & i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? & readonly?="readonly"?
+		
+		//('columns=' columns=INT)? & i18nInfo=UiI18nInfo? & ('styles' styles=STRING)? & readonly?="readonly"?
 		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
-
-		//("columns=" columns=INT)?
+		
+		//('columns=' columns=INT)?
 		public Group getGroup_2_1_0() { return cGroup_2_1_0; }
-
-		//"columns="
+		
+		//'columns='
 		public Keyword getColumnsKeyword_2_1_0_0() { return cColumnsKeyword_2_1_0_0; }
-
+		
 		//columns=INT
 		public Assignment getColumnsAssignment_2_1_0_1() { return cColumnsAssignment_2_1_0_1; }
-
+		
 		//INT
 		public RuleCall getColumnsINTTerminalRuleCall_2_1_0_1_0() { return cColumnsINTTerminalRuleCall_2_1_0_1_0; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_1_1() { return cI18nInfoAssignment_2_1_1; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_1_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_1_0; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_1_2() { return cGroup_2_1_2; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_1_2_0() { return cStylesKeyword_2_1_2_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_1_2_1() { return cStylesAssignment_2_1_2_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_2_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_2_1_0; }
-
+		
 		//readonly?="readonly"?
 		public Assignment getReadonlyAssignment_2_1_3() { return cReadonlyAssignment_2_1_3; }
-
+		
 		//"readonly"
 		public Keyword getReadonlyReadonlyKeyword_2_1_3_0() { return cReadonlyReadonlyKeyword_2_1_3_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
-
+		
 		//contents+=UiGridLayoutAssigment*
 		public Assignment getContentsAssignment_5() { return cContentsAssignment_5; }
-
+		
 		//UiGridLayoutAssigment
 		public RuleCall getContentsUiGridLayoutAssigmentParserRuleCall_5_0() { return cContentsUiGridLayoutAssigmentParserRuleCall_5_0; }
-
+		
 		//bindings+=UiBinding*
 		public Assignment getBindingsAssignment_6() { return cBindingsAssignment_6; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_6_0() { return cBindingsUiBindingParserRuleCall_6_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment*
 		public Assignment getProcessorAssignmentsAssignment_7() { return cProcessorAssignmentsAssignment_7; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
 	}
-
 	public class UiVisibilityProcessorAssignmentElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiVisibilityProcessorAssignment");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiVisibilityProcessorAssignmentAction_0 = (Action)cGroup.eContents().get(0);
 		private final Assignment cProcessorAssignment_1 = (Assignment)cGroup.eContents().get(1);
@@ -1845,23 +1989,22 @@
 		
 		//UiVisibilityProcessorAssignment:
 		//	{UiVisibilityProcessorAssignment} processor=UiVisibilityProcessor;
-		public ParserRule getRule() { return rule; }
-
+		@Override public ParserRule getRule() { return rule; }
+		
 		//{UiVisibilityProcessorAssignment} processor=UiVisibilityProcessor
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiVisibilityProcessorAssignment}
 		public Action getUiVisibilityProcessorAssignmentAction_0() { return cUiVisibilityProcessorAssignmentAction_0; }
-
+		
 		//processor=UiVisibilityProcessor
 		public Assignment getProcessorAssignment_1() { return cProcessorAssignment_1; }
-
+		
 		//UiVisibilityProcessor
 		public RuleCall getProcessorUiVisibilityProcessorParserRuleCall_1_0() { return cProcessorUiVisibilityProcessorParserRuleCall_1_0; }
 	}
-
 	public class UiGridLayoutAssigmentElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiGridLayoutAssigment");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiGridLayoutAssigment");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Assignment cElementAssignment_0 = (Assignment)cGroup.eContents().get(0);
 		private final RuleCall cElementUiEmbeddableParserRuleCall_0_0 = (RuleCall)cElementAssignment_0.eContents().get(0);
@@ -1871,33 +2014,32 @@
 		private final RuleCall cAlignmentUiAlignmentEnumRuleCall_1_1_0 = (RuleCall)cAlignmentAssignment_1_1.eContents().get(0);
 		
 		//UiGridLayoutAssigment:
-		//	element=UiEmbeddable ("align" alignment=UiAlignment)?;
-		public ParserRule getRule() { return rule; }
-
-		//element=UiEmbeddable ("align" alignment=UiAlignment)?
+		//	element=UiEmbeddable ('align' alignment=UiAlignment)?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//element=UiEmbeddable ('align' alignment=UiAlignment)?
 		public Group getGroup() { return cGroup; }
-
+		
 		//element=UiEmbeddable
 		public Assignment getElementAssignment_0() { return cElementAssignment_0; }
-
+		
 		//UiEmbeddable
 		public RuleCall getElementUiEmbeddableParserRuleCall_0_0() { return cElementUiEmbeddableParserRuleCall_0_0; }
-
-		//("align" alignment=UiAlignment)?
+		
+		//('align' alignment=UiAlignment)?
 		public Group getGroup_1() { return cGroup_1; }
-
-		//"align"
+		
+		//'align'
 		public Keyword getAlignKeyword_1_0() { return cAlignKeyword_1_0; }
-
+		
 		//alignment=UiAlignment
 		public Assignment getAlignmentAssignment_1_1() { return cAlignmentAssignment_1_1; }
-
+		
 		//UiAlignment
 		public RuleCall getAlignmentUiAlignmentEnumRuleCall_1_1_0() { return cAlignmentUiAlignmentEnumRuleCall_1_1_0; }
 	}
-
 	public class UiFormLayoutElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiFormLayout");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiFormLayout");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiFormLayoutAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cFormKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -1926,108 +2068,116 @@
 		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
 		
 		//UiFormLayout:
-		//	{UiFormLayout} "form" ("(" i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? & readonly?="readonly"? ")")? name=ID? "{"
-		//	contents+=UiFormLayoutAssigment* bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* "}";
-		public ParserRule getRule() { return rule; }
-
-		//{UiFormLayout} "form" ("(" i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? & readonly?="readonly"? ")")? name=ID? "{"
-		//contents+=UiFormLayoutAssigment* bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* "}"
+		//	{UiFormLayout}
+		//	'form' ('('
+		//	i18nInfo=UiI18nInfo?
+		//	& ('styles' styles=STRING)?
+		//	& readonly?="readonly"?
+		//	')')?
+		//	name=ID?
+		//	'{'
+		//	contents+=UiFormLayoutAssigment*
+		//	bindings+=UiBinding*
+		//	processorAssignments+=UiVisibilityProcessorAssignment*
+		//	'}';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiFormLayout} 'form' ('(' i18nInfo=UiI18nInfo? & ('styles' styles=STRING)? & readonly?="readonly"? ')')? name=ID? '{'
+		//contents+=UiFormLayoutAssigment* bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* '}'
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiFormLayout}
 		public Action getUiFormLayoutAction_0() { return cUiFormLayoutAction_0; }
-
-		//"form"
+		
+		//'form'
 		public Keyword getFormKeyword_1() { return cFormKeyword_1; }
-
-		//("(" i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? & readonly?="readonly"? ")")?
+		
+		//('(' i18nInfo=UiI18nInfo? & ('styles' styles=STRING)? & readonly?="readonly"? ')')?
 		public UnorderedGroup getUnorderedGroup_2() { return cUnorderedGroup_2; }
-
-		//"(" i18nInfo=UiI18nInfo?
+		
+		//'(' i18nInfo=UiI18nInfo?
 		public Group getGroup_2_0() { return cGroup_2_0; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0_0() { return cLeftParenthesisKeyword_2_0_0; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_0_1() { return cI18nInfoAssignment_2_0_1; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_0_1_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_0_1_0; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_1() { return cGroup_2_1; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_1_0() { return cStylesKeyword_2_1_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_1_1() { return cStylesAssignment_2_1_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_0; }
-
-		//readonly?="readonly"? ")"
+		
+		//readonly?="readonly"? ')'
 		public Group getGroup_2_2() { return cGroup_2_2; }
-
+		
 		//readonly?="readonly"?
 		public Assignment getReadonlyAssignment_2_2_0() { return cReadonlyAssignment_2_2_0; }
-
+		
 		//"readonly"
 		public Keyword getReadonlyReadonlyKeyword_2_2_0_0() { return cReadonlyReadonlyKeyword_2_2_0_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2_1() { return cRightParenthesisKeyword_2_2_1; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
-
+		
 		//contents+=UiFormLayoutAssigment*
 		public Assignment getContentsAssignment_5() { return cContentsAssignment_5; }
-
+		
 		//UiFormLayoutAssigment
 		public RuleCall getContentsUiFormLayoutAssigmentParserRuleCall_5_0() { return cContentsUiFormLayoutAssigmentParserRuleCall_5_0; }
-
+		
 		//bindings+=UiBinding*
 		public Assignment getBindingsAssignment_6() { return cBindingsAssignment_6; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_6_0() { return cBindingsUiBindingParserRuleCall_6_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment*
 		public Assignment getProcessorAssignmentsAssignment_7() { return cProcessorAssignmentsAssignment_7; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
 	}
-
 	public class UiFormLayoutAssigmentElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiFormLayoutAssigment");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiFormLayoutAssigment");
 		private final Assignment cElementAssignment = (Assignment)rule.eContents().get(1);
 		private final RuleCall cElementUiEmbeddableParserRuleCall_0 = (RuleCall)cElementAssignment.eContents().get(0);
 		
 		//UiFormLayoutAssigment:
 		//	element=UiEmbeddable;
-		public ParserRule getRule() { return rule; }
-
+		@Override public ParserRule getRule() { return rule; }
+		
 		//element=UiEmbeddable
 		public Assignment getElementAssignment() { return cElementAssignment; }
-
+		
 		//UiEmbeddable
 		public RuleCall getElementUiEmbeddableParserRuleCall_0() { return cElementUiEmbeddableParserRuleCall_0; }
 	}
-
 	public class UiVerticalLayoutElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiVerticalLayout");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiVerticalLayout");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiVerticalLayoutAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cVerticalLayoutKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -2056,94 +2206,102 @@
 		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
 		
 		//UiVerticalLayout:
-		//	{UiVerticalLayout} "verticalLayout" ("(" i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? & readonly?="readonly"?
-		//	")")? name=ID? "{" contents+=UiVerticalLayoutAssigment* bindings+=UiBinding*
-		//	processorAssignments+=UiVisibilityProcessorAssignment* "}";
-		public ParserRule getRule() { return rule; }
-
-		//{UiVerticalLayout} "verticalLayout" ("(" i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? & readonly?="readonly"? ")")?
-		//name=ID? "{" contents+=UiVerticalLayoutAssigment* bindings+=UiBinding*
-		//processorAssignments+=UiVisibilityProcessorAssignment* "}"
+		//	{UiVerticalLayout}
+		//	'verticalLayout' ('('
+		//	i18nInfo=UiI18nInfo?
+		//	& ('styles' styles=STRING)?
+		//	& readonly?="readonly"?
+		//	')')?
+		//	name=ID?
+		//	'{'
+		//	contents+=UiVerticalLayoutAssigment*
+		//	bindings+=UiBinding*
+		//	processorAssignments+=UiVisibilityProcessorAssignment*
+		//	'}';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiVerticalLayout} 'verticalLayout' ('(' i18nInfo=UiI18nInfo? & ('styles' styles=STRING)? & readonly?="readonly"? ')')?
+		//name=ID? '{' contents+=UiVerticalLayoutAssigment* bindings+=UiBinding*
+		//processorAssignments+=UiVisibilityProcessorAssignment* '}'
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiVerticalLayout}
 		public Action getUiVerticalLayoutAction_0() { return cUiVerticalLayoutAction_0; }
-
-		//"verticalLayout"
+		
+		//'verticalLayout'
 		public Keyword getVerticalLayoutKeyword_1() { return cVerticalLayoutKeyword_1; }
-
-		//("(" i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? & readonly?="readonly"? ")")?
+		
+		//('(' i18nInfo=UiI18nInfo? & ('styles' styles=STRING)? & readonly?="readonly"? ')')?
 		public UnorderedGroup getUnorderedGroup_2() { return cUnorderedGroup_2; }
-
-		//"(" i18nInfo=UiI18nInfo?
+		
+		//'(' i18nInfo=UiI18nInfo?
 		public Group getGroup_2_0() { return cGroup_2_0; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0_0() { return cLeftParenthesisKeyword_2_0_0; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_0_1() { return cI18nInfoAssignment_2_0_1; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_0_1_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_0_1_0; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_1() { return cGroup_2_1; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_1_0() { return cStylesKeyword_2_1_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_1_1() { return cStylesAssignment_2_1_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_0; }
-
-		//readonly?="readonly"? ")"
+		
+		//readonly?="readonly"? ')'
 		public Group getGroup_2_2() { return cGroup_2_2; }
-
+		
 		//readonly?="readonly"?
 		public Assignment getReadonlyAssignment_2_2_0() { return cReadonlyAssignment_2_2_0; }
-
+		
 		//"readonly"
 		public Keyword getReadonlyReadonlyKeyword_2_2_0_0() { return cReadonlyReadonlyKeyword_2_2_0_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2_1() { return cRightParenthesisKeyword_2_2_1; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
-
+		
 		//contents+=UiVerticalLayoutAssigment*
 		public Assignment getContentsAssignment_5() { return cContentsAssignment_5; }
-
+		
 		//UiVerticalLayoutAssigment
 		public RuleCall getContentsUiVerticalLayoutAssigmentParserRuleCall_5_0() { return cContentsUiVerticalLayoutAssigmentParserRuleCall_5_0; }
-
+		
 		//bindings+=UiBinding*
 		public Assignment getBindingsAssignment_6() { return cBindingsAssignment_6; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_6_0() { return cBindingsUiBindingParserRuleCall_6_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment*
 		public Assignment getProcessorAssignmentsAssignment_7() { return cProcessorAssignmentsAssignment_7; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
 	}
-
 	public class UiVerticalLayoutAssigmentElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiVerticalLayoutAssigment");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiVerticalLayoutAssigment");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Assignment cElementAssignment_0 = (Assignment)cGroup.eContents().get(0);
 		private final RuleCall cElementUiEmbeddableParserRuleCall_0_0 = (RuleCall)cElementAssignment_0.eContents().get(0);
@@ -2153,33 +2311,32 @@
 		private final RuleCall cAlignmentUiAlignmentEnumRuleCall_1_1_0 = (RuleCall)cAlignmentAssignment_1_1.eContents().get(0);
 		
 		//UiVerticalLayoutAssigment:
-		//	element=UiEmbeddable ("align" alignment=UiAlignment)?;
-		public ParserRule getRule() { return rule; }
-
-		//element=UiEmbeddable ("align" alignment=UiAlignment)?
+		//	element=UiEmbeddable ('align' alignment=UiAlignment)?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//element=UiEmbeddable ('align' alignment=UiAlignment)?
 		public Group getGroup() { return cGroup; }
-
+		
 		//element=UiEmbeddable
 		public Assignment getElementAssignment_0() { return cElementAssignment_0; }
-
+		
 		//UiEmbeddable
 		public RuleCall getElementUiEmbeddableParserRuleCall_0_0() { return cElementUiEmbeddableParserRuleCall_0_0; }
-
-		//("align" alignment=UiAlignment)?
+		
+		//('align' alignment=UiAlignment)?
 		public Group getGroup_1() { return cGroup_1; }
-
-		//"align"
+		
+		//'align'
 		public Keyword getAlignKeyword_1_0() { return cAlignKeyword_1_0; }
-
+		
 		//alignment=UiAlignment
 		public Assignment getAlignmentAssignment_1_1() { return cAlignmentAssignment_1_1; }
-
+		
 		//UiAlignment
 		public RuleCall getAlignmentUiAlignmentEnumRuleCall_1_1_0() { return cAlignmentUiAlignmentEnumRuleCall_1_1_0; }
 	}
-
 	public class UiMobileVerticalLayoutElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileVerticalLayout");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileVerticalLayout");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiVerticalLayoutAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cMobileVerticalLayoutKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -2207,95 +2364,103 @@
 		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0 = (RuleCall)cProcessorAssignmentsAssignment_7.eContents().get(0);
 		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
 		
-		//UiMobileVerticalLayout returns UiVerticalLayout:
-		//	{UiVerticalLayout} "mobileVerticalLayout" ("(" i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? &
-		//	readonly?="readonly"? ")")? name=ID? "{" contents+=UiMobileVerticalLayoutAssigment* bindings+=UiBinding*
-		//	processorAssignments+=UiVisibilityProcessorAssignment* "}";
-		public ParserRule getRule() { return rule; }
-
-		//{UiVerticalLayout} "mobileVerticalLayout" ("(" i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? & readonly?="readonly"?
-		//")")? name=ID? "{" contents+=UiMobileVerticalLayoutAssigment* bindings+=UiBinding*
-		//processorAssignments+=UiVisibilityProcessorAssignment* "}"
+		//UiMobileVerticalLayout UiVerticalLayout:
+		//	{UiVerticalLayout}
+		//	'mobileVerticalLayout' ('('
+		//	i18nInfo=UiI18nInfo?
+		//	& ('styles' styles=STRING)?
+		//	& readonly?="readonly"?
+		//	')')?
+		//	name=ID?
+		//	'{'
+		//	contents+=UiMobileVerticalLayoutAssigment*
+		//	bindings+=UiBinding*
+		//	processorAssignments+=UiVisibilityProcessorAssignment*
+		//	'}';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiVerticalLayout} 'mobileVerticalLayout' ('(' i18nInfo=UiI18nInfo? & ('styles' styles=STRING)? & readonly?="readonly"?
+		//')')? name=ID? '{' contents+=UiMobileVerticalLayoutAssigment* bindings+=UiBinding*
+		//processorAssignments+=UiVisibilityProcessorAssignment* '}'
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiVerticalLayout}
 		public Action getUiVerticalLayoutAction_0() { return cUiVerticalLayoutAction_0; }
-
-		//"mobileVerticalLayout"
+		
+		//'mobileVerticalLayout'
 		public Keyword getMobileVerticalLayoutKeyword_1() { return cMobileVerticalLayoutKeyword_1; }
-
-		//("(" i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? & readonly?="readonly"? ")")?
+		
+		//('(' i18nInfo=UiI18nInfo? & ('styles' styles=STRING)? & readonly?="readonly"? ')')?
 		public UnorderedGroup getUnorderedGroup_2() { return cUnorderedGroup_2; }
-
-		//"(" i18nInfo=UiI18nInfo?
+		
+		//'(' i18nInfo=UiI18nInfo?
 		public Group getGroup_2_0() { return cGroup_2_0; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0_0() { return cLeftParenthesisKeyword_2_0_0; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_0_1() { return cI18nInfoAssignment_2_0_1; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_0_1_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_0_1_0; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_1() { return cGroup_2_1; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_1_0() { return cStylesKeyword_2_1_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_1_1() { return cStylesAssignment_2_1_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_0; }
-
-		//readonly?="readonly"? ")"
+		
+		//readonly?="readonly"? ')'
 		public Group getGroup_2_2() { return cGroup_2_2; }
-
+		
 		//readonly?="readonly"?
 		public Assignment getReadonlyAssignment_2_2_0() { return cReadonlyAssignment_2_2_0; }
-
+		
 		//"readonly"
 		public Keyword getReadonlyReadonlyKeyword_2_2_0_0() { return cReadonlyReadonlyKeyword_2_2_0_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2_1() { return cRightParenthesisKeyword_2_2_1; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
-
+		
 		//contents+=UiMobileVerticalLayoutAssigment*
 		public Assignment getContentsAssignment_5() { return cContentsAssignment_5; }
-
+		
 		//UiMobileVerticalLayoutAssigment
 		public RuleCall getContentsUiMobileVerticalLayoutAssigmentParserRuleCall_5_0() { return cContentsUiMobileVerticalLayoutAssigmentParserRuleCall_5_0; }
-
+		
 		//bindings+=UiBinding*
 		public Assignment getBindingsAssignment_6() { return cBindingsAssignment_6; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_6_0() { return cBindingsUiBindingParserRuleCall_6_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment*
 		public Assignment getProcessorAssignmentsAssignment_7() { return cProcessorAssignmentsAssignment_7; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
 	}
-
 	public class UiMobileVerticalLayoutAssigmentElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileVerticalLayoutAssigment");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileVerticalLayoutAssigment");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Assignment cElementAssignment_0 = (Assignment)cGroup.eContents().get(0);
 		private final RuleCall cElementUiMobileEmbeddableParserRuleCall_0_0 = (RuleCall)cElementAssignment_0.eContents().get(0);
@@ -2304,34 +2469,33 @@
 		private final Assignment cAlignmentAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
 		private final RuleCall cAlignmentUiAlignmentEnumRuleCall_1_1_0 = (RuleCall)cAlignmentAssignment_1_1.eContents().get(0);
 		
-		//UiMobileVerticalLayoutAssigment returns UiVerticalLayoutAssigment:
-		//	element=UiMobileEmbeddable ("align" alignment=UiAlignment)?;
-		public ParserRule getRule() { return rule; }
-
-		//element=UiMobileEmbeddable ("align" alignment=UiAlignment)?
+		//UiMobileVerticalLayoutAssigment UiVerticalLayoutAssigment:
+		//	element=UiMobileEmbeddable ('align' alignment=UiAlignment)?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//element=UiMobileEmbeddable ('align' alignment=UiAlignment)?
 		public Group getGroup() { return cGroup; }
-
+		
 		//element=UiMobileEmbeddable
 		public Assignment getElementAssignment_0() { return cElementAssignment_0; }
-
+		
 		//UiMobileEmbeddable
 		public RuleCall getElementUiMobileEmbeddableParserRuleCall_0_0() { return cElementUiMobileEmbeddableParserRuleCall_0_0; }
-
-		//("align" alignment=UiAlignment)?
+		
+		//('align' alignment=UiAlignment)?
 		public Group getGroup_1() { return cGroup_1; }
-
-		//"align"
+		
+		//'align'
 		public Keyword getAlignKeyword_1_0() { return cAlignKeyword_1_0; }
-
+		
 		//alignment=UiAlignment
 		public Assignment getAlignmentAssignment_1_1() { return cAlignmentAssignment_1_1; }
-
+		
 		//UiAlignment
 		public RuleCall getAlignmentUiAlignmentEnumRuleCall_1_1_0() { return cAlignmentUiAlignmentEnumRuleCall_1_1_0; }
 	}
-
 	public class UiMobileNavigationRootElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileNavigationRoot");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileNavigationRoot");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiMobileNavigationRootAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cNavRootKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -2343,55 +2507,57 @@
 		private final Keyword cRightCurlyBracketKeyword_5 = (Keyword)cGroup.eContents().get(5);
 		
 		//UiMobileNavigationRoot:
-		//	{UiMobileNavigationRoot} "navRoot" name=ID? "{" contents+=UiMobileNavigationRootAssigment "}";
-		public ParserRule getRule() { return rule; }
-
-		//{UiMobileNavigationRoot} "navRoot" name=ID? "{" contents+=UiMobileNavigationRootAssigment "}"
+		//	{UiMobileNavigationRoot}
+		//	'navRoot'
+		//	name=ID?
+		//	'{'
+		//	contents+=UiMobileNavigationRootAssigment '}';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiMobileNavigationRoot} 'navRoot' name=ID? '{' contents+=UiMobileNavigationRootAssigment '}'
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiMobileNavigationRoot}
 		public Action getUiMobileNavigationRootAction_0() { return cUiMobileNavigationRootAction_0; }
-
-		//"navRoot"
+		
+		//'navRoot'
 		public Keyword getNavRootKeyword_1() { return cNavRootKeyword_1; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_2_0() { return cNameIDTerminalRuleCall_2_0; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_3() { return cLeftCurlyBracketKeyword_3; }
-
+		
 		//contents+=UiMobileNavigationRootAssigment
 		public Assignment getContentsAssignment_4() { return cContentsAssignment_4; }
-
+		
 		//UiMobileNavigationRootAssigment
 		public RuleCall getContentsUiMobileNavigationRootAssigmentParserRuleCall_4_0() { return cContentsUiMobileNavigationRootAssigmentParserRuleCall_4_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_5() { return cRightCurlyBracketKeyword_5; }
 	}
-
 	public class UiMobileNavigationRootAssigmentElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileNavigationRootAssigment");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileNavigationRootAssigment");
 		private final Assignment cElementAssignment = (Assignment)rule.eContents().get(1);
 		private final RuleCall cElementUiMobileNavigationPageParserRuleCall_0 = (RuleCall)cElementAssignment.eContents().get(0);
 		
 		//UiMobileNavigationRootAssigment:
 		//	element=UiMobileNavigationPage;
-		public ParserRule getRule() { return rule; }
-
+		@Override public ParserRule getRule() { return rule; }
+		
 		//element=UiMobileNavigationPage
 		public Assignment getElementAssignment() { return cElementAssignment; }
-
+		
 		//UiMobileNavigationPage
 		public RuleCall getElementUiMobileNavigationPageParserRuleCall_0() { return cElementUiMobileNavigationPageParserRuleCall_0; }
 	}
-
 	public class UiHorizontalLayoutElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiHorizontalLayout");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiHorizontalLayout");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiHorizontalLayoutAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cHorizontalLayoutKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -2420,94 +2586,104 @@
 		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
 		
 		//UiHorizontalLayout:
-		//	{UiHorizontalLayout} "horizontalLayout" ("(" i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?
-		//	")")? name=ID? "{" //	(autowire?="autowire" 'source' autoWireSource=UiBindingEndpointAssignment)?
-		//	contents+=UiHorizontalLayoutAssigment* bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* "}";
-		public ParserRule getRule() { return rule; }
-
-		//{UiHorizontalLayout} "horizontalLayout" ("(" i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?
-		//")")? name=ID? "{" //	(autowire?="autowire" 'source' autoWireSource=UiBindingEndpointAssignment)?
-		//contents+=UiHorizontalLayoutAssigment* bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* "}"
+		//	{UiHorizontalLayout}
+		//	'horizontalLayout' ('('
+		//	i18nInfo=UiI18nInfo?
+		//	& readonly?="readonly"?
+		//	& ('styles' styles=STRING)?
+		//	')')?
+		//	name=ID?
+		//	'{'
+		//	//	(autowire?="autowire" 'source' autoWireSource=UiBindingEndpointAssignment)?
+		//	contents+=UiHorizontalLayoutAssigment*
+		//	bindings+=UiBinding*
+		//	processorAssignments+=UiVisibilityProcessorAssignment*
+		//	'}';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiHorizontalLayout} 'horizontalLayout' ('(' i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?
+		//')')? name=ID? '{' //	(autowire?="autowire" 'source' autoWireSource=UiBindingEndpointAssignment)?
+		//contents+=UiHorizontalLayoutAssigment* bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* '}'
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiHorizontalLayout}
 		public Action getUiHorizontalLayoutAction_0() { return cUiHorizontalLayoutAction_0; }
-
-		//"horizontalLayout"
+		
+		//'horizontalLayout'
 		public Keyword getHorizontalLayoutKeyword_1() { return cHorizontalLayoutKeyword_1; }
-
-		//("(" i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)? ")")?
+		
+		//('(' i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)? ')')?
 		public UnorderedGroup getUnorderedGroup_2() { return cUnorderedGroup_2; }
-
-		//"(" i18nInfo=UiI18nInfo?
+		
+		//'(' i18nInfo=UiI18nInfo?
 		public Group getGroup_2_0() { return cGroup_2_0; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0_0() { return cLeftParenthesisKeyword_2_0_0; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_0_1() { return cI18nInfoAssignment_2_0_1; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_0_1_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_0_1_0; }
-
+		
 		//readonly?="readonly"?
 		public Assignment getReadonlyAssignment_2_1() { return cReadonlyAssignment_2_1; }
-
+		
 		//"readonly"
 		public Keyword getReadonlyReadonlyKeyword_2_1_0() { return cReadonlyReadonlyKeyword_2_1_0; }
-
-		//("styles" styles=STRING)? ")"
+		
+		//('styles' styles=STRING)? ')'
 		public Group getGroup_2_2() { return cGroup_2_2; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_2_0() { return cGroup_2_2_0; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_2_0_0() { return cStylesKeyword_2_2_0_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_2_0_1() { return cStylesAssignment_2_2_0_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_2_0_1_0() { return cStylesSTRINGTerminalRuleCall_2_2_0_1_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2_1() { return cRightParenthesisKeyword_2_2_1; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
-
+		
+		////	(autowire?="autowire" 'source' autoWireSource=UiBindingEndpointAssignment)?
 		//contents+=UiHorizontalLayoutAssigment*
 		public Assignment getContentsAssignment_5() { return cContentsAssignment_5; }
-
+		
 		//UiHorizontalLayoutAssigment
 		public RuleCall getContentsUiHorizontalLayoutAssigmentParserRuleCall_5_0() { return cContentsUiHorizontalLayoutAssigmentParserRuleCall_5_0; }
-
+		
 		//bindings+=UiBinding*
 		public Assignment getBindingsAssignment_6() { return cBindingsAssignment_6; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_6_0() { return cBindingsUiBindingParserRuleCall_6_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment*
 		public Assignment getProcessorAssignmentsAssignment_7() { return cProcessorAssignmentsAssignment_7; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
 	}
-
 	public class UiHorizontalLayoutAssigmentElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiHorizontalLayoutAssigment");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiHorizontalLayoutAssigment");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Assignment cElementAssignment_0 = (Assignment)cGroup.eContents().get(0);
 		private final RuleCall cElementUiEmbeddableParserRuleCall_0_0 = (RuleCall)cElementAssignment_0.eContents().get(0);
@@ -2517,33 +2693,32 @@
 		private final RuleCall cAlignmentUiAlignmentEnumRuleCall_1_1_0 = (RuleCall)cAlignmentAssignment_1_1.eContents().get(0);
 		
 		//UiHorizontalLayoutAssigment:
-		//	element=UiEmbeddable ("align" alignment=UiAlignment)?;
-		public ParserRule getRule() { return rule; }
-
-		//element=UiEmbeddable ("align" alignment=UiAlignment)?
+		//	element=UiEmbeddable ('align' alignment=UiAlignment)?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//element=UiEmbeddable ('align' alignment=UiAlignment)?
 		public Group getGroup() { return cGroup; }
-
+		
 		//element=UiEmbeddable
 		public Assignment getElementAssignment_0() { return cElementAssignment_0; }
-
+		
 		//UiEmbeddable
 		public RuleCall getElementUiEmbeddableParserRuleCall_0_0() { return cElementUiEmbeddableParserRuleCall_0_0; }
-
-		//("align" alignment=UiAlignment)?
+		
+		//('align' alignment=UiAlignment)?
 		public Group getGroup_1() { return cGroup_1; }
-
-		//"align"
+		
+		//'align'
 		public Keyword getAlignKeyword_1_0() { return cAlignKeyword_1_0; }
-
+		
 		//alignment=UiAlignment
 		public Assignment getAlignmentAssignment_1_1() { return cAlignmentAssignment_1_1; }
-
+		
 		//UiAlignment
 		public RuleCall getAlignmentUiAlignmentEnumRuleCall_1_1_0() { return cAlignmentUiAlignmentEnumRuleCall_1_1_0; }
 	}
-
 	public class UiMobileHorizontalLayoutElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileHorizontalLayout");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileHorizontalLayout");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiHorizontalLayoutAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cMobileHorizontalLayoutKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -2571,97 +2746,106 @@
 		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0 = (RuleCall)cProcessorAssignmentsAssignment_7.eContents().get(0);
 		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
 		
-		//UiMobileHorizontalLayout returns UiHorizontalLayout:
-		//	{UiHorizontalLayout} "mobileHorizontalLayout" ("(" i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? &
-		//	readonly?="readonly"? ")")? name=ID? "{" //	(autowire?="autowire" 'source' autoWireSource=UiBindingEndpointAssignment)?
-		//	contents+=UiMobileHorizontalLayoutAssigment* bindings+=UiBinding*
-		//	processorAssignments+=UiVisibilityProcessorAssignment* "}";
-		public ParserRule getRule() { return rule; }
-
-		//{UiHorizontalLayout} "mobileHorizontalLayout" ("(" i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? &
-		//readonly?="readonly"? ")")? name=ID? "{" //	(autowire?="autowire" 'source' autoWireSource=UiBindingEndpointAssignment)?
+		//UiMobileHorizontalLayout UiHorizontalLayout:
+		//	{UiHorizontalLayout}
+		//	'mobileHorizontalLayout' ('('
+		//	i18nInfo=UiI18nInfo?
+		//	& ('styles' styles=STRING)?
+		//	& readonly?="readonly"?
+		//	')')?
+		//	name=ID?
+		//	'{'
+		//	//	(autowire?="autowire" 'source' autoWireSource=UiBindingEndpointAssignment)?
+		//	contents+=UiMobileHorizontalLayoutAssigment*
+		//	bindings+=UiBinding*
+		//	processorAssignments+=UiVisibilityProcessorAssignment*
+		//	'}';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiHorizontalLayout} 'mobileHorizontalLayout' ('(' i18nInfo=UiI18nInfo? & ('styles' styles=STRING)? &
+		//readonly?="readonly"? ')')? name=ID? '{' //	(autowire?="autowire" 'source' autoWireSource=UiBindingEndpointAssignment)?
 		//contents+=UiMobileHorizontalLayoutAssigment* bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment*
-		//"}"
+		//'}'
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiHorizontalLayout}
 		public Action getUiHorizontalLayoutAction_0() { return cUiHorizontalLayoutAction_0; }
-
-		//"mobileHorizontalLayout"
+		
+		//'mobileHorizontalLayout'
 		public Keyword getMobileHorizontalLayoutKeyword_1() { return cMobileHorizontalLayoutKeyword_1; }
-
-		//("(" i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? & readonly?="readonly"? ")")?
+		
+		//('(' i18nInfo=UiI18nInfo? & ('styles' styles=STRING)? & readonly?="readonly"? ')')?
 		public UnorderedGroup getUnorderedGroup_2() { return cUnorderedGroup_2; }
-
-		//"(" i18nInfo=UiI18nInfo?
+		
+		//'(' i18nInfo=UiI18nInfo?
 		public Group getGroup_2_0() { return cGroup_2_0; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0_0() { return cLeftParenthesisKeyword_2_0_0; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_0_1() { return cI18nInfoAssignment_2_0_1; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_0_1_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_0_1_0; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_1() { return cGroup_2_1; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_1_0() { return cStylesKeyword_2_1_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_1_1() { return cStylesAssignment_2_1_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_0; }
-
-		//readonly?="readonly"? ")"
+		
+		//readonly?="readonly"? ')'
 		public Group getGroup_2_2() { return cGroup_2_2; }
-
+		
 		//readonly?="readonly"?
 		public Assignment getReadonlyAssignment_2_2_0() { return cReadonlyAssignment_2_2_0; }
-
+		
 		//"readonly"
 		public Keyword getReadonlyReadonlyKeyword_2_2_0_0() { return cReadonlyReadonlyKeyword_2_2_0_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2_1() { return cRightParenthesisKeyword_2_2_1; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
-
+		
+		////	(autowire?="autowire" 'source' autoWireSource=UiBindingEndpointAssignment)?
 		//contents+=UiMobileHorizontalLayoutAssigment*
 		public Assignment getContentsAssignment_5() { return cContentsAssignment_5; }
-
+		
 		//UiMobileHorizontalLayoutAssigment
 		public RuleCall getContentsUiMobileHorizontalLayoutAssigmentParserRuleCall_5_0() { return cContentsUiMobileHorizontalLayoutAssigmentParserRuleCall_5_0; }
-
+		
 		//bindings+=UiBinding*
 		public Assignment getBindingsAssignment_6() { return cBindingsAssignment_6; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_6_0() { return cBindingsUiBindingParserRuleCall_6_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment*
 		public Assignment getProcessorAssignmentsAssignment_7() { return cProcessorAssignmentsAssignment_7; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
 	}
-
 	public class UiMobileHorizontalLayoutAssigmentElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileHorizontalLayoutAssigment");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileHorizontalLayoutAssigment");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Assignment cElementAssignment_0 = (Assignment)cGroup.eContents().get(0);
 		private final RuleCall cElementUiMobileEmbeddableParserRuleCall_0_0 = (RuleCall)cElementAssignment_0.eContents().get(0);
@@ -2670,34 +2854,33 @@
 		private final Assignment cAlignmentAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
 		private final RuleCall cAlignmentUiAlignmentEnumRuleCall_1_1_0 = (RuleCall)cAlignmentAssignment_1_1.eContents().get(0);
 		
-		//UiMobileHorizontalLayoutAssigment returns UiHorizontalLayoutAssigment:
-		//	element=UiMobileEmbeddable ("align" alignment=UiAlignment)?;
-		public ParserRule getRule() { return rule; }
-
-		//element=UiMobileEmbeddable ("align" alignment=UiAlignment)?
+		//UiMobileHorizontalLayoutAssigment UiHorizontalLayoutAssigment:
+		//	element=UiMobileEmbeddable ('align' alignment=UiAlignment)?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//element=UiMobileEmbeddable ('align' alignment=UiAlignment)?
 		public Group getGroup() { return cGroup; }
-
+		
 		//element=UiMobileEmbeddable
 		public Assignment getElementAssignment_0() { return cElementAssignment_0; }
-
+		
 		//UiMobileEmbeddable
 		public RuleCall getElementUiMobileEmbeddableParserRuleCall_0_0() { return cElementUiMobileEmbeddableParserRuleCall_0_0; }
-
-		//("align" alignment=UiAlignment)?
+		
+		//('align' alignment=UiAlignment)?
 		public Group getGroup_1() { return cGroup_1; }
-
-		//"align"
+		
+		//'align'
 		public Keyword getAlignKeyword_1_0() { return cAlignKeyword_1_0; }
-
+		
 		//alignment=UiAlignment
 		public Assignment getAlignmentAssignment_1_1() { return cAlignmentAssignment_1_1; }
-
+		
 		//UiAlignment
 		public RuleCall getAlignmentUiAlignmentEnumRuleCall_1_1_0() { return cAlignmentUiAlignmentEnumRuleCall_1_1_0; }
 	}
-
 	public class UiMobileHorizontalButtonGroupElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileHorizontalButtonGroup");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileHorizontalButtonGroup");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiHorizontalButtonGroupAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cHorizontalButtonGroupKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -2724,108 +2907,113 @@
 		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0 = (RuleCall)cProcessorAssignmentsAssignment_7.eContents().get(0);
 		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
 		
-		//UiMobileHorizontalButtonGroup returns UiHorizontalButtonGroup:
-		//	{UiHorizontalButtonGroup} "horizontalButtonGroup" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? &
-		//	readonly?="readonly"?) ")")? name=ID? "{" contents+=UiMobileHorizontalButtonGroupAssigment* bindings+=UiBinding*
-		//	processorAssignments+=UiVisibilityProcessorAssignment* "}";
-		public ParserRule getRule() { return rule; }
-
-		//{UiHorizontalButtonGroup} "horizontalButtonGroup" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? &
-		//readonly?="readonly"?) ")")? name=ID? "{" contents+=UiMobileHorizontalButtonGroupAssigment* bindings+=UiBinding*
-		//processorAssignments+=UiVisibilityProcessorAssignment* "}"
+		//UiMobileHorizontalButtonGroup UiHorizontalButtonGroup:
+		//	{UiHorizontalButtonGroup}
+		//	'horizontalButtonGroup' ('(' (i18nInfo=UiI18nInfo?
+		//	& ('styles' styles=STRING)?
+		//	& readonly?="readonly"?) ')')?
+		//	name=ID?
+		//	'{'
+		//	contents+=UiMobileHorizontalButtonGroupAssigment*
+		//	bindings+=UiBinding*
+		//	processorAssignments+=UiVisibilityProcessorAssignment*
+		//	'}';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiHorizontalButtonGroup} 'horizontalButtonGroup' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)? &
+		//readonly?="readonly"?) ')')? name=ID? '{' contents+=UiMobileHorizontalButtonGroupAssigment* bindings+=UiBinding*
+		//processorAssignments+=UiVisibilityProcessorAssignment* '}'
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiHorizontalButtonGroup}
 		public Action getUiHorizontalButtonGroupAction_0() { return cUiHorizontalButtonGroupAction_0; }
-
-		//"horizontalButtonGroup"
+		
+		//'horizontalButtonGroup'
 		public Keyword getHorizontalButtonGroupKeyword_1() { return cHorizontalButtonGroupKeyword_1; }
-
-		//("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? & readonly?="readonly"?) ")")?
+		
+		//('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)? & readonly?="readonly"?) ')')?
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
-
-		//i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? & readonly?="readonly"?
+		
+		//i18nInfo=UiI18nInfo? & ('styles' styles=STRING)? & readonly?="readonly"?
 		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }
-
+		
 		//readonly?="readonly"?
 		public Assignment getReadonlyAssignment_2_1_2() { return cReadonlyAssignment_2_1_2; }
-
+		
 		//"readonly"
 		public Keyword getReadonlyReadonlyKeyword_2_1_2_0() { return cReadonlyReadonlyKeyword_2_1_2_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
-
+		
 		//contents+=UiMobileHorizontalButtonGroupAssigment*
 		public Assignment getContentsAssignment_5() { return cContentsAssignment_5; }
-
+		
 		//UiMobileHorizontalButtonGroupAssigment
 		public RuleCall getContentsUiMobileHorizontalButtonGroupAssigmentParserRuleCall_5_0() { return cContentsUiMobileHorizontalButtonGroupAssigmentParserRuleCall_5_0; }
-
+		
 		//bindings+=UiBinding*
 		public Assignment getBindingsAssignment_6() { return cBindingsAssignment_6; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_6_0() { return cBindingsUiBindingParserRuleCall_6_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment*
 		public Assignment getProcessorAssignmentsAssignment_7() { return cProcessorAssignmentsAssignment_7; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
 	}
-
 	public class UiMobileHorizontalButtonGroupAssigmentElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileHorizontalButtonGroupAssigment");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileHorizontalButtonGroupAssigment");
 		private final Assignment cElementAssignment = (Assignment)rule.eContents().get(1);
 		private final RuleCall cElementUiMobileEmbeddableParserRuleCall_0 = (RuleCall)cElementAssignment.eContents().get(0);
 		
-		//UiMobileHorizontalButtonGroupAssigment returns UiHorizontalButtonGroupAssigment:
+		//UiMobileHorizontalButtonGroupAssigment UiHorizontalButtonGroupAssigment:
 		//	element=UiMobileEmbeddable;
-		public ParserRule getRule() { return rule; }
-
+		@Override public ParserRule getRule() { return rule; }
+		
 		//element=UiMobileEmbeddable
 		public Assignment getElementAssignment() { return cElementAssignment; }
-
+		
 		//UiMobileEmbeddable
 		public RuleCall getElementUiMobileEmbeddableParserRuleCall_0() { return cElementUiMobileEmbeddableParserRuleCall_0; }
 	}
-
 	public class UiMobileVerticalComponentGroupElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileVerticalComponentGroup");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileVerticalComponentGroup");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiVerticalComponentGroupAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cVerticalGroupKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -2852,108 +3040,114 @@
 		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0 = (RuleCall)cProcessorAssignmentsAssignment_7.eContents().get(0);
 		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
 		
-		//UiMobileVerticalComponentGroup returns UiVerticalComponentGroup:
-		//	{UiVerticalComponentGroup} "verticalGroup" ("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles"
-		//	styles=STRING)?) ")")? name=ID? "{" contents+=UiMobileVerticalComponentGroupAssigment* bindings+=UiBinding*
-		//	processorAssignments+=UiVisibilityProcessorAssignment* "}";
-		public ParserRule getRule() { return rule; }
-
-		//{UiVerticalComponentGroup} "verticalGroup" ("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles"
-		//styles=STRING)?) ")")? name=ID? "{" contents+=UiMobileVerticalComponentGroupAssigment* bindings+=UiBinding*
-		//processorAssignments+=UiVisibilityProcessorAssignment* "}"
+		//UiMobileVerticalComponentGroup UiVerticalComponentGroup:
+		//	{UiVerticalComponentGroup}
+		//	'verticalGroup' ('(' (i18nInfo=UiI18nInfo?
+		//	& readonly?="readonly"?
+		//	& ('styles' styles=STRING)?)
+		//	')')?
+		//	name=ID?
+		//	'{'
+		//	contents+=UiMobileVerticalComponentGroupAssigment*
+		//	bindings+=UiBinding*
+		//	processorAssignments+=UiVisibilityProcessorAssignment*
+		//	'}';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiVerticalComponentGroup} 'verticalGroup' ('(' (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles'
+		//styles=STRING)?) ')')? name=ID? '{' contents+=UiMobileVerticalComponentGroupAssigment* bindings+=UiBinding*
+		//processorAssignments+=UiVisibilityProcessorAssignment* '}'
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiVerticalComponentGroup}
 		public Action getUiVerticalComponentGroupAction_0() { return cUiVerticalComponentGroupAction_0; }
-
-		//"verticalGroup"
+		
+		//'verticalGroup'
 		public Keyword getVerticalGroupKeyword_1() { return cVerticalGroupKeyword_1; }
-
-		//("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?) ")")?
+		
+		//('(' (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?) ')')?
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
-
-		//i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?
+		
+		//i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?
 		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
-
+		
 		//readonly?="readonly"?
 		public Assignment getReadonlyAssignment_2_1_1() { return cReadonlyAssignment_2_1_1; }
-
+		
 		//"readonly"
 		public Keyword getReadonlyReadonlyKeyword_2_1_1_0() { return cReadonlyReadonlyKeyword_2_1_1_0; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_1_2() { return cGroup_2_1_2; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_1_2_0() { return cStylesKeyword_2_1_2_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_1_2_1() { return cStylesAssignment_2_1_2_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_2_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_2_1_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
-
+		
 		//contents+=UiMobileVerticalComponentGroupAssigment*
 		public Assignment getContentsAssignment_5() { return cContentsAssignment_5; }
-
+		
 		//UiMobileVerticalComponentGroupAssigment
 		public RuleCall getContentsUiMobileVerticalComponentGroupAssigmentParserRuleCall_5_0() { return cContentsUiMobileVerticalComponentGroupAssigmentParserRuleCall_5_0; }
-
+		
 		//bindings+=UiBinding*
 		public Assignment getBindingsAssignment_6() { return cBindingsAssignment_6; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_6_0() { return cBindingsUiBindingParserRuleCall_6_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment*
 		public Assignment getProcessorAssignmentsAssignment_7() { return cProcessorAssignmentsAssignment_7; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
 	}
-
 	public class UiMobileVerticalComponentGroupAssigmentElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileVerticalComponentGroupAssigment");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileVerticalComponentGroupAssigment");
 		private final Assignment cElementAssignment = (Assignment)rule.eContents().get(1);
 		private final RuleCall cElementUiMobileEmbeddableParserRuleCall_0 = (RuleCall)cElementAssignment.eContents().get(0);
 		
-		//UiMobileVerticalComponentGroupAssigment returns UiVerticalComponentGroupAssigment:
+		//UiMobileVerticalComponentGroupAssigment UiVerticalComponentGroupAssigment:
 		//	element=UiMobileEmbeddable;
-		public ParserRule getRule() { return rule; }
-
+		@Override public ParserRule getRule() { return rule; }
+		
 		//element=UiMobileEmbeddable
 		public Assignment getElementAssignment() { return cElementAssignment; }
-
+		
 		//UiMobileEmbeddable
 		public RuleCall getElementUiMobileEmbeddableParserRuleCall_0() { return cElementUiMobileEmbeddableParserRuleCall_0; }
 	}
-
 	public class UiSearchPanelElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiSearchPanel");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiSearchPanel");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiSearchPanelAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cSearchPanelKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -2983,97 +3177,104 @@
 		private final Keyword cRightCurlyBracketKeyword_11 = (Keyword)cGroup.eContents().get(11);
 		
 		//UiSearchPanel:
-		//	{UiSearchPanel} "searchPanel" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? "{" "type"
-		//	jvmType=JvmTypeReference ";"? contents+=UiSearchField* bindings+=UiBinding*
-		//	processorAssignments+=UiVisibilityProcessorAssignment* "}";
-		public ParserRule getRule() { return rule; }
-
-		//{UiSearchPanel} "searchPanel" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? "{" "type"
-		//jvmType=JvmTypeReference ";"? contents+=UiSearchField* bindings+=UiBinding*
-		//processorAssignments+=UiVisibilityProcessorAssignment* "}"
+		//	{UiSearchPanel}
+		//	'searchPanel' ('(' (i18nInfo=UiI18nInfo?
+		//	& ('styles' styles=STRING)?)
+		//	')')?
+		//	name=ID?
+		//	'{'
+		//	'type' jvmType=JvmTypeReference ';'?
+		//	contents+=UiSearchField*
+		//	bindings+=UiBinding*
+		//	processorAssignments+=UiVisibilityProcessorAssignment*
+		//	'}';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiSearchPanel} 'searchPanel' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=ID? '{' 'type'
+		//jvmType=JvmTypeReference ';'? contents+=UiSearchField* bindings+=UiBinding*
+		//processorAssignments+=UiVisibilityProcessorAssignment* '}'
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiSearchPanel}
 		public Action getUiSearchPanelAction_0() { return cUiSearchPanelAction_0; }
-
-		//"searchPanel"
+		
+		//'searchPanel'
 		public Keyword getSearchPanelKeyword_1() { return cSearchPanelKeyword_1; }
-
-		//("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")?
+		
+		//('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
-
-		//i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?
+		
+		//i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?
 		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
-
-		//"type"
+		
+		//'type'
 		public Keyword getTypeKeyword_5() { return cTypeKeyword_5; }
-
+		
 		//jvmType=JvmTypeReference
 		public Assignment getJvmTypeAssignment_6() { return cJvmTypeAssignment_6; }
-
+		
 		//JvmTypeReference
 		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_6_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_6_0; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_7() { return cSemicolonKeyword_7; }
-
+		
 		//contents+=UiSearchField*
 		public Assignment getContentsAssignment_8() { return cContentsAssignment_8; }
-
+		
 		//UiSearchField
 		public RuleCall getContentsUiSearchFieldParserRuleCall_8_0() { return cContentsUiSearchFieldParserRuleCall_8_0; }
-
+		
 		//bindings+=UiBinding*
 		public Assignment getBindingsAssignment_9() { return cBindingsAssignment_9; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_9_0() { return cBindingsUiBindingParserRuleCall_9_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment*
 		public Assignment getProcessorAssignmentsAssignment_10() { return cProcessorAssignmentsAssignment_10; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_10_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_10_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_11() { return cRightCurlyBracketKeyword_11; }
 	}
-
 	public class UiMobileSearchPanelElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileSearchPanel");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileSearchPanel");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiMobileSearchPanelAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cMobileSearchPanelKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -3103,97 +3304,104 @@
 		private final Keyword cRightCurlyBracketKeyword_11 = (Keyword)cGroup.eContents().get(11);
 		
 		//UiMobileSearchPanel:
-		//	{UiMobileSearchPanel} "mobileSearchPanel" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? "{"
-		//	"type" jvmType=JvmTypeReference ";"? contents+=UiSearchField* bindings+=UiBinding*
-		//	processorAssignments+=UiVisibilityProcessorAssignment* "}";
-		public ParserRule getRule() { return rule; }
-
-		//{UiMobileSearchPanel} "mobileSearchPanel" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? "{"
-		//"type" jvmType=JvmTypeReference ";"? contents+=UiSearchField* bindings+=UiBinding*
-		//processorAssignments+=UiVisibilityProcessorAssignment* "}"
+		//	{UiMobileSearchPanel}
+		//	'mobileSearchPanel' ('(' (i18nInfo=UiI18nInfo?
+		//	& ('styles' styles=STRING)?)
+		//	')')?
+		//	name=ID?
+		//	'{'
+		//	'type' jvmType=JvmTypeReference ';'?
+		//	contents+=UiSearchField*
+		//	bindings+=UiBinding*
+		//	processorAssignments+=UiVisibilityProcessorAssignment*
+		//	'}';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiMobileSearchPanel} 'mobileSearchPanel' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=ID? '{'
+		//'type' jvmType=JvmTypeReference ';'? contents+=UiSearchField* bindings+=UiBinding*
+		//processorAssignments+=UiVisibilityProcessorAssignment* '}'
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiMobileSearchPanel}
 		public Action getUiMobileSearchPanelAction_0() { return cUiMobileSearchPanelAction_0; }
-
-		//"mobileSearchPanel"
+		
+		//'mobileSearchPanel'
 		public Keyword getMobileSearchPanelKeyword_1() { return cMobileSearchPanelKeyword_1; }
-
-		//("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")?
+		
+		//('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
-
-		//i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?
+		
+		//i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?
 		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
-
-		//"type"
+		
+		//'type'
 		public Keyword getTypeKeyword_5() { return cTypeKeyword_5; }
-
+		
 		//jvmType=JvmTypeReference
 		public Assignment getJvmTypeAssignment_6() { return cJvmTypeAssignment_6; }
-
+		
 		//JvmTypeReference
 		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_6_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_6_0; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_7() { return cSemicolonKeyword_7; }
-
+		
 		//contents+=UiSearchField*
 		public Assignment getContentsAssignment_8() { return cContentsAssignment_8; }
-
+		
 		//UiSearchField
 		public RuleCall getContentsUiSearchFieldParserRuleCall_8_0() { return cContentsUiSearchFieldParserRuleCall_8_0; }
-
+		
 		//bindings+=UiBinding*
 		public Assignment getBindingsAssignment_9() { return cBindingsAssignment_9; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_9_0() { return cBindingsUiBindingParserRuleCall_9_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment*
 		public Assignment getProcessorAssignmentsAssignment_10() { return cProcessorAssignmentsAssignment_10; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_10_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_10_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_11() { return cRightCurlyBracketKeyword_11; }
 	}
-
 	public class UiMobileTabSheetElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileTabSheet");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileTabSheet");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiMobileTabSheetAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cMobileTabKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -3219,83 +3427,90 @@
 		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
 		
 		//UiMobileTabSheet:
-		//	{UiMobileTabSheet} "mobileTab" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? "{"
-		//	tabs+=UiMobileTabAssignment* bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* "}";
-		public ParserRule getRule() { return rule; }
-
-		//{UiMobileTabSheet} "mobileTab" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? "{"
-		//tabs+=UiMobileTabAssignment* bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* "}"
+		//	{UiMobileTabSheet}
+		//	'mobileTab' ('(' (i18nInfo=UiI18nInfo?
+		//	& ('styles' styles=STRING)?)
+		//	')')?
+		//	name=ID?
+		//	'{'
+		//	tabs+=UiMobileTabAssignment*
+		//	bindings+=UiBinding*
+		//	processorAssignments+=UiVisibilityProcessorAssignment*
+		//	'}';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiMobileTabSheet} 'mobileTab' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=ID? '{'
+		//tabs+=UiMobileTabAssignment* bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* '}'
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiMobileTabSheet}
 		public Action getUiMobileTabSheetAction_0() { return cUiMobileTabSheetAction_0; }
-
-		//"mobileTab"
+		
+		//'mobileTab'
 		public Keyword getMobileTabKeyword_1() { return cMobileTabKeyword_1; }
-
-		//("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")?
+		
+		//('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
-
-		//i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?
+		
+		//i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?
 		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
-
+		
 		//tabs+=UiMobileTabAssignment*
 		public Assignment getTabsAssignment_5() { return cTabsAssignment_5; }
-
+		
 		//UiMobileTabAssignment
 		public RuleCall getTabsUiMobileTabAssignmentParserRuleCall_5_0() { return cTabsUiMobileTabAssignmentParserRuleCall_5_0; }
-
+		
 		//bindings+=UiBinding*
 		public Assignment getBindingsAssignment_6() { return cBindingsAssignment_6; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_6_0() { return cBindingsUiBindingParserRuleCall_6_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment*
 		public Assignment getProcessorAssignmentsAssignment_7() { return cProcessorAssignmentsAssignment_7; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
 	}
-
 	public class UiMobileTabAssignmentElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileTabAssignment");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileTabAssignment");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cTabKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
@@ -3304,30 +3519,29 @@
 		private final RuleCall cElementUiMobileEmbeddableParserRuleCall_2_0 = (RuleCall)cElementAssignment_2.eContents().get(0);
 		
 		//UiMobileTabAssignment:
-		//	"tab" name=ID? element=UiMobileEmbeddable;
-		public ParserRule getRule() { return rule; }
-
-		//"tab" name=ID? element=UiMobileEmbeddable
+		//	'tab' name=ID? element=UiMobileEmbeddable;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'tab' name=ID? element=UiMobileEmbeddable
 		public Group getGroup() { return cGroup; }
-
-		//"tab"
+		
+		//'tab'
 		public Keyword getTabKeyword_0() { return cTabKeyword_0; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
-
+		
 		//element=UiMobileEmbeddable
 		public Assignment getElementAssignment_2() { return cElementAssignment_2; }
-
+		
 		//UiMobileEmbeddable
 		public RuleCall getElementUiMobileEmbeddableParserRuleCall_2_0() { return cElementUiMobileEmbeddableParserRuleCall_2_0; }
 	}
-
 	public class UiTabSheetElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiTabSheet");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiTabSheet");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiTabSheetAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cTabsheetKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -3353,83 +3567,90 @@
 		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
 		
 		//UiTabSheet:
-		//	{UiTabSheet} "tabsheet" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? "{"
-		//	tabs+=UiTabAssignment* bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* "}";
-		public ParserRule getRule() { return rule; }
-
-		//{UiTabSheet} "tabsheet" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? "{"
-		//tabs+=UiTabAssignment* bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* "}"
+		//	{UiTabSheet}
+		//	'tabsheet' ('(' (i18nInfo=UiI18nInfo?
+		//	& ('styles' styles=STRING)?)
+		//	')')?
+		//	name=ID?
+		//	'{'
+		//	tabs+=UiTabAssignment*
+		//	bindings+=UiBinding*
+		//	processorAssignments+=UiVisibilityProcessorAssignment*
+		//	'}';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiTabSheet} 'tabsheet' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=ID? '{'
+		//tabs+=UiTabAssignment* bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* '}'
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiTabSheet}
 		public Action getUiTabSheetAction_0() { return cUiTabSheetAction_0; }
-
-		//"tabsheet"
+		
+		//'tabsheet'
 		public Keyword getTabsheetKeyword_1() { return cTabsheetKeyword_1; }
-
-		//("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")?
+		
+		//('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
-
-		//i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?
+		
+		//i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?
 		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
-
+		
 		//tabs+=UiTabAssignment*
 		public Assignment getTabsAssignment_5() { return cTabsAssignment_5; }
-
+		
 		//UiTabAssignment
 		public RuleCall getTabsUiTabAssignmentParserRuleCall_5_0() { return cTabsUiTabAssignmentParserRuleCall_5_0; }
-
+		
 		//bindings+=UiBinding*
 		public Assignment getBindingsAssignment_6() { return cBindingsAssignment_6; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_6_0() { return cBindingsUiBindingParserRuleCall_6_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment*
 		public Assignment getProcessorAssignmentsAssignment_7() { return cProcessorAssignmentsAssignment_7; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
 	}
-
 	public class UiTabAssignmentElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiTabAssignment");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiTabAssignment");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cTabKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
@@ -3438,30 +3659,29 @@
 		private final RuleCall cElementUiEmbeddableParserRuleCall_2_0 = (RuleCall)cElementAssignment_2.eContents().get(0);
 		
 		//UiTabAssignment:
-		//	"tab" name=ID? element=UiEmbeddable;
-		public ParserRule getRule() { return rule; }
-
-		//"tab" name=ID? element=UiEmbeddable
+		//	'tab' name=ID? element=UiEmbeddable;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'tab' name=ID? element=UiEmbeddable
 		public Group getGroup() { return cGroup; }
-
-		//"tab"
+		
+		//'tab'
 		public Keyword getTabKeyword_0() { return cTabKeyword_0; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
-
+		
 		//element=UiEmbeddable
 		public Assignment getElementAssignment_2() { return cElementAssignment_2; }
-
+		
 		//UiEmbeddable
 		public RuleCall getElementUiEmbeddableParserRuleCall_2_0() { return cElementUiEmbeddableParserRuleCall_2_0; }
 	}
-
 	public class UiSplitpanelElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiSplitpanel");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiSplitpanel");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cSplitterKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final UnorderedGroup cUnorderedGroup_1 = (UnorderedGroup)cGroup.eContents().get(1);
@@ -3500,141 +3720,142 @@
 		private final Keyword cRightCurlyBracketKeyword_7 = (Keyword)cGroup.eContents().get(7);
 		
 		//UiSplitpanel:
-		//	"splitter" ("(" i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? ")")? name=ID "{" ("first"
-		//	firstContent=UiSplitpanelAssigment & "second" secondContent=UiSplitpanelAssigment & ("splitPos" splitPosition=INT)? &
-		//	readonly?="readonly"?) bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* "}";
-		public ParserRule getRule() { return rule; }
-
-		//"splitter" ("(" i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? ")")? name=ID "{" ("first"
-		//firstContent=UiSplitpanelAssigment & "second" secondContent=UiSplitpanelAssigment & ("splitPos" splitPosition=INT)? &
-		//readonly?="readonly"?) bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* "}"
+		//	'splitter' ('(' i18nInfo=UiI18nInfo? & ('styles' styles=STRING)? ')')? name=ID
+		//	'{' ('first' firstContent=UiSplitpanelAssigment & 'second' secondContent=UiSplitpanelAssigment & ('splitPos'
+		//	splitPosition=INT)?
+		//	& readonly?="readonly"?) bindings+=UiBinding*
+		//	processorAssignments+=UiVisibilityProcessorAssignment*
+		//	'}';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'splitter' ('(' i18nInfo=UiI18nInfo? & ('styles' styles=STRING)? ')')? name=ID '{' ('first'
+		//firstContent=UiSplitpanelAssigment & 'second' secondContent=UiSplitpanelAssigment & ('splitPos' splitPosition=INT)? &
+		//readonly?="readonly"?) bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* '}'
 		public Group getGroup() { return cGroup; }
-
-		//"splitter"
+		
+		//'splitter'
 		public Keyword getSplitterKeyword_0() { return cSplitterKeyword_0; }
-
-		//("(" i18nInfo=UiI18nInfo? & ("styles" styles=STRING)? ")")?
+		
+		//('(' i18nInfo=UiI18nInfo? & ('styles' styles=STRING)? ')')?
 		public UnorderedGroup getUnorderedGroup_1() { return cUnorderedGroup_1; }
-
-		//"(" i18nInfo=UiI18nInfo?
+		
+		//'(' i18nInfo=UiI18nInfo?
 		public Group getGroup_1_0() { return cGroup_1_0; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_1_0_0() { return cLeftParenthesisKeyword_1_0_0; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_1_0_1() { return cI18nInfoAssignment_1_0_1; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_1_0_1_0() { return cI18nInfoUiI18nInfoParserRuleCall_1_0_1_0; }
-
-		//("styles" styles=STRING)? ")"
+		
+		//('styles' styles=STRING)? ')'
 		public Group getGroup_1_1() { return cGroup_1_1; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_1_1_0() { return cGroup_1_1_0; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_1_1_0_0() { return cStylesKeyword_1_1_0_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_1_1_0_1() { return cStylesAssignment_1_1_0_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_1_1_0_1_0() { return cStylesSTRINGTerminalRuleCall_1_1_0_1_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_1_1_1() { return cRightParenthesisKeyword_1_1_1; }
-
+		
 		//name=ID
 		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_2_0() { return cNameIDTerminalRuleCall_2_0; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_3() { return cLeftCurlyBracketKeyword_3; }
-
-		//"first" firstContent=UiSplitpanelAssigment & "second" secondContent=UiSplitpanelAssigment & ("splitPos"
+		
+		//'first' firstContent=UiSplitpanelAssigment & 'second' secondContent=UiSplitpanelAssigment & ('splitPos'
 		//splitPosition=INT)? & readonly?="readonly"?
 		public UnorderedGroup getUnorderedGroup_4() { return cUnorderedGroup_4; }
-
-		//"first" firstContent=UiSplitpanelAssigment
+		
+		//'first' firstContent=UiSplitpanelAssigment
 		public Group getGroup_4_0() { return cGroup_4_0; }
-
-		//"first"
+		
+		//'first'
 		public Keyword getFirstKeyword_4_0_0() { return cFirstKeyword_4_0_0; }
-
+		
 		//firstContent=UiSplitpanelAssigment
 		public Assignment getFirstContentAssignment_4_0_1() { return cFirstContentAssignment_4_0_1; }
-
+		
 		//UiSplitpanelAssigment
 		public RuleCall getFirstContentUiSplitpanelAssigmentParserRuleCall_4_0_1_0() { return cFirstContentUiSplitpanelAssigmentParserRuleCall_4_0_1_0; }
-
-		//"second" secondContent=UiSplitpanelAssigment
+		
+		//'second' secondContent=UiSplitpanelAssigment
 		public Group getGroup_4_1() { return cGroup_4_1; }
-
-		//"second"
+		
+		//'second'
 		public Keyword getSecondKeyword_4_1_0() { return cSecondKeyword_4_1_0; }
-
+		
 		//secondContent=UiSplitpanelAssigment
 		public Assignment getSecondContentAssignment_4_1_1() { return cSecondContentAssignment_4_1_1; }
-
+		
 		//UiSplitpanelAssigment
 		public RuleCall getSecondContentUiSplitpanelAssigmentParserRuleCall_4_1_1_0() { return cSecondContentUiSplitpanelAssigmentParserRuleCall_4_1_1_0; }
-
-		//("splitPos" splitPosition=INT)?
+		
+		//('splitPos' splitPosition=INT)?
 		public Group getGroup_4_2() { return cGroup_4_2; }
-
-		//"splitPos"
+		
+		//'splitPos'
 		public Keyword getSplitPosKeyword_4_2_0() { return cSplitPosKeyword_4_2_0; }
-
+		
 		//splitPosition=INT
 		public Assignment getSplitPositionAssignment_4_2_1() { return cSplitPositionAssignment_4_2_1; }
-
+		
 		//INT
 		public RuleCall getSplitPositionINTTerminalRuleCall_4_2_1_0() { return cSplitPositionINTTerminalRuleCall_4_2_1_0; }
-
+		
 		//readonly?="readonly"?
 		public Assignment getReadonlyAssignment_4_3() { return cReadonlyAssignment_4_3; }
-
+		
 		//"readonly"
 		public Keyword getReadonlyReadonlyKeyword_4_3_0() { return cReadonlyReadonlyKeyword_4_3_0; }
-
+		
 		//bindings+=UiBinding*
 		public Assignment getBindingsAssignment_5() { return cBindingsAssignment_5; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_5_0() { return cBindingsUiBindingParserRuleCall_5_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment*
 		public Assignment getProcessorAssignmentsAssignment_6() { return cProcessorAssignmentsAssignment_6; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_6_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_6_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_7() { return cRightCurlyBracketKeyword_7; }
 	}
-
 	public class UiSplitpanelAssigmentElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiSplitpanelAssigment");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiSplitpanelAssigment");
 		private final Assignment cElementAssignment = (Assignment)rule.eContents().get(1);
 		private final RuleCall cElementUiEmbeddableParserRuleCall_0 = (RuleCall)cElementAssignment.eContents().get(0);
 		
 		//UiSplitpanelAssigment:
 		//	element=UiEmbeddable;
-		public ParserRule getRule() { return rule; }
-
+		@Override public ParserRule getRule() { return rule; }
+		
 		//element=UiEmbeddable
 		public Assignment getElementAssignment() { return cElementAssignment; }
-
+		
 		//UiEmbeddable
 		public RuleCall getElementUiEmbeddableParserRuleCall_0() { return cElementUiEmbeddableParserRuleCall_0; }
 	}
-
 	public class UiPanelElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiPanel");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiPanel");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cPanelKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
@@ -3662,89 +3883,96 @@
 		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
 		
 		//UiPanel:
-		//	"panel" ("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?) ")")? name=ID "{" "content"
-		//	content=UiEmbeddable bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* "}";
-		public ParserRule getRule() { return rule; }
-
-		//"panel" ("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?) ")")? name=ID "{" "content"
-		//content=UiEmbeddable bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* "}"
+		//	'panel' ('(' (i18nInfo=UiI18nInfo?
+		//	& readonly?="readonly"?
+		//	& ('styles' styles=STRING)?)
+		//	')')?
+		//	name=ID
+		//	'{'
+		//	'content' content=UiEmbeddable
+		//	bindings+=UiBinding*
+		//	processorAssignments+=UiVisibilityProcessorAssignment*
+		//	'}';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'panel' ('(' (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?) ')')? name=ID '{' 'content'
+		//content=UiEmbeddable bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* '}'
 		public Group getGroup() { return cGroup; }
-
-		//"panel"
+		
+		//'panel'
 		public Keyword getPanelKeyword_0() { return cPanelKeyword_0; }
-
-		//("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?) ")")?
+		
+		//('(' (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?) ')')?
 		public Group getGroup_1() { return cGroup_1; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_1_0() { return cLeftParenthesisKeyword_1_0; }
-
-		//i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?
+		
+		//i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?
 		public UnorderedGroup getUnorderedGroup_1_1() { return cUnorderedGroup_1_1; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_1_1_0() { return cI18nInfoAssignment_1_1_0; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_1_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_1_1_0_0; }
-
+		
 		//readonly?="readonly"?
 		public Assignment getReadonlyAssignment_1_1_1() { return cReadonlyAssignment_1_1_1; }
-
+		
 		//"readonly"
 		public Keyword getReadonlyReadonlyKeyword_1_1_1_0() { return cReadonlyReadonlyKeyword_1_1_1_0; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_1_1_2() { return cGroup_1_1_2; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_1_1_2_0() { return cStylesKeyword_1_1_2_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_1_1_2_1() { return cStylesAssignment_1_1_2_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_1_1_2_1_0() { return cStylesSTRINGTerminalRuleCall_1_1_2_1_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_1_2() { return cRightParenthesisKeyword_1_2; }
-
+		
 		//name=ID
 		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_2_0() { return cNameIDTerminalRuleCall_2_0; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_3() { return cLeftCurlyBracketKeyword_3; }
-
-		//"content"
+		
+		//'content'
 		public Keyword getContentKeyword_4() { return cContentKeyword_4; }
-
+		
 		//content=UiEmbeddable
 		public Assignment getContentAssignment_5() { return cContentAssignment_5; }
-
+		
 		//UiEmbeddable
 		public RuleCall getContentUiEmbeddableParserRuleCall_5_0() { return cContentUiEmbeddableParserRuleCall_5_0; }
-
+		
 		//bindings+=UiBinding*
 		public Assignment getBindingsAssignment_6() { return cBindingsAssignment_6; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_6_0() { return cBindingsUiBindingParserRuleCall_6_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment*
 		public Assignment getProcessorAssignmentsAssignment_7() { return cProcessorAssignmentsAssignment_7; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
 	}
-
 	public class UiDialogElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiDialog");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiDialog");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiDialogAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cDialogKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -3777,122 +4005,123 @@
 		private final Keyword cRightCurlyBracketKeyword_9 = (Keyword)cGroup.eContents().get(9);
 		
 		//UiDialog:
-		//	{UiDialog} "dialog" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? "{" ("type"
-		//	jvmType=JvmTypeReference ";"?)? (content=UiDialogAssignment ";"?)? bindings+=UiBinding*
-		//	processorAssignments+=UiVisibilityProcessorAssignment* "}";
-		public ParserRule getRule() { return rule; }
-
-		//{UiDialog} "dialog" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? "{" ("type"
-		//jvmType=JvmTypeReference ";"?)? (content=UiDialogAssignment ";"?)? bindings+=UiBinding*
-		//processorAssignments+=UiVisibilityProcessorAssignment* "}"
+		//	{UiDialog}
+		//	'dialog' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=ID? '{' ('type' jvmType=JvmTypeReference
+		//	';'?)? (content=UiDialogAssignment ';'?)?
+		//	bindings+=UiBinding*
+		//	processorAssignments+=UiVisibilityProcessorAssignment*
+		//	'}';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiDialog} 'dialog' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=ID? '{' ('type'
+		//jvmType=JvmTypeReference ';'?)? (content=UiDialogAssignment ';'?)? bindings+=UiBinding*
+		//processorAssignments+=UiVisibilityProcessorAssignment* '}'
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiDialog}
 		public Action getUiDialogAction_0() { return cUiDialogAction_0; }
-
-		//"dialog"
+		
+		//'dialog'
 		public Keyword getDialogKeyword_1() { return cDialogKeyword_1; }
-
-		//("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")?
+		
+		//('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
-
-		//i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?
+		
+		//i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?
 		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
-
-		//("type" jvmType=JvmTypeReference ";"?)?
+		
+		//('type' jvmType=JvmTypeReference ';'?)?
 		public Group getGroup_5() { return cGroup_5; }
-
-		//"type"
+		
+		//'type'
 		public Keyword getTypeKeyword_5_0() { return cTypeKeyword_5_0; }
-
+		
 		//jvmType=JvmTypeReference
 		public Assignment getJvmTypeAssignment_5_1() { return cJvmTypeAssignment_5_1; }
-
+		
 		//JvmTypeReference
 		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_5_1_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_5_1_0; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_5_2() { return cSemicolonKeyword_5_2; }
-
-		//(content=UiDialogAssignment ";"?)?
+		
+		//(content=UiDialogAssignment ';'?)?
 		public Group getGroup_6() { return cGroup_6; }
-
+		
 		//content=UiDialogAssignment
 		public Assignment getContentAssignment_6_0() { return cContentAssignment_6_0; }
-
+		
 		//UiDialogAssignment
 		public RuleCall getContentUiDialogAssignmentParserRuleCall_6_0_0() { return cContentUiDialogAssignmentParserRuleCall_6_0_0; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_6_1() { return cSemicolonKeyword_6_1; }
-
+		
 		//bindings+=UiBinding*
 		public Assignment getBindingsAssignment_7() { return cBindingsAssignment_7; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_7_0() { return cBindingsUiBindingParserRuleCall_7_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment*
 		public Assignment getProcessorAssignmentsAssignment_8() { return cProcessorAssignmentsAssignment_8; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_8_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_8_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_9() { return cRightCurlyBracketKeyword_9; }
 	}
-
 	public class UiDialogAssignmentElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiDialogAssignment");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiDialogAssignment");
 		private final Assignment cElementAssignment = (Assignment)rule.eContents().get(1);
 		private final RuleCall cElementUiEmbeddableParserRuleCall_0 = (RuleCall)cElementAssignment.eContents().get(0);
 		
 		//UiDialogAssignment:
 		//	element=UiEmbeddable;
-		public ParserRule getRule() { return rule; }
-
+		@Override public ParserRule getRule() { return rule; }
+		
 		//element=UiEmbeddable
 		public Assignment getElementAssignment() { return cElementAssignment; }
-
+		
 		//UiEmbeddable
 		public RuleCall getElementUiEmbeddableParserRuleCall_0() { return cElementUiEmbeddableParserRuleCall_0; }
 	}
-
 	public class UiSearchDialogElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiSearchDialog");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiSearchDialog");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiSearchDialogAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cSearchdialogKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -3932,143 +4161,148 @@
 		private final Keyword cRightCurlyBracketKeyword_10 = (Keyword)cGroup.eContents().get(10);
 		
 		//UiSearchDialog:
-		//	{UiSearchDialog} "searchdialog" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? "{" ("type"
-		//	jvmType=JvmTypeReference)? ("search" "{" searchFields+=UiDialogSearchFieldAssignment* "}")? ("content" "{"
-		//	content=UiDialogAssignment "}")? bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* "}";
-		public ParserRule getRule() { return rule; }
-
-		//{UiSearchDialog} "searchdialog" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? "{" ("type"
-		//jvmType=JvmTypeReference)? ("search" "{" searchFields+=UiDialogSearchFieldAssignment* "}")? ("content" "{"
-		//content=UiDialogAssignment "}")? bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* "}"
+		//	{UiSearchDialog}
+		//	'searchdialog' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=ID? '{' ('type'
+		//	jvmType=JvmTypeReference)? ('search' '{'
+		//	searchFields+=UiDialogSearchFieldAssignment*
+		//	'}')? ('content' '{'
+		//	content=UiDialogAssignment
+		//	'}')?
+		//	bindings+=UiBinding*
+		//	processorAssignments+=UiVisibilityProcessorAssignment*
+		//	'}';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiSearchDialog} 'searchdialog' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=ID? '{' ('type'
+		//jvmType=JvmTypeReference)? ('search' '{' searchFields+=UiDialogSearchFieldAssignment* '}')? ('content' '{'
+		//content=UiDialogAssignment '}')? bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* '}'
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiSearchDialog}
 		public Action getUiSearchDialogAction_0() { return cUiSearchDialogAction_0; }
-
-		//"searchdialog"
+		
+		//'searchdialog'
 		public Keyword getSearchdialogKeyword_1() { return cSearchdialogKeyword_1; }
-
-		//("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")?
+		
+		//('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
-
-		//i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?
+		
+		//i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?
 		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
-
-		//("type" jvmType=JvmTypeReference)?
+		
+		//('type' jvmType=JvmTypeReference)?
 		public Group getGroup_5() { return cGroup_5; }
-
-		//"type"
+		
+		//'type'
 		public Keyword getTypeKeyword_5_0() { return cTypeKeyword_5_0; }
-
+		
 		//jvmType=JvmTypeReference
 		public Assignment getJvmTypeAssignment_5_1() { return cJvmTypeAssignment_5_1; }
-
+		
 		//JvmTypeReference
 		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_5_1_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_5_1_0; }
-
-		//("search" "{" searchFields+=UiDialogSearchFieldAssignment* "}")?
+		
+		//('search' '{' searchFields+=UiDialogSearchFieldAssignment* '}')?
 		public Group getGroup_6() { return cGroup_6; }
-
-		//"search"
+		
+		//'search'
 		public Keyword getSearchKeyword_6_0() { return cSearchKeyword_6_0; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_6_1() { return cLeftCurlyBracketKeyword_6_1; }
-
+		
 		//searchFields+=UiDialogSearchFieldAssignment*
 		public Assignment getSearchFieldsAssignment_6_2() { return cSearchFieldsAssignment_6_2; }
-
+		
 		//UiDialogSearchFieldAssignment
 		public RuleCall getSearchFieldsUiDialogSearchFieldAssignmentParserRuleCall_6_2_0() { return cSearchFieldsUiDialogSearchFieldAssignmentParserRuleCall_6_2_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_6_3() { return cRightCurlyBracketKeyword_6_3; }
-
-		//("content" "{" content=UiDialogAssignment "}")?
+		
+		//('content' '{' content=UiDialogAssignment '}')?
 		public Group getGroup_7() { return cGroup_7; }
-
-		//"content"
+		
+		//'content'
 		public Keyword getContentKeyword_7_0() { return cContentKeyword_7_0; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_7_1() { return cLeftCurlyBracketKeyword_7_1; }
-
+		
 		//content=UiDialogAssignment
 		public Assignment getContentAssignment_7_2() { return cContentAssignment_7_2; }
-
+		
 		//UiDialogAssignment
 		public RuleCall getContentUiDialogAssignmentParserRuleCall_7_2_0() { return cContentUiDialogAssignmentParserRuleCall_7_2_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_7_3() { return cRightCurlyBracketKeyword_7_3; }
-
+		
 		//bindings+=UiBinding*
 		public Assignment getBindingsAssignment_8() { return cBindingsAssignment_8; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_8_0() { return cBindingsUiBindingParserRuleCall_8_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment*
 		public Assignment getProcessorAssignmentsAssignment_9() { return cProcessorAssignmentsAssignment_9; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_9_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_9_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_10() { return cRightCurlyBracketKeyword_10; }
 	}
-
 	public class UiDialogSearchFieldAssignmentElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiDialogSearchFieldAssignment");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiDialogSearchFieldAssignment");
 		private final Assignment cElementAssignment = (Assignment)rule.eContents().get(1);
 		private final RuleCall cElementUiSearchFieldParserRuleCall_0 = (RuleCall)cElementAssignment.eContents().get(0);
 		
 		//UiDialogSearchFieldAssignment:
 		//	element=UiSearchField;
-		public ParserRule getRule() { return rule; }
-
+		@Override public ParserRule getRule() { return rule; }
+		
 		//element=UiSearchField
 		public Assignment getElementAssignment() { return cElementAssignment; }
-
+		
 		//UiSearchField
 		public RuleCall getElementUiSearchFieldParserRuleCall_0() { return cElementUiSearchFieldParserRuleCall_0; }
 	}
-
 	public class UiMobileNavigationPageElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileNavigationPage");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileNavigationPage");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiMobileNavigationPageAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cNavPageKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -4105,120 +4339,124 @@
 		private final Keyword cRightCurlyBracketKeyword_10 = (Keyword)cGroup.eContents().get(10);
 		
 		//UiMobileNavigationPage:
-		//	{UiMobileNavigationPage} "navPage" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? "{" ("type"
-		//	jvmType=JvmTypeReference ";"?)? ("navbarActions" "{" barActions+=UiMobileNavBarAction* "}")?
-		//	contents+=UiMobileNavigationPageAssignment* bindings+=UiBinding*
-		//	processorAssignments+=UiVisibilityProcessorAssignment* "}";
-		public ParserRule getRule() { return rule; }
-
-		//{UiMobileNavigationPage} "navPage" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? "{" ("type"
-		//jvmType=JvmTypeReference ";"?)? ("navbarActions" "{" barActions+=UiMobileNavBarAction* "}")?
+		//	{UiMobileNavigationPage}
+		//	'navPage' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=ID? '{' ('type' jvmType=JvmTypeReference
+		//	';'?)? ('navbarActions' '{'
+		//	barActions+=UiMobileNavBarAction*
+		//	'}')?
+		//	contents+=UiMobileNavigationPageAssignment*
+		//	bindings+=UiBinding*
+		//	processorAssignments+=UiVisibilityProcessorAssignment*
+		//	'}';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiMobileNavigationPage} 'navPage' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=ID? '{' ('type'
+		//jvmType=JvmTypeReference ';'?)? ('navbarActions' '{' barActions+=UiMobileNavBarAction* '}')?
 		//contents+=UiMobileNavigationPageAssignment* bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment*
-		//"}"
+		//'}'
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiMobileNavigationPage}
 		public Action getUiMobileNavigationPageAction_0() { return cUiMobileNavigationPageAction_0; }
-
-		//"navPage"
+		
+		//'navPage'
 		public Keyword getNavPageKeyword_1() { return cNavPageKeyword_1; }
-
-		//("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")?
+		
+		//('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
-
-		//i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?
+		
+		//i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?
 		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
-
-		//("type" jvmType=JvmTypeReference ";"?)?
+		
+		//('type' jvmType=JvmTypeReference ';'?)?
 		public Group getGroup_5() { return cGroup_5; }
-
-		//"type"
+		
+		//'type'
 		public Keyword getTypeKeyword_5_0() { return cTypeKeyword_5_0; }
-
+		
 		//jvmType=JvmTypeReference
 		public Assignment getJvmTypeAssignment_5_1() { return cJvmTypeAssignment_5_1; }
-
+		
 		//JvmTypeReference
 		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_5_1_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_5_1_0; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_5_2() { return cSemicolonKeyword_5_2; }
-
-		//("navbarActions" "{" barActions+=UiMobileNavBarAction* "}")?
+		
+		//('navbarActions' '{' barActions+=UiMobileNavBarAction* '}')?
 		public Group getGroup_6() { return cGroup_6; }
-
-		//"navbarActions"
+		
+		//'navbarActions'
 		public Keyword getNavbarActionsKeyword_6_0() { return cNavbarActionsKeyword_6_0; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_6_1() { return cLeftCurlyBracketKeyword_6_1; }
-
+		
 		//barActions+=UiMobileNavBarAction*
 		public Assignment getBarActionsAssignment_6_2() { return cBarActionsAssignment_6_2; }
-
+		
 		//UiMobileNavBarAction
 		public RuleCall getBarActionsUiMobileNavBarActionParserRuleCall_6_2_0() { return cBarActionsUiMobileNavBarActionParserRuleCall_6_2_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_6_3() { return cRightCurlyBracketKeyword_6_3; }
-
+		
 		//contents+=UiMobileNavigationPageAssignment*
 		public Assignment getContentsAssignment_7() { return cContentsAssignment_7; }
-
+		
 		//UiMobileNavigationPageAssignment
 		public RuleCall getContentsUiMobileNavigationPageAssignmentParserRuleCall_7_0() { return cContentsUiMobileNavigationPageAssignmentParserRuleCall_7_0; }
-
+		
 		//bindings+=UiBinding*
 		public Assignment getBindingsAssignment_8() { return cBindingsAssignment_8; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_8_0() { return cBindingsUiBindingParserRuleCall_8_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment*
 		public Assignment getProcessorAssignmentsAssignment_9() { return cProcessorAssignmentsAssignment_9; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_9_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_9_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_10() { return cRightCurlyBracketKeyword_10; }
 	}
-
 	public class UiMobileNavigationPageAssignmentElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileNavigationPageAssignment");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileNavigationPageAssignment");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Assignment cElementAssignment_0 = (Assignment)cGroup.eContents().get(0);
 		private final RuleCall cElementUiMobileEmbeddableParserRuleCall_0_0 = (RuleCall)cElementAssignment_0.eContents().get(0);
@@ -4228,33 +4466,32 @@
 		private final RuleCall cAlignmentUiAlignmentEnumRuleCall_1_1_0 = (RuleCall)cAlignmentAssignment_1_1.eContents().get(0);
 		
 		//UiMobileNavigationPageAssignment:
-		//	element=UiMobileEmbeddable ("align" alignment=UiAlignment)?;
-		public ParserRule getRule() { return rule; }
-
-		//element=UiMobileEmbeddable ("align" alignment=UiAlignment)?
+		//	element=UiMobileEmbeddable ('align' alignment=UiAlignment)?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//element=UiMobileEmbeddable ('align' alignment=UiAlignment)?
 		public Group getGroup() { return cGroup; }
-
+		
 		//element=UiMobileEmbeddable
 		public Assignment getElementAssignment_0() { return cElementAssignment_0; }
-
+		
 		//UiMobileEmbeddable
 		public RuleCall getElementUiMobileEmbeddableParserRuleCall_0_0() { return cElementUiMobileEmbeddableParserRuleCall_0_0; }
-
-		//("align" alignment=UiAlignment)?
+		
+		//('align' alignment=UiAlignment)?
 		public Group getGroup_1() { return cGroup_1; }
-
-		//"align"
+		
+		//'align'
 		public Keyword getAlignKeyword_1_0() { return cAlignKeyword_1_0; }
-
+		
 		//alignment=UiAlignment
 		public Assignment getAlignmentAssignment_1_1() { return cAlignmentAssignment_1_1; }
-
+		
 		//UiAlignment
 		public RuleCall getAlignmentUiAlignmentEnumRuleCall_1_1_0() { return cAlignmentUiAlignmentEnumRuleCall_1_1_0; }
 	}
-
 	public class UiPointElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiPoint");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiPoint");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Assignment cXAssignment_0 = (Assignment)cGroup.eContents().get(0);
 		private final RuleCall cXINTTerminalRuleCall_0_0 = (RuleCall)cXAssignment_0.eContents().get(0);
@@ -4263,30 +4500,29 @@
 		private final RuleCall cYINTTerminalRuleCall_2_0 = (RuleCall)cYAssignment_2.eContents().get(0);
 		
 		//UiPoint:
-		//	x=INT "/" y=INT;
-		public ParserRule getRule() { return rule; }
-
-		//x=INT "/" y=INT
+		//	x=INT '/' y=INT;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//x=INT '/' y=INT
 		public Group getGroup() { return cGroup; }
-
+		
 		//x=INT
 		public Assignment getXAssignment_0() { return cXAssignment_0; }
-
+		
 		//INT
 		public RuleCall getXINTTerminalRuleCall_0_0() { return cXINTTerminalRuleCall_0_0; }
-
-		//"/"
+		
+		//'/'
 		public Keyword getSolidusKeyword_1() { return cSolidusKeyword_1; }
-
+		
 		//y=INT
 		public Assignment getYAssignment_2() { return cYAssignment_2; }
-
+		
 		//INT
 		public RuleCall getYINTTerminalRuleCall_2_0() { return cYINTTerminalRuleCall_2_0; }
 	}
-
 	public class UiTextFieldElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiTextField");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiTextField");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiTextFieldAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cTextfieldKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -4328,135 +4564,143 @@
 		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
 		
 		//UiTextField:
-		//	{UiTextField} "textfield" ("(" (("maxLength=" maxLength=INT)? & ("minLength=" minLength=INT)? & ("regex="
-		//	regex=STRING)? & ("styles" styles=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ")")? name=ID? ("{"
-		//	(validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
-		public ParserRule getRule() { return rule; }
-
-		//{UiTextField} "textfield" ("(" (("maxLength=" maxLength=INT)? & ("minLength=" minLength=INT)? & ("regex=" regex=STRING)?
-		//& ("styles" styles=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ")")? name=ID? ("{"
-		//(validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		//	{UiTextField}
+		//	'textfield' ('(' (('maxLength=' maxLength=INT)?
+		//	& ('minLength=' minLength=INT)?
+		//	& ('regex=' regex=STRING)?
+		//	& ('styles' styles=STRING)?
+		//	& i18nInfo=UiI18nInfo?
+		//	& readonly?="readonly"?)
+		//	')')?
+		//	name=ID? ('{' (validators+=UiValidator
+		//	| bindings+=UiBinding)*
+		//	processorAssignments+=UiVisibilityProcessorAssignment*
+		//	'}')?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiTextField} 'textfield' ('(' (('maxLength=' maxLength=INT)? & ('minLength=' minLength=INT)? & ('regex=' regex=STRING)?
+		//& ('styles' styles=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ')')? name=ID? ('{'
+		//(validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiTextField}
 		public Action getUiTextFieldAction_0() { return cUiTextFieldAction_0; }
-
-		//"textfield"
+		
+		//'textfield'
 		public Keyword getTextfieldKeyword_1() { return cTextfieldKeyword_1; }
-
-		//("(" (("maxLength=" maxLength=INT)? & ("minLength=" minLength=INT)? & ("regex=" regex=STRING)? & ("styles"
-		//styles=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ")")?
+		
+		//('(' (('maxLength=' maxLength=INT)? & ('minLength=' minLength=INT)? & ('regex=' regex=STRING)? & ('styles'
+		//styles=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ')')?
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
-
-		//("maxLength=" maxLength=INT)? & ("minLength=" minLength=INT)? & ("regex=" regex=STRING)? & ("styles" styles=STRING)? &
+		
+		//('maxLength=' maxLength=INT)? & ('minLength=' minLength=INT)? & ('regex=' regex=STRING)? & ('styles' styles=STRING)? &
 		//i18nInfo=UiI18nInfo? & readonly?="readonly"?
 		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
-
-		//("maxLength=" maxLength=INT)?
+		
+		//('maxLength=' maxLength=INT)?
 		public Group getGroup_2_1_0() { return cGroup_2_1_0; }
-
-		//"maxLength="
+		
+		//'maxLength='
 		public Keyword getMaxLengthKeyword_2_1_0_0() { return cMaxLengthKeyword_2_1_0_0; }
-
+		
 		//maxLength=INT
 		public Assignment getMaxLengthAssignment_2_1_0_1() { return cMaxLengthAssignment_2_1_0_1; }
-
+		
 		//INT
 		public RuleCall getMaxLengthINTTerminalRuleCall_2_1_0_1_0() { return cMaxLengthINTTerminalRuleCall_2_1_0_1_0; }
-
-		//("minLength=" minLength=INT)?
+		
+		//('minLength=' minLength=INT)?
 		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
-
-		//"minLength="
+		
+		//'minLength='
 		public Keyword getMinLengthKeyword_2_1_1_0() { return cMinLengthKeyword_2_1_1_0; }
-
+		
 		//minLength=INT
 		public Assignment getMinLengthAssignment_2_1_1_1() { return cMinLengthAssignment_2_1_1_1; }
-
+		
 		//INT
 		public RuleCall getMinLengthINTTerminalRuleCall_2_1_1_1_0() { return cMinLengthINTTerminalRuleCall_2_1_1_1_0; }
-
-		//("regex=" regex=STRING)?
+		
+		//('regex=' regex=STRING)?
 		public Group getGroup_2_1_2() { return cGroup_2_1_2; }
-
-		//"regex="
+		
+		//'regex='
 		public Keyword getRegexKeyword_2_1_2_0() { return cRegexKeyword_2_1_2_0; }
-
+		
 		//regex=STRING
 		public Assignment getRegexAssignment_2_1_2_1() { return cRegexAssignment_2_1_2_1; }
-
+		
 		//STRING
 		public RuleCall getRegexSTRINGTerminalRuleCall_2_1_2_1_0() { return cRegexSTRINGTerminalRuleCall_2_1_2_1_0; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_1_3() { return cGroup_2_1_3; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_1_3_0() { return cStylesKeyword_2_1_3_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_1_3_1() { return cStylesAssignment_2_1_3_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_3_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_3_1_0; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_1_4() { return cI18nInfoAssignment_2_1_4; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_4_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_4_0; }
-
+		
 		//readonly?="readonly"?
 		public Assignment getReadonlyAssignment_2_1_5() { return cReadonlyAssignment_2_1_5; }
-
+		
 		//"readonly"
 		public Keyword getReadonlyReadonlyKeyword_2_1_5_0() { return cReadonlyReadonlyKeyword_2_1_5_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
-
-		//("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		
+		//('{' (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup_4() { return cGroup_4; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
-
+		
 		//(validators+=UiValidator | bindings+=UiBinding)*
 		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }
-
+		
 		//validators+=UiValidator
 		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }
-
+		
 		//UiValidator
 		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }
-
+		
 		//bindings+=UiBinding
 		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment*
 		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
 	}
-
 	public class UiPasswordFieldElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiPasswordField");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiPasswordField");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiPasswordFieldAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cPasswordFieldKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -4486,97 +4730,102 @@
 		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
 		
 		//UiPasswordField:
-		//	{UiPasswordField} "passwordField" ("(" (("styles" styles=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?)
-		//	")")? name=ID? ("{" (validators+=UiValidator | bindings+=UiBinding)*
-		//	processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
-		public ParserRule getRule() { return rule; }
-
-		//{UiPasswordField} "passwordField" ("(" (("styles" styles=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ")")?
-		//name=ID? ("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment*
-		//"}")?
+		//	{UiPasswordField}
+		//	'passwordField' ('(' (('styles' styles=STRING)?
+		//	& i18nInfo=UiI18nInfo?
+		//	& readonly?="readonly"?)
+		//	')')?
+		//	name=ID? ('{' (validators+=UiValidator
+		//	| bindings+=UiBinding)*
+		//	processorAssignments+=UiVisibilityProcessorAssignment*
+		//	'}')?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiPasswordField} 'passwordField' ('(' (('styles' styles=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ')')?
+		//name=ID? ('{' (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment*
+		//'}')?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiPasswordField}
 		public Action getUiPasswordFieldAction_0() { return cUiPasswordFieldAction_0; }
-
-		//"passwordField"
+		
+		//'passwordField'
 		public Keyword getPasswordFieldKeyword_1() { return cPasswordFieldKeyword_1; }
-
-		//("(" (("styles" styles=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ")")?
+		
+		//('(' (('styles' styles=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ')')?
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
-
-		//("styles" styles=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?
+		
+		//('styles' styles=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?
 		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_1_0() { return cGroup_2_1_0; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_1_0_0() { return cStylesKeyword_2_1_0_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_1_0_1() { return cStylesAssignment_2_1_0_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_0_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_0_1_0; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_1_1() { return cI18nInfoAssignment_2_1_1; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_1_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_1_0; }
-
+		
 		//readonly?="readonly"?
 		public Assignment getReadonlyAssignment_2_1_2() { return cReadonlyAssignment_2_1_2; }
-
+		
 		//"readonly"
 		public Keyword getReadonlyReadonlyKeyword_2_1_2_0() { return cReadonlyReadonlyKeyword_2_1_2_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
-
-		//("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		
+		//('{' (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup_4() { return cGroup_4; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
-
+		
 		//(validators+=UiValidator | bindings+=UiBinding)*
 		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }
-
+		
 		//validators+=UiValidator
 		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }
-
+		
 		//UiValidator
 		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }
-
+		
 		//bindings+=UiBinding
 		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment*
 		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
 	}
-
 	public class UiMaskedTextFieldElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMaskedTextField");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMaskedTextField");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiMaskedTextFieldAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cMaskedTextKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -4610,109 +4859,115 @@
 		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
 		
 		//UiMaskedTextField:
-		//	{UiMaskedTextField} "maskedText" ("(" (("styles" styles=STRING)? & ("mask=" mask=STRING)? & i18nInfo=UiI18nInfo? &
-		//	readonly?="readonly"?) ")")? name=ID? ("{" (validators+=UiValidator | bindings+=UiBinding)*
-		//	processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
-		public ParserRule getRule() { return rule; }
-
-		//{UiMaskedTextField} "maskedText" ("(" (("styles" styles=STRING)? & ("mask=" mask=STRING)? & i18nInfo=UiI18nInfo? &
-		//readonly?="readonly"?) ")")? name=ID? ("{" (validators+=UiValidator | bindings+=UiBinding)*
-		//processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		//	{UiMaskedTextField}
+		//	'maskedText' ('(' (('styles' styles=STRING)?
+		//	& ('mask=' mask=STRING)?
+		//	& i18nInfo=UiI18nInfo?
+		//	& readonly?="readonly"?)
+		//	')')?
+		//	name=ID? ('{' (validators+=UiValidator
+		//	| bindings+=UiBinding)*
+		//	processorAssignments+=UiVisibilityProcessorAssignment*
+		//	'}')?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiMaskedTextField} 'maskedText' ('(' (('styles' styles=STRING)? & ('mask=' mask=STRING)? & i18nInfo=UiI18nInfo? &
+		//readonly?="readonly"?) ')')? name=ID? ('{' (validators+=UiValidator | bindings+=UiBinding)*
+		//processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiMaskedTextField}
 		public Action getUiMaskedTextFieldAction_0() { return cUiMaskedTextFieldAction_0; }
-
-		//"maskedText"
+		
+		//'maskedText'
 		public Keyword getMaskedTextKeyword_1() { return cMaskedTextKeyword_1; }
-
-		//("(" (("styles" styles=STRING)? & ("mask=" mask=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ")")?
+		
+		//('(' (('styles' styles=STRING)? & ('mask=' mask=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ')')?
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
-
-		//("styles" styles=STRING)? & ("mask=" mask=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?
+		
+		//('styles' styles=STRING)? & ('mask=' mask=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?
 		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_1_0() { return cGroup_2_1_0; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_1_0_0() { return cStylesKeyword_2_1_0_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_1_0_1() { return cStylesAssignment_2_1_0_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_0_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_0_1_0; }
-
-		//("mask=" mask=STRING)?
+		
+		//('mask=' mask=STRING)?
 		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
-
-		//"mask="
+		
+		//'mask='
 		public Keyword getMaskKeyword_2_1_1_0() { return cMaskKeyword_2_1_1_0; }
-
+		
 		//mask=STRING
 		public Assignment getMaskAssignment_2_1_1_1() { return cMaskAssignment_2_1_1_1; }
-
+		
 		//STRING
 		public RuleCall getMaskSTRINGTerminalRuleCall_2_1_1_1_0() { return cMaskSTRINGTerminalRuleCall_2_1_1_1_0; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_1_2() { return cI18nInfoAssignment_2_1_2; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_2_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_2_0; }
-
+		
 		//readonly?="readonly"?
 		public Assignment getReadonlyAssignment_2_1_3() { return cReadonlyAssignment_2_1_3; }
-
+		
 		//"readonly"
 		public Keyword getReadonlyReadonlyKeyword_2_1_3_0() { return cReadonlyReadonlyKeyword_2_1_3_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
-
-		//("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		
+		//('{' (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup_4() { return cGroup_4; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
-
+		
 		//(validators+=UiValidator | bindings+=UiBinding)*
 		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }
-
+		
 		//validators+=UiValidator
 		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }
-
+		
 		//UiValidator
 		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }
-
+		
 		//bindings+=UiBinding
 		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment*
 		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
 	}
-
 	public class UiMaskedNumericFieldElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMaskedNumericField");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMaskedNumericField");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiMaskedNumericFieldAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cMaskedNumericKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -4742,97 +4997,102 @@
 		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
 		
 		//UiMaskedNumericField:
-		//	{UiMaskedNumericField} "maskedNumeric" ("(" (("styles" styles=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?)
-		//	")")? name=ID? ("{" (validators+=UiValidator | bindings+=UiBinding)*
-		//	processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
-		public ParserRule getRule() { return rule; }
-
-		//{UiMaskedNumericField} "maskedNumeric" ("(" (("styles" styles=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?)
-		//")")? name=ID? ("{" (validators+=UiValidator | bindings+=UiBinding)*
-		//processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		//	{UiMaskedNumericField}
+		//	'maskedNumeric' ('(' (('styles' styles=STRING)?
+		//	& i18nInfo=UiI18nInfo?
+		//	& readonly?="readonly"?)
+		//	')')?
+		//	name=ID? ('{' (validators+=UiValidator
+		//	| bindings+=UiBinding)*
+		//	processorAssignments+=UiVisibilityProcessorAssignment*
+		//	'}')?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiMaskedNumericField} 'maskedNumeric' ('(' (('styles' styles=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?)
+		//')')? name=ID? ('{' (validators+=UiValidator | bindings+=UiBinding)*
+		//processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiMaskedNumericField}
 		public Action getUiMaskedNumericFieldAction_0() { return cUiMaskedNumericFieldAction_0; }
-
-		//"maskedNumeric"
+		
+		//'maskedNumeric'
 		public Keyword getMaskedNumericKeyword_1() { return cMaskedNumericKeyword_1; }
-
-		//("(" (("styles" styles=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ")")?
+		
+		//('(' (('styles' styles=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ')')?
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
-
-		//("styles" styles=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?
+		
+		//('styles' styles=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?
 		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_1_0() { return cGroup_2_1_0; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_1_0_0() { return cStylesKeyword_2_1_0_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_1_0_1() { return cStylesAssignment_2_1_0_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_0_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_0_1_0; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_1_1() { return cI18nInfoAssignment_2_1_1; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_1_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_1_0; }
-
+		
 		//readonly?="readonly"?
 		public Assignment getReadonlyAssignment_2_1_2() { return cReadonlyAssignment_2_1_2; }
-
+		
 		//"readonly"
 		public Keyword getReadonlyReadonlyKeyword_2_1_2_0() { return cReadonlyReadonlyKeyword_2_1_2_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
-
-		//("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		
+		//('{' (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup_4() { return cGroup_4; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
-
+		
 		//(validators+=UiValidator | bindings+=UiBinding)*
 		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }
-
+		
 		//validators+=UiValidator
 		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }
-
+		
 		//UiValidator
 		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }
-
+		
 		//bindings+=UiBinding
 		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment*
 		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
 	}
-
 	public class UiMaskedDecimalFieldElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMaskedDecimalField");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMaskedDecimalField");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiMaskedDecimalFieldAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cMaskedDecimalKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -4866,109 +5126,115 @@
 		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
 		
 		//UiMaskedDecimalField:
-		//	{UiMaskedDecimalField} "maskedDecimal" ("(" (("styles" styles=STRING)? & ("mask=" mask=STRING)? & i18nInfo=UiI18nInfo?
-		//	& readonly?="readonly"?) ")")? name=ID? ("{" (validators+=UiValidator | bindings+=UiBinding)*
-		//	processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
-		public ParserRule getRule() { return rule; }
-
-		//{UiMaskedDecimalField} "maskedDecimal" ("(" (("styles" styles=STRING)? & ("mask=" mask=STRING)? & i18nInfo=UiI18nInfo? &
-		//readonly?="readonly"?) ")")? name=ID? ("{" (validators+=UiValidator | bindings+=UiBinding)*
-		//processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		//	{UiMaskedDecimalField}
+		//	'maskedDecimal' ('(' (('styles' styles=STRING)?
+		//	& ('mask=' mask=STRING)?
+		//	& i18nInfo=UiI18nInfo?
+		//	& readonly?="readonly"?)
+		//	')')?
+		//	name=ID? ('{' (validators+=UiValidator
+		//	| bindings+=UiBinding)*
+		//	processorAssignments+=UiVisibilityProcessorAssignment*
+		//	'}')?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiMaskedDecimalField} 'maskedDecimal' ('(' (('styles' styles=STRING)? & ('mask=' mask=STRING)? & i18nInfo=UiI18nInfo? &
+		//readonly?="readonly"?) ')')? name=ID? ('{' (validators+=UiValidator | bindings+=UiBinding)*
+		//processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiMaskedDecimalField}
 		public Action getUiMaskedDecimalFieldAction_0() { return cUiMaskedDecimalFieldAction_0; }
-
-		//"maskedDecimal"
+		
+		//'maskedDecimal'
 		public Keyword getMaskedDecimalKeyword_1() { return cMaskedDecimalKeyword_1; }
-
-		//("(" (("styles" styles=STRING)? & ("mask=" mask=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ")")?
+		
+		//('(' (('styles' styles=STRING)? & ('mask=' mask=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ')')?
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
-
-		//("styles" styles=STRING)? & ("mask=" mask=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?
+		
+		//('styles' styles=STRING)? & ('mask=' mask=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?
 		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_1_0() { return cGroup_2_1_0; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_1_0_0() { return cStylesKeyword_2_1_0_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_1_0_1() { return cStylesAssignment_2_1_0_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_0_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_0_1_0; }
-
-		//("mask=" mask=STRING)?
+		
+		//('mask=' mask=STRING)?
 		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
-
-		//"mask="
+		
+		//'mask='
 		public Keyword getMaskKeyword_2_1_1_0() { return cMaskKeyword_2_1_1_0; }
-
+		
 		//mask=STRING
 		public Assignment getMaskAssignment_2_1_1_1() { return cMaskAssignment_2_1_1_1; }
-
+		
 		//STRING
 		public RuleCall getMaskSTRINGTerminalRuleCall_2_1_1_1_0() { return cMaskSTRINGTerminalRuleCall_2_1_1_1_0; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_1_2() { return cI18nInfoAssignment_2_1_2; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_2_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_2_0; }
-
+		
 		//readonly?="readonly"?
 		public Assignment getReadonlyAssignment_2_1_3() { return cReadonlyAssignment_2_1_3; }
-
+		
 		//"readonly"
 		public Keyword getReadonlyReadonlyKeyword_2_1_3_0() { return cReadonlyReadonlyKeyword_2_1_3_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
-
-		//("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		
+		//('{' (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup_4() { return cGroup_4; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
-
+		
 		//(validators+=UiValidator | bindings+=UiBinding)*
 		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }
-
+		
 		//validators+=UiValidator
 		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }
-
+		
 		//UiValidator
 		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }
-
+		
 		//bindings+=UiBinding
 		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment*
 		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
 	}
-
 	public class UiPrefixedMaskedTextFieldElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiPrefixedMaskedTextField");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiPrefixedMaskedTextField");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiPrefixedMaskedTextFieldAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cMaskedTextWithPrefixKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -5012,143 +5278,149 @@
 		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
 		
 		//UiPrefixedMaskedTextField:
-		//	{UiPrefixedMaskedTextField} "maskedTextWithPrefix" ("(" (("styles" styles=STRING)? & ("mask=" mask=STRING)? &
-		//	("prefixes=" "(" prefixMasks+=UiPrefixToMaskMapEntry ("," prefixMasks+=UiPrefixToMaskMapEntry)* ")")? &
-		//	i18nInfo=UiI18nInfo? & readonly?="readonly"?) ")")? name=ID? ("{" (validators+=UiValidator | bindings+=UiBinding)*
-		//	processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
-		public ParserRule getRule() { return rule; }
-
-		//{UiPrefixedMaskedTextField} "maskedTextWithPrefix" ("(" (("styles" styles=STRING)? & ("mask=" mask=STRING)? &
-		//("prefixes=" "(" prefixMasks+=UiPrefixToMaskMapEntry ("," prefixMasks+=UiPrefixToMaskMapEntry)* ")")? &
-		//i18nInfo=UiI18nInfo? & readonly?="readonly"?) ")")? name=ID? ("{" (validators+=UiValidator | bindings+=UiBinding)*
-		//processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		//	{UiPrefixedMaskedTextField}
+		//	'maskedTextWithPrefix' ('(' (('styles' styles=STRING)?
+		//	& ('mask=' mask=STRING)?
+		//	& ('prefixes=' '(' prefixMasks+=UiPrefixToMaskMapEntry (',' prefixMasks+=UiPrefixToMaskMapEntry)* ')')?
+		//	& i18nInfo=UiI18nInfo?
+		//	& readonly?="readonly"?)
+		//	')')?
+		//	name=ID? ('{' (validators+=UiValidator
+		//	| bindings+=UiBinding)*
+		//	processorAssignments+=UiVisibilityProcessorAssignment*
+		//	'}')?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiPrefixedMaskedTextField} 'maskedTextWithPrefix' ('(' (('styles' styles=STRING)? & ('mask=' mask=STRING)? &
+		//('prefixes=' '(' prefixMasks+=UiPrefixToMaskMapEntry (',' prefixMasks+=UiPrefixToMaskMapEntry)* ')')? &
+		//i18nInfo=UiI18nInfo? & readonly?="readonly"?) ')')? name=ID? ('{' (validators+=UiValidator | bindings+=UiBinding)*
+		//processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiPrefixedMaskedTextField}
 		public Action getUiPrefixedMaskedTextFieldAction_0() { return cUiPrefixedMaskedTextFieldAction_0; }
-
-		//"maskedTextWithPrefix"
+		
+		//'maskedTextWithPrefix'
 		public Keyword getMaskedTextWithPrefixKeyword_1() { return cMaskedTextWithPrefixKeyword_1; }
-
-		//("(" (("styles" styles=STRING)? & ("mask=" mask=STRING)? & ("prefixes=" "(" prefixMasks+=UiPrefixToMaskMapEntry (","
-		//prefixMasks+=UiPrefixToMaskMapEntry)* ")")? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ")")?
+		
+		//('(' (('styles' styles=STRING)? & ('mask=' mask=STRING)? & ('prefixes=' '(' prefixMasks+=UiPrefixToMaskMapEntry (','
+		//prefixMasks+=UiPrefixToMaskMapEntry)* ')')? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ')')?
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
-
-		//("styles" styles=STRING)? & ("mask=" mask=STRING)? & ("prefixes=" "(" prefixMasks+=UiPrefixToMaskMapEntry (","
-		//prefixMasks+=UiPrefixToMaskMapEntry)* ")")? & i18nInfo=UiI18nInfo? & readonly?="readonly"?
+		
+		//('styles' styles=STRING)? & ('mask=' mask=STRING)? & ('prefixes=' '(' prefixMasks+=UiPrefixToMaskMapEntry (','
+		//prefixMasks+=UiPrefixToMaskMapEntry)* ')')? & i18nInfo=UiI18nInfo? & readonly?="readonly"?
 		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_1_0() { return cGroup_2_1_0; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_1_0_0() { return cStylesKeyword_2_1_0_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_1_0_1() { return cStylesAssignment_2_1_0_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_0_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_0_1_0; }
-
-		//("mask=" mask=STRING)?
+		
+		//('mask=' mask=STRING)?
 		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
-
-		//"mask="
+		
+		//'mask='
 		public Keyword getMaskKeyword_2_1_1_0() { return cMaskKeyword_2_1_1_0; }
-
+		
 		//mask=STRING
 		public Assignment getMaskAssignment_2_1_1_1() { return cMaskAssignment_2_1_1_1; }
-
+		
 		//STRING
 		public RuleCall getMaskSTRINGTerminalRuleCall_2_1_1_1_0() { return cMaskSTRINGTerminalRuleCall_2_1_1_1_0; }
-
-		//("prefixes=" "(" prefixMasks+=UiPrefixToMaskMapEntry ("," prefixMasks+=UiPrefixToMaskMapEntry)* ")")?
+		
+		//('prefixes=' '(' prefixMasks+=UiPrefixToMaskMapEntry (',' prefixMasks+=UiPrefixToMaskMapEntry)* ')')?
 		public Group getGroup_2_1_2() { return cGroup_2_1_2; }
-
-		//"prefixes="
+		
+		//'prefixes='
 		public Keyword getPrefixesKeyword_2_1_2_0() { return cPrefixesKeyword_2_1_2_0; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_1_2_1() { return cLeftParenthesisKeyword_2_1_2_1; }
-
+		
 		//prefixMasks+=UiPrefixToMaskMapEntry
 		public Assignment getPrefixMasksAssignment_2_1_2_2() { return cPrefixMasksAssignment_2_1_2_2; }
-
+		
 		//UiPrefixToMaskMapEntry
 		public RuleCall getPrefixMasksUiPrefixToMaskMapEntryParserRuleCall_2_1_2_2_0() { return cPrefixMasksUiPrefixToMaskMapEntryParserRuleCall_2_1_2_2_0; }
-
-		//("," prefixMasks+=UiPrefixToMaskMapEntry)*
+		
+		//(',' prefixMasks+=UiPrefixToMaskMapEntry)*
 		public Group getGroup_2_1_2_3() { return cGroup_2_1_2_3; }
-
-		//","
+		
+		//','
 		public Keyword getCommaKeyword_2_1_2_3_0() { return cCommaKeyword_2_1_2_3_0; }
-
+		
 		//prefixMasks+=UiPrefixToMaskMapEntry
 		public Assignment getPrefixMasksAssignment_2_1_2_3_1() { return cPrefixMasksAssignment_2_1_2_3_1; }
-
+		
 		//UiPrefixToMaskMapEntry
 		public RuleCall getPrefixMasksUiPrefixToMaskMapEntryParserRuleCall_2_1_2_3_1_0() { return cPrefixMasksUiPrefixToMaskMapEntryParserRuleCall_2_1_2_3_1_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_1_2_4() { return cRightParenthesisKeyword_2_1_2_4; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_1_3() { return cI18nInfoAssignment_2_1_3; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_3_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_3_0; }
-
+		
 		//readonly?="readonly"?
 		public Assignment getReadonlyAssignment_2_1_4() { return cReadonlyAssignment_2_1_4; }
-
+		
 		//"readonly"
 		public Keyword getReadonlyReadonlyKeyword_2_1_4_0() { return cReadonlyReadonlyKeyword_2_1_4_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
-
-		//("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		
+		//('{' (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup_4() { return cGroup_4; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
-
+		
 		//(validators+=UiValidator | bindings+=UiBinding)*
 		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }
-
+		
 		//validators+=UiValidator
 		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }
-
+		
 		//UiValidator
 		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }
-
+		
 		//bindings+=UiBinding
 		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment*
 		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
 	}
-
 	public class UiPrefixToMaskMapEntryElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiPrefixToMaskMapEntry");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiPrefixToMaskMapEntry");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiPrefixToMaskMapEntryAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cPrefixKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -5159,36 +5431,36 @@
 		private final RuleCall cValueSTRINGTerminalRuleCall_4_0 = (RuleCall)cValueAssignment_4.eContents().get(0);
 		
 		//UiPrefixToMaskMapEntry:
-		//	{UiPrefixToMaskMapEntry} "prefix" key=STRING "mask" value=STRING;
-		public ParserRule getRule() { return rule; }
-
-		//{UiPrefixToMaskMapEntry} "prefix" key=STRING "mask" value=STRING
+		//	{UiPrefixToMaskMapEntry}
+		//	'prefix' key=STRING 'mask' value=STRING;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiPrefixToMaskMapEntry} 'prefix' key=STRING 'mask' value=STRING
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiPrefixToMaskMapEntry}
 		public Action getUiPrefixToMaskMapEntryAction_0() { return cUiPrefixToMaskMapEntryAction_0; }
-
-		//"prefix"
+		
+		//'prefix'
 		public Keyword getPrefixKeyword_1() { return cPrefixKeyword_1; }
-
+		
 		//key=STRING
 		public Assignment getKeyAssignment_2() { return cKeyAssignment_2; }
-
+		
 		//STRING
 		public RuleCall getKeySTRINGTerminalRuleCall_2_0() { return cKeySTRINGTerminalRuleCall_2_0; }
-
-		//"mask"
+		
+		//'mask'
 		public Keyword getMaskKeyword_3() { return cMaskKeyword_3; }
-
+		
 		//value=STRING
 		public Assignment getValueAssignment_4() { return cValueAssignment_4; }
-
+		
 		//STRING
 		public RuleCall getValueSTRINGTerminalRuleCall_4_0() { return cValueSTRINGTerminalRuleCall_4_0; }
 	}
-
 	public class UiRichTextAreaElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiRichTextArea");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiRichTextArea");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiRichTextAreaAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cRichtextAreaKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -5220,103 +5492,109 @@
 		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
 		
 		//UiRichTextArea:
-		//	{UiRichTextArea} "richtextArea" ("(" (("styles" styles=STRING)? & i18nInfo=UiI18nInfo? & asBlob?="asBlob"? &
-		//	readonly?="readonly"?) ")")? name=ID? ("{" (validators+=UiValidator | bindings+=UiBinding)*
-		//	processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
-		public ParserRule getRule() { return rule; }
-
-		//{UiRichTextArea} "richtextArea" ("(" (("styles" styles=STRING)? & i18nInfo=UiI18nInfo? & asBlob?="asBlob"? &
-		//readonly?="readonly"?) ")")? name=ID? ("{" (validators+=UiValidator | bindings+=UiBinding)*
-		//processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		//	{UiRichTextArea}
+		//	'richtextArea' ('(' (('styles' styles=STRING)?
+		//	& i18nInfo=UiI18nInfo?
+		//	& asBlob?="asBlob"?
+		//	& readonly?="readonly"?)
+		//	')')?
+		//	name=ID? ('{' (validators+=UiValidator
+		//	| bindings+=UiBinding)*
+		//	processorAssignments+=UiVisibilityProcessorAssignment*
+		//	'}')?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiRichTextArea} 'richtextArea' ('(' (('styles' styles=STRING)? & i18nInfo=UiI18nInfo? & asBlob?="asBlob"? &
+		//readonly?="readonly"?) ')')? name=ID? ('{' (validators+=UiValidator | bindings+=UiBinding)*
+		//processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiRichTextArea}
 		public Action getUiRichTextAreaAction_0() { return cUiRichTextAreaAction_0; }
-
-		//"richtextArea"
+		
+		//'richtextArea'
 		public Keyword getRichtextAreaKeyword_1() { return cRichtextAreaKeyword_1; }
-
-		//("(" (("styles" styles=STRING)? & i18nInfo=UiI18nInfo? & asBlob?="asBlob"? & readonly?="readonly"?) ")")?
+		
+		//('(' (('styles' styles=STRING)? & i18nInfo=UiI18nInfo? & asBlob?="asBlob"? & readonly?="readonly"?) ')')?
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
-
-		//("styles" styles=STRING)? & i18nInfo=UiI18nInfo? & asBlob?="asBlob"? & readonly?="readonly"?
+		
+		//('styles' styles=STRING)? & i18nInfo=UiI18nInfo? & asBlob?="asBlob"? & readonly?="readonly"?
 		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_1_0() { return cGroup_2_1_0; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_1_0_0() { return cStylesKeyword_2_1_0_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_1_0_1() { return cStylesAssignment_2_1_0_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_0_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_0_1_0; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_1_1() { return cI18nInfoAssignment_2_1_1; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_1_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_1_0; }
-
+		
 		//asBlob?="asBlob"?
 		public Assignment getAsBlobAssignment_2_1_2() { return cAsBlobAssignment_2_1_2; }
-
+		
 		//"asBlob"
 		public Keyword getAsBlobAsBlobKeyword_2_1_2_0() { return cAsBlobAsBlobKeyword_2_1_2_0; }
-
+		
 		//readonly?="readonly"?
 		public Assignment getReadonlyAssignment_2_1_3() { return cReadonlyAssignment_2_1_3; }
-
+		
 		//"readonly"
 		public Keyword getReadonlyReadonlyKeyword_2_1_3_0() { return cReadonlyReadonlyKeyword_2_1_3_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
-
-		//("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		
+		//('{' (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup_4() { return cGroup_4; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
-
+		
 		//(validators+=UiValidator | bindings+=UiBinding)*
 		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }
-
+		
 		//validators+=UiValidator
 		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }
-
+		
 		//UiValidator
 		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }
-
+		
 		//bindings+=UiBinding
 		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment*
 		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
 	}
-
 	public class UiSuggestTextFieldElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiSuggestTextField");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiSuggestTextField");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiSuggestTextFieldAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cSuggestTextKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -5372,184 +5650,189 @@
 		private final Keyword cRightCurlyBracketKeyword_4_4 = (Keyword)cGroup_4.eContents().get(4);
 		
 		//UiSuggestTextField:
-		//	{UiSuggestTextField} "suggestText" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? ("{"
-		//	(("type" jvmType=JvmTypeReference ";"?)? & ("captionField" itemCaptionProperty=[JvmOperation] ";"?)? & ("filterField"
-		//	itemFilterProperty=[JvmOperation] ";"?)? & ("uuidField" itemUUIDProperty=[JvmOperation] ";"?)? &
-		//	autoHidePopup?="autoHidePopup"? & readonly?="readonly"?) (validators+=UiValidator | bindings+=UiBinding)*
-		//	processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
-		public ParserRule getRule() { return rule; }
-
-		//{UiSuggestTextField} "suggestText" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? ("{" (("type"
-		//jvmType=JvmTypeReference ";"?)? & ("captionField" itemCaptionProperty=[JvmOperation] ";"?)? & ("filterField"
-		//itemFilterProperty=[JvmOperation] ";"?)? & ("uuidField" itemUUIDProperty=[JvmOperation] ";"?)? &
-		//autoHidePopup?="autoHidePopup"? & readonly?="readonly"?) (validators+=UiValidator | bindings+=UiBinding)*
-		//processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		//	{UiSuggestTextField}
+		//	'suggestText' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=ID? ('{' (('type'
+		//	jvmType=JvmTypeReference ';'?)?
+		//	& ('captionField' itemCaptionProperty=[JvmOperation] ';'?)?
+		//	& ('filterField' itemFilterProperty=[JvmOperation] ';'?)?
+		//	& ('uuidField' itemUUIDProperty=[JvmOperation] ';'?)?
+		//	& autoHidePopup?='autoHidePopup'?
+		//	& readonly?='readonly'?) (validators+=UiValidator
+		//	| bindings+=UiBinding)*
+		//	processorAssignments+=UiVisibilityProcessorAssignment*
+		//	'}')?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiSuggestTextField} 'suggestText' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=ID? ('{' (('type'
+		//jvmType=JvmTypeReference ';'?)? & ('captionField' itemCaptionProperty=[JvmOperation] ';'?)? & ('filterField'
+		//itemFilterProperty=[JvmOperation] ';'?)? & ('uuidField' itemUUIDProperty=[JvmOperation] ';'?)? &
+		//autoHidePopup?='autoHidePopup'? & readonly?='readonly'?) (validators+=UiValidator | bindings+=UiBinding)*
+		//processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiSuggestTextField}
 		public Action getUiSuggestTextFieldAction_0() { return cUiSuggestTextFieldAction_0; }
-
-		//"suggestText"
+		
+		//'suggestText'
 		public Keyword getSuggestTextKeyword_1() { return cSuggestTextKeyword_1; }
-
-		//("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")?
+		
+		//('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
-
-		//i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?
+		
+		//i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?
 		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
-
-		//("{" (("type" jvmType=JvmTypeReference ";"?)? & ("captionField" itemCaptionProperty=[JvmOperation] ";"?)? &
-		//("filterField" itemFilterProperty=[JvmOperation] ";"?)? & ("uuidField" itemUUIDProperty=[JvmOperation] ";"?)? &
-		//autoHidePopup?="autoHidePopup"? & readonly?="readonly"?) (validators+=UiValidator | bindings+=UiBinding)*
-		//processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		
+		//('{' (('type' jvmType=JvmTypeReference ';'?)? & ('captionField' itemCaptionProperty=[JvmOperation] ';'?)? &
+		//('filterField' itemFilterProperty=[JvmOperation] ';'?)? & ('uuidField' itemUUIDProperty=[JvmOperation] ';'?)? &
+		//autoHidePopup?='autoHidePopup'? & readonly?='readonly'?) (validators+=UiValidator | bindings+=UiBinding)*
+		//processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup_4() { return cGroup_4; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
-
-		//("type" jvmType=JvmTypeReference ";"?)? & ("captionField" itemCaptionProperty=[JvmOperation] ";"?)? & ("filterField"
-		//itemFilterProperty=[JvmOperation] ";"?)? & ("uuidField" itemUUIDProperty=[JvmOperation] ";"?)? &
-		//autoHidePopup?="autoHidePopup"? & readonly?="readonly"?
+		
+		//('type' jvmType=JvmTypeReference ';'?)? & ('captionField' itemCaptionProperty=[JvmOperation] ';'?)? & ('filterField'
+		//itemFilterProperty=[JvmOperation] ';'?)? & ('uuidField' itemUUIDProperty=[JvmOperation] ';'?)? &
+		//autoHidePopup?='autoHidePopup'? & readonly?='readonly'?
 		public UnorderedGroup getUnorderedGroup_4_1() { return cUnorderedGroup_4_1; }
-
-		//("type" jvmType=JvmTypeReference ";"?)?
+		
+		//('type' jvmType=JvmTypeReference ';'?)?
 		public Group getGroup_4_1_0() { return cGroup_4_1_0; }
-
-		//"type"
+		
+		//'type'
 		public Keyword getTypeKeyword_4_1_0_0() { return cTypeKeyword_4_1_0_0; }
-
+		
 		//jvmType=JvmTypeReference
 		public Assignment getJvmTypeAssignment_4_1_0_1() { return cJvmTypeAssignment_4_1_0_1; }
-
+		
 		//JvmTypeReference
 		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_4_1_0_2() { return cSemicolonKeyword_4_1_0_2; }
-
-		//("captionField" itemCaptionProperty=[JvmOperation] ";"?)?
+		
+		//('captionField' itemCaptionProperty=[JvmOperation] ';'?)?
 		public Group getGroup_4_1_1() { return cGroup_4_1_1; }
-
-		//"captionField"
+		
+		//'captionField'
 		public Keyword getCaptionFieldKeyword_4_1_1_0() { return cCaptionFieldKeyword_4_1_1_0; }
-
+		
 		//itemCaptionProperty=[JvmOperation]
 		public Assignment getItemCaptionPropertyAssignment_4_1_1_1() { return cItemCaptionPropertyAssignment_4_1_1_1; }
-
+		
 		//[JvmOperation]
 		public CrossReference getItemCaptionPropertyJvmOperationCrossReference_4_1_1_1_0() { return cItemCaptionPropertyJvmOperationCrossReference_4_1_1_1_0; }
-
+		
 		//ID
 		public RuleCall getItemCaptionPropertyJvmOperationIDTerminalRuleCall_4_1_1_1_0_1() { return cItemCaptionPropertyJvmOperationIDTerminalRuleCall_4_1_1_1_0_1; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_4_1_1_2() { return cSemicolonKeyword_4_1_1_2; }
-
-		//("filterField" itemFilterProperty=[JvmOperation] ";"?)?
+		
+		//('filterField' itemFilterProperty=[JvmOperation] ';'?)?
 		public Group getGroup_4_1_2() { return cGroup_4_1_2; }
-
-		//"filterField"
+		
+		//'filterField'
 		public Keyword getFilterFieldKeyword_4_1_2_0() { return cFilterFieldKeyword_4_1_2_0; }
-
+		
 		//itemFilterProperty=[JvmOperation]
 		public Assignment getItemFilterPropertyAssignment_4_1_2_1() { return cItemFilterPropertyAssignment_4_1_2_1; }
-
+		
 		//[JvmOperation]
 		public CrossReference getItemFilterPropertyJvmOperationCrossReference_4_1_2_1_0() { return cItemFilterPropertyJvmOperationCrossReference_4_1_2_1_0; }
-
+		
 		//ID
 		public RuleCall getItemFilterPropertyJvmOperationIDTerminalRuleCall_4_1_2_1_0_1() { return cItemFilterPropertyJvmOperationIDTerminalRuleCall_4_1_2_1_0_1; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_4_1_2_2() { return cSemicolonKeyword_4_1_2_2; }
-
-		//("uuidField" itemUUIDProperty=[JvmOperation] ";"?)?
+		
+		//('uuidField' itemUUIDProperty=[JvmOperation] ';'?)?
 		public Group getGroup_4_1_3() { return cGroup_4_1_3; }
-
-		//"uuidField"
+		
+		//'uuidField'
 		public Keyword getUuidFieldKeyword_4_1_3_0() { return cUuidFieldKeyword_4_1_3_0; }
-
+		
 		//itemUUIDProperty=[JvmOperation]
 		public Assignment getItemUUIDPropertyAssignment_4_1_3_1() { return cItemUUIDPropertyAssignment_4_1_3_1; }
-
+		
 		//[JvmOperation]
 		public CrossReference getItemUUIDPropertyJvmOperationCrossReference_4_1_3_1_0() { return cItemUUIDPropertyJvmOperationCrossReference_4_1_3_1_0; }
-
+		
 		//ID
 		public RuleCall getItemUUIDPropertyJvmOperationIDTerminalRuleCall_4_1_3_1_0_1() { return cItemUUIDPropertyJvmOperationIDTerminalRuleCall_4_1_3_1_0_1; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_4_1_3_2() { return cSemicolonKeyword_4_1_3_2; }
-
-		//autoHidePopup?="autoHidePopup"?
+		
+		//autoHidePopup?='autoHidePopup'?
 		public Assignment getAutoHidePopupAssignment_4_1_4() { return cAutoHidePopupAssignment_4_1_4; }
-
-		//"autoHidePopup"
+		
+		//'autoHidePopup'
 		public Keyword getAutoHidePopupAutoHidePopupKeyword_4_1_4_0() { return cAutoHidePopupAutoHidePopupKeyword_4_1_4_0; }
-
-		//readonly?="readonly"?
+		
+		//readonly?='readonly'?
 		public Assignment getReadonlyAssignment_4_1_5() { return cReadonlyAssignment_4_1_5; }
-
-		//"readonly"
+		
+		//'readonly'
 		public Keyword getReadonlyReadonlyKeyword_4_1_5_0() { return cReadonlyReadonlyKeyword_4_1_5_0; }
-
+		
 		//(validators+=UiValidator | bindings+=UiBinding)*
 		public Alternatives getAlternatives_4_2() { return cAlternatives_4_2; }
-
+		
 		//validators+=UiValidator
 		public Assignment getValidatorsAssignment_4_2_0() { return cValidatorsAssignment_4_2_0; }
-
+		
 		//UiValidator
 		public RuleCall getValidatorsUiValidatorParserRuleCall_4_2_0_0() { return cValidatorsUiValidatorParserRuleCall_4_2_0_0; }
-
+		
 		//bindings+=UiBinding
 		public Assignment getBindingsAssignment_4_2_1() { return cBindingsAssignment_4_2_1; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_4_2_1_0() { return cBindingsUiBindingParserRuleCall_4_2_1_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment*
 		public Assignment getProcessorAssignmentsAssignment_4_3() { return cProcessorAssignmentsAssignment_4_3; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_4_4() { return cRightCurlyBracketKeyword_4_4; }
 	}
-
 	public class UiBeanReferenceFieldElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiBeanReferenceField");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiBeanReferenceField");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiBeanReferenceFieldAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cReferenceFieldKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -5612,209 +5895,215 @@
 		private final Keyword cRightCurlyBracketKeyword_4_4 = (Keyword)cGroup_4.eContents().get(4);
 		
 		//UiBeanReferenceField:
-		//	{UiBeanReferenceField} "referenceField" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? ("{"
-		//	(("type" jvmType=JvmTypeReference ";"?)? & ("refSource" referenceSourceJvmType=JvmTypeReference ":"
-		//	referenceSourceField=[JvmField] ";"?)? & ("captionField" captionProperty=UiNestedProperty ";"?)? & ("descriptionField"
-		//	descriptionProperty=UiNestedProperty ";"?)? & ("imageField" imageProperty=UiNestedProperty ";"?)? & ("inMemoryService"
-		//	inMemoryBeanProvider=JvmTypeReference ";"?)?) (validators+=UiValidator | bindings+=UiBinding)*
-		//	processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
-		public ParserRule getRule() { return rule; }
-
-		//{UiBeanReferenceField} "referenceField" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? ("{"
-		//(("type" jvmType=JvmTypeReference ";"?)? & ("refSource" referenceSourceJvmType=JvmTypeReference ":"
-		//referenceSourceField=[JvmField] ";"?)? & ("captionField" captionProperty=UiNestedProperty ";"?)? & ("descriptionField"
-		//descriptionProperty=UiNestedProperty ";"?)? & ("imageField" imageProperty=UiNestedProperty ";"?)? & ("inMemoryService"
-		//inMemoryBeanProvider=JvmTypeReference ";"?)?) (validators+=UiValidator | bindings+=UiBinding)*
-		//processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		//	{UiBeanReferenceField}
+		//	'referenceField' ('(' (i18nInfo=UiI18nInfo?
+		//	& ('styles' styles=STRING)?)
+		//	')')?
+		//	name=ID? ('{' (('type' jvmType=JvmTypeReference ';'?)?
+		//	& ('refSource' referenceSourceJvmType=JvmTypeReference ':' referenceSourceField=[JvmField] ';'?)?
+		//	& ('captionField' captionProperty=UiNestedProperty ';'?)?
+		//	& ('descriptionField' descriptionProperty=UiNestedProperty ';'?)?
+		//	& ('imageField' imageProperty=UiNestedProperty ';'?)?
+		//	& ('inMemoryService' inMemoryBeanProvider=JvmTypeReference ';'?)?) (validators+=UiValidator
+		//	| bindings+=UiBinding)*
+		//	processorAssignments+=UiVisibilityProcessorAssignment*
+		//	'}')?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiBeanReferenceField} 'referenceField' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=ID? ('{'
+		//(('type' jvmType=JvmTypeReference ';'?)? & ('refSource' referenceSourceJvmType=JvmTypeReference ':'
+		//referenceSourceField=[JvmField] ';'?)? & ('captionField' captionProperty=UiNestedProperty ';'?)? & ('descriptionField'
+		//descriptionProperty=UiNestedProperty ';'?)? & ('imageField' imageProperty=UiNestedProperty ';'?)? & ('inMemoryService'
+		//inMemoryBeanProvider=JvmTypeReference ';'?)?) (validators+=UiValidator | bindings+=UiBinding)*
+		//processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiBeanReferenceField}
 		public Action getUiBeanReferenceFieldAction_0() { return cUiBeanReferenceFieldAction_0; }
-
-		//"referenceField"
+		
+		//'referenceField'
 		public Keyword getReferenceFieldKeyword_1() { return cReferenceFieldKeyword_1; }
-
-		//("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")?
+		
+		//('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
-
-		//i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?
+		
+		//i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?
 		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
-
-		//("{" (("type" jvmType=JvmTypeReference ";"?)? & ("refSource" referenceSourceJvmType=JvmTypeReference ":"
-		//referenceSourceField=[JvmField] ";"?)? & ("captionField" captionProperty=UiNestedProperty ";"?)? & ("descriptionField"
-		//descriptionProperty=UiNestedProperty ";"?)? & ("imageField" imageProperty=UiNestedProperty ";"?)? & ("inMemoryService"
-		//inMemoryBeanProvider=JvmTypeReference ";"?)?) (validators+=UiValidator | bindings+=UiBinding)*
-		//processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		
+		//('{' (('type' jvmType=JvmTypeReference ';'?)? & ('refSource' referenceSourceJvmType=JvmTypeReference ':'
+		//referenceSourceField=[JvmField] ';'?)? & ('captionField' captionProperty=UiNestedProperty ';'?)? & ('descriptionField'
+		//descriptionProperty=UiNestedProperty ';'?)? & ('imageField' imageProperty=UiNestedProperty ';'?)? & ('inMemoryService'
+		//inMemoryBeanProvider=JvmTypeReference ';'?)?) (validators+=UiValidator | bindings+=UiBinding)*
+		//processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup_4() { return cGroup_4; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
-
-		//("type" jvmType=JvmTypeReference ";"?)? & ("refSource" referenceSourceJvmType=JvmTypeReference ":"
-		//referenceSourceField=[JvmField] ";"?)? & ("captionField" captionProperty=UiNestedProperty ";"?)? & ("descriptionField"
-		//descriptionProperty=UiNestedProperty ";"?)? & ("imageField" imageProperty=UiNestedProperty ";"?)? & ("inMemoryService"
-		//inMemoryBeanProvider=JvmTypeReference ";"?)?
+		
+		//('type' jvmType=JvmTypeReference ';'?)? & ('refSource' referenceSourceJvmType=JvmTypeReference ':'
+		//referenceSourceField=[JvmField] ';'?)? & ('captionField' captionProperty=UiNestedProperty ';'?)? & ('descriptionField'
+		//descriptionProperty=UiNestedProperty ';'?)? & ('imageField' imageProperty=UiNestedProperty ';'?)? & ('inMemoryService'
+		//inMemoryBeanProvider=JvmTypeReference ';'?)?
 		public UnorderedGroup getUnorderedGroup_4_1() { return cUnorderedGroup_4_1; }
-
-		//("type" jvmType=JvmTypeReference ";"?)?
+		
+		//('type' jvmType=JvmTypeReference ';'?)?
 		public Group getGroup_4_1_0() { return cGroup_4_1_0; }
-
-		//"type"
+		
+		//'type'
 		public Keyword getTypeKeyword_4_1_0_0() { return cTypeKeyword_4_1_0_0; }
-
+		
 		//jvmType=JvmTypeReference
 		public Assignment getJvmTypeAssignment_4_1_0_1() { return cJvmTypeAssignment_4_1_0_1; }
-
+		
 		//JvmTypeReference
 		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_4_1_0_2() { return cSemicolonKeyword_4_1_0_2; }
-
-		//("refSource" referenceSourceJvmType=JvmTypeReference ":" referenceSourceField=[JvmField] ";"?)?
+		
+		//('refSource' referenceSourceJvmType=JvmTypeReference ':' referenceSourceField=[JvmField] ';'?)?
 		public Group getGroup_4_1_1() { return cGroup_4_1_1; }
-
-		//"refSource"
+		
+		//'refSource'
 		public Keyword getRefSourceKeyword_4_1_1_0() { return cRefSourceKeyword_4_1_1_0; }
-
+		
 		//referenceSourceJvmType=JvmTypeReference
 		public Assignment getReferenceSourceJvmTypeAssignment_4_1_1_1() { return cReferenceSourceJvmTypeAssignment_4_1_1_1; }
-
+		
 		//JvmTypeReference
 		public RuleCall getReferenceSourceJvmTypeJvmTypeReferenceParserRuleCall_4_1_1_1_0() { return cReferenceSourceJvmTypeJvmTypeReferenceParserRuleCall_4_1_1_1_0; }
-
-		//":"
+		
+		//':'
 		public Keyword getColonKeyword_4_1_1_2() { return cColonKeyword_4_1_1_2; }
-
+		
 		//referenceSourceField=[JvmField]
 		public Assignment getReferenceSourceFieldAssignment_4_1_1_3() { return cReferenceSourceFieldAssignment_4_1_1_3; }
-
+		
 		//[JvmField]
 		public CrossReference getReferenceSourceFieldJvmFieldCrossReference_4_1_1_3_0() { return cReferenceSourceFieldJvmFieldCrossReference_4_1_1_3_0; }
-
+		
 		//ID
 		public RuleCall getReferenceSourceFieldJvmFieldIDTerminalRuleCall_4_1_1_3_0_1() { return cReferenceSourceFieldJvmFieldIDTerminalRuleCall_4_1_1_3_0_1; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_4_1_1_4() { return cSemicolonKeyword_4_1_1_4; }
-
-		//("captionField" captionProperty=UiNestedProperty ";"?)?
+		
+		//('captionField' captionProperty=UiNestedProperty ';'?)?
 		public Group getGroup_4_1_2() { return cGroup_4_1_2; }
-
-		//"captionField"
+		
+		//'captionField'
 		public Keyword getCaptionFieldKeyword_4_1_2_0() { return cCaptionFieldKeyword_4_1_2_0; }
-
+		
 		//captionProperty=UiNestedProperty
 		public Assignment getCaptionPropertyAssignment_4_1_2_1() { return cCaptionPropertyAssignment_4_1_2_1; }
-
+		
 		//UiNestedProperty
 		public RuleCall getCaptionPropertyUiNestedPropertyParserRuleCall_4_1_2_1_0() { return cCaptionPropertyUiNestedPropertyParserRuleCall_4_1_2_1_0; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_4_1_2_2() { return cSemicolonKeyword_4_1_2_2; }
-
-		//("descriptionField" descriptionProperty=UiNestedProperty ";"?)?
+		
+		//('descriptionField' descriptionProperty=UiNestedProperty ';'?)?
 		public Group getGroup_4_1_3() { return cGroup_4_1_3; }
-
-		//"descriptionField"
+		
+		//'descriptionField'
 		public Keyword getDescriptionFieldKeyword_4_1_3_0() { return cDescriptionFieldKeyword_4_1_3_0; }
-
+		
 		//descriptionProperty=UiNestedProperty
 		public Assignment getDescriptionPropertyAssignment_4_1_3_1() { return cDescriptionPropertyAssignment_4_1_3_1; }
-
+		
 		//UiNestedProperty
 		public RuleCall getDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_3_1_0() { return cDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_3_1_0; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_4_1_3_2() { return cSemicolonKeyword_4_1_3_2; }
-
-		//("imageField" imageProperty=UiNestedProperty ";"?)?
+		
+		//('imageField' imageProperty=UiNestedProperty ';'?)?
 		public Group getGroup_4_1_4() { return cGroup_4_1_4; }
-
-		//"imageField"
+		
+		//'imageField'
 		public Keyword getImageFieldKeyword_4_1_4_0() { return cImageFieldKeyword_4_1_4_0; }
-
+		
 		//imageProperty=UiNestedProperty
 		public Assignment getImagePropertyAssignment_4_1_4_1() { return cImagePropertyAssignment_4_1_4_1; }
-
+		
 		//UiNestedProperty
 		public RuleCall getImagePropertyUiNestedPropertyParserRuleCall_4_1_4_1_0() { return cImagePropertyUiNestedPropertyParserRuleCall_4_1_4_1_0; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_4_1_4_2() { return cSemicolonKeyword_4_1_4_2; }
-
-		//("inMemoryService" inMemoryBeanProvider=JvmTypeReference ";"?)?
+		
+		//('inMemoryService' inMemoryBeanProvider=JvmTypeReference ';'?)?
 		public Group getGroup_4_1_5() { return cGroup_4_1_5; }
-
-		//"inMemoryService"
+		
+		//'inMemoryService'
 		public Keyword getInMemoryServiceKeyword_4_1_5_0() { return cInMemoryServiceKeyword_4_1_5_0; }
-
+		
 		//inMemoryBeanProvider=JvmTypeReference
 		public Assignment getInMemoryBeanProviderAssignment_4_1_5_1() { return cInMemoryBeanProviderAssignment_4_1_5_1; }
-
+		
 		//JvmTypeReference
 		public RuleCall getInMemoryBeanProviderJvmTypeReferenceParserRuleCall_4_1_5_1_0() { return cInMemoryBeanProviderJvmTypeReferenceParserRuleCall_4_1_5_1_0; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_4_1_5_2() { return cSemicolonKeyword_4_1_5_2; }
-
+		
 		//(validators+=UiValidator | bindings+=UiBinding)*
 		public Alternatives getAlternatives_4_2() { return cAlternatives_4_2; }
-
+		
 		//validators+=UiValidator
 		public Assignment getValidatorsAssignment_4_2_0() { return cValidatorsAssignment_4_2_0; }
-
+		
 		//UiValidator
 		public RuleCall getValidatorsUiValidatorParserRuleCall_4_2_0_0() { return cValidatorsUiValidatorParserRuleCall_4_2_0_0; }
-
+		
 		//bindings+=UiBinding
 		public Assignment getBindingsAssignment_4_2_1() { return cBindingsAssignment_4_2_1; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_4_2_1_0() { return cBindingsUiBindingParserRuleCall_4_2_1_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment*
 		public Assignment getProcessorAssignmentsAssignment_4_3() { return cProcessorAssignmentsAssignment_4_3; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_4_4() { return cRightCurlyBracketKeyword_4_4; }
 	}
-
 	public class UiSearchFieldElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiSearchField");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiSearchField");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiSearchFieldAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cSearchfieldKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -5832,57 +6121,57 @@
 		private final RuleCall cPropertyUiNestedPropertyParserRuleCall_3_0 = (RuleCall)cPropertyAssignment_3.eContents().get(0);
 		
 		//UiSearchField:
-		//	{UiSearchField} "searchfield" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? property=UiNestedProperty;
-		public ParserRule getRule() { return rule; }
-
-		//{UiSearchField} "searchfield" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? property=UiNestedProperty
+		//	{UiSearchField}
+		//	'searchfield' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? property=UiNestedProperty;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiSearchField} 'searchfield' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? property=UiNestedProperty
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiSearchField}
 		public Action getUiSearchFieldAction_0() { return cUiSearchFieldAction_0; }
-
-		//"searchfield"
+		
+		//'searchfield'
 		public Keyword getSearchfieldKeyword_1() { return cSearchfieldKeyword_1; }
-
-		//("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")?
+		
+		//('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
-
-		//i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?
+		
+		//i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?
 		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
-
+		
 		//property=UiNestedProperty
 		public Assignment getPropertyAssignment_3() { return cPropertyAssignment_3; }
-
+		
 		//UiNestedProperty
 		public RuleCall getPropertyUiNestedPropertyParserRuleCall_3_0() { return cPropertyUiNestedPropertyParserRuleCall_3_0; }
 	}
-
 	public class UiTextAreaElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiTextArea");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiTextArea");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiTextAreaAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cTextareaKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -5912,95 +6201,101 @@
 		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
 		
 		//UiTextArea:
-		//	{UiTextArea} "textarea" ("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?) ")")? name=ID?
-		//	("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
-		public ParserRule getRule() { return rule; }
-
-		//{UiTextArea} "textarea" ("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?) ")")? name=ID?
-		//("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		//	{UiTextArea}
+		//	'textarea' ('(' (i18nInfo=UiI18nInfo?
+		//	& readonly?="readonly"?
+		//	& ('styles' styles=STRING)?)
+		//	')')?
+		//	name=ID? ('{' (validators+=UiValidator
+		//	| bindings+=UiBinding)*
+		//	processorAssignments+=UiVisibilityProcessorAssignment*
+		//	'}')?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiTextArea} 'textarea' ('(' (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?) ')')? name=ID?
+		//('{' (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiTextArea}
 		public Action getUiTextAreaAction_0() { return cUiTextAreaAction_0; }
-
-		//"textarea"
+		
+		//'textarea'
 		public Keyword getTextareaKeyword_1() { return cTextareaKeyword_1; }
-
-		//("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?) ")")?
+		
+		//('(' (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?) ')')?
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
-
-		//i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?
+		
+		//i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?
 		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
-
+		
 		//readonly?="readonly"?
 		public Assignment getReadonlyAssignment_2_1_1() { return cReadonlyAssignment_2_1_1; }
-
+		
 		//"readonly"
 		public Keyword getReadonlyReadonlyKeyword_2_1_1_0() { return cReadonlyReadonlyKeyword_2_1_1_0; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_1_2() { return cGroup_2_1_2; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_1_2_0() { return cStylesKeyword_2_1_2_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_1_2_1() { return cStylesAssignment_2_1_2_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_2_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_2_1_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
-
-		//("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		
+		//('{' (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup_4() { return cGroup_4; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
-
+		
 		//(validators+=UiValidator | bindings+=UiBinding)*
 		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }
-
+		
 		//validators+=UiValidator
 		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }
-
+		
 		//UiValidator
 		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }
-
+		
 		//bindings+=UiBinding
 		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment*
 		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
 	}
-
 	public class UiDateFieldElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiDateField");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiDateField");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiDateFieldAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cDatefieldKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -6034,111 +6329,118 @@
 		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
 		
 		//UiDateField:
-		//	{UiDateField} "datefield" ("(" (dateFormat=UiDateFormat? & resolution=UiDateTimeResolution? & ("styles"
-		//	styles=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ")")? name=ID? ("{" (validators+=UiValidator |
-		//	bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
-		public ParserRule getRule() { return rule; }
-
-		//{UiDateField} "datefield" ("(" (dateFormat=UiDateFormat? & resolution=UiDateTimeResolution? & ("styles" styles=STRING)?
-		//& i18nInfo=UiI18nInfo? & readonly?="readonly"?) ")")? name=ID? ("{" (validators+=UiValidator | bindings+=UiBinding)*
-		//processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		//	{UiDateField}
+		//	'datefield' ('(' (dateFormat=UiDateFormat?
+		//	& resolution=UiDateTimeResolution?
+		//	& ('styles' styles=STRING)?
+		//	& i18nInfo=UiI18nInfo?
+		//	& readonly?="readonly"?)
+		//	')')?
+		//	name=ID? ('{' (validators+=UiValidator
+		//	| bindings+=UiBinding)*
+		//	processorAssignments+=UiVisibilityProcessorAssignment*
+		//	'}')?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiDateField} 'datefield' ('(' (dateFormat=UiDateFormat? & resolution=UiDateTimeResolution? & ('styles' styles=STRING)?
+		//& i18nInfo=UiI18nInfo? & readonly?="readonly"?) ')')? name=ID? ('{' (validators+=UiValidator | bindings+=UiBinding)*
+		//processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiDateField}
 		public Action getUiDateFieldAction_0() { return cUiDateFieldAction_0; }
-
-		//"datefield"
+		
+		//'datefield'
 		public Keyword getDatefieldKeyword_1() { return cDatefieldKeyword_1; }
-
-		//("(" (dateFormat=UiDateFormat? & resolution=UiDateTimeResolution? & ("styles" styles=STRING)? & i18nInfo=UiI18nInfo? &
-		//readonly?="readonly"?) ")")?
+		
+		//('(' (dateFormat=UiDateFormat? & resolution=UiDateTimeResolution? & ('styles' styles=STRING)? & i18nInfo=UiI18nInfo? &
+		//readonly?="readonly"?) ')')?
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
-
-		//dateFormat=UiDateFormat? & resolution=UiDateTimeResolution? & ("styles" styles=STRING)? & i18nInfo=UiI18nInfo? &
+		
+		//dateFormat=UiDateFormat? & resolution=UiDateTimeResolution? & ('styles' styles=STRING)? & i18nInfo=UiI18nInfo? &
 		//readonly?="readonly"?
 		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
-
+		
 		//dateFormat=UiDateFormat?
 		public Assignment getDateFormatAssignment_2_1_0() { return cDateFormatAssignment_2_1_0; }
-
+		
 		//UiDateFormat
 		public RuleCall getDateFormatUiDateFormatEnumRuleCall_2_1_0_0() { return cDateFormatUiDateFormatEnumRuleCall_2_1_0_0; }
-
+		
 		//resolution=UiDateTimeResolution?
 		public Assignment getResolutionAssignment_2_1_1() { return cResolutionAssignment_2_1_1; }
-
+		
 		//UiDateTimeResolution
 		public RuleCall getResolutionUiDateTimeResolutionEnumRuleCall_2_1_1_0() { return cResolutionUiDateTimeResolutionEnumRuleCall_2_1_1_0; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_1_2() { return cGroup_2_1_2; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_1_2_0() { return cStylesKeyword_2_1_2_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_1_2_1() { return cStylesAssignment_2_1_2_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_2_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_2_1_0; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_1_3() { return cI18nInfoAssignment_2_1_3; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_3_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_3_0; }
-
+		
 		//readonly?="readonly"?
 		public Assignment getReadonlyAssignment_2_1_4() { return cReadonlyAssignment_2_1_4; }
-
+		
 		//"readonly"
 		public Keyword getReadonlyReadonlyKeyword_2_1_4_0() { return cReadonlyReadonlyKeyword_2_1_4_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
-
-		//("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		
+		//('{' (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup_4() { return cGroup_4; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
-
+		
 		//(validators+=UiValidator | bindings+=UiBinding)*
 		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }
-
+		
 		//validators+=UiValidator
 		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }
-
+		
 		//UiValidator
 		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }
-
+		
 		//bindings+=UiBinding
 		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment*
 		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
 	}
-
 	public class UiBrowserElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiBrowser");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiBrowser");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiBrowserAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cBrowserKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -6168,95 +6470,100 @@
 		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
 		
 		//UiBrowser:
-		//	{UiBrowser} "browser" ("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?) ")")? name=ID?
-		//	("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
-		public ParserRule getRule() { return rule; }
-
-		//{UiBrowser} "browser" ("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?) ")")? name=ID?
-		//("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		//	{UiBrowser}
+		//	'browser' ('(' (i18nInfo=UiI18nInfo?
+		//	& readonly?="readonly"?
+		//	& ('styles' styles=STRING)?)
+		//	')')? name=ID? ('{' (validators+=UiValidator
+		//	| bindings+=UiBinding)*
+		//	processorAssignments+=UiVisibilityProcessorAssignment*
+		//	'}')?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiBrowser} 'browser' ('(' (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?) ')')? name=ID?
+		//('{' (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiBrowser}
 		public Action getUiBrowserAction_0() { return cUiBrowserAction_0; }
-
-		//"browser"
+		
+		//'browser'
 		public Keyword getBrowserKeyword_1() { return cBrowserKeyword_1; }
-
-		//("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?) ")")?
+		
+		//('(' (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?) ')')?
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
-
-		//i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?
+		
+		//i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?
 		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
-
+		
 		//readonly?="readonly"?
 		public Assignment getReadonlyAssignment_2_1_1() { return cReadonlyAssignment_2_1_1; }
-
+		
 		//"readonly"
 		public Keyword getReadonlyReadonlyKeyword_2_1_1_0() { return cReadonlyReadonlyKeyword_2_1_1_0; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_1_2() { return cGroup_2_1_2; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_1_2_0() { return cStylesKeyword_2_1_2_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_1_2_1() { return cStylesAssignment_2_1_2_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_2_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_2_1_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
-
-		//("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		
+		//('{' (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup_4() { return cGroup_4; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
-
+		
 		//(validators+=UiValidator | bindings+=UiBinding)*
 		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }
-
+		
 		//validators+=UiValidator
 		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }
-
+		
 		//UiValidator
 		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }
-
+		
 		//bindings+=UiBinding
 		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment*
 		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
 	}
-
 	public class UiProgressBarElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiProgressBar");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiProgressBar");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiProgressBarAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cProgressbarKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -6284,89 +6591,91 @@
 		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
 		
 		//UiProgressBar:
-		//	{UiProgressBar} "progressbar" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? ("{"
-		//	(validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
-		public ParserRule getRule() { return rule; }
-
-		//{UiProgressBar} "progressbar" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? ("{"
-		//(validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		//	{UiProgressBar}
+		//	'progressbar' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=ID? ('{' (validators+=UiValidator
+		//	| bindings+=UiBinding)*
+		//	processorAssignments+=UiVisibilityProcessorAssignment*
+		//	'}')?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiProgressBar} 'progressbar' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=ID? ('{'
+		//(validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiProgressBar}
 		public Action getUiProgressBarAction_0() { return cUiProgressBarAction_0; }
-
-		//"progressbar"
+		
+		//'progressbar'
 		public Keyword getProgressbarKeyword_1() { return cProgressbarKeyword_1; }
-
-		//("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")?
+		
+		//('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
-
-		//i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?
+		
+		//i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?
 		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
-
-		//("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		
+		//('{' (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup_4() { return cGroup_4; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
-
+		
 		//(validators+=UiValidator | bindings+=UiBinding)*
 		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }
-
+		
 		//validators+=UiValidator
 		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }
-
+		
 		//UiValidator
 		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }
-
+		
 		//bindings+=UiBinding
 		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment*
 		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
 	}
-
 	public class UiImageElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiImage");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiImage");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiImageAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cImageKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -6396,95 +6705,97 @@
 		private final Keyword cRightCurlyBracketKeyword_4_4 = (Keyword)cGroup_4.eContents().get(4);
 		
 		//UiImage:
-		//	{UiImage} "image" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? ("{" ("iconPath" value=STRING
-		//	";"?)? bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
-		public ParserRule getRule() { return rule; }
-
-		//{UiImage} "image" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? ("{" ("iconPath" value=STRING
-		//";"?)? bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		//	{UiImage}
+		//	'image' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=ID? ('{' ('iconPath' value=STRING ';'?)?
+		//	bindings+=UiBinding*
+		//	processorAssignments+=UiVisibilityProcessorAssignment*
+		//	'}')?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiImage} 'image' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=ID? ('{' ('iconPath' value=STRING
+		//';'?)? bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiImage}
 		public Action getUiImageAction_0() { return cUiImageAction_0; }
-
-		//"image"
+		
+		//'image'
 		public Keyword getImageKeyword_1() { return cImageKeyword_1; }
-
-		//("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")?
+		
+		//('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
-
-		//i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?
+		
+		//i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?
 		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
-
-		//("{" ("iconPath" value=STRING ";"?)? bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		
+		//('{' ('iconPath' value=STRING ';'?)? bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup_4() { return cGroup_4; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
-
-		//("iconPath" value=STRING ";"?)?
+		
+		//('iconPath' value=STRING ';'?)?
 		public Group getGroup_4_1() { return cGroup_4_1; }
-
-		//"iconPath"
+		
+		//'iconPath'
 		public Keyword getIconPathKeyword_4_1_0() { return cIconPathKeyword_4_1_0; }
-
+		
 		//value=STRING
 		public Assignment getValueAssignment_4_1_1() { return cValueAssignment_4_1_1; }
-
+		
 		//STRING
 		public RuleCall getValueSTRINGTerminalRuleCall_4_1_1_0() { return cValueSTRINGTerminalRuleCall_4_1_1_0; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_4_1_2() { return cSemicolonKeyword_4_1_2; }
-
+		
 		//bindings+=UiBinding*
 		public Assignment getBindingsAssignment_4_2() { return cBindingsAssignment_4_2; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_4_2_0() { return cBindingsUiBindingParserRuleCall_4_2_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment*
 		public Assignment getProcessorAssignmentsAssignment_4_3() { return cProcessorAssignmentsAssignment_4_3; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_4_4() { return cRightCurlyBracketKeyword_4_4; }
 	}
-
 	public class UiTableElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiTable");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiTable");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiTableAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cTableKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -6523,8 +6834,12 @@
 		private final Assignment cConsumeBeanServiceAssignment_4_1_3_0 = (Assignment)cGroup_4_1_3.eContents().get(0);
 		private final Keyword cConsumeBeanServiceUseBeanServiceKeyword_4_1_3_0_0 = (Keyword)cConsumeBeanServiceAssignment_4_1_3_0.eContents().get(0);
 		private final Keyword cSemicolonKeyword_4_1_3_1 = (Keyword)cGroup_4_1_3.eContents().get(1);
-		private final Assignment cReadonlyAssignment_4_1_4 = (Assignment)cUnorderedGroup_4_1.eContents().get(4);
-		private final Keyword cReadonlyReadonlyKeyword_4_1_4_0 = (Keyword)cReadonlyAssignment_4_1_4.eContents().get(0);
+		private final Group cGroup_4_1_4 = (Group)cUnorderedGroup_4_1.eContents().get(4);
+		private final Assignment cScrollToBottomAssignment_4_1_4_0 = (Assignment)cGroup_4_1_4.eContents().get(0);
+		private final Keyword cScrollToBottomScrollToBottomKeyword_4_1_4_0_0 = (Keyword)cScrollToBottomAssignment_4_1_4_0.eContents().get(0);
+		private final Keyword cSemicolonKeyword_4_1_4_1 = (Keyword)cGroup_4_1_4.eContents().get(1);
+		private final Assignment cReadonlyAssignment_4_1_5 = (Assignment)cUnorderedGroup_4_1.eContents().get(5);
+		private final Keyword cReadonlyReadonlyKeyword_4_1_5_0 = (Keyword)cReadonlyAssignment_4_1_5.eContents().get(0);
 		private final Assignment cColumnAssignmentAssignment_4_2 = (Assignment)cGroup_4.eContents().get(2);
 		private final RuleCall cColumnAssignmentUiColumnsAssignmentParserRuleCall_4_2_0 = (RuleCall)cColumnAssignmentAssignment_4_2.eContents().get(0);
 		private final Assignment cSortOrderAssignmentAssignment_4_3 = (Assignment)cGroup_4.eContents().get(3);
@@ -6539,180 +6854,201 @@
 		private final Keyword cRightCurlyBracketKeyword_4_6 = (Keyword)cGroup_4.eContents().get(6);
 		
 		//UiTable:
-		//	{UiTable} "table" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? ("{" (("type"
-		//	jvmType=JvmTypeReference ";"?)? & ("selectionType" selectionType=UiSelectionType ";"?)? & ("imageField"
-		//	itemImageProperty=[JvmOperation] ";"?)? & (consumeBeanService?="useBeanService" ";"?)? & readonly?="readonly"?)
-		//	columnAssignment=UiColumnsAssignment? sortOrderAssignment=UiSortOrderAssignment? (validators+=UiValidator |
-		//	bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
-		public ParserRule getRule() { return rule; }
-
-		//{UiTable} "table" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? ("{" (("type"
-		//jvmType=JvmTypeReference ";"?)? & ("selectionType" selectionType=UiSelectionType ";"?)? & ("imageField"
-		//itemImageProperty=[JvmOperation] ";"?)? & (consumeBeanService?="useBeanService" ";"?)? & readonly?="readonly"?)
-		//columnAssignment=UiColumnsAssignment? sortOrderAssignment=UiSortOrderAssignment? (validators+=UiValidator |
-		//bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		//	{UiTable}
+		//	'table' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=ID? ('{' (('type' jvmType=JvmTypeReference
+		//	';'?)?
+		//	& ('selectionType' selectionType=UiSelectionType ';'?)?
+		//	& ('imageField' itemImageProperty=[JvmOperation] ';'?)?
+		//	& (consumeBeanService?='useBeanService' ';'?)?
+		//	& (scrollToBottom?='scrollToBottom' ';'?)?
+		//	& readonly?="readonly"?) columnAssignment=UiColumnsAssignment?
+		//	sortOrderAssignment=UiSortOrderAssignment? (validators+=UiValidator
+		//	| bindings+=UiBinding)*
+		//	processorAssignments+=UiVisibilityProcessorAssignment*
+		//	'}')?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiTable} 'table' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=ID? ('{' (('type'
+		//jvmType=JvmTypeReference ';'?)? & ('selectionType' selectionType=UiSelectionType ';'?)? & ('imageField'
+		//itemImageProperty=[JvmOperation] ';'?)? & (consumeBeanService?='useBeanService' ';'?)? &
+		//(scrollToBottom?='scrollToBottom' ';'?)? & readonly?="readonly"?) columnAssignment=UiColumnsAssignment?
+		//sortOrderAssignment=UiSortOrderAssignment? (validators+=UiValidator | bindings+=UiBinding)*
+		//processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiTable}
 		public Action getUiTableAction_0() { return cUiTableAction_0; }
-
-		//"table"
+		
+		//'table'
 		public Keyword getTableKeyword_1() { return cTableKeyword_1; }
-
-		//("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")?
+		
+		//('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
-
-		//i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?
+		
+		//i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?
 		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
-
-		//("{" (("type" jvmType=JvmTypeReference ";"?)? & ("selectionType" selectionType=UiSelectionType ";"?)? & ("imageField"
-		//itemImageProperty=[JvmOperation] ";"?)? & (consumeBeanService?="useBeanService" ";"?)? & readonly?="readonly"?)
-		//columnAssignment=UiColumnsAssignment? sortOrderAssignment=UiSortOrderAssignment? (validators+=UiValidator |
-		//bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		
+		//('{' (('type' jvmType=JvmTypeReference ';'?)? & ('selectionType' selectionType=UiSelectionType ';'?)? & ('imageField'
+		//itemImageProperty=[JvmOperation] ';'?)? & (consumeBeanService?='useBeanService' ';'?)? &
+		//(scrollToBottom?='scrollToBottom' ';'?)? & readonly?="readonly"?) columnAssignment=UiColumnsAssignment?
+		//sortOrderAssignment=UiSortOrderAssignment? (validators+=UiValidator | bindings+=UiBinding)*
+		//processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup_4() { return cGroup_4; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
-
-		//("type" jvmType=JvmTypeReference ";"?)? & ("selectionType" selectionType=UiSelectionType ";"?)? & ("imageField"
-		//itemImageProperty=[JvmOperation] ";"?)? & (consumeBeanService?="useBeanService" ";"?)? & readonly?="readonly"?
+		
+		//('type' jvmType=JvmTypeReference ';'?)? & ('selectionType' selectionType=UiSelectionType ';'?)? & ('imageField'
+		//itemImageProperty=[JvmOperation] ';'?)? & (consumeBeanService?='useBeanService' ';'?)? &
+		//(scrollToBottom?='scrollToBottom' ';'?)? & readonly?="readonly"?
 		public UnorderedGroup getUnorderedGroup_4_1() { return cUnorderedGroup_4_1; }
-
-		//("type" jvmType=JvmTypeReference ";"?)?
+		
+		//('type' jvmType=JvmTypeReference ';'?)?
 		public Group getGroup_4_1_0() { return cGroup_4_1_0; }
-
-		//"type"
+		
+		//'type'
 		public Keyword getTypeKeyword_4_1_0_0() { return cTypeKeyword_4_1_0_0; }
-
+		
 		//jvmType=JvmTypeReference
 		public Assignment getJvmTypeAssignment_4_1_0_1() { return cJvmTypeAssignment_4_1_0_1; }
-
+		
 		//JvmTypeReference
 		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_4_1_0_2() { return cSemicolonKeyword_4_1_0_2; }
-
-		//("selectionType" selectionType=UiSelectionType ";"?)?
+		
+		//('selectionType' selectionType=UiSelectionType ';'?)?
 		public Group getGroup_4_1_1() { return cGroup_4_1_1; }
-
-		//"selectionType"
+		
+		//'selectionType'
 		public Keyword getSelectionTypeKeyword_4_1_1_0() { return cSelectionTypeKeyword_4_1_1_0; }
-
+		
 		//selectionType=UiSelectionType
 		public Assignment getSelectionTypeAssignment_4_1_1_1() { return cSelectionTypeAssignment_4_1_1_1; }
-
+		
 		//UiSelectionType
 		public RuleCall getSelectionTypeUiSelectionTypeEnumRuleCall_4_1_1_1_0() { return cSelectionTypeUiSelectionTypeEnumRuleCall_4_1_1_1_0; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_4_1_1_2() { return cSemicolonKeyword_4_1_1_2; }
-
-		//("imageField" itemImageProperty=[JvmOperation] ";"?)?
+		
+		//('imageField' itemImageProperty=[JvmOperation] ';'?)?
 		public Group getGroup_4_1_2() { return cGroup_4_1_2; }
-
-		//"imageField"
+		
+		//'imageField'
 		public Keyword getImageFieldKeyword_4_1_2_0() { return cImageFieldKeyword_4_1_2_0; }
-
+		
 		//itemImageProperty=[JvmOperation]
 		public Assignment getItemImagePropertyAssignment_4_1_2_1() { return cItemImagePropertyAssignment_4_1_2_1; }
-
+		
 		//[JvmOperation]
 		public CrossReference getItemImagePropertyJvmOperationCrossReference_4_1_2_1_0() { return cItemImagePropertyJvmOperationCrossReference_4_1_2_1_0; }
-
+		
 		//ID
 		public RuleCall getItemImagePropertyJvmOperationIDTerminalRuleCall_4_1_2_1_0_1() { return cItemImagePropertyJvmOperationIDTerminalRuleCall_4_1_2_1_0_1; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_4_1_2_2() { return cSemicolonKeyword_4_1_2_2; }
-
-		//(consumeBeanService?="useBeanService" ";"?)?
+		
+		//(consumeBeanService?='useBeanService' ';'?)?
 		public Group getGroup_4_1_3() { return cGroup_4_1_3; }
-
-		//consumeBeanService?="useBeanService"
+		
+		//consumeBeanService?='useBeanService'
 		public Assignment getConsumeBeanServiceAssignment_4_1_3_0() { return cConsumeBeanServiceAssignment_4_1_3_0; }
-
-		//"useBeanService"
+		
+		//'useBeanService'
 		public Keyword getConsumeBeanServiceUseBeanServiceKeyword_4_1_3_0_0() { return cConsumeBeanServiceUseBeanServiceKeyword_4_1_3_0_0; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_4_1_3_1() { return cSemicolonKeyword_4_1_3_1; }
-
+		
+		//(scrollToBottom?='scrollToBottom' ';'?)?
+		public Group getGroup_4_1_4() { return cGroup_4_1_4; }
+		
+		//scrollToBottom?='scrollToBottom'
+		public Assignment getScrollToBottomAssignment_4_1_4_0() { return cScrollToBottomAssignment_4_1_4_0; }
+		
+		//'scrollToBottom'
+		public Keyword getScrollToBottomScrollToBottomKeyword_4_1_4_0_0() { return cScrollToBottomScrollToBottomKeyword_4_1_4_0_0; }
+		
+		//';'?
+		public Keyword getSemicolonKeyword_4_1_4_1() { return cSemicolonKeyword_4_1_4_1; }
+		
 		//readonly?="readonly"?
-		public Assignment getReadonlyAssignment_4_1_4() { return cReadonlyAssignment_4_1_4; }
-
+		public Assignment getReadonlyAssignment_4_1_5() { return cReadonlyAssignment_4_1_5; }
+		
 		//"readonly"
-		public Keyword getReadonlyReadonlyKeyword_4_1_4_0() { return cReadonlyReadonlyKeyword_4_1_4_0; }
-
+		public Keyword getReadonlyReadonlyKeyword_4_1_5_0() { return cReadonlyReadonlyKeyword_4_1_5_0; }
+		
 		//columnAssignment=UiColumnsAssignment?
 		public Assignment getColumnAssignmentAssignment_4_2() { return cColumnAssignmentAssignment_4_2; }
-
+		
 		//UiColumnsAssignment
 		public RuleCall getColumnAssignmentUiColumnsAssignmentParserRuleCall_4_2_0() { return cColumnAssignmentUiColumnsAssignmentParserRuleCall_4_2_0; }
-
+		
 		//sortOrderAssignment=UiSortOrderAssignment?
 		public Assignment getSortOrderAssignmentAssignment_4_3() { return cSortOrderAssignmentAssignment_4_3; }
-
+		
 		//UiSortOrderAssignment
 		public RuleCall getSortOrderAssignmentUiSortOrderAssignmentParserRuleCall_4_3_0() { return cSortOrderAssignmentUiSortOrderAssignmentParserRuleCall_4_3_0; }
-
+		
 		//(validators+=UiValidator | bindings+=UiBinding)*
 		public Alternatives getAlternatives_4_4() { return cAlternatives_4_4; }
-
+		
 		//validators+=UiValidator
 		public Assignment getValidatorsAssignment_4_4_0() { return cValidatorsAssignment_4_4_0; }
-
+		
 		//UiValidator
 		public RuleCall getValidatorsUiValidatorParserRuleCall_4_4_0_0() { return cValidatorsUiValidatorParserRuleCall_4_4_0_0; }
-
+		
 		//bindings+=UiBinding
 		public Assignment getBindingsAssignment_4_4_1() { return cBindingsAssignment_4_4_1; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_4_4_1_0() { return cBindingsUiBindingParserRuleCall_4_4_1_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment*
 		public Assignment getProcessorAssignmentsAssignment_4_5() { return cProcessorAssignmentsAssignment_4_5; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_5_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_5_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_4_6() { return cRightCurlyBracketKeyword_4_6; }
 	}
-
 	public class UiComboBoxElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiComboBox");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiComboBox");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiComboBoxAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cComboKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -6769,187 +7105,192 @@
 		private final Keyword cRightCurlyBracketKeyword_4_4 = (Keyword)cGroup_4.eContents().get(4);
 		
 		//UiComboBox:
-		//	{UiComboBox} "combo" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? ("{" (("type"
-		//	jvmType=JvmTypeReference ";"?)? & ("captionField" itemCaptionProperty=[JvmOperation] ";"?)? & ("descriptionField"
-		//	descriptionProperty=UiNestedProperty ";"?)? & ("imageField" itemImageProperty=[JvmOperation] ";"?)? &
-		//	(consumeBeanService?="useBeanService" ";"?)? & readonly?="readonly"?) (validators+=UiValidator | bindings+=UiBinding)*
-		//	processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
-		public ParserRule getRule() { return rule; }
-
-		//{UiComboBox} "combo" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? ("{" (("type"
-		//jvmType=JvmTypeReference ";"?)? & ("captionField" itemCaptionProperty=[JvmOperation] ";"?)? & ("descriptionField"
-		//descriptionProperty=UiNestedProperty ";"?)? & ("imageField" itemImageProperty=[JvmOperation] ";"?)? &
-		//(consumeBeanService?="useBeanService" ";"?)? & readonly?="readonly"?) (validators+=UiValidator | bindings+=UiBinding)*
-		//processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		//	{UiComboBox}
+		//	'combo' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=ID? ('{' (('type' jvmType=JvmTypeReference
+		//	';'?)?
+		//	& ('captionField' itemCaptionProperty=[JvmOperation] ';'?)?
+		//	& ('descriptionField' descriptionProperty=UiNestedProperty ';'?)?
+		//	& ('imageField' itemImageProperty=[JvmOperation] ';'?)?
+		//	& (consumeBeanService?='useBeanService' ';'?)?
+		//	& readonly?='readonly'?) (validators+=UiValidator
+		//	| bindings+=UiBinding)*
+		//	processorAssignments+=UiVisibilityProcessorAssignment*
+		//	'}')?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiComboBox} 'combo' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=ID? ('{' (('type'
+		//jvmType=JvmTypeReference ';'?)? & ('captionField' itemCaptionProperty=[JvmOperation] ';'?)? & ('descriptionField'
+		//descriptionProperty=UiNestedProperty ';'?)? & ('imageField' itemImageProperty=[JvmOperation] ';'?)? &
+		//(consumeBeanService?='useBeanService' ';'?)? & readonly?='readonly'?) (validators+=UiValidator | bindings+=UiBinding)*
+		//processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiComboBox}
 		public Action getUiComboBoxAction_0() { return cUiComboBoxAction_0; }
-
-		//"combo"
+		
+		//'combo'
 		public Keyword getComboKeyword_1() { return cComboKeyword_1; }
-
-		//("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")?
+		
+		//('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
-
-		//i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?
+		
+		//i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?
 		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
-
-		//("{" (("type" jvmType=JvmTypeReference ";"?)? & ("captionField" itemCaptionProperty=[JvmOperation] ";"?)? &
-		//("descriptionField" descriptionProperty=UiNestedProperty ";"?)? & ("imageField" itemImageProperty=[JvmOperation] ";"?)?
-		//& (consumeBeanService?="useBeanService" ";"?)? & readonly?="readonly"?) (validators+=UiValidator |
-		//bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		
+		//('{' (('type' jvmType=JvmTypeReference ';'?)? & ('captionField' itemCaptionProperty=[JvmOperation] ';'?)? &
+		//('descriptionField' descriptionProperty=UiNestedProperty ';'?)? & ('imageField' itemImageProperty=[JvmOperation] ';'?)?
+		//& (consumeBeanService?='useBeanService' ';'?)? & readonly?='readonly'?) (validators+=UiValidator |
+		//bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup_4() { return cGroup_4; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
-
-		//("type" jvmType=JvmTypeReference ";"?)? & ("captionField" itemCaptionProperty=[JvmOperation] ";"?)? &
-		//("descriptionField" descriptionProperty=UiNestedProperty ";"?)? & ("imageField" itemImageProperty=[JvmOperation] ";"?)?
-		//& (consumeBeanService?="useBeanService" ";"?)? & readonly?="readonly"?
+		
+		//('type' jvmType=JvmTypeReference ';'?)? & ('captionField' itemCaptionProperty=[JvmOperation] ';'?)? &
+		//('descriptionField' descriptionProperty=UiNestedProperty ';'?)? & ('imageField' itemImageProperty=[JvmOperation] ';'?)?
+		//& (consumeBeanService?='useBeanService' ';'?)? & readonly?='readonly'?
 		public UnorderedGroup getUnorderedGroup_4_1() { return cUnorderedGroup_4_1; }
-
-		//("type" jvmType=JvmTypeReference ";"?)?
+		
+		//('type' jvmType=JvmTypeReference ';'?)?
 		public Group getGroup_4_1_0() { return cGroup_4_1_0; }
-
-		//"type"
+		
+		//'type'
 		public Keyword getTypeKeyword_4_1_0_0() { return cTypeKeyword_4_1_0_0; }
-
+		
 		//jvmType=JvmTypeReference
 		public Assignment getJvmTypeAssignment_4_1_0_1() { return cJvmTypeAssignment_4_1_0_1; }
-
+		
 		//JvmTypeReference
 		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_4_1_0_2() { return cSemicolonKeyword_4_1_0_2; }
-
-		//("captionField" itemCaptionProperty=[JvmOperation] ";"?)?
+		
+		//('captionField' itemCaptionProperty=[JvmOperation] ';'?)?
 		public Group getGroup_4_1_1() { return cGroup_4_1_1; }
-
-		//"captionField"
+		
+		//'captionField'
 		public Keyword getCaptionFieldKeyword_4_1_1_0() { return cCaptionFieldKeyword_4_1_1_0; }
-
+		
 		//itemCaptionProperty=[JvmOperation]
 		public Assignment getItemCaptionPropertyAssignment_4_1_1_1() { return cItemCaptionPropertyAssignment_4_1_1_1; }
-
+		
 		//[JvmOperation]
 		public CrossReference getItemCaptionPropertyJvmOperationCrossReference_4_1_1_1_0() { return cItemCaptionPropertyJvmOperationCrossReference_4_1_1_1_0; }
-
+		
 		//ID
 		public RuleCall getItemCaptionPropertyJvmOperationIDTerminalRuleCall_4_1_1_1_0_1() { return cItemCaptionPropertyJvmOperationIDTerminalRuleCall_4_1_1_1_0_1; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_4_1_1_2() { return cSemicolonKeyword_4_1_1_2; }
-
-		//("descriptionField" descriptionProperty=UiNestedProperty ";"?)?
+		
+		//('descriptionField' descriptionProperty=UiNestedProperty ';'?)?
 		public Group getGroup_4_1_2() { return cGroup_4_1_2; }
-
-		//"descriptionField"
+		
+		//'descriptionField'
 		public Keyword getDescriptionFieldKeyword_4_1_2_0() { return cDescriptionFieldKeyword_4_1_2_0; }
-
+		
 		//descriptionProperty=UiNestedProperty
 		public Assignment getDescriptionPropertyAssignment_4_1_2_1() { return cDescriptionPropertyAssignment_4_1_2_1; }
-
+		
 		//UiNestedProperty
 		public RuleCall getDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_2_1_0() { return cDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_2_1_0; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_4_1_2_2() { return cSemicolonKeyword_4_1_2_2; }
-
-		//("imageField" itemImageProperty=[JvmOperation] ";"?)?
+		
+		//('imageField' itemImageProperty=[JvmOperation] ';'?)?
 		public Group getGroup_4_1_3() { return cGroup_4_1_3; }
-
-		//"imageField"
+		
+		//'imageField'
 		public Keyword getImageFieldKeyword_4_1_3_0() { return cImageFieldKeyword_4_1_3_0; }
-
+		
 		//itemImageProperty=[JvmOperation]
 		public Assignment getItemImagePropertyAssignment_4_1_3_1() { return cItemImagePropertyAssignment_4_1_3_1; }
-
+		
 		//[JvmOperation]
 		public CrossReference getItemImagePropertyJvmOperationCrossReference_4_1_3_1_0() { return cItemImagePropertyJvmOperationCrossReference_4_1_3_1_0; }
-
+		
 		//ID
 		public RuleCall getItemImagePropertyJvmOperationIDTerminalRuleCall_4_1_3_1_0_1() { return cItemImagePropertyJvmOperationIDTerminalRuleCall_4_1_3_1_0_1; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_4_1_3_2() { return cSemicolonKeyword_4_1_3_2; }
-
-		//(consumeBeanService?="useBeanService" ";"?)?
+		
+		//(consumeBeanService?='useBeanService' ';'?)?
 		public Group getGroup_4_1_4() { return cGroup_4_1_4; }
-
-		//consumeBeanService?="useBeanService"
+		
+		//consumeBeanService?='useBeanService'
 		public Assignment getConsumeBeanServiceAssignment_4_1_4_0() { return cConsumeBeanServiceAssignment_4_1_4_0; }
-
-		//"useBeanService"
+		
+		//'useBeanService'
 		public Keyword getConsumeBeanServiceUseBeanServiceKeyword_4_1_4_0_0() { return cConsumeBeanServiceUseBeanServiceKeyword_4_1_4_0_0; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_4_1_4_1() { return cSemicolonKeyword_4_1_4_1; }
-
-		//readonly?="readonly"?
+		
+		//readonly?='readonly'?
 		public Assignment getReadonlyAssignment_4_1_5() { return cReadonlyAssignment_4_1_5; }
-
-		//"readonly"
+		
+		//'readonly'
 		public Keyword getReadonlyReadonlyKeyword_4_1_5_0() { return cReadonlyReadonlyKeyword_4_1_5_0; }
-
+		
 		//(validators+=UiValidator | bindings+=UiBinding)*
 		public Alternatives getAlternatives_4_2() { return cAlternatives_4_2; }
-
+		
 		//validators+=UiValidator
 		public Assignment getValidatorsAssignment_4_2_0() { return cValidatorsAssignment_4_2_0; }
-
+		
 		//UiValidator
 		public RuleCall getValidatorsUiValidatorParserRuleCall_4_2_0_0() { return cValidatorsUiValidatorParserRuleCall_4_2_0_0; }
-
+		
 		//bindings+=UiBinding
 		public Assignment getBindingsAssignment_4_2_1() { return cBindingsAssignment_4_2_1; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_4_2_1_0() { return cBindingsUiBindingParserRuleCall_4_2_1_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment*
 		public Assignment getProcessorAssignmentsAssignment_4_3() { return cProcessorAssignmentsAssignment_4_3; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_4_4() { return cRightCurlyBracketKeyword_4_4; }
 	}
-
 	public class UiButtonElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiButton");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiButton");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiButtonAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cButtonKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -6969,63 +7310,66 @@
 		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
 		
 		//UiButton:
-		//	{UiButton} "button" ("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?) ")")? name=ID?;
-		public ParserRule getRule() { return rule; }
-
-		//{UiButton} "button" ("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?) ")")? name=ID?
+		//	{UiButton}
+		//	'button' ('(' (i18nInfo=UiI18nInfo?
+		//	& readonly?='readonly'?
+		//	& ('styles' styles=STRING)?)
+		//	')')? name=ID?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiButton} 'button' ('(' (i18nInfo=UiI18nInfo? & readonly?='readonly'? & ('styles' styles=STRING)?) ')')? name=ID?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiButton}
 		public Action getUiButtonAction_0() { return cUiButtonAction_0; }
-
-		//"button"
+		
+		//'button'
 		public Keyword getButtonKeyword_1() { return cButtonKeyword_1; }
-
-		//("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?) ")")?
+		
+		//('(' (i18nInfo=UiI18nInfo? & readonly?='readonly'? & ('styles' styles=STRING)?) ')')?
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
-
-		//i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?
+		
+		//i18nInfo=UiI18nInfo? & readonly?='readonly'? & ('styles' styles=STRING)?
 		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
-
-		//readonly?="readonly"?
+		
+		//readonly?='readonly'?
 		public Assignment getReadonlyAssignment_2_1_1() { return cReadonlyAssignment_2_1_1; }
-
-		//"readonly"
+		
+		//'readonly'
 		public Keyword getReadonlyReadonlyKeyword_2_1_1_0() { return cReadonlyReadonlyKeyword_2_1_1_0; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_1_2() { return cGroup_2_1_2; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_1_2_0() { return cStylesKeyword_2_1_2_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_1_2_1() { return cStylesAssignment_2_1_2_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_2_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_2_1_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
 	}
-
 	public class UiMobileNavigationButtonElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileNavigationButton");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileNavigationButton");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiMobileNavigationButtonAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cNavButtonKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -7053,89 +7397,93 @@
 		private final RuleCall cTargetPageAliasUiMobileNavigationPageIDTerminalRuleCall_4_1_1_0_1 = (RuleCall)cTargetPageAliasUiMobileNavigationPageCrossReference_4_1_1_0.eContents().get(1);
 		
 		//UiMobileNavigationButton:
-		//	{UiMobileNavigationButton} "navButton" ("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?)
-		//	")")? name=ID? (targetPage=UiMobileNavigationPage | "alias" targetPageAlias=[UiMobileNavigationPage]);
-		public ParserRule getRule() { return rule; }
-
-		//{UiMobileNavigationButton} "navButton" ("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?)
-		//")")? name=ID? (targetPage=UiMobileNavigationPage | "alias" targetPageAlias=[UiMobileNavigationPage])
+		//	{UiMobileNavigationButton}
+		//	'navButton' ('(' (i18nInfo=UiI18nInfo?
+		//	& readonly?="readonly"?
+		//	& ('styles' styles=STRING)?)
+		//	')')?
+		//	name=ID? (targetPage=UiMobileNavigationPage | 'alias'
+		//	targetPageAlias=[UiMobileNavigationPage]);
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiMobileNavigationButton} 'navButton' ('(' (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?)
+		//')')? name=ID? (targetPage=UiMobileNavigationPage | 'alias' targetPageAlias=[UiMobileNavigationPage])
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiMobileNavigationButton}
 		public Action getUiMobileNavigationButtonAction_0() { return cUiMobileNavigationButtonAction_0; }
-
-		//"navButton"
+		
+		//'navButton'
 		public Keyword getNavButtonKeyword_1() { return cNavButtonKeyword_1; }
-
-		//("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?) ")")?
+		
+		//('(' (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?) ')')?
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
-
-		//i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?
+		
+		//i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?
 		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
-
+		
 		//readonly?="readonly"?
 		public Assignment getReadonlyAssignment_2_1_1() { return cReadonlyAssignment_2_1_1; }
-
+		
 		//"readonly"
 		public Keyword getReadonlyReadonlyKeyword_2_1_1_0() { return cReadonlyReadonlyKeyword_2_1_1_0; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_1_2() { return cGroup_2_1_2; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_1_2_0() { return cStylesKeyword_2_1_2_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_1_2_1() { return cStylesAssignment_2_1_2_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_2_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_2_1_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
-
-		//targetPage=UiMobileNavigationPage | "alias" targetPageAlias=[UiMobileNavigationPage]
+		
+		//targetPage=UiMobileNavigationPage | 'alias' targetPageAlias=[UiMobileNavigationPage]
 		public Alternatives getAlternatives_4() { return cAlternatives_4; }
-
+		
 		//targetPage=UiMobileNavigationPage
 		public Assignment getTargetPageAssignment_4_0() { return cTargetPageAssignment_4_0; }
-
+		
 		//UiMobileNavigationPage
 		public RuleCall getTargetPageUiMobileNavigationPageParserRuleCall_4_0_0() { return cTargetPageUiMobileNavigationPageParserRuleCall_4_0_0; }
-
-		//"alias" targetPageAlias=[UiMobileNavigationPage]
+		
+		//'alias' targetPageAlias=[UiMobileNavigationPage]
 		public Group getGroup_4_1() { return cGroup_4_1; }
-
-		//"alias"
+		
+		//'alias'
 		public Keyword getAliasKeyword_4_1_0() { return cAliasKeyword_4_1_0; }
-
+		
 		//targetPageAlias=[UiMobileNavigationPage]
 		public Assignment getTargetPageAliasAssignment_4_1_1() { return cTargetPageAliasAssignment_4_1_1; }
-
+		
 		//[UiMobileNavigationPage]
 		public CrossReference getTargetPageAliasUiMobileNavigationPageCrossReference_4_1_1_0() { return cTargetPageAliasUiMobileNavigationPageCrossReference_4_1_1_0; }
-
+		
 		//ID
 		public RuleCall getTargetPageAliasUiMobileNavigationPageIDTerminalRuleCall_4_1_1_0_1() { return cTargetPageAliasUiMobileNavigationPageIDTerminalRuleCall_4_1_1_0_1; }
 	}
-
 	public class UiMobileSwitchElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileSwitch");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileSwitch");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiSwitchAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cSwitchItKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -7164,96 +7512,98 @@
 		private final RuleCall cBindingsUiBindingParserRuleCall_4_2_1_0 = (RuleCall)cBindingsAssignment_4_2_1.eContents().get(0);
 		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
 		
-		//UiMobileSwitch returns UiSwitch:
-		//	{UiSwitch} "switchIt" ("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?) ")")? name=ID?
-		//	("{" processorAssignments+=UiVisibilityProcessorAssignment* (validators+=UiValidator | bindings+=UiBinding)* "}")?;
-		public ParserRule getRule() { return rule; }
-
-		//{UiSwitch} "switchIt" ("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?) ")")? name=ID?
-		//("{" processorAssignments+=UiVisibilityProcessorAssignment* (validators+=UiValidator | bindings+=UiBinding)* "}")?
+		//UiMobileSwitch UiSwitch:
+		//	{UiSwitch}
+		//	'switchIt' ('(' (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?) ')')? name=ID? ('{'
+		//	processorAssignments+=UiVisibilityProcessorAssignment* (validators+=UiValidator
+		//	| bindings+=UiBinding)*
+		//	'}')?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiSwitch} 'switchIt' ('(' (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?) ')')? name=ID?
+		//('{' processorAssignments+=UiVisibilityProcessorAssignment* (validators+=UiValidator | bindings+=UiBinding)* '}')?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiSwitch}
 		public Action getUiSwitchAction_0() { return cUiSwitchAction_0; }
-
-		//"switchIt"
+		
+		//'switchIt'
 		public Keyword getSwitchItKeyword_1() { return cSwitchItKeyword_1; }
-
-		//("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?) ")")?
+		
+		//('(' (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?) ')')?
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
-
-		//i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?
+		
+		//i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?
 		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
-
+		
 		//readonly?="readonly"?
 		public Assignment getReadonlyAssignment_2_1_1() { return cReadonlyAssignment_2_1_1; }
-
+		
 		//"readonly"
 		public Keyword getReadonlyReadonlyKeyword_2_1_1_0() { return cReadonlyReadonlyKeyword_2_1_1_0; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_1_2() { return cGroup_2_1_2; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_1_2_0() { return cStylesKeyword_2_1_2_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_1_2_1() { return cStylesAssignment_2_1_2_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_2_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_2_1_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
-
-		//("{" processorAssignments+=UiVisibilityProcessorAssignment* (validators+=UiValidator | bindings+=UiBinding)* "}")?
+		
+		//('{' processorAssignments+=UiVisibilityProcessorAssignment* (validators+=UiValidator | bindings+=UiBinding)* '}')?
 		public Group getGroup_4() { return cGroup_4; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment*
 		public Assignment getProcessorAssignmentsAssignment_4_1() { return cProcessorAssignmentsAssignment_4_1; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_1_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_1_0; }
-
+		
 		//(validators+=UiValidator | bindings+=UiBinding)*
 		public Alternatives getAlternatives_4_2() { return cAlternatives_4_2; }
-
+		
 		//validators+=UiValidator
 		public Assignment getValidatorsAssignment_4_2_0() { return cValidatorsAssignment_4_2_0; }
-
+		
 		//UiValidator
 		public RuleCall getValidatorsUiValidatorParserRuleCall_4_2_0_0() { return cValidatorsUiValidatorParserRuleCall_4_2_0_0; }
-
+		
 		//bindings+=UiBinding
 		public Assignment getBindingsAssignment_4_2_1() { return cBindingsAssignment_4_2_1; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_4_2_1_0() { return cBindingsUiBindingParserRuleCall_4_2_1_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
 	}
-
 	public class UiLabelElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiLabel");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiLabel");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiLabelAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cLabelKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -7278,80 +7628,82 @@
 		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
 		
 		//UiLabel:
-		//	{UiLabel} "label" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? ("{"
-		//	processorAssignments+=UiVisibilityProcessorAssignment* bindings+=UiBinding* "}")?;
-		public ParserRule getRule() { return rule; }
-
-		//{UiLabel} "label" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? ("{"
-		//processorAssignments+=UiVisibilityProcessorAssignment* bindings+=UiBinding* "}")?
+		//	{UiLabel}
+		//	'label' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=ID? ('{'
+		//	processorAssignments+=UiVisibilityProcessorAssignment*
+		//	bindings+=UiBinding*
+		//	'}')?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiLabel} 'label' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=ID? ('{'
+		//processorAssignments+=UiVisibilityProcessorAssignment* bindings+=UiBinding* '}')?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiLabel}
 		public Action getUiLabelAction_0() { return cUiLabelAction_0; }
-
-		//"label"
+		
+		//'label'
 		public Keyword getLabelKeyword_1() { return cLabelKeyword_1; }
-
-		//("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")?
+		
+		//('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
-
-		//i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?
+		
+		//i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?
 		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
-
-		//("{" processorAssignments+=UiVisibilityProcessorAssignment* bindings+=UiBinding* "}")?
+		
+		//('{' processorAssignments+=UiVisibilityProcessorAssignment* bindings+=UiBinding* '}')?
 		public Group getGroup_4() { return cGroup_4; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment*
 		public Assignment getProcessorAssignmentsAssignment_4_1() { return cProcessorAssignmentsAssignment_4_1; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_1_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_1_0; }
-
+		
 		//bindings+=UiBinding*
 		public Assignment getBindingsAssignment_4_2() { return cBindingsAssignment_4_2; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_4_2_0() { return cBindingsUiBindingParserRuleCall_4_2_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
 	}
-
 	public class UiDecimalFieldElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiDecimalField");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiDecimalField");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiDecimalFieldAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cDecimalFieldKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -7389,123 +7741,131 @@
 		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
 		
 		//UiDecimalField:
-		//	{UiDecimalField} "decimalField" ("(" (noGrouping?="noGrouping"? & noMarkNegative?="noMarkNegative"? & ("styles"
-		//	styles=STRING)? & ("precision=" precision=INT)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ")")? name=ID? ("{"
-		//	(validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
-		public ParserRule getRule() { return rule; }
-
-		//{UiDecimalField} "decimalField" ("(" (noGrouping?="noGrouping"? & noMarkNegative?="noMarkNegative"? & ("styles"
-		//styles=STRING)? & ("precision=" precision=INT)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ")")? name=ID? ("{"
-		//(validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		//	{UiDecimalField}
+		//	'decimalField' ('(' (noGrouping?='noGrouping'?
+		//	& noMarkNegative?='noMarkNegative'?
+		//	& ('styles' styles=STRING)?
+		//	& ('precision=' precision=INT)?
+		//	& i18nInfo=UiI18nInfo?
+		//	& readonly?="readonly"?)
+		//	')')?
+		//	name=ID? ('{' (validators+=UiValidator
+		//	| bindings+=UiBinding)*
+		//	processorAssignments+=UiVisibilityProcessorAssignment*
+		//	'}')?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiDecimalField} 'decimalField' ('(' (noGrouping?='noGrouping'? & noMarkNegative?='noMarkNegative'? & ('styles'
+		//styles=STRING)? & ('precision=' precision=INT)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ')')? name=ID? ('{'
+		//(validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiDecimalField}
 		public Action getUiDecimalFieldAction_0() { return cUiDecimalFieldAction_0; }
-
-		//"decimalField"
+		
+		//'decimalField'
 		public Keyword getDecimalFieldKeyword_1() { return cDecimalFieldKeyword_1; }
-
-		//("(" (noGrouping?="noGrouping"? & noMarkNegative?="noMarkNegative"? & ("styles" styles=STRING)? & ("precision="
-		//precision=INT)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ")")?
+		
+		//('(' (noGrouping?='noGrouping'? & noMarkNegative?='noMarkNegative'? & ('styles' styles=STRING)? & ('precision='
+		//precision=INT)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ')')?
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
-
-		//noGrouping?="noGrouping"? & noMarkNegative?="noMarkNegative"? & ("styles" styles=STRING)? & ("precision="
+		
+		//noGrouping?='noGrouping'? & noMarkNegative?='noMarkNegative'? & ('styles' styles=STRING)? & ('precision='
 		//precision=INT)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?
 		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
-
-		//noGrouping?="noGrouping"?
+		
+		//noGrouping?='noGrouping'?
 		public Assignment getNoGroupingAssignment_2_1_0() { return cNoGroupingAssignment_2_1_0; }
-
-		//"noGrouping"
+		
+		//'noGrouping'
 		public Keyword getNoGroupingNoGroupingKeyword_2_1_0_0() { return cNoGroupingNoGroupingKeyword_2_1_0_0; }
-
-		//noMarkNegative?="noMarkNegative"?
+		
+		//noMarkNegative?='noMarkNegative'?
 		public Assignment getNoMarkNegativeAssignment_2_1_1() { return cNoMarkNegativeAssignment_2_1_1; }
-
-		//"noMarkNegative"
+		
+		//'noMarkNegative'
 		public Keyword getNoMarkNegativeNoMarkNegativeKeyword_2_1_1_0() { return cNoMarkNegativeNoMarkNegativeKeyword_2_1_1_0; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_1_2() { return cGroup_2_1_2; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_1_2_0() { return cStylesKeyword_2_1_2_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_1_2_1() { return cStylesAssignment_2_1_2_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_2_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_2_1_0; }
-
-		//("precision=" precision=INT)?
+		
+		//('precision=' precision=INT)?
 		public Group getGroup_2_1_3() { return cGroup_2_1_3; }
-
-		//"precision="
+		
+		//'precision='
 		public Keyword getPrecisionKeyword_2_1_3_0() { return cPrecisionKeyword_2_1_3_0; }
-
+		
 		//precision=INT
 		public Assignment getPrecisionAssignment_2_1_3_1() { return cPrecisionAssignment_2_1_3_1; }
-
+		
 		//INT
 		public RuleCall getPrecisionINTTerminalRuleCall_2_1_3_1_0() { return cPrecisionINTTerminalRuleCall_2_1_3_1_0; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_1_4() { return cI18nInfoAssignment_2_1_4; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_4_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_4_0; }
-
+		
 		//readonly?="readonly"?
 		public Assignment getReadonlyAssignment_2_1_5() { return cReadonlyAssignment_2_1_5; }
-
+		
 		//"readonly"
 		public Keyword getReadonlyReadonlyKeyword_2_1_5_0() { return cReadonlyReadonlyKeyword_2_1_5_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
-
-		//("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		
+		//('{' (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup_4() { return cGroup_4; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
-
+		
 		//(validators+=UiValidator | bindings+=UiBinding)*
 		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }
-
+		
 		//validators+=UiValidator
 		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }
-
+		
 		//UiValidator
 		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }
-
+		
 		//bindings+=UiBinding
 		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment*
 		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
 	}
-
 	public class UiOptionsGroupElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiOptionsGroup");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiOptionsGroup");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiOptionsGroupAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cOptionsgroupKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -7563,190 +7923,196 @@
 		private final Keyword cRightCurlyBracketKeyword_4_4 = (Keyword)cGroup_4.eContents().get(4);
 		
 		//UiOptionsGroup:
-		//	{UiOptionsGroup} "optionsgroup" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? ("{" (("type"
-		//	jvmType=JvmTypeReference)? & ("selectionType" selectionType=UiSelectionType)? & ("captionField"
-		//	itemCaptionProperty=[JvmOperation])? & ("descriptionField" descriptionProperty=UiNestedProperty ";"?)? & ("imageField"
-		//	itemImageProperty=[JvmOperation])? & (consumeBeanService?="useBeanService" ";"?)? & readonly?="readonly"?)
-		//	(validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
-		public ParserRule getRule() { return rule; }
-
-		//{UiOptionsGroup} "optionsgroup" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? ("{" (("type"
-		//jvmType=JvmTypeReference)? & ("selectionType" selectionType=UiSelectionType)? & ("captionField"
-		//itemCaptionProperty=[JvmOperation])? & ("descriptionField" descriptionProperty=UiNestedProperty ";"?)? & ("imageField"
-		//itemImageProperty=[JvmOperation])? & (consumeBeanService?="useBeanService" ";"?)? & readonly?="readonly"?)
-		//(validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		//	{UiOptionsGroup}
+		//	'optionsgroup' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
+		//	name=ID? ('{' (('type' jvmType=JvmTypeReference)?
+		//	& ('selectionType' selectionType=UiSelectionType)?
+		//	& ('captionField' itemCaptionProperty=[JvmOperation])?
+		//	& ('descriptionField' descriptionProperty=UiNestedProperty ';'?)?
+		//	& ('imageField' itemImageProperty=[JvmOperation])?
+		//	& (consumeBeanService?='useBeanService' ';'?)?
+		//	& readonly?="readonly"?) (validators+=UiValidator
+		//	| bindings+=UiBinding)*
+		//	processorAssignments+=UiVisibilityProcessorAssignment*
+		//	'}')?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiOptionsGroup} 'optionsgroup' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=ID? ('{' (('type'
+		//jvmType=JvmTypeReference)? & ('selectionType' selectionType=UiSelectionType)? & ('captionField'
+		//itemCaptionProperty=[JvmOperation])? & ('descriptionField' descriptionProperty=UiNestedProperty ';'?)? & ('imageField'
+		//itemImageProperty=[JvmOperation])? & (consumeBeanService?='useBeanService' ';'?)? & readonly?="readonly"?)
+		//(validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiOptionsGroup}
 		public Action getUiOptionsGroupAction_0() { return cUiOptionsGroupAction_0; }
-
-		//"optionsgroup"
+		
+		//'optionsgroup'
 		public Keyword getOptionsgroupKeyword_1() { return cOptionsgroupKeyword_1; }
-
-		//("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")?
+		
+		//('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
-
-		//i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?
+		
+		//i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?
 		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
-
-		//("{" (("type" jvmType=JvmTypeReference)? & ("selectionType" selectionType=UiSelectionType)? & ("captionField"
-		//itemCaptionProperty=[JvmOperation])? & ("descriptionField" descriptionProperty=UiNestedProperty ";"?)? & ("imageField"
-		//itemImageProperty=[JvmOperation])? & (consumeBeanService?="useBeanService" ";"?)? & readonly?="readonly"?)
-		//(validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		
+		//('{' (('type' jvmType=JvmTypeReference)? & ('selectionType' selectionType=UiSelectionType)? & ('captionField'
+		//itemCaptionProperty=[JvmOperation])? & ('descriptionField' descriptionProperty=UiNestedProperty ';'?)? & ('imageField'
+		//itemImageProperty=[JvmOperation])? & (consumeBeanService?='useBeanService' ';'?)? & readonly?="readonly"?)
+		//(validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup_4() { return cGroup_4; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
-
-		//("type" jvmType=JvmTypeReference)? & ("selectionType" selectionType=UiSelectionType)? & ("captionField"
-		//itemCaptionProperty=[JvmOperation])? & ("descriptionField" descriptionProperty=UiNestedProperty ";"?)? & ("imageField"
-		//itemImageProperty=[JvmOperation])? & (consumeBeanService?="useBeanService" ";"?)? & readonly?="readonly"?
+		
+		//('type' jvmType=JvmTypeReference)? & ('selectionType' selectionType=UiSelectionType)? & ('captionField'
+		//itemCaptionProperty=[JvmOperation])? & ('descriptionField' descriptionProperty=UiNestedProperty ';'?)? & ('imageField'
+		//itemImageProperty=[JvmOperation])? & (consumeBeanService?='useBeanService' ';'?)? & readonly?="readonly"?
 		public UnorderedGroup getUnorderedGroup_4_1() { return cUnorderedGroup_4_1; }
-
-		//("type" jvmType=JvmTypeReference)?
+		
+		//('type' jvmType=JvmTypeReference)?
 		public Group getGroup_4_1_0() { return cGroup_4_1_0; }
-
-		//"type"
+		
+		//'type'
 		public Keyword getTypeKeyword_4_1_0_0() { return cTypeKeyword_4_1_0_0; }
-
+		
 		//jvmType=JvmTypeReference
 		public Assignment getJvmTypeAssignment_4_1_0_1() { return cJvmTypeAssignment_4_1_0_1; }
-
+		
 		//JvmTypeReference
 		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0; }
-
-		//("selectionType" selectionType=UiSelectionType)?
+		
+		//('selectionType' selectionType=UiSelectionType)?
 		public Group getGroup_4_1_1() { return cGroup_4_1_1; }
-
-		//"selectionType"
+		
+		//'selectionType'
 		public Keyword getSelectionTypeKeyword_4_1_1_0() { return cSelectionTypeKeyword_4_1_1_0; }
-
+		
 		//selectionType=UiSelectionType
 		public Assignment getSelectionTypeAssignment_4_1_1_1() { return cSelectionTypeAssignment_4_1_1_1; }
-
+		
 		//UiSelectionType
 		public RuleCall getSelectionTypeUiSelectionTypeEnumRuleCall_4_1_1_1_0() { return cSelectionTypeUiSelectionTypeEnumRuleCall_4_1_1_1_0; }
-
-		//("captionField" itemCaptionProperty=[JvmOperation])?
+		
+		//('captionField' itemCaptionProperty=[JvmOperation])?
 		public Group getGroup_4_1_2() { return cGroup_4_1_2; }
-
-		//"captionField"
+		
+		//'captionField'
 		public Keyword getCaptionFieldKeyword_4_1_2_0() { return cCaptionFieldKeyword_4_1_2_0; }
-
+		
 		//itemCaptionProperty=[JvmOperation]
 		public Assignment getItemCaptionPropertyAssignment_4_1_2_1() { return cItemCaptionPropertyAssignment_4_1_2_1; }
-
+		
 		//[JvmOperation]
 		public CrossReference getItemCaptionPropertyJvmOperationCrossReference_4_1_2_1_0() { return cItemCaptionPropertyJvmOperationCrossReference_4_1_2_1_0; }
-
+		
 		//ID
 		public RuleCall getItemCaptionPropertyJvmOperationIDTerminalRuleCall_4_1_2_1_0_1() { return cItemCaptionPropertyJvmOperationIDTerminalRuleCall_4_1_2_1_0_1; }
-
-		//("descriptionField" descriptionProperty=UiNestedProperty ";"?)?
+		
+		//('descriptionField' descriptionProperty=UiNestedProperty ';'?)?
 		public Group getGroup_4_1_3() { return cGroup_4_1_3; }
-
-		//"descriptionField"
+		
+		//'descriptionField'
 		public Keyword getDescriptionFieldKeyword_4_1_3_0() { return cDescriptionFieldKeyword_4_1_3_0; }
-
+		
 		//descriptionProperty=UiNestedProperty
 		public Assignment getDescriptionPropertyAssignment_4_1_3_1() { return cDescriptionPropertyAssignment_4_1_3_1; }
-
+		
 		//UiNestedProperty
 		public RuleCall getDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_3_1_0() { return cDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_3_1_0; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_4_1_3_2() { return cSemicolonKeyword_4_1_3_2; }
-
-		//("imageField" itemImageProperty=[JvmOperation])?
+		
+		//('imageField' itemImageProperty=[JvmOperation])?
 		public Group getGroup_4_1_4() { return cGroup_4_1_4; }
-
-		//"imageField"
+		
+		//'imageField'
 		public Keyword getImageFieldKeyword_4_1_4_0() { return cImageFieldKeyword_4_1_4_0; }
-
+		
 		//itemImageProperty=[JvmOperation]
 		public Assignment getItemImagePropertyAssignment_4_1_4_1() { return cItemImagePropertyAssignment_4_1_4_1; }
-
+		
 		//[JvmOperation]
 		public CrossReference getItemImagePropertyJvmOperationCrossReference_4_1_4_1_0() { return cItemImagePropertyJvmOperationCrossReference_4_1_4_1_0; }
-
+		
 		//ID
 		public RuleCall getItemImagePropertyJvmOperationIDTerminalRuleCall_4_1_4_1_0_1() { return cItemImagePropertyJvmOperationIDTerminalRuleCall_4_1_4_1_0_1; }
-
-		//(consumeBeanService?="useBeanService" ";"?)?
+		
+		//(consumeBeanService?='useBeanService' ';'?)?
 		public Group getGroup_4_1_5() { return cGroup_4_1_5; }
-
-		//consumeBeanService?="useBeanService"
+		
+		//consumeBeanService?='useBeanService'
 		public Assignment getConsumeBeanServiceAssignment_4_1_5_0() { return cConsumeBeanServiceAssignment_4_1_5_0; }
-
-		//"useBeanService"
+		
+		//'useBeanService'
 		public Keyword getConsumeBeanServiceUseBeanServiceKeyword_4_1_5_0_0() { return cConsumeBeanServiceUseBeanServiceKeyword_4_1_5_0_0; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_4_1_5_1() { return cSemicolonKeyword_4_1_5_1; }
-
+		
 		//readonly?="readonly"?
 		public Assignment getReadonlyAssignment_4_1_6() { return cReadonlyAssignment_4_1_6; }
-
+		
 		//"readonly"
 		public Keyword getReadonlyReadonlyKeyword_4_1_6_0() { return cReadonlyReadonlyKeyword_4_1_6_0; }
-
+		
 		//(validators+=UiValidator | bindings+=UiBinding)*
 		public Alternatives getAlternatives_4_2() { return cAlternatives_4_2; }
-
+		
 		//validators+=UiValidator
 		public Assignment getValidatorsAssignment_4_2_0() { return cValidatorsAssignment_4_2_0; }
-
+		
 		//UiValidator
 		public RuleCall getValidatorsUiValidatorParserRuleCall_4_2_0_0() { return cValidatorsUiValidatorParserRuleCall_4_2_0_0; }
-
+		
 		//bindings+=UiBinding
 		public Assignment getBindingsAssignment_4_2_1() { return cBindingsAssignment_4_2_1; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_4_2_1_0() { return cBindingsUiBindingParserRuleCall_4_2_1_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment*
 		public Assignment getProcessorAssignmentsAssignment_4_3() { return cProcessorAssignmentsAssignment_4_3; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_4_4() { return cRightCurlyBracketKeyword_4_4; }
 	}
-
 	public class UiListElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiList");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiList");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiListAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cListSelectKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -7804,190 +8170,196 @@
 		private final Keyword cRightCurlyBracketKeyword_4_4 = (Keyword)cGroup_4.eContents().get(4);
 		
 		//UiList:
-		//	{UiList} "listSelect" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? ("{" (("type"
-		//	jvmType=JvmTypeReference)? & ("selectionType" selectionType=UiSelectionType)? & ("captionField"
-		//	itemCaptionProperty=[JvmOperation])? & ("descriptionField" descriptionProperty=UiNestedProperty ";"?)? & ("imageField"
-		//	itemImageProperty=[JvmOperation])? & (consumeBeanService?="useBeanService" ";"?)? & readonly?="readonly"?)
-		//	(validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
-		public ParserRule getRule() { return rule; }
-
-		//{UiList} "listSelect" ("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")? name=ID? ("{" (("type"
-		//jvmType=JvmTypeReference)? & ("selectionType" selectionType=UiSelectionType)? & ("captionField"
-		//itemCaptionProperty=[JvmOperation])? & ("descriptionField" descriptionProperty=UiNestedProperty ";"?)? & ("imageField"
-		//itemImageProperty=[JvmOperation])? & (consumeBeanService?="useBeanService" ";"?)? & readonly?="readonly"?)
-		//(validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		//	{UiList}
+		//	'listSelect' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
+		//	name=ID? ('{' (('type' jvmType=JvmTypeReference)?
+		//	& ('selectionType' selectionType=UiSelectionType)?
+		//	& ('captionField' itemCaptionProperty=[JvmOperation])?
+		//	& ('descriptionField' descriptionProperty=UiNestedProperty ';'?)?
+		//	& ('imageField' itemImageProperty=[JvmOperation])?
+		//	& (consumeBeanService?='useBeanService' ';'?)?
+		//	& readonly?="readonly"?) (validators+=UiValidator
+		//	| bindings+=UiBinding)*
+		//	processorAssignments+=UiVisibilityProcessorAssignment*
+		//	'}')?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiList} 'listSelect' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=ID? ('{' (('type'
+		//jvmType=JvmTypeReference)? & ('selectionType' selectionType=UiSelectionType)? & ('captionField'
+		//itemCaptionProperty=[JvmOperation])? & ('descriptionField' descriptionProperty=UiNestedProperty ';'?)? & ('imageField'
+		//itemImageProperty=[JvmOperation])? & (consumeBeanService?='useBeanService' ';'?)? & readonly?="readonly"?)
+		//(validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiList}
 		public Action getUiListAction_0() { return cUiListAction_0; }
-
-		//"listSelect"
+		
+		//'listSelect'
 		public Keyword getListSelectKeyword_1() { return cListSelectKeyword_1; }
-
-		//("(" (i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?) ")")?
+		
+		//('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
-
-		//i18nInfo=UiI18nInfo? & ("styles" styles=STRING)?
+		
+		//i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?
 		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
-
-		//("{" (("type" jvmType=JvmTypeReference)? & ("selectionType" selectionType=UiSelectionType)? & ("captionField"
-		//itemCaptionProperty=[JvmOperation])? & ("descriptionField" descriptionProperty=UiNestedProperty ";"?)? & ("imageField"
-		//itemImageProperty=[JvmOperation])? & (consumeBeanService?="useBeanService" ";"?)? & readonly?="readonly"?)
-		//(validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		
+		//('{' (('type' jvmType=JvmTypeReference)? & ('selectionType' selectionType=UiSelectionType)? & ('captionField'
+		//itemCaptionProperty=[JvmOperation])? & ('descriptionField' descriptionProperty=UiNestedProperty ';'?)? & ('imageField'
+		//itemImageProperty=[JvmOperation])? & (consumeBeanService?='useBeanService' ';'?)? & readonly?="readonly"?)
+		//(validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup_4() { return cGroup_4; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
-
-		//("type" jvmType=JvmTypeReference)? & ("selectionType" selectionType=UiSelectionType)? & ("captionField"
-		//itemCaptionProperty=[JvmOperation])? & ("descriptionField" descriptionProperty=UiNestedProperty ";"?)? & ("imageField"
-		//itemImageProperty=[JvmOperation])? & (consumeBeanService?="useBeanService" ";"?)? & readonly?="readonly"?
+		
+		//('type' jvmType=JvmTypeReference)? & ('selectionType' selectionType=UiSelectionType)? & ('captionField'
+		//itemCaptionProperty=[JvmOperation])? & ('descriptionField' descriptionProperty=UiNestedProperty ';'?)? & ('imageField'
+		//itemImageProperty=[JvmOperation])? & (consumeBeanService?='useBeanService' ';'?)? & readonly?="readonly"?
 		public UnorderedGroup getUnorderedGroup_4_1() { return cUnorderedGroup_4_1; }
-
-		//("type" jvmType=JvmTypeReference)?
+		
+		//('type' jvmType=JvmTypeReference)?
 		public Group getGroup_4_1_0() { return cGroup_4_1_0; }
-
-		//"type"
+		
+		//'type'
 		public Keyword getTypeKeyword_4_1_0_0() { return cTypeKeyword_4_1_0_0; }
-
+		
 		//jvmType=JvmTypeReference
 		public Assignment getJvmTypeAssignment_4_1_0_1() { return cJvmTypeAssignment_4_1_0_1; }
-
+		
 		//JvmTypeReference
 		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0; }
-
-		//("selectionType" selectionType=UiSelectionType)?
+		
+		//('selectionType' selectionType=UiSelectionType)?
 		public Group getGroup_4_1_1() { return cGroup_4_1_1; }
-
-		//"selectionType"
+		
+		//'selectionType'
 		public Keyword getSelectionTypeKeyword_4_1_1_0() { return cSelectionTypeKeyword_4_1_1_0; }
-
+		
 		//selectionType=UiSelectionType
 		public Assignment getSelectionTypeAssignment_4_1_1_1() { return cSelectionTypeAssignment_4_1_1_1; }
-
+		
 		//UiSelectionType
 		public RuleCall getSelectionTypeUiSelectionTypeEnumRuleCall_4_1_1_1_0() { return cSelectionTypeUiSelectionTypeEnumRuleCall_4_1_1_1_0; }
-
-		//("captionField" itemCaptionProperty=[JvmOperation])?
+		
+		//('captionField' itemCaptionProperty=[JvmOperation])?
 		public Group getGroup_4_1_2() { return cGroup_4_1_2; }
-
-		//"captionField"
+		
+		//'captionField'
 		public Keyword getCaptionFieldKeyword_4_1_2_0() { return cCaptionFieldKeyword_4_1_2_0; }
-
+		
 		//itemCaptionProperty=[JvmOperation]
 		public Assignment getItemCaptionPropertyAssignment_4_1_2_1() { return cItemCaptionPropertyAssignment_4_1_2_1; }
-
+		
 		//[JvmOperation]
 		public CrossReference getItemCaptionPropertyJvmOperationCrossReference_4_1_2_1_0() { return cItemCaptionPropertyJvmOperationCrossReference_4_1_2_1_0; }
-
+		
 		//ID
 		public RuleCall getItemCaptionPropertyJvmOperationIDTerminalRuleCall_4_1_2_1_0_1() { return cItemCaptionPropertyJvmOperationIDTerminalRuleCall_4_1_2_1_0_1; }
-
-		//("descriptionField" descriptionProperty=UiNestedProperty ";"?)?
+		
+		//('descriptionField' descriptionProperty=UiNestedProperty ';'?)?
 		public Group getGroup_4_1_3() { return cGroup_4_1_3; }
-
-		//"descriptionField"
+		
+		//'descriptionField'
 		public Keyword getDescriptionFieldKeyword_4_1_3_0() { return cDescriptionFieldKeyword_4_1_3_0; }
-
+		
 		//descriptionProperty=UiNestedProperty
 		public Assignment getDescriptionPropertyAssignment_4_1_3_1() { return cDescriptionPropertyAssignment_4_1_3_1; }
-
+		
 		//UiNestedProperty
 		public RuleCall getDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_3_1_0() { return cDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_3_1_0; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_4_1_3_2() { return cSemicolonKeyword_4_1_3_2; }
-
-		//("imageField" itemImageProperty=[JvmOperation])?
+		
+		//('imageField' itemImageProperty=[JvmOperation])?
 		public Group getGroup_4_1_4() { return cGroup_4_1_4; }
-
-		//"imageField"
+		
+		//'imageField'
 		public Keyword getImageFieldKeyword_4_1_4_0() { return cImageFieldKeyword_4_1_4_0; }
-
+		
 		//itemImageProperty=[JvmOperation]
 		public Assignment getItemImagePropertyAssignment_4_1_4_1() { return cItemImagePropertyAssignment_4_1_4_1; }
-
+		
 		//[JvmOperation]
 		public CrossReference getItemImagePropertyJvmOperationCrossReference_4_1_4_1_0() { return cItemImagePropertyJvmOperationCrossReference_4_1_4_1_0; }
-
+		
 		//ID
 		public RuleCall getItemImagePropertyJvmOperationIDTerminalRuleCall_4_1_4_1_0_1() { return cItemImagePropertyJvmOperationIDTerminalRuleCall_4_1_4_1_0_1; }
-
-		//(consumeBeanService?="useBeanService" ";"?)?
+		
+		//(consumeBeanService?='useBeanService' ';'?)?
 		public Group getGroup_4_1_5() { return cGroup_4_1_5; }
-
-		//consumeBeanService?="useBeanService"
+		
+		//consumeBeanService?='useBeanService'
 		public Assignment getConsumeBeanServiceAssignment_4_1_5_0() { return cConsumeBeanServiceAssignment_4_1_5_0; }
-
-		//"useBeanService"
+		
+		//'useBeanService'
 		public Keyword getConsumeBeanServiceUseBeanServiceKeyword_4_1_5_0_0() { return cConsumeBeanServiceUseBeanServiceKeyword_4_1_5_0_0; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_4_1_5_1() { return cSemicolonKeyword_4_1_5_1; }
-
+		
 		//readonly?="readonly"?
 		public Assignment getReadonlyAssignment_4_1_6() { return cReadonlyAssignment_4_1_6; }
-
+		
 		//"readonly"
 		public Keyword getReadonlyReadonlyKeyword_4_1_6_0() { return cReadonlyReadonlyKeyword_4_1_6_0; }
-
+		
 		//(validators+=UiValidator | bindings+=UiBinding)*
 		public Alternatives getAlternatives_4_2() { return cAlternatives_4_2; }
-
+		
 		//validators+=UiValidator
 		public Assignment getValidatorsAssignment_4_2_0() { return cValidatorsAssignment_4_2_0; }
-
+		
 		//UiValidator
 		public RuleCall getValidatorsUiValidatorParserRuleCall_4_2_0_0() { return cValidatorsUiValidatorParserRuleCall_4_2_0_0; }
-
+		
 		//bindings+=UiBinding
 		public Assignment getBindingsAssignment_4_2_1() { return cBindingsAssignment_4_2_1; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_4_2_1_0() { return cBindingsUiBindingParserRuleCall_4_2_1_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment*
 		public Assignment getProcessorAssignmentsAssignment_4_3() { return cProcessorAssignmentsAssignment_4_3; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_4_4() { return cRightCurlyBracketKeyword_4_4; }
 	}
-
 	public class UiColumnsAssignmentElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiColumnsAssignment");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiColumnsAssignment");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiColumnsAssignmentAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cColumnsKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -7997,33 +8369,35 @@
 		private final Keyword cRightCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
 		
 		//UiColumnsAssignment:
-		//	{UiColumnsAssignment} "columns" "{" columns+=UiColumn* "}";
-		public ParserRule getRule() { return rule; }
-
-		//{UiColumnsAssignment} "columns" "{" columns+=UiColumn* "}"
+		//	{UiColumnsAssignment}
+		//	'columns' '{'
+		//	columns+=UiColumn*
+		//	'}';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiColumnsAssignment} 'columns' '{' columns+=UiColumn* '}'
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiColumnsAssignment}
 		public Action getUiColumnsAssignmentAction_0() { return cUiColumnsAssignmentAction_0; }
-
-		//"columns"
+		
+		//'columns'
 		public Keyword getColumnsKeyword_1() { return cColumnsKeyword_1; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
-
+		
 		//columns+=UiColumn*
 		public Assignment getColumnsAssignment_3() { return cColumnsAssignment_3; }
-
+		
 		//UiColumn
 		public RuleCall getColumnsUiColumnParserRuleCall_3_0() { return cColumnsUiColumnParserRuleCall_3_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_4() { return cRightCurlyBracketKeyword_4; }
 	}
-
 	public class UiSortOrderAssignmentElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiSortOrderAssignment");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiSortOrderAssignment");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiSortOrderAssignmentAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cSortKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -8033,33 +8407,35 @@
 		private final Keyword cRightCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
 		
 		//UiSortOrderAssignment:
-		//	{UiSortOrderAssignment} "sort" "{" columns+=UiSortOrder* "}";
-		public ParserRule getRule() { return rule; }
-
-		//{UiSortOrderAssignment} "sort" "{" columns+=UiSortOrder* "}"
+		//	{UiSortOrderAssignment}
+		//	'sort' '{'
+		//	columns+=UiSortOrder*
+		//	'}';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiSortOrderAssignment} 'sort' '{' columns+=UiSortOrder* '}'
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiSortOrderAssignment}
 		public Action getUiSortOrderAssignmentAction_0() { return cUiSortOrderAssignmentAction_0; }
-
-		//"sort"
+		
+		//'sort'
 		public Keyword getSortKeyword_1() { return cSortKeyword_1; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
-
+		
 		//columns+=UiSortOrder*
 		public Assignment getColumnsAssignment_3() { return cColumnsAssignment_3; }
-
+		
 		//UiSortOrder
 		public RuleCall getColumnsUiSortOrderParserRuleCall_3_0() { return cColumnsUiSortOrderParserRuleCall_3_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_4() { return cRightCurlyBracketKeyword_4; }
 	}
-
 	public class UiSortOrderElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiSortOrder");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiSortOrder");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cColumnKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cPropertyAssignment_1 = (Assignment)cGroup.eContents().get(1);
@@ -8071,39 +8447,38 @@
 		private final Keyword cSemicolonKeyword_3 = (Keyword)cGroup.eContents().get(3);
 		
 		//UiSortOrder:
-		//	"column" property=UiNestedProperty ("desc" | asc?="asc")? ";"?;
-		public ParserRule getRule() { return rule; }
-
-		//"column" property=UiNestedProperty ("desc" | asc?="asc")? ";"?
+		//	'column' property=UiNestedProperty ('desc' | asc?="asc")? ';'?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'column' property=UiNestedProperty ('desc' | asc?="asc")? ';'?
 		public Group getGroup() { return cGroup; }
-
-		//"column"
+		
+		//'column'
 		public Keyword getColumnKeyword_0() { return cColumnKeyword_0; }
-
+		
 		//property=UiNestedProperty
 		public Assignment getPropertyAssignment_1() { return cPropertyAssignment_1; }
-
+		
 		//UiNestedProperty
 		public RuleCall getPropertyUiNestedPropertyParserRuleCall_1_0() { return cPropertyUiNestedPropertyParserRuleCall_1_0; }
-
-		//("desc" | asc?="asc")?
+		
+		//('desc' | asc?="asc")?
 		public Alternatives getAlternatives_2() { return cAlternatives_2; }
-
-		//"desc"
+		
+		//'desc'
 		public Keyword getDescKeyword_2_0() { return cDescKeyword_2_0; }
-
+		
 		//asc?="asc"
 		public Assignment getAscAssignment_2_1() { return cAscAssignment_2_1; }
-
+		
 		//"asc"
 		public Keyword getAscAscKeyword_2_1_0() { return cAscAscKeyword_2_1_0; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_3() { return cSemicolonKeyword_3; }
 	}
-
 	public class UiColumnElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiColumn");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiColumn");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiColumnAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cColumnKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -8116,42 +8491,42 @@
 		private final Keyword cSemicolonKeyword_4 = (Keyword)cGroup.eContents().get(4);
 		
 		//UiColumn:
-		//	{UiColumn} "column" property=UiNestedProperty ("icon" iconName=STRING)? ";"?;
-		public ParserRule getRule() { return rule; }
-
-		//{UiColumn} "column" property=UiNestedProperty ("icon" iconName=STRING)? ";"?
+		//	{UiColumn}
+		//	'column' property=UiNestedProperty ('icon' iconName=STRING)? ';'?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiColumn} 'column' property=UiNestedProperty ('icon' iconName=STRING)? ';'?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiColumn}
 		public Action getUiColumnAction_0() { return cUiColumnAction_0; }
-
-		//"column"
+		
+		//'column'
 		public Keyword getColumnKeyword_1() { return cColumnKeyword_1; }
-
+		
 		//property=UiNestedProperty
 		public Assignment getPropertyAssignment_2() { return cPropertyAssignment_2; }
-
+		
 		//UiNestedProperty
 		public RuleCall getPropertyUiNestedPropertyParserRuleCall_2_0() { return cPropertyUiNestedPropertyParserRuleCall_2_0; }
-
-		//("icon" iconName=STRING)?
+		
+		//('icon' iconName=STRING)?
 		public Group getGroup_3() { return cGroup_3; }
-
-		//"icon"
+		
+		//'icon'
 		public Keyword getIconKeyword_3_0() { return cIconKeyword_3_0; }
-
+		
 		//iconName=STRING
 		public Assignment getIconNameAssignment_3_1() { return cIconNameAssignment_3_1; }
-
+		
 		//STRING
 		public RuleCall getIconNameSTRINGTerminalRuleCall_3_1_0() { return cIconNameSTRINGTerminalRuleCall_3_1_0; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_4() { return cSemicolonKeyword_4; }
 	}
-
 	public class UiEmbeddableElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiEmbeddable");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiEmbeddable");
 		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
 		private final RuleCall cUiLayoutParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
 		private final RuleCall cUiFieldParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
@@ -8160,26 +8535,25 @@
 		
 		//UiEmbeddable:
 		//	UiLayout | UiField | UiAction | UiTabSheet;
-		public ParserRule getRule() { return rule; }
-
+		@Override public ParserRule getRule() { return rule; }
+		
 		//UiLayout | UiField | UiAction | UiTabSheet
 		public Alternatives getAlternatives() { return cAlternatives; }
-
+		
 		//UiLayout
 		public RuleCall getUiLayoutParserRuleCall_0() { return cUiLayoutParserRuleCall_0; }
-
+		
 		//UiField
 		public RuleCall getUiFieldParserRuleCall_1() { return cUiFieldParserRuleCall_1; }
-
+		
 		//UiAction
 		public RuleCall getUiActionParserRuleCall_2() { return cUiActionParserRuleCall_2; }
-
+		
 		//UiTabSheet
 		public RuleCall getUiTabSheetParserRuleCall_3() { return cUiTabSheetParserRuleCall_3; }
 	}
-
 	public class UiMobileEmbeddableElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileEmbeddable");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileEmbeddable");
 		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
 		private final RuleCall cUiMobileLayoutParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
 		private final RuleCall cUiMobileFieldParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
@@ -8188,26 +8562,25 @@
 		
 		//UiMobileEmbeddable:
 		//	UiMobileLayout | UiMobileField | UiMobileTabSheet | UiMobileAction;
-		public ParserRule getRule() { return rule; }
-
+		@Override public ParserRule getRule() { return rule; }
+		
 		//UiMobileLayout | UiMobileField | UiMobileTabSheet | UiMobileAction
 		public Alternatives getAlternatives() { return cAlternatives; }
-
+		
 		//UiMobileLayout
 		public RuleCall getUiMobileLayoutParserRuleCall_0() { return cUiMobileLayoutParserRuleCall_0; }
-
+		
 		//UiMobileField
 		public RuleCall getUiMobileFieldParserRuleCall_1() { return cUiMobileFieldParserRuleCall_1; }
-
+		
 		//UiMobileTabSheet
 		public RuleCall getUiMobileTabSheetParserRuleCall_2() { return cUiMobileTabSheetParserRuleCall_2; }
-
+		
 		//UiMobileAction
 		public RuleCall getUiMobileActionParserRuleCall_3() { return cUiMobileActionParserRuleCall_3; }
 	}
-
 	public class UiMobileLayoutElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileLayout");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileLayout");
 		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
 		private final RuleCall cUiMobileHorizontalButtonGroupParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
 		private final RuleCall cUiMobileVerticalComponentGroupParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
@@ -8220,36 +8593,35 @@
 		//UiMobileLayout:
 		//	UiMobileHorizontalButtonGroup | UiMobileVerticalComponentGroup | UiMobileNavigationPage | UiMobileHorizontalLayout |
 		//	UiMobileVerticalLayout | UiMobileSearchPanel | UiMobileNavigationRoot;
-		public ParserRule getRule() { return rule; }
-
+		@Override public ParserRule getRule() { return rule; }
+		
 		//UiMobileHorizontalButtonGroup | UiMobileVerticalComponentGroup | UiMobileNavigationPage | UiMobileHorizontalLayout |
 		//UiMobileVerticalLayout | UiMobileSearchPanel | UiMobileNavigationRoot
 		public Alternatives getAlternatives() { return cAlternatives; }
-
+		
 		//UiMobileHorizontalButtonGroup
 		public RuleCall getUiMobileHorizontalButtonGroupParserRuleCall_0() { return cUiMobileHorizontalButtonGroupParserRuleCall_0; }
-
+		
 		//UiMobileVerticalComponentGroup
 		public RuleCall getUiMobileVerticalComponentGroupParserRuleCall_1() { return cUiMobileVerticalComponentGroupParserRuleCall_1; }
-
+		
 		//UiMobileNavigationPage
 		public RuleCall getUiMobileNavigationPageParserRuleCall_2() { return cUiMobileNavigationPageParserRuleCall_2; }
-
+		
 		//UiMobileHorizontalLayout
 		public RuleCall getUiMobileHorizontalLayoutParserRuleCall_3() { return cUiMobileHorizontalLayoutParserRuleCall_3; }
-
+		
 		//UiMobileVerticalLayout
 		public RuleCall getUiMobileVerticalLayoutParserRuleCall_4() { return cUiMobileVerticalLayoutParserRuleCall_4; }
-
+		
 		//UiMobileSearchPanel
 		public RuleCall getUiMobileSearchPanelParserRuleCall_5() { return cUiMobileSearchPanelParserRuleCall_5; }
-
+		
 		//UiMobileNavigationRoot
 		public RuleCall getUiMobileNavigationRootParserRuleCall_6() { return cUiMobileNavigationRootParserRuleCall_6; }
 	}
-
 	public class UiMobileFieldElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileField");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileField");
 		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
 		private final RuleCall cUiMobileSwitchParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
 		private final RuleCall cUiTextFieldParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
@@ -8276,82 +8648,81 @@
 		//UiMobileField:
 		//	UiMobileSwitch | UiTextField | UiMaskedTextField | UiMaskedNumericField | UiMaskedDecimalField |
 		//	UiPrefixedMaskedTextField | UiRichTextArea | UiPasswordField | UiSuggestTextField | UiNumericField | UiTable |
-		//	UiComboBox | UiImage | UiSearchField | UiLabel | UiDecimalField | UiTextArea | UiDateField | UiBrowser | UiProgressBar
-		//	| UiOptionsGroup;
-		public ParserRule getRule() { return rule; }
-
+		//	UiComboBox | UiImage
+		//	| UiSearchField | UiLabel | UiDecimalField | UiTextArea | UiDateField | UiBrowser | UiProgressBar | UiOptionsGroup;
+		@Override public ParserRule getRule() { return rule; }
+		
 		//UiMobileSwitch | UiTextField | UiMaskedTextField | UiMaskedNumericField | UiMaskedDecimalField |
 		//UiPrefixedMaskedTextField | UiRichTextArea | UiPasswordField | UiSuggestTextField | UiNumericField | UiTable |
 		//UiComboBox | UiImage | UiSearchField | UiLabel | UiDecimalField | UiTextArea | UiDateField | UiBrowser | UiProgressBar
 		//| UiOptionsGroup
 		public Alternatives getAlternatives() { return cAlternatives; }
-
+		
 		//UiMobileSwitch
 		public RuleCall getUiMobileSwitchParserRuleCall_0() { return cUiMobileSwitchParserRuleCall_0; }
-
+		
 		//UiTextField
 		public RuleCall getUiTextFieldParserRuleCall_1() { return cUiTextFieldParserRuleCall_1; }
-
+		
 		//UiMaskedTextField
 		public RuleCall getUiMaskedTextFieldParserRuleCall_2() { return cUiMaskedTextFieldParserRuleCall_2; }
-
+		
 		//UiMaskedNumericField
 		public RuleCall getUiMaskedNumericFieldParserRuleCall_3() { return cUiMaskedNumericFieldParserRuleCall_3; }
-
+		
 		//UiMaskedDecimalField
 		public RuleCall getUiMaskedDecimalFieldParserRuleCall_4() { return cUiMaskedDecimalFieldParserRuleCall_4; }
-
+		
 		//UiPrefixedMaskedTextField
 		public RuleCall getUiPrefixedMaskedTextFieldParserRuleCall_5() { return cUiPrefixedMaskedTextFieldParserRuleCall_5; }
-
+		
 		//UiRichTextArea
 		public RuleCall getUiRichTextAreaParserRuleCall_6() { return cUiRichTextAreaParserRuleCall_6; }
-
+		
 		//UiPasswordField
 		public RuleCall getUiPasswordFieldParserRuleCall_7() { return cUiPasswordFieldParserRuleCall_7; }
-
+		
 		//UiSuggestTextField
 		public RuleCall getUiSuggestTextFieldParserRuleCall_8() { return cUiSuggestTextFieldParserRuleCall_8; }
-
+		
 		//UiNumericField
 		public RuleCall getUiNumericFieldParserRuleCall_9() { return cUiNumericFieldParserRuleCall_9; }
-
+		
 		//UiTable
 		public RuleCall getUiTableParserRuleCall_10() { return cUiTableParserRuleCall_10; }
-
+		
 		//UiComboBox
 		public RuleCall getUiComboBoxParserRuleCall_11() { return cUiComboBoxParserRuleCall_11; }
-
+		
 		//UiImage
 		public RuleCall getUiImageParserRuleCall_12() { return cUiImageParserRuleCall_12; }
-
+		
 		//UiSearchField
 		public RuleCall getUiSearchFieldParserRuleCall_13() { return cUiSearchFieldParserRuleCall_13; }
-
+		
 		//UiLabel
 		public RuleCall getUiLabelParserRuleCall_14() { return cUiLabelParserRuleCall_14; }
-
+		
 		//UiDecimalField
 		public RuleCall getUiDecimalFieldParserRuleCall_15() { return cUiDecimalFieldParserRuleCall_15; }
-
+		
 		//UiTextArea
 		public RuleCall getUiTextAreaParserRuleCall_16() { return cUiTextAreaParserRuleCall_16; }
-
+		
 		//UiDateField
 		public RuleCall getUiDateFieldParserRuleCall_17() { return cUiDateFieldParserRuleCall_17; }
-
+		
 		//UiBrowser
 		public RuleCall getUiBrowserParserRuleCall_18() { return cUiBrowserParserRuleCall_18; }
-
+		
 		//UiProgressBar
 		public RuleCall getUiProgressBarParserRuleCall_19() { return cUiProgressBarParserRuleCall_19; }
-
+		
 		//UiOptionsGroup
 		public RuleCall getUiOptionsGroupParserRuleCall_20() { return cUiOptionsGroupParserRuleCall_20; }
 	}
-
 	public class UiLayoutElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiLayout");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiLayout");
 		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
 		private final RuleCall cUiGridLayoutParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
 		private final RuleCall cUiFormLayoutParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
@@ -8363,35 +8734,34 @@
 		
 		//UiLayout:
 		//	UiGridLayout | UiFormLayout | UiHorizontalLayout | UiVerticalLayout | UiSplitpanel | UiPanel | UiSearchPanel;
-		public ParserRule getRule() { return rule; }
-
+		@Override public ParserRule getRule() { return rule; }
+		
 		//UiGridLayout | UiFormLayout | UiHorizontalLayout | UiVerticalLayout | UiSplitpanel | UiPanel | UiSearchPanel
 		public Alternatives getAlternatives() { return cAlternatives; }
-
+		
 		//UiGridLayout
 		public RuleCall getUiGridLayoutParserRuleCall_0() { return cUiGridLayoutParserRuleCall_0; }
-
+		
 		//UiFormLayout
 		public RuleCall getUiFormLayoutParserRuleCall_1() { return cUiFormLayoutParserRuleCall_1; }
-
+		
 		//UiHorizontalLayout
 		public RuleCall getUiHorizontalLayoutParserRuleCall_2() { return cUiHorizontalLayoutParserRuleCall_2; }
-
+		
 		//UiVerticalLayout
 		public RuleCall getUiVerticalLayoutParserRuleCall_3() { return cUiVerticalLayoutParserRuleCall_3; }
-
+		
 		//UiSplitpanel
 		public RuleCall getUiSplitpanelParserRuleCall_4() { return cUiSplitpanelParserRuleCall_4; }
-
+		
 		//UiPanel
 		public RuleCall getUiPanelParserRuleCall_5() { return cUiPanelParserRuleCall_5; }
-
+		
 		//UiSearchPanel
 		public RuleCall getUiSearchPanelParserRuleCall_6() { return cUiSearchPanelParserRuleCall_6; }
 	}
-
 	public class UiFieldElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiField");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiField");
 		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
 		private final RuleCall cUiTextFieldParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
 		private final RuleCall cUiMaskedTextFieldParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
@@ -8422,118 +8792,115 @@
 		//	UiRichTextArea | UiPasswordField | UiSuggestTextField | UiList | UiNumericField | UiCheckBox | UiTable | UiComboBox |
 		//	UiImage | UiSearchField | UiLabel | UiDecimalField | UiTextArea | UiDateField | UiBrowser | UiProgressBar |
 		//	UiOptionsGroup | UiBeanReferenceField;
-		public ParserRule getRule() { return rule; }
-
+		@Override public ParserRule getRule() { return rule; }
+		
 		//UiTextField | UiMaskedTextField | UiMaskedNumericField | UiMaskedDecimalField | UiPrefixedMaskedTextField |
 		//UiRichTextArea | UiPasswordField | UiSuggestTextField | UiList | UiNumericField | UiCheckBox | UiTable | UiComboBox |
 		//UiImage | UiSearchField | UiLabel | UiDecimalField | UiTextArea | UiDateField | UiBrowser | UiProgressBar |
 		//UiOptionsGroup | UiBeanReferenceField
 		public Alternatives getAlternatives() { return cAlternatives; }
-
+		
 		//UiTextField
 		public RuleCall getUiTextFieldParserRuleCall_0() { return cUiTextFieldParserRuleCall_0; }
-
+		
 		//UiMaskedTextField
 		public RuleCall getUiMaskedTextFieldParserRuleCall_1() { return cUiMaskedTextFieldParserRuleCall_1; }
-
+		
 		//UiMaskedNumericField
 		public RuleCall getUiMaskedNumericFieldParserRuleCall_2() { return cUiMaskedNumericFieldParserRuleCall_2; }
-
+		
 		//UiMaskedDecimalField
 		public RuleCall getUiMaskedDecimalFieldParserRuleCall_3() { return cUiMaskedDecimalFieldParserRuleCall_3; }
-
+		
 		//UiPrefixedMaskedTextField
 		public RuleCall getUiPrefixedMaskedTextFieldParserRuleCall_4() { return cUiPrefixedMaskedTextFieldParserRuleCall_4; }
-
+		
 		//UiRichTextArea
 		public RuleCall getUiRichTextAreaParserRuleCall_5() { return cUiRichTextAreaParserRuleCall_5; }
-
+		
 		//UiPasswordField
 		public RuleCall getUiPasswordFieldParserRuleCall_6() { return cUiPasswordFieldParserRuleCall_6; }
-
+		
 		//UiSuggestTextField
 		public RuleCall getUiSuggestTextFieldParserRuleCall_7() { return cUiSuggestTextFieldParserRuleCall_7; }
-
+		
 		//UiList
 		public RuleCall getUiListParserRuleCall_8() { return cUiListParserRuleCall_8; }
-
+		
 		//UiNumericField
 		public RuleCall getUiNumericFieldParserRuleCall_9() { return cUiNumericFieldParserRuleCall_9; }
-
+		
 		//UiCheckBox
 		public RuleCall getUiCheckBoxParserRuleCall_10() { return cUiCheckBoxParserRuleCall_10; }
-
+		
 		//UiTable
 		public RuleCall getUiTableParserRuleCall_11() { return cUiTableParserRuleCall_11; }
-
+		
 		//UiComboBox
 		public RuleCall getUiComboBoxParserRuleCall_12() { return cUiComboBoxParserRuleCall_12; }
-
+		
 		//UiImage
 		public RuleCall getUiImageParserRuleCall_13() { return cUiImageParserRuleCall_13; }
-
+		
 		//UiSearchField
 		public RuleCall getUiSearchFieldParserRuleCall_14() { return cUiSearchFieldParserRuleCall_14; }
-
+		
 		//UiLabel
 		public RuleCall getUiLabelParserRuleCall_15() { return cUiLabelParserRuleCall_15; }
-
+		
 		//UiDecimalField
 		public RuleCall getUiDecimalFieldParserRuleCall_16() { return cUiDecimalFieldParserRuleCall_16; }
-
+		
 		//UiTextArea
 		public RuleCall getUiTextAreaParserRuleCall_17() { return cUiTextAreaParserRuleCall_17; }
-
+		
 		//UiDateField
 		public RuleCall getUiDateFieldParserRuleCall_18() { return cUiDateFieldParserRuleCall_18; }
-
+		
 		//UiBrowser
 		public RuleCall getUiBrowserParserRuleCall_19() { return cUiBrowserParserRuleCall_19; }
-
+		
 		//UiProgressBar
 		public RuleCall getUiProgressBarParserRuleCall_20() { return cUiProgressBarParserRuleCall_20; }
-
+		
 		//UiOptionsGroup
 		public RuleCall getUiOptionsGroupParserRuleCall_21() { return cUiOptionsGroupParserRuleCall_21; }
-
+		
 		//UiBeanReferenceField
 		public RuleCall getUiBeanReferenceFieldParserRuleCall_22() { return cUiBeanReferenceFieldParserRuleCall_22; }
 	}
-
 	public class UiActionElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiAction");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiAction");
 		private final RuleCall cUiButtonParserRuleCall = (RuleCall)rule.eContents().get(1);
 		
 		//UiAction:
 		//	UiButton;
-		public ParserRule getRule() { return rule; }
-
+		@Override public ParserRule getRule() { return rule; }
+		
 		//UiButton
 		public RuleCall getUiButtonParserRuleCall() { return cUiButtonParserRuleCall; }
 	}
-
 	public class UiMobileActionElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMobileAction");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileAction");
 		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
 		private final RuleCall cUiMobileNavigationButtonParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
 		private final RuleCall cUiButtonParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
 		
 		//UiMobileAction:
 		//	UiMobileNavigationButton | UiButton;
-		public ParserRule getRule() { return rule; }
-
+		@Override public ParserRule getRule() { return rule; }
+		
 		//UiMobileNavigationButton | UiButton
 		public Alternatives getAlternatives() { return cAlternatives; }
-
+		
 		//UiMobileNavigationButton
 		public RuleCall getUiMobileNavigationButtonParserRuleCall_0() { return cUiMobileNavigationButtonParserRuleCall_0; }
-
+		
 		//UiButton
 		public RuleCall getUiButtonParserRuleCall_1() { return cUiButtonParserRuleCall_1; }
 	}
-
 	public class UiNumericFieldElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiNumericField");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiNumericField");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiNumericFieldAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cNumericFieldKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -8567,111 +8934,118 @@
 		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
 		
 		//UiNumericField:
-		//	{UiNumericField} "numericField" ("(" (noGrouping?="noGrouping"? & ("styles" styles=STRING)? &
-		//	noMarkNegative?="noMarkNegative"? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ")")? name=ID? ("{"
-		//	(validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
-		public ParserRule getRule() { return rule; }
-
-		//{UiNumericField} "numericField" ("(" (noGrouping?="noGrouping"? & ("styles" styles=STRING)? &
-		//noMarkNegative?="noMarkNegative"? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ")")? name=ID? ("{"
-		//(validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		//	{UiNumericField}
+		//	'numericField' ('(' (noGrouping?='noGrouping'?
+		//	& ('styles' styles=STRING)?
+		//	& noMarkNegative?='noMarkNegative'?
+		//	& i18nInfo=UiI18nInfo?
+		//	& readonly?="readonly"?)
+		//	')')?
+		//	name=ID? ('{' (validators+=UiValidator
+		//	| bindings+=UiBinding)*
+		//	processorAssignments+=UiVisibilityProcessorAssignment*
+		//	'}')?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiNumericField} 'numericField' ('(' (noGrouping?='noGrouping'? & ('styles' styles=STRING)? &
+		//noMarkNegative?='noMarkNegative'? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ')')? name=ID? ('{'
+		//(validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiNumericField}
 		public Action getUiNumericFieldAction_0() { return cUiNumericFieldAction_0; }
-
-		//"numericField"
+		
+		//'numericField'
 		public Keyword getNumericFieldKeyword_1() { return cNumericFieldKeyword_1; }
-
-		//("(" (noGrouping?="noGrouping"? & ("styles" styles=STRING)? & noMarkNegative?="noMarkNegative"? & i18nInfo=UiI18nInfo? &
-		//readonly?="readonly"?) ")")?
+		
+		//('(' (noGrouping?='noGrouping'? & ('styles' styles=STRING)? & noMarkNegative?='noMarkNegative'? & i18nInfo=UiI18nInfo? &
+		//readonly?="readonly"?) ')')?
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
-
-		//noGrouping?="noGrouping"? & ("styles" styles=STRING)? & noMarkNegative?="noMarkNegative"? & i18nInfo=UiI18nInfo? &
+		
+		//noGrouping?='noGrouping'? & ('styles' styles=STRING)? & noMarkNegative?='noMarkNegative'? & i18nInfo=UiI18nInfo? &
 		//readonly?="readonly"?
 		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
-
-		//noGrouping?="noGrouping"?
+		
+		//noGrouping?='noGrouping'?
 		public Assignment getNoGroupingAssignment_2_1_0() { return cNoGroupingAssignment_2_1_0; }
-
-		//"noGrouping"
+		
+		//'noGrouping'
 		public Keyword getNoGroupingNoGroupingKeyword_2_1_0_0() { return cNoGroupingNoGroupingKeyword_2_1_0_0; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }
-
-		//noMarkNegative?="noMarkNegative"?
+		
+		//noMarkNegative?='noMarkNegative'?
 		public Assignment getNoMarkNegativeAssignment_2_1_2() { return cNoMarkNegativeAssignment_2_1_2; }
-
-		//"noMarkNegative"
+		
+		//'noMarkNegative'
 		public Keyword getNoMarkNegativeNoMarkNegativeKeyword_2_1_2_0() { return cNoMarkNegativeNoMarkNegativeKeyword_2_1_2_0; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_1_3() { return cI18nInfoAssignment_2_1_3; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_3_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_3_0; }
-
+		
 		//readonly?="readonly"?
 		public Assignment getReadonlyAssignment_2_1_4() { return cReadonlyAssignment_2_1_4; }
-
+		
 		//"readonly"
 		public Keyword getReadonlyReadonlyKeyword_2_1_4_0() { return cReadonlyReadonlyKeyword_2_1_4_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
-
-		//("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		
+		//('{' (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup_4() { return cGroup_4; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
-
+		
 		//(validators+=UiValidator | bindings+=UiBinding)*
 		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }
-
+		
 		//validators+=UiValidator
 		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }
-
+		
 		//UiValidator
 		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }
-
+		
 		//bindings+=UiBinding
 		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment*
 		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
 	}
-
 	public class UiCheckBoxElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiCheckBox");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiCheckBox");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiCheckBoxAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cCheckboxKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -8701,95 +9075,100 @@
 		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
 		
 		//UiCheckBox:
-		//	{UiCheckBox} "checkbox" ("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?) ")")? name=ID?
-		//	("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?;
-		public ParserRule getRule() { return rule; }
-
-		//{UiCheckBox} "checkbox" ("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?) ")")? name=ID?
-		//("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		//	{UiCheckBox}
+		//	'checkbox' ('(' (i18nInfo=UiI18nInfo?
+		//	& readonly?="readonly"?
+		//	& ('styles' styles=STRING)?)
+		//	')')? name=ID? ('{' (validators+=UiValidator
+		//	| bindings+=UiBinding)*
+		//	processorAssignments+=UiVisibilityProcessorAssignment*
+		//	'}')?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiCheckBox} 'checkbox' ('(' (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?) ')')? name=ID?
+		//('{' (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiCheckBox}
 		public Action getUiCheckBoxAction_0() { return cUiCheckBoxAction_0; }
-
-		//"checkbox"
+		
+		//'checkbox'
 		public Keyword getCheckboxKeyword_1() { return cCheckboxKeyword_1; }
-
-		//("(" (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?) ")")?
+		
+		//('(' (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?) ')')?
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
-
-		//i18nInfo=UiI18nInfo? & readonly?="readonly"? & ("styles" styles=STRING)?
+		
+		//i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?
 		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
-
+		
 		//i18nInfo=UiI18nInfo?
 		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
-
+		
 		//UiI18nInfo
 		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
-
+		
 		//readonly?="readonly"?
 		public Assignment getReadonlyAssignment_2_1_1() { return cReadonlyAssignment_2_1_1; }
-
+		
 		//"readonly"
 		public Keyword getReadonlyReadonlyKeyword_2_1_1_0() { return cReadonlyReadonlyKeyword_2_1_1_0; }
-
-		//("styles" styles=STRING)?
+		
+		//('styles' styles=STRING)?
 		public Group getGroup_2_1_2() { return cGroup_2_1_2; }
-
-		//"styles"
+		
+		//'styles'
 		public Keyword getStylesKeyword_2_1_2_0() { return cStylesKeyword_2_1_2_0; }
-
+		
 		//styles=STRING
 		public Assignment getStylesAssignment_2_1_2_1() { return cStylesAssignment_2_1_2_1; }
-
+		
 		//STRING
 		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_2_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_2_1_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
-
-		//("{" (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* "}")?
+		
+		//('{' (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
 		public Group getGroup_4() { return cGroup_4; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
-
+		
 		//(validators+=UiValidator | bindings+=UiBinding)*
 		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }
-
+		
 		//validators+=UiValidator
 		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }
-
+		
 		//UiValidator
 		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }
-
+		
 		//bindings+=UiBinding
 		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }
-
+		
 		//UiBinding
 		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }
-
+		
 		//processorAssignments+=UiVisibilityProcessorAssignment*
 		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }
-
+		
 		//UiVisibilityProcessorAssignment
 		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
 	}
-
 	public class UiValidatorElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiValidator");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
 		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
 		private final RuleCall cUiMaxLengthValidatorParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
 		private final RuleCall cUiMinLengthValidatorParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
@@ -8799,29 +9178,28 @@
 		
 		//UiValidator:
 		//	UiMaxLengthValidator | UiMinLengthValidator | UiRegexpValidator | UiXbaseValidator | UiBeanValidationValidator;
-		public ParserRule getRule() { return rule; }
-
+		@Override public ParserRule getRule() { return rule; }
+		
 		//UiMaxLengthValidator | UiMinLengthValidator | UiRegexpValidator | UiXbaseValidator | UiBeanValidationValidator
 		public Alternatives getAlternatives() { return cAlternatives; }
-
+		
 		//UiMaxLengthValidator
 		public RuleCall getUiMaxLengthValidatorParserRuleCall_0() { return cUiMaxLengthValidatorParserRuleCall_0; }
-
+		
 		//UiMinLengthValidator
 		public RuleCall getUiMinLengthValidatorParserRuleCall_1() { return cUiMinLengthValidatorParserRuleCall_1; }
-
+		
 		//UiRegexpValidator
 		public RuleCall getUiRegexpValidatorParserRuleCall_2() { return cUiRegexpValidatorParserRuleCall_2; }
-
+		
 		//UiXbaseValidator
 		public RuleCall getUiXbaseValidatorParserRuleCall_3() { return cUiXbaseValidatorParserRuleCall_3; }
-
+		
 		//UiBeanValidationValidator
 		public RuleCall getUiBeanValidationValidatorParserRuleCall_4() { return cUiBeanValidationValidatorParserRuleCall_4; }
 	}
-
 	public class UiMaxLengthValidatorElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMaxLengthValidator");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMaxLengthValidator");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiMaxLengthValidatorAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cMaxLengthValidatorKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -8835,45 +9213,45 @@
 		private final RuleCall cErrorCodeUiErrorCodeParserRuleCall_6_0 = (RuleCall)cErrorCodeAssignment_6.eContents().get(0);
 		
 		//UiMaxLengthValidator:
-		//	{UiMaxLengthValidator} "MaxLengthValidator" name=ID? "(" maxLength=INT ")" errorCode=UiErrorCode?;
-		public ParserRule getRule() { return rule; }
-
-		//{UiMaxLengthValidator} "MaxLengthValidator" name=ID? "(" maxLength=INT ")" errorCode=UiErrorCode?
+		//	{UiMaxLengthValidator}
+		//	'MaxLengthValidator' name=ID? '(' maxLength=INT ')' errorCode=UiErrorCode?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiMaxLengthValidator} 'MaxLengthValidator' name=ID? '(' maxLength=INT ')' errorCode=UiErrorCode?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiMaxLengthValidator}
 		public Action getUiMaxLengthValidatorAction_0() { return cUiMaxLengthValidatorAction_0; }
-
-		//"MaxLengthValidator"
+		
+		//'MaxLengthValidator'
 		public Keyword getMaxLengthValidatorKeyword_1() { return cMaxLengthValidatorKeyword_1; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_2_0() { return cNameIDTerminalRuleCall_2_0; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_3() { return cLeftParenthesisKeyword_3; }
-
+		
 		//maxLength=INT
 		public Assignment getMaxLengthAssignment_4() { return cMaxLengthAssignment_4; }
-
+		
 		//INT
 		public RuleCall getMaxLengthINTTerminalRuleCall_4_0() { return cMaxLengthINTTerminalRuleCall_4_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_5() { return cRightParenthesisKeyword_5; }
-
+		
 		//errorCode=UiErrorCode?
 		public Assignment getErrorCodeAssignment_6() { return cErrorCodeAssignment_6; }
-
+		
 		//UiErrorCode
 		public RuleCall getErrorCodeUiErrorCodeParserRuleCall_6_0() { return cErrorCodeUiErrorCodeParserRuleCall_6_0; }
 	}
-
 	public class UiMinLengthValidatorElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiMinLengthValidator");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMinLengthValidator");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiMinLengthValidatorAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cMinLengthValidatorKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -8887,45 +9265,45 @@
 		private final RuleCall cErrorCodeUiErrorCodeParserRuleCall_6_0 = (RuleCall)cErrorCodeAssignment_6.eContents().get(0);
 		
 		//UiMinLengthValidator:
-		//	{UiMinLengthValidator} "MinLengthValidator" name=ID? "(" minLength=INT ")" errorCode=UiErrorCode?;
-		public ParserRule getRule() { return rule; }
-
-		//{UiMinLengthValidator} "MinLengthValidator" name=ID? "(" minLength=INT ")" errorCode=UiErrorCode?
+		//	{UiMinLengthValidator}
+		//	'MinLengthValidator' name=ID? '(' minLength=INT ')' errorCode=UiErrorCode?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiMinLengthValidator} 'MinLengthValidator' name=ID? '(' minLength=INT ')' errorCode=UiErrorCode?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiMinLengthValidator}
 		public Action getUiMinLengthValidatorAction_0() { return cUiMinLengthValidatorAction_0; }
-
-		//"MinLengthValidator"
+		
+		//'MinLengthValidator'
 		public Keyword getMinLengthValidatorKeyword_1() { return cMinLengthValidatorKeyword_1; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_2_0() { return cNameIDTerminalRuleCall_2_0; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_3() { return cLeftParenthesisKeyword_3; }
-
+		
 		//minLength=INT
 		public Assignment getMinLengthAssignment_4() { return cMinLengthAssignment_4; }
-
+		
 		//INT
 		public RuleCall getMinLengthINTTerminalRuleCall_4_0() { return cMinLengthINTTerminalRuleCall_4_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_5() { return cRightParenthesisKeyword_5; }
-
+		
 		//errorCode=UiErrorCode?
 		public Assignment getErrorCodeAssignment_6() { return cErrorCodeAssignment_6; }
-
+		
 		//UiErrorCode
 		public RuleCall getErrorCodeUiErrorCodeParserRuleCall_6_0() { return cErrorCodeUiErrorCodeParserRuleCall_6_0; }
 	}
-
 	public class UiRegexpValidatorElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiRegexpValidator");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiRegexpValidator");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiRegexpValidatorAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cRegexValidatorKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -8939,45 +9317,45 @@
 		private final RuleCall cErrorCodeUiErrorCodeParserRuleCall_6_0 = (RuleCall)cErrorCodeAssignment_6.eContents().get(0);
 		
 		//UiRegexpValidator:
-		//	{UiRegexpValidator} "RegexValidator" name=ID? "(" regExpression=STRING ")" errorCode=UiErrorCode?;
-		public ParserRule getRule() { return rule; }
-
-		//{UiRegexpValidator} "RegexValidator" name=ID? "(" regExpression=STRING ")" errorCode=UiErrorCode?
+		//	{UiRegexpValidator}
+		//	'RegexValidator' name=ID? '(' regExpression=STRING ')' errorCode=UiErrorCode?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiRegexpValidator} 'RegexValidator' name=ID? '(' regExpression=STRING ')' errorCode=UiErrorCode?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiRegexpValidator}
 		public Action getUiRegexpValidatorAction_0() { return cUiRegexpValidatorAction_0; }
-
-		//"RegexValidator"
+		
+		//'RegexValidator'
 		public Keyword getRegexValidatorKeyword_1() { return cRegexValidatorKeyword_1; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_2_0() { return cNameIDTerminalRuleCall_2_0; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_3() { return cLeftParenthesisKeyword_3; }
-
+		
 		//regExpression=STRING
 		public Assignment getRegExpressionAssignment_4() { return cRegExpressionAssignment_4; }
-
+		
 		//STRING
 		public RuleCall getRegExpressionSTRINGTerminalRuleCall_4_0() { return cRegExpressionSTRINGTerminalRuleCall_4_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_5() { return cRightParenthesisKeyword_5; }
-
+		
 		//errorCode=UiErrorCode?
 		public Assignment getErrorCodeAssignment_6() { return cErrorCodeAssignment_6; }
-
+		
 		//UiErrorCode
 		public RuleCall getErrorCodeUiErrorCodeParserRuleCall_6_0() { return cErrorCodeUiErrorCodeParserRuleCall_6_0; }
 	}
-
 	public class UiXbaseValidatorElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiXbaseValidator");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiXbaseValidator");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiXbaseValidatorAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cExpressionKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -8993,53 +9371,53 @@
 		private final RuleCall cExpressionXBlockExpressionParserRuleCall_7_0 = (RuleCall)cExpressionAssignment_7.eContents().get(0);
 		
 		//UiXbaseValidator:
-		//	{UiXbaseValidator} "Expression" name=ID "(" jvmType=JvmTypeReference ")" errorCodes+=UiErrorCode*
-		//	expression=XBlockExpression?;
-		public ParserRule getRule() { return rule; }
-
-		//{UiXbaseValidator} "Expression" name=ID "(" jvmType=JvmTypeReference ")" errorCodes+=UiErrorCode*
+		//	{UiXbaseValidator}
+		//	'Expression' name=ID '(' jvmType=JvmTypeReference ')'
+		//	errorCodes+=UiErrorCode* expression=XBlockExpression?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiXbaseValidator} 'Expression' name=ID '(' jvmType=JvmTypeReference ')' errorCodes+=UiErrorCode*
 		//expression=XBlockExpression?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiXbaseValidator}
 		public Action getUiXbaseValidatorAction_0() { return cUiXbaseValidatorAction_0; }
-
-		//"Expression"
+		
+		//'Expression'
 		public Keyword getExpressionKeyword_1() { return cExpressionKeyword_1; }
-
+		
 		//name=ID
 		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_2_0() { return cNameIDTerminalRuleCall_2_0; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_3() { return cLeftParenthesisKeyword_3; }
-
+		
 		//jvmType=JvmTypeReference
 		public Assignment getJvmTypeAssignment_4() { return cJvmTypeAssignment_4; }
-
+		
 		//JvmTypeReference
 		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_4_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_4_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_5() { return cRightParenthesisKeyword_5; }
-
+		
 		//errorCodes+=UiErrorCode*
 		public Assignment getErrorCodesAssignment_6() { return cErrorCodesAssignment_6; }
-
+		
 		//UiErrorCode
 		public RuleCall getErrorCodesUiErrorCodeParserRuleCall_6_0() { return cErrorCodesUiErrorCodeParserRuleCall_6_0; }
-
+		
 		//expression=XBlockExpression?
 		public Assignment getExpressionAssignment_7() { return cExpressionAssignment_7; }
-
+		
 		//XBlockExpression
 		public RuleCall getExpressionXBlockExpressionParserRuleCall_7_0() { return cExpressionXBlockExpressionParserRuleCall_7_0; }
 	}
-
 	public class UiBeanValidationValidatorElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiBeanValidationValidator");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiBeanValidationValidator");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiBeanValidationValidatorAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cBeanValidationValidatorKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -9047,27 +9425,27 @@
 		private final RuleCall cNameIDTerminalRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
 		
 		//UiBeanValidationValidator:
-		//	{UiBeanValidationValidator} "BeanValidationValidator" name=ID?;
-		public ParserRule getRule() { return rule; }
-
-		//{UiBeanValidationValidator} "BeanValidationValidator" name=ID?
+		//	{UiBeanValidationValidator}
+		//	'BeanValidationValidator' name=ID?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiBeanValidationValidator} 'BeanValidationValidator' name=ID?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiBeanValidationValidator}
 		public Action getUiBeanValidationValidatorAction_0() { return cUiBeanValidationValidatorAction_0; }
-
-		//"BeanValidationValidator"
+		
+		//'BeanValidationValidator'
 		public Keyword getBeanValidationValidatorKeyword_1() { return cBeanValidationValidatorKeyword_1; }
-
+		
 		//name=ID?
 		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_2_0() { return cNameIDTerminalRuleCall_2_0; }
 	}
-
 	public class UiErrorCodeElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiErrorCode");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiErrorCode");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cCodeKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
@@ -9076,30 +9454,29 @@
 		private final RuleCall cDefaultMessageSTRINGTerminalRuleCall_2_0 = (RuleCall)cDefaultMessageAssignment_2.eContents().get(0);
 		
 		//UiErrorCode:
-		//	"code" name=ID defaultMessage=STRING?;
-		public ParserRule getRule() { return rule; }
-
-		//"code" name=ID defaultMessage=STRING?
+		//	'code' name=ID defaultMessage=STRING?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'code' name=ID defaultMessage=STRING?
 		public Group getGroup() { return cGroup; }
-
-		//"code"
+		
+		//'code'
 		public Keyword getCodeKeyword_0() { return cCodeKeyword_0; }
-
+		
 		//name=ID
 		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
-
+		
 		//defaultMessage=STRING?
 		public Assignment getDefaultMessageAssignment_2() { return cDefaultMessageAssignment_2; }
-
+		
 		//STRING
 		public RuleCall getDefaultMessageSTRINGTerminalRuleCall_2_0() { return cDefaultMessageSTRINGTerminalRuleCall_2_0; }
 	}
-
 	public class UiVisibilityProcessorElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiVisibilityProcessor");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessor");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUiVisibilityProcessorAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cVisibilityKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -9118,78 +9495,80 @@
 		private final Keyword cRightCurlyBracketKeyword_6 = (Keyword)cGroup.eContents().get(6);
 		
 		//UiVisibilityProcessor:
-		//	{UiVisibilityProcessor} "visibility" name=ID "{" (dataUsed+=UiBindingEndpointAlias | changeTriggers+=UiChangeTrigger |
-		//	importedElements+=UiTypedBindableRawTypeAlias)* rule=UiXbaseVisibilityRule? "}";
-		public ParserRule getRule() { return rule; }
-
-		//{UiVisibilityProcessor} "visibility" name=ID "{" (dataUsed+=UiBindingEndpointAlias | changeTriggers+=UiChangeTrigger |
-		//importedElements+=UiTypedBindableRawTypeAlias)* rule=UiXbaseVisibilityRule? "}"
+		//	{UiVisibilityProcessor}
+		//	'visibility' name=ID '{' (dataUsed+=UiBindingEndpointAlias
+		//	| changeTriggers+=UiChangeTrigger
+		//	| importedElements+=UiTypedBindableRawTypeAlias)*
+		//	rule=UiXbaseVisibilityRule?
+		//	'}';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UiVisibilityProcessor} 'visibility' name=ID '{' (dataUsed+=UiBindingEndpointAlias | changeTriggers+=UiChangeTrigger |
+		//importedElements+=UiTypedBindableRawTypeAlias)* rule=UiXbaseVisibilityRule? '}'
 		public Group getGroup() { return cGroup; }
-
+		
 		//{UiVisibilityProcessor}
 		public Action getUiVisibilityProcessorAction_0() { return cUiVisibilityProcessorAction_0; }
-
-		//"visibility"
+		
+		//'visibility'
 		public Keyword getVisibilityKeyword_1() { return cVisibilityKeyword_1; }
-
+		
 		//name=ID
 		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_2_0() { return cNameIDTerminalRuleCall_2_0; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_3() { return cLeftCurlyBracketKeyword_3; }
-
+		
 		//(dataUsed+=UiBindingEndpointAlias | changeTriggers+=UiChangeTrigger | importedElements+=UiTypedBindableRawTypeAlias)*
 		public Alternatives getAlternatives_4() { return cAlternatives_4; }
-
+		
 		//dataUsed+=UiBindingEndpointAlias
 		public Assignment getDataUsedAssignment_4_0() { return cDataUsedAssignment_4_0; }
-
+		
 		//UiBindingEndpointAlias
 		public RuleCall getDataUsedUiBindingEndpointAliasParserRuleCall_4_0_0() { return cDataUsedUiBindingEndpointAliasParserRuleCall_4_0_0; }
-
+		
 		//changeTriggers+=UiChangeTrigger
 		public Assignment getChangeTriggersAssignment_4_1() { return cChangeTriggersAssignment_4_1; }
-
+		
 		//UiChangeTrigger
 		public RuleCall getChangeTriggersUiChangeTriggerParserRuleCall_4_1_0() { return cChangeTriggersUiChangeTriggerParserRuleCall_4_1_0; }
-
+		
 		//importedElements+=UiTypedBindableRawTypeAlias
 		public Assignment getImportedElementsAssignment_4_2() { return cImportedElementsAssignment_4_2; }
-
+		
 		//UiTypedBindableRawTypeAlias
 		public RuleCall getImportedElementsUiTypedBindableRawTypeAliasParserRuleCall_4_2_0() { return cImportedElementsUiTypedBindableRawTypeAliasParserRuleCall_4_2_0; }
-
+		
 		//rule=UiXbaseVisibilityRule?
 		public Assignment getRuleAssignment_5() { return cRuleAssignment_5; }
-
+		
 		//UiXbaseVisibilityRule
 		public RuleCall getRuleUiXbaseVisibilityRuleParserRuleCall_5_0() { return cRuleUiXbaseVisibilityRuleParserRuleCall_5_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_6() { return cRightCurlyBracketKeyword_6; }
 	}
-
 	public class UiXbaseVisibilityRuleElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiXbaseVisibilityRule");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiXbaseVisibilityRule");
 		private final Assignment cExpressionAssignment = (Assignment)rule.eContents().get(1);
 		private final RuleCall cExpressionXBlockExpressionParserRuleCall_0 = (RuleCall)cExpressionAssignment.eContents().get(0);
 		
 		//UiXbaseVisibilityRule:
 		//	expression=XBlockExpression;
-		public ParserRule getRule() { return rule; }
-
+		@Override public ParserRule getRule() { return rule; }
+		
 		//expression=XBlockExpression
 		public Assignment getExpressionAssignment() { return cExpressionAssignment; }
-
+		
 		//XBlockExpression
 		public RuleCall getExpressionXBlockExpressionParserRuleCall_0() { return cExpressionXBlockExpressionParserRuleCall_0; }
 	}
-
 	public class UiChangeTriggerElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UiChangeTrigger");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiChangeTrigger");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cFireOnKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cEndpointAssignment_1 = (Assignment)cGroup.eContents().get(1);
@@ -9200,37 +9579,36 @@
 		private final Keyword cSemicolonKeyword_4 = (Keyword)cGroup.eContents().get(4);
 		
 		//UiChangeTrigger:
-		//	"fireOn" endpoint=UiBindingEndpointAssignment "as" alias=ID ";"?;
-		public ParserRule getRule() { return rule; }
-
-		//"fireOn" endpoint=UiBindingEndpointAssignment "as" alias=ID ";"?
+		//	'fireOn' endpoint=UiBindingEndpointAssignment 'as' alias=ID ';'?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'fireOn' endpoint=UiBindingEndpointAssignment 'as' alias=ID ';'?
 		public Group getGroup() { return cGroup; }
-
-		//"fireOn"
+		
+		//'fireOn'
 		public Keyword getFireOnKeyword_0() { return cFireOnKeyword_0; }
-
+		
 		//endpoint=UiBindingEndpointAssignment
 		public Assignment getEndpointAssignment_1() { return cEndpointAssignment_1; }
-
+		
 		//UiBindingEndpointAssignment
 		public RuleCall getEndpointUiBindingEndpointAssignmentParserRuleCall_1_0() { return cEndpointUiBindingEndpointAssignmentParserRuleCall_1_0; }
-
-		//"as"
+		
+		//'as'
 		public Keyword getAsKeyword_2() { return cAsKeyword_2; }
-
+		
 		//alias=ID
 		public Assignment getAliasAssignment_3() { return cAliasAssignment_3; }
-
+		
 		//ID
 		public RuleCall getAliasIDTerminalRuleCall_3_0() { return cAliasIDTerminalRuleCall_3_0; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_4() { return cSemicolonKeyword_4; }
 	}
 	
-	
 	public class UiDateFormatElements extends AbstractEnumRuleElementFinder {
-		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "UiDateFormat");
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiDateFormat");
 		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
 		private final EnumLiteralDeclaration cDATEEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
 		private final Keyword cDATEDateKeyword_0_0 = (Keyword)cDATEEnumLiteralDeclaration_0.eContents().get(0);
@@ -9242,31 +9620,30 @@
 		//enum UiDateFormat:
 		//	DATE="date" | DATE_TIME="datetime" | TIME="time";
 		public EnumRule getRule() { return rule; }
-
+		
 		//DATE="date" | DATE_TIME="datetime" | TIME="time"
 		public Alternatives getAlternatives() { return cAlternatives; }
-
+		
 		//DATE="date"
 		public EnumLiteralDeclaration getDATEEnumLiteralDeclaration_0() { return cDATEEnumLiteralDeclaration_0; }
-
+		
 		//"date"
 		public Keyword getDATEDateKeyword_0_0() { return cDATEDateKeyword_0_0; }
-
+		
 		//DATE_TIME="datetime"
 		public EnumLiteralDeclaration getDATE_TIMEEnumLiteralDeclaration_1() { return cDATE_TIMEEnumLiteralDeclaration_1; }
-
+		
 		//"datetime"
 		public Keyword getDATE_TIMEDatetimeKeyword_1_0() { return cDATE_TIMEDatetimeKeyword_1_0; }
-
+		
 		//TIME="time"
 		public EnumLiteralDeclaration getTIMEEnumLiteralDeclaration_2() { return cTIMEEnumLiteralDeclaration_2; }
-
+		
 		//"time"
 		public Keyword getTIMETimeKeyword_2_0() { return cTIMETimeKeyword_2_0; }
 	}
-
 	public class UiDateTimeResolutionElements extends AbstractEnumRuleElementFinder {
-		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "UiDateTimeResolution");
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiDateTimeResolution");
 		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
 		private final EnumLiteralDeclaration cUNDEFINEDEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
 		private final Keyword cUNDEFINEDUndefinedKeyword_0_0 = (Keyword)cUNDEFINEDEnumLiteralDeclaration_0.eContents().get(0);
@@ -9286,55 +9663,54 @@
 		//enum UiDateTimeResolution:
 		//	UNDEFINED="undefined" | SECOND="second" | MINUTE="minute" | HOUR="hour" | DAY="day" | MONTH="month" | YEAR="year";
 		public EnumRule getRule() { return rule; }
-
+		
 		//UNDEFINED="undefined" | SECOND="second" | MINUTE="minute" | HOUR="hour" | DAY="day" | MONTH="month" | YEAR="year"
 		public Alternatives getAlternatives() { return cAlternatives; }
-
+		
 		//UNDEFINED="undefined"
 		public EnumLiteralDeclaration getUNDEFINEDEnumLiteralDeclaration_0() { return cUNDEFINEDEnumLiteralDeclaration_0; }
-
+		
 		//"undefined"
 		public Keyword getUNDEFINEDUndefinedKeyword_0_0() { return cUNDEFINEDUndefinedKeyword_0_0; }
-
+		
 		//SECOND="second"
 		public EnumLiteralDeclaration getSECONDEnumLiteralDeclaration_1() { return cSECONDEnumLiteralDeclaration_1; }
-
+		
 		//"second"
 		public Keyword getSECONDSecondKeyword_1_0() { return cSECONDSecondKeyword_1_0; }
-
+		
 		//MINUTE="minute"
 		public EnumLiteralDeclaration getMINUTEEnumLiteralDeclaration_2() { return cMINUTEEnumLiteralDeclaration_2; }
-
+		
 		//"minute"
 		public Keyword getMINUTEMinuteKeyword_2_0() { return cMINUTEMinuteKeyword_2_0; }
-
+		
 		//HOUR="hour"
 		public EnumLiteralDeclaration getHOUREnumLiteralDeclaration_3() { return cHOUREnumLiteralDeclaration_3; }
-
+		
 		//"hour"
 		public Keyword getHOURHourKeyword_3_0() { return cHOURHourKeyword_3_0; }
-
+		
 		//DAY="day"
 		public EnumLiteralDeclaration getDAYEnumLiteralDeclaration_4() { return cDAYEnumLiteralDeclaration_4; }
-
+		
 		//"day"
 		public Keyword getDAYDayKeyword_4_0() { return cDAYDayKeyword_4_0; }
-
+		
 		//MONTH="month"
 		public EnumLiteralDeclaration getMONTHEnumLiteralDeclaration_5() { return cMONTHEnumLiteralDeclaration_5; }
-
+		
 		//"month"
 		public Keyword getMONTHMonthKeyword_5_0() { return cMONTHMonthKeyword_5_0; }
-
+		
 		//YEAR="year"
 		public EnumLiteralDeclaration getYEAREnumLiteralDeclaration_6() { return cYEAREnumLiteralDeclaration_6; }
-
+		
 		//"year"
 		public Keyword getYEARYearKeyword_6_0() { return cYEARYearKeyword_6_0; }
 	}
-
 	public class UiSelectionTypeElements extends AbstractEnumRuleElementFinder {
-		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "UiSelectionType");
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiSelectionType");
 		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
 		private final EnumLiteralDeclaration cSINGLEEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
 		private final Keyword cSINGLESingleKeyword_0_0 = (Keyword)cSINGLEEnumLiteralDeclaration_0.eContents().get(0);
@@ -9344,33 +9720,32 @@
 		private final Keyword cNONENoneKeyword_2_0 = (Keyword)cNONEEnumLiteralDeclaration_2.eContents().get(0);
 		
 		//enum UiSelectionType:
-		//	SINGLE="single" | MULTI="multi" | NONE="none";
+		//	SINGLE='single' | MULTI='multi' | NONE='none';
 		public EnumRule getRule() { return rule; }
-
-		//SINGLE="single" | MULTI="multi" | NONE="none"
+		
+		//SINGLE='single' | MULTI='multi' | NONE='none'
 		public Alternatives getAlternatives() { return cAlternatives; }
-
-		//SINGLE="single"
+		
+		//SINGLE='single'
 		public EnumLiteralDeclaration getSINGLEEnumLiteralDeclaration_0() { return cSINGLEEnumLiteralDeclaration_0; }
-
-		//"single"
+		
+		//'single'
 		public Keyword getSINGLESingleKeyword_0_0() { return cSINGLESingleKeyword_0_0; }
-
-		//MULTI="multi"
+		
+		//MULTI='multi'
 		public EnumLiteralDeclaration getMULTIEnumLiteralDeclaration_1() { return cMULTIEnumLiteralDeclaration_1; }
-
-		//"multi"
+		
+		//'multi'
 		public Keyword getMULTIMultiKeyword_1_0() { return cMULTIMultiKeyword_1_0; }
-
-		//NONE="none"
+		
+		//NONE='none'
 		public EnumLiteralDeclaration getNONEEnumLiteralDeclaration_2() { return cNONEEnumLiteralDeclaration_2; }
-
-		//"none"
+		
+		//'none'
 		public Keyword getNONENoneKeyword_2_0() { return cNONENoneKeyword_2_0; }
 	}
-
 	public class UiAlignmentElements extends AbstractEnumRuleElementFinder {
-		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "UiAlignment");
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiAlignment");
 		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
 		private final EnumLiteralDeclaration cUNDEFINEDEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
 		private final Keyword cUNDEFINEDUndefinedKeyword_0_0 = (Keyword)cUNDEFINEDEnumLiteralDeclaration_0.eContents().get(0);
@@ -9408,124 +9783,123 @@
 		private final Keyword cFILL_FILLFillFillKeyword_16_0 = (Keyword)cFILL_FILLEnumLiteralDeclaration_16.eContents().get(0);
 		
 		//enum UiAlignment:
-		//	UNDEFINED="undefined" | BOTTOM_CENTER="bottom-center" | BOTTOM_LEFT="bottom-left" | BOTTOM_RIGHT="bottom-right" |
-		//	BOTTOM_FILL="bottom-fill" | MIDDLE_CENTER="middle-center" | MIDDLE_LEFT="middle-left" | MIDDLE_RIGHT="middle-right" |
-		//	MIDDLE_FILL="middle-fill" | TOP_CENTER="top-center" | TOP_LEFT="top-left" | TOP_RIGHT="top-right" |
-		//	TOP_FILL="top-fill" | FILL_CENTER="fill-center" | FILL_LEFT="fill-left" | FILL_RIGHT="fill-right" |
-		//	FILL_FILL="fill-fill";
+		//	UNDEFINED="undefined"
+		//	| BOTTOM_CENTER="bottom-center" | BOTTOM_LEFT="bottom-left" | BOTTOM_RIGHT="bottom-right" | BOTTOM_FILL="bottom-fill"
+		//	| MIDDLE_CENTER="middle-center" | MIDDLE_LEFT="middle-left" | MIDDLE_RIGHT="middle-right" | MIDDLE_FILL="middle-fill"
+		//	| TOP_CENTER="top-center" | TOP_LEFT="top-left" | TOP_RIGHT="top-right" | TOP_FILL="top-fill"
+		//	| FILL_CENTER="fill-center" | FILL_LEFT="fill-left" | FILL_RIGHT="fill-right" | FILL_FILL="fill-fill";
 		public EnumRule getRule() { return rule; }
-
+		
 		//UNDEFINED="undefined" | BOTTOM_CENTER="bottom-center" | BOTTOM_LEFT="bottom-left" | BOTTOM_RIGHT="bottom-right" |
 		//BOTTOM_FILL="bottom-fill" | MIDDLE_CENTER="middle-center" | MIDDLE_LEFT="middle-left" | MIDDLE_RIGHT="middle-right" |
 		//MIDDLE_FILL="middle-fill" | TOP_CENTER="top-center" | TOP_LEFT="top-left" | TOP_RIGHT="top-right" | TOP_FILL="top-fill"
 		//| FILL_CENTER="fill-center" | FILL_LEFT="fill-left" | FILL_RIGHT="fill-right" | FILL_FILL="fill-fill"
 		public Alternatives getAlternatives() { return cAlternatives; }
-
+		
 		//UNDEFINED="undefined"
 		public EnumLiteralDeclaration getUNDEFINEDEnumLiteralDeclaration_0() { return cUNDEFINEDEnumLiteralDeclaration_0; }
-
+		
 		//"undefined"
 		public Keyword getUNDEFINEDUndefinedKeyword_0_0() { return cUNDEFINEDUndefinedKeyword_0_0; }
-
+		
 		//BOTTOM_CENTER="bottom-center"
 		public EnumLiteralDeclaration getBOTTOM_CENTEREnumLiteralDeclaration_1() { return cBOTTOM_CENTEREnumLiteralDeclaration_1; }
-
+		
 		//"bottom-center"
 		public Keyword getBOTTOM_CENTERBottomCenterKeyword_1_0() { return cBOTTOM_CENTERBottomCenterKeyword_1_0; }
-
+		
 		//BOTTOM_LEFT="bottom-left"
 		public EnumLiteralDeclaration getBOTTOM_LEFTEnumLiteralDeclaration_2() { return cBOTTOM_LEFTEnumLiteralDeclaration_2; }
-
+		
 		//"bottom-left"
 		public Keyword getBOTTOM_LEFTBottomLeftKeyword_2_0() { return cBOTTOM_LEFTBottomLeftKeyword_2_0; }
-
+		
 		//BOTTOM_RIGHT="bottom-right"
 		public EnumLiteralDeclaration getBOTTOM_RIGHTEnumLiteralDeclaration_3() { return cBOTTOM_RIGHTEnumLiteralDeclaration_3; }
-
+		
 		//"bottom-right"
 		public Keyword getBOTTOM_RIGHTBottomRightKeyword_3_0() { return cBOTTOM_RIGHTBottomRightKeyword_3_0; }
-
+		
 		//BOTTOM_FILL="bottom-fill"
 		public EnumLiteralDeclaration getBOTTOM_FILLEnumLiteralDeclaration_4() { return cBOTTOM_FILLEnumLiteralDeclaration_4; }
-
+		
 		//"bottom-fill"
 		public Keyword getBOTTOM_FILLBottomFillKeyword_4_0() { return cBOTTOM_FILLBottomFillKeyword_4_0; }
-
+		
 		//MIDDLE_CENTER="middle-center"
 		public EnumLiteralDeclaration getMIDDLE_CENTEREnumLiteralDeclaration_5() { return cMIDDLE_CENTEREnumLiteralDeclaration_5; }
-
+		
 		//"middle-center"
 		public Keyword getMIDDLE_CENTERMiddleCenterKeyword_5_0() { return cMIDDLE_CENTERMiddleCenterKeyword_5_0; }
-
+		
 		//MIDDLE_LEFT="middle-left"
 		public EnumLiteralDeclaration getMIDDLE_LEFTEnumLiteralDeclaration_6() { return cMIDDLE_LEFTEnumLiteralDeclaration_6; }
-
+		
 		//"middle-left"
 		public Keyword getMIDDLE_LEFTMiddleLeftKeyword_6_0() { return cMIDDLE_LEFTMiddleLeftKeyword_6_0; }
-
+		
 		//MIDDLE_RIGHT="middle-right"
 		public EnumLiteralDeclaration getMIDDLE_RIGHTEnumLiteralDeclaration_7() { return cMIDDLE_RIGHTEnumLiteralDeclaration_7; }
-
+		
 		//"middle-right"
 		public Keyword getMIDDLE_RIGHTMiddleRightKeyword_7_0() { return cMIDDLE_RIGHTMiddleRightKeyword_7_0; }
-
+		
 		//MIDDLE_FILL="middle-fill"
 		public EnumLiteralDeclaration getMIDDLE_FILLEnumLiteralDeclaration_8() { return cMIDDLE_FILLEnumLiteralDeclaration_8; }
-
+		
 		//"middle-fill"
 		public Keyword getMIDDLE_FILLMiddleFillKeyword_8_0() { return cMIDDLE_FILLMiddleFillKeyword_8_0; }
-
+		
 		//TOP_CENTER="top-center"
 		public EnumLiteralDeclaration getTOP_CENTEREnumLiteralDeclaration_9() { return cTOP_CENTEREnumLiteralDeclaration_9; }
-
+		
 		//"top-center"
 		public Keyword getTOP_CENTERTopCenterKeyword_9_0() { return cTOP_CENTERTopCenterKeyword_9_0; }
-
+		
 		//TOP_LEFT="top-left"
 		public EnumLiteralDeclaration getTOP_LEFTEnumLiteralDeclaration_10() { return cTOP_LEFTEnumLiteralDeclaration_10; }
-
+		
 		//"top-left"
 		public Keyword getTOP_LEFTTopLeftKeyword_10_0() { return cTOP_LEFTTopLeftKeyword_10_0; }
-
+		
 		//TOP_RIGHT="top-right"
 		public EnumLiteralDeclaration getTOP_RIGHTEnumLiteralDeclaration_11() { return cTOP_RIGHTEnumLiteralDeclaration_11; }
-
+		
 		//"top-right"
 		public Keyword getTOP_RIGHTTopRightKeyword_11_0() { return cTOP_RIGHTTopRightKeyword_11_0; }
-
+		
 		//TOP_FILL="top-fill"
 		public EnumLiteralDeclaration getTOP_FILLEnumLiteralDeclaration_12() { return cTOP_FILLEnumLiteralDeclaration_12; }
-
+		
 		//"top-fill"
 		public Keyword getTOP_FILLTopFillKeyword_12_0() { return cTOP_FILLTopFillKeyword_12_0; }
-
+		
 		//FILL_CENTER="fill-center"
 		public EnumLiteralDeclaration getFILL_CENTEREnumLiteralDeclaration_13() { return cFILL_CENTEREnumLiteralDeclaration_13; }
-
+		
 		//"fill-center"
 		public Keyword getFILL_CENTERFillCenterKeyword_13_0() { return cFILL_CENTERFillCenterKeyword_13_0; }
-
+		
 		//FILL_LEFT="fill-left"
 		public EnumLiteralDeclaration getFILL_LEFTEnumLiteralDeclaration_14() { return cFILL_LEFTEnumLiteralDeclaration_14; }
-
+		
 		//"fill-left"
 		public Keyword getFILL_LEFTFillLeftKeyword_14_0() { return cFILL_LEFTFillLeftKeyword_14_0; }
-
+		
 		//FILL_RIGHT="fill-right"
 		public EnumLiteralDeclaration getFILL_RIGHTEnumLiteralDeclaration_15() { return cFILL_RIGHTEnumLiteralDeclaration_15; }
-
+		
 		//"fill-right"
 		public Keyword getFILL_RIGHTFillRightKeyword_15_0() { return cFILL_RIGHTFillRightKeyword_15_0; }
-
+		
 		//FILL_FILL="fill-fill"
 		public EnumLiteralDeclaration getFILL_FILLEnumLiteralDeclaration_16() { return cFILL_FILLEnumLiteralDeclaration_16; }
-
+		
 		//"fill-fill"
 		public Keyword getFILL_FILLFillFillKeyword_16_0() { return cFILL_FILLFillFillKeyword_16_0; }
 	}
 	
 	private final UiModelElements pUiModel;
-	private final UiImportsElements pUiImports;
 	private final UiRootElementsElements pUiRootElements;
 	private final UiValidatorAliasElements pUiValidatorAlias;
 	private final UiValidatorAssignmentElements pUiValidatorAssignment;
@@ -9552,6 +9926,7 @@
 	private final UiSendEventCommandElements pUiSendEventCommand;
 	private final UiViewElements pUiView;
 	private final UiIDEViewElements pUiIDEView;
+	private final UiDisplayViewElements pUiDisplayView;
 	private final UiExposedActionElements pUiExposedAction;
 	private final UiMobileNavBarActionElements pUiMobileNavBarAction;
 	private final UiMobileViewElements pUiMobileView;
@@ -9604,8 +9979,8 @@
 	private final UiSearchFieldElements pUiSearchField;
 	private final UiTextAreaElements pUiTextArea;
 	private final UiDateFieldElements pUiDateField;
-	private final UiDateFormatElements unknownRuleUiDateFormat;
-	private final UiDateTimeResolutionElements unknownRuleUiDateTimeResolution;
+	private final UiDateFormatElements eUiDateFormat;
+	private final UiDateTimeResolutionElements eUiDateTimeResolution;
 	private final UiBrowserElements pUiBrowser;
 	private final UiProgressBarElements pUiProgressBar;
 	private final UiImageElements pUiImage;
@@ -9618,8 +9993,8 @@
 	private final UiDecimalFieldElements pUiDecimalField;
 	private final UiOptionsGroupElements pUiOptionsGroup;
 	private final UiListElements pUiList;
-	private final UiSelectionTypeElements unknownRuleUiSelectionType;
-	private final UiAlignmentElements unknownRuleUiAlignment;
+	private final UiSelectionTypeElements eUiSelectionType;
+	private final UiAlignmentElements eUiAlignment;
 	private final UiColumnsAssignmentElements pUiColumnsAssignment;
 	private final UiSortOrderAssignmentElements pUiSortOrderAssignment;
 	private final UiSortOrderElements pUiSortOrder;
@@ -9646,16 +10021,27 @@
 	private final UiChangeTriggerElements pUiChangeTrigger;
 	
 	private final Grammar grammar;
-
+	
+	private final OXtypeGrammarAccess gaOXtype;
+	
+	private final XbaseWithAnnotationsGrammarAccess gaXbaseWithAnnotations;
+	
 	private final XbaseGrammarAccess gaXbase;
+	
+	private final XtypeGrammarAccess gaXtype;
 
 	@Inject
 	public UIGrammarGrammarAccess(GrammarProvider grammarProvider,
-		XbaseGrammarAccess gaXbase) {
+			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.pUiModel = new UiModelElements();
-		this.pUiImports = new UiImportsElements();
 		this.pUiRootElements = new UiRootElementsElements();
 		this.pUiValidatorAlias = new UiValidatorAliasElements();
 		this.pUiValidatorAssignment = new UiValidatorAssignmentElements();
@@ -9682,6 +10068,7 @@
 		this.pUiSendEventCommand = new UiSendEventCommandElements();
 		this.pUiView = new UiViewElements();
 		this.pUiIDEView = new UiIDEViewElements();
+		this.pUiDisplayView = new UiDisplayViewElements();
 		this.pUiExposedAction = new UiExposedActionElements();
 		this.pUiMobileNavBarAction = new UiMobileNavBarActionElements();
 		this.pUiMobileView = new UiMobileViewElements();
@@ -9734,8 +10121,8 @@
 		this.pUiSearchField = new UiSearchFieldElements();
 		this.pUiTextArea = new UiTextAreaElements();
 		this.pUiDateField = new UiDateFieldElements();
-		this.unknownRuleUiDateFormat = new UiDateFormatElements();
-		this.unknownRuleUiDateTimeResolution = new UiDateTimeResolutionElements();
+		this.eUiDateFormat = new UiDateFormatElements();
+		this.eUiDateTimeResolution = new UiDateTimeResolutionElements();
 		this.pUiBrowser = new UiBrowserElements();
 		this.pUiProgressBar = new UiProgressBarElements();
 		this.pUiImage = new UiImageElements();
@@ -9748,8 +10135,8 @@
 		this.pUiDecimalField = new UiDecimalFieldElements();
 		this.pUiOptionsGroup = new UiOptionsGroupElements();
 		this.pUiList = new UiListElements();
-		this.unknownRuleUiSelectionType = new UiSelectionTypeElements();
-		this.unknownRuleUiAlignment = new UiAlignmentElements();
+		this.eUiSelectionType = new UiSelectionTypeElements();
+		this.eUiAlignment = new UiAlignmentElements();
 		this.pUiColumnsAssignment = new UiColumnsAssignmentElements();
 		this.pUiSortOrderAssignment = new UiSortOrderAssignmentElements();
 		this.pUiSortOrder = new UiSortOrderElements();
@@ -9792,19 +10179,33 @@
 		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;
+	}
 
 	
 	//UiModel:
-	//	"package" packageName=QualifiedName imports+=UiImports* roots+=UiRootElements*;
+	//	'package' packageName=QualifiedName
+	//	importSection=XImportSection?
+	//	roots+=UiRootElements*;
 	public UiModelElements getUiModelAccess() {
 		return pUiModel;
 	}
@@ -9812,19 +10213,9 @@
 	public ParserRule getUiModelRule() {
 		return getUiModelAccess().getRule();
 	}
-
-	//UiImports:
-	//	"import" importedNamespace=QualifiedNameWithWildcard ";"?;
-	public UiImportsElements getUiImportsAccess() {
-		return pUiImports;
-	}
 	
-	public ParserRule getUiImportsRule() {
-		return getUiImportsAccess().getRule();
-	}
-
 	//UiRootElements:
-	//	UiView | UiViewSet | UiValidatorAlias | UiMobileView;
+	//	UiView | UiDisplayView | UiViewSet | UiValidatorAlias | UiMobileView;
 	public UiRootElementsElements getUiRootElementsAccess() {
 		return pUiRootElements;
 	}
@@ -9832,9 +10223,9 @@
 	public ParserRule getUiRootElementsRule() {
 		return getUiRootElementsAccess().getRule();
 	}
-
+	
 	//UiValidatorAlias:
-	//	"validatorAlias" validator=UiValidator "as" alias=ID ";"?;
+	//	'validatorAlias' validator=UiValidator 'as' alias=ID ';'?;
 	public UiValidatorAliasElements getUiValidatorAliasAccess() {
 		return pUiValidatorAlias;
 	}
@@ -9842,10 +10233,10 @@
 	public ParserRule getUiValidatorAliasRule() {
 		return getUiValidatorAliasAccess().getRule();
 	}
-
+	
 	//UiValidatorAssignment:
-	//	"fieldValidation" field=[UiField] "+=" (validatorDef=UiValidatorDef | validatorAlias=[UiValidatorAlias|QualifiedName]
-	//	";"?);
+	//	'fieldValidation' field=[UiField] '+=' (validatorDef=UiValidatorDef | validatorAlias=[UiValidatorAlias|QualifiedName]
+	//	';'?);
 	public UiValidatorAssignmentElements getUiValidatorAssignmentAccess() {
 		return pUiValidatorAssignment;
 	}
@@ -9853,7 +10244,7 @@
 	public ParserRule getUiValidatorAssignmentRule() {
 		return getUiValidatorAssignmentAccess().getRule();
 	}
-
+	
 	//UiValidatorDef:
 	//	validator=UiValidator;
 	public UiValidatorDefElements getUiValidatorDefAccess() {
@@ -9863,9 +10254,12 @@
 	public ParserRule getUiValidatorDefRule() {
 		return getUiValidatorDefAccess().getRule();
 	}
-
+	
 	//UiViewSet:
-	//	"viewset" name=ID "{" beanSlots+=UiBeanSlot* bindingEndpointAlias+=UiBindingEndpointAlias* "}";
+	//	'viewset' name=ID '{'
+	//	beanSlots+=UiBeanSlot*
+	//	bindingEndpointAlias+=UiBindingEndpointAlias*
+	//	'}';
 	public UiViewSetElements getUiViewSetAccess() {
 		return pUiViewSet;
 	}
@@ -9873,9 +10267,9 @@
 	public ParserRule getUiViewSetRule() {
 		return getUiViewSetAccess().getRule();
 	}
-
+	
 	//UiBindingEndpointAlias:
-	//	"dataAlias" endpoint=UiBindingEndpointAssignment "as" alias=ID ";"?;
+	//	'dataAlias' endpoint=UiBindingEndpointAssignment 'as' alias=ID ';'?;
 	public UiBindingEndpointAliasElements getUiBindingEndpointAliasAccess() {
 		return pUiBindingEndpointAlias;
 	}
@@ -9883,9 +10277,9 @@
 	public ParserRule getUiBindingEndpointAliasRule() {
 		return getUiBindingEndpointAliasAccess().getRule();
 	}
-
+	
 	//UiBeanSlot:
-	//	"datasource" name=ID ":" jvmType=JvmTypeReference ("eventTopic" eventTopic=STRING)? ";"?;
+	//	'datasource' name=ID ':' jvmType=JvmTypeReference ('eventTopic' eventTopic=STRING)? ';'?;
 	public UiBeanSlotElements getUiBeanSlotAccess() {
 		return pUiBeanSlot;
 	}
@@ -9893,10 +10287,10 @@
 	public ParserRule getUiBeanSlotRule() {
 		return getUiBeanSlotAccess().getRule();
 	}
-
+	
 	//UiBinding:
-	//	"bind" listBinding?="list"? source=UiBindingEndpointAssignment (targetToSource?="<"? "--" sourceToTarget?=">"?)
-	//	target=UiBindingEndpointAssignment ";"?;
+	//	'bind' listBinding?='list'? source=UiBindingEndpointAssignment (targetToSource?='<'? '--'
+	//	sourceToTarget?='>'?) target=UiBindingEndpointAssignment ';'?;
 	public UiBindingElements getUiBindingAccess() {
 		return pUiBinding;
 	}
@@ -9904,8 +10298,8 @@
 	public ParserRule getUiBindingRule() {
 		return getUiBindingAccess().getRule();
 	}
-
-	//UiBindingEndpointAssignment returns UiBindingExpression:
+	
+	//UiBindingEndpointAssignment UiBindingExpression:
 	//	UiTypedBindableDef {UiBindingEndpointAssignment.typedBindableDef=current} path=UiPathSegment? | UiCommandBindableDef
 	//	{UiBindingEndpointAssignment.typedBindableDef=current} | {UiBindingEndpointAssignment}
 	//	typedBindableAlias=[UiTypedBindable] path=UiPathSegment?;
@@ -9916,9 +10310,10 @@
 	public ParserRule getUiBindingEndpointAssignmentRule() {
 		return getUiBindingEndpointAssignmentAccess().getRule();
 	}
-
+	
 	//UiPathSegment:
-	//	{UiPathSegment} "." getter=[JvmOperation] path=UiPathSegment?;
+	//	{UiPathSegment}
+	//	'.' getter=[JvmOperation] path=UiPathSegment?;
 	public UiPathSegmentElements getUiPathSegmentAccess() {
 		return pUiPathSegment;
 	}
@@ -9926,7 +10321,7 @@
 	public ParserRule getUiPathSegmentRule() {
 		return getUiPathSegmentAccess().getRule();
 	}
-
+	
 	//UiNestedProperty:
 	//	{UiNestedProperty} getter=[JvmOperation] path=UiPathSegment?;
 	public UiNestedPropertyElements getUiNestedPropertyAccess() {
@@ -9936,9 +10331,9 @@
 	public ParserRule getUiNestedPropertyRule() {
 		return getUiNestedPropertyAccess().getRule();
 	}
-
-	//UiTypedBindableDef returns UiBindingExpression:
-	//	{UiTypedBindableDef} ("[" rawBindable=[UiRawBindable] rawBindablePath=UiRawBindablePathSegment? "]" "."
+	
+	//UiTypedBindableDef UiBindingExpression:
+	//	{UiTypedBindableDef} ('[' rawBindable=[UiRawBindable] rawBindablePath=UiRawBindablePathSegment? ']' '.'
 	//	method=[cfg::UxEndpointDef]);
 	public UiTypedBindableDefElements getUiTypedBindableDefAccess() {
 		return pUiTypedBindableDef;
@@ -9947,9 +10342,10 @@
 	public ParserRule getUiTypedBindableDefRule() {
 		return getUiTypedBindableDefAccess().getRule();
 	}
-
-	//UiTypedBindableRawType returns UiBindingExpression:
-	//	{UiTypedBindableRawType} "[" rawBindable=[UiRawBindable] rawBindablePath=UiRawBindablePathSegment? "]";
+	
+	//UiTypedBindableRawType UiBindingExpression:
+	//	{UiTypedBindableRawType}
+	//	'[' rawBindable=[UiRawBindable] rawBindablePath=UiRawBindablePathSegment? ']';
 	public UiTypedBindableRawTypeElements getUiTypedBindableRawTypeAccess() {
 		return pUiTypedBindableRawType;
 	}
@@ -9957,9 +10353,9 @@
 	public ParserRule getUiTypedBindableRawTypeRule() {
 		return getUiTypedBindableRawTypeAccess().getRule();
 	}
-
+	
 	//UiTypedBindableRawTypeAlias:
-	//	"ui" type=UiTypedBindableRawType "as" alias=ID ";"?;
+	//	'ui' type=UiTypedBindableRawType 'as' alias=ID ';'?;
 	public UiTypedBindableRawTypeAliasElements getUiTypedBindableRawTypeAliasAccess() {
 		return pUiTypedBindableRawTypeAlias;
 	}
@@ -9967,9 +10363,9 @@
 	public ParserRule getUiTypedBindableRawTypeAliasRule() {
 		return getUiTypedBindableRawTypeAliasAccess().getRule();
 	}
-
+	
 	//UiRawBindablePathSegment:
-	//	{UiRawBindablePathSegment} ("." | toParent?="..") rawBindable=[UiRawBindable] path=UiRawBindablePathSegment?;
+	//	{UiRawBindablePathSegment} ('.' | toParent?='..') rawBindable=[UiRawBindable] path=UiRawBindablePathSegment?;
 	public UiRawBindablePathSegmentElements getUiRawBindablePathSegmentAccess() {
 		return pUiRawBindablePathSegment;
 	}
@@ -9977,7 +10373,7 @@
 	public ParserRule getUiRawBindablePathSegmentRule() {
 		return getUiRawBindablePathSegmentAccess().getRule();
 	}
-
+	
 	//UiCommandBindableDef:
 	//	{UiCommandBindableDef} command=UiCommand;
 	public UiCommandBindableDefElements getUiCommandBindableDefAccess() {
@@ -9987,7 +10383,7 @@
 	public ParserRule getUiCommandBindableDefRule() {
 		return getUiCommandBindableDefAccess().getRule();
 	}
-
+	
 	//UiCommand:
 	//	UiMobileNavigationCommand | UiOpenDialogCommand | UiSearchWithDialogCommand | UiAddToTableCommand |
 	//	UiRemoveFromTableCommand | UiSendEventCommand | UiSetNewInstanceCommand;
@@ -9998,9 +10394,10 @@
 	public ParserRule getUiCommandRule() {
 		return getUiCommandAccess().getRule();
 	}
-
+	
 	//UiMobileNavigationCommand:
-	//	{UiMobileNavigationCommand} "navigateTo" targetPage=UiMobileNavigationPage;
+	//	{UiMobileNavigationCommand}
+	//	'navigateTo' targetPage=UiMobileNavigationPage;
 	public UiMobileNavigationCommandElements getUiMobileNavigationCommandAccess() {
 		return pUiMobileNavigationCommand;
 	}
@@ -10008,5 +10405,2416 @@
 	public ParserRule getUiMobileNavigationCommandRule() {
 		return getUiMobileNavigationCommandAccess().getRule();
 	}
-
+	
 	//UiOpenDialogCommand:
+	//	{UiOpenDialogCommand}
+	//	'openDialog' dialog=UiDialog;
+	public UiOpenDialogCommandElements getUiOpenDialogCommandAccess() {
+		return pUiOpenDialogCommand;
+	}
+	
+	public ParserRule getUiOpenDialogCommandRule() {
+		return getUiOpenDialogCommandAccess().getRule();
+	}
+	
+	//UiSearchWithDialogCommand:
+	//	{UiSearchWithDialogCommand}
+	//	'searchWith' dialog=UiSearchDialog;
+	public UiSearchWithDialogCommandElements getUiSearchWithDialogCommandAccess() {
+		return pUiSearchWithDialogCommand;
+	}
+	
+	public ParserRule getUiSearchWithDialogCommandRule() {
+		return getUiSearchWithDialogCommandAccess().getRule();
+	}
+	
+	//UiAddToTableCommand:
+	//	{UiAddToTableCommand}
+	//	'addToTable' table=[UiTable];
+	public UiAddToTableCommandElements getUiAddToTableCommandAccess() {
+		return pUiAddToTableCommand;
+	}
+	
+	public ParserRule getUiAddToTableCommandRule() {
+		return getUiAddToTableCommandAccess().getRule();
+	}
+	
+	//UiRemoveFromTableCommand:
+	//	{UiRemoveFromTableCommand}
+	//	'removeFromTable' table=[UiTable];
+	public UiRemoveFromTableCommandElements getUiRemoveFromTableCommandAccess() {
+		return pUiRemoveFromTableCommand;
+	}
+	
+	public ParserRule getUiRemoveFromTableCommandRule() {
+		return getUiRemoveFromTableCommandAccess().getRule();
+	}
+	
+	//UiSetNewInstanceCommand:
+	//	{UiSetNewInstanceCommand}
+	//	'newInstance' ('for' jvmType=JvmTypeReference)? ('at' target=UiBindingEndpointAssignment);
+	public UiSetNewInstanceCommandElements getUiSetNewInstanceCommandAccess() {
+		return pUiSetNewInstanceCommand;
+	}
+	
+	public ParserRule getUiSetNewInstanceCommandRule() {
+		return getUiSetNewInstanceCommandAccess().getRule();
+	}
+	
+	//UiSendEventCommand:
+	//	{UiSendEventCommand}
+	//	'sendEvent' '(' noAutoTrigger?='noAutoTrigger'? eventTopic=STRING ')';
+	public UiSendEventCommandElements getUiSendEventCommandAccess() {
+		return pUiSendEventCommand;
+	}
+	
+	public ParserRule getUiSendEventCommandRule() {
+		return getUiSendEventCommandAccess().getRule();
+	}
+	
+	//UiView:
+	//	UiIDEView;
+	public UiViewElements getUiViewAccess() {
+		return pUiView;
+	}
+	
+	public ParserRule getUiViewRule() {
+		return getUiViewAccess().getRule();
+	}
+	
+	//UiIDEView:
+	//	'ideview' name=ID
+	//	'{' (('sharedStateGroup' sharedStateGroup=STRING ';'?)?
+	//	& ('category' viewCategory=[cfg::UxViewCategory|QualifiedName] ';'?)?
+	//	& ('rootType' jvmType=JvmTypeReference ';'?)?
+	//	& ('exposedActions' '{'
+	//	exposedActions+=UiExposedAction*
+	//	'}')?) (beanSlots+=UiBeanSlot | bindingEndpointAlias+=UiBindingEndpointAlias | bindings+=UiBinding)*
+	//	content=UiEmbeddable ('align' contentAlignment=UiAlignment)? (bindingEndpointAlias+=UiBindingEndpointAlias |
+	//	bindings+=UiBinding | validatorAssignments+=UiValidatorAssignment |
+	//	processorAssignments+=UiVisibilityProcessorAssignment)*
+	//	'}';
+	public UiIDEViewElements getUiIDEViewAccess() {
+		return pUiIDEView;
+	}
+	
+	public ParserRule getUiIDEViewRule() {
+		return getUiIDEViewAccess().getRule();
+	}
+	
+	//UiDisplayView:
+	//	'display' name=ID
+	//	'{'
+	//	'rootType' jvmType=JvmTypeReference (beanSlots+=UiBeanSlot | bindingEndpointAlias+=UiBindingEndpointAlias |
+	//	bindings+=UiBinding)*
+	//	content=UiEmbeddable ('align' contentAlignment=UiAlignment)? (bindingEndpointAlias+=UiBindingEndpointAlias |
+	//	bindings+=UiBinding | validatorAssignments+=UiValidatorAssignment |
+	//	processorAssignments+=UiVisibilityProcessorAssignment)*
+	//	'}';
+	public UiDisplayViewElements getUiDisplayViewAccess() {
+		return pUiDisplayView;
+	}
+	
+	public ParserRule getUiDisplayViewRule() {
+		return getUiDisplayViewAccess().getRule();
+	}
+	
+	//UiExposedAction:
+	//	name=ID ('icon' iconName=STRING)? 'id' (=> actionReference=[cfg::UxAction|QualifiedName] | actionID=STRING)
+	//	checkDirty?='checkDirty'? ('externalCommand' externalCommandId=STRING)? ';'?;
+	public UiExposedActionElements getUiExposedActionAccess() {
+		return pUiExposedAction;
+	}
+	
+	public ParserRule getUiExposedActionRule() {
+		return getUiExposedActionAccess().getRule();
+	}
+	
+	//UiMobileNavBarAction:
+	//	name=ID ('icon' iconName=STRING)? 'id' (=> actionReference=[cfg::UxAction|QualifiedName] | actionID=STRING) ';'?;
+	public UiMobileNavBarActionElements getUiMobileNavBarActionAccess() {
+		return pUiMobileNavBarAction;
+	}
+	
+	public ParserRule getUiMobileNavBarActionRule() {
+		return getUiMobileNavBarActionAccess().getRule();
+	}
+	
+	//UiMobileView:
+	//	'mobile' name=ID
+	//	'{' (('sharedStateGroup' sharedStateGroup=STRING ';'?)?
+	//	& ('rootType' jvmType=JvmTypeReference ';'?)?) (beanSlots+=UiBeanSlot | bindingEndpointAlias+=UiBindingEndpointAlias)*
+	//	content=UiMobileEmbeddable ('align' contentAlignment=UiAlignment)? (bindingEndpointAlias+=UiBindingEndpointAlias |
+	//	bindings+=UiBinding | validatorAssignments+=UiValidatorAssignment |
+	//	processorAssignments+=UiVisibilityProcessorAssignment)*
+	//	'}';
+	public UiMobileViewElements getUiMobileViewAccess() {
+		return pUiMobileView;
+	}
+	
+	public ParserRule getUiMobileViewRule() {
+		return getUiMobileViewAccess().getRule();
+	}
+	
+	//UiI18nInfo:
+	//	'i18n' (noCaption?='noCaption' | key=STRING);
+	public UiI18nInfoElements getUiI18nInfoAccess() {
+		return pUiI18nInfo;
+	}
+	
+	public ParserRule getUiI18nInfoRule() {
+		return getUiI18nInfoAccess().getRule();
+	}
+	
+	//UiGridLayout:
+	//	{UiGridLayout}
+	//	'gridlayout' ('(' (('columns=' columns=INT)?
+	//	& i18nInfo=UiI18nInfo?
+	//	& ('styles' styles=STRING)?
+	//	& readonly?="readonly"?)
+	//	')')?
+	//	name=ID?
+	//	'{'
+	//	contents+=UiGridLayoutAssigment*
+	//	bindings+=UiBinding*
+	//	processorAssignments+=UiVisibilityProcessorAssignment*
+	//	'}';
+	public UiGridLayoutElements getUiGridLayoutAccess() {
+		return pUiGridLayout;
+	}
+	
+	public ParserRule getUiGridLayoutRule() {
+		return getUiGridLayoutAccess().getRule();
+	}
+	
+	//UiVisibilityProcessorAssignment:
+	//	{UiVisibilityProcessorAssignment} processor=UiVisibilityProcessor;
+	public UiVisibilityProcessorAssignmentElements getUiVisibilityProcessorAssignmentAccess() {
+		return pUiVisibilityProcessorAssignment;
+	}
+	
+	public ParserRule getUiVisibilityProcessorAssignmentRule() {
+		return getUiVisibilityProcessorAssignmentAccess().getRule();
+	}
+	
+	//UiGridLayoutAssigment:
+	//	element=UiEmbeddable ('align' alignment=UiAlignment)?;
+	public UiGridLayoutAssigmentElements getUiGridLayoutAssigmentAccess() {
+		return pUiGridLayoutAssigment;
+	}
+	
+	public ParserRule getUiGridLayoutAssigmentRule() {
+		return getUiGridLayoutAssigmentAccess().getRule();
+	}
+	
+	//UiFormLayout:
+	//	{UiFormLayout}
+	//	'form' ('('
+	//	i18nInfo=UiI18nInfo?
+	//	& ('styles' styles=STRING)?
+	//	& readonly?="readonly"?
+	//	')')?
+	//	name=ID?
+	//	'{'
+	//	contents+=UiFormLayoutAssigment*
+	//	bindings+=UiBinding*
+	//	processorAssignments+=UiVisibilityProcessorAssignment*
+	//	'}';
+	public UiFormLayoutElements getUiFormLayoutAccess() {
+		return pUiFormLayout;
+	}
+	
+	public ParserRule getUiFormLayoutRule() {
+		return getUiFormLayoutAccess().getRule();
+	}
+	
+	//UiFormLayoutAssigment:
+	//	element=UiEmbeddable;
+	public UiFormLayoutAssigmentElements getUiFormLayoutAssigmentAccess() {
+		return pUiFormLayoutAssigment;
+	}
+	
+	public ParserRule getUiFormLayoutAssigmentRule() {
+		return getUiFormLayoutAssigmentAccess().getRule();
+	}
+	
+	//UiVerticalLayout:
+	//	{UiVerticalLayout}
+	//	'verticalLayout' ('('
+	//	i18nInfo=UiI18nInfo?
+	//	& ('styles' styles=STRING)?
+	//	& readonly?="readonly"?
+	//	')')?
+	//	name=ID?
+	//	'{'
+	//	contents+=UiVerticalLayoutAssigment*
+	//	bindings+=UiBinding*
+	//	processorAssignments+=UiVisibilityProcessorAssignment*
+	//	'}';
+	public UiVerticalLayoutElements getUiVerticalLayoutAccess() {
+		return pUiVerticalLayout;
+	}
+	
+	public ParserRule getUiVerticalLayoutRule() {
+		return getUiVerticalLayoutAccess().getRule();
+	}
+	
+	//UiVerticalLayoutAssigment:
+	//	element=UiEmbeddable ('align' alignment=UiAlignment)?;
+	public UiVerticalLayoutAssigmentElements getUiVerticalLayoutAssigmentAccess() {
+		return pUiVerticalLayoutAssigment;
+	}
+	
+	public ParserRule getUiVerticalLayoutAssigmentRule() {
+		return getUiVerticalLayoutAssigmentAccess().getRule();
+	}
+	
+	//UiMobileVerticalLayout UiVerticalLayout:
+	//	{UiVerticalLayout}
+	//	'mobileVerticalLayout' ('('
+	//	i18nInfo=UiI18nInfo?
+	//	& ('styles' styles=STRING)?
+	//	& readonly?="readonly"?
+	//	')')?
+	//	name=ID?
+	//	'{'
+	//	contents+=UiMobileVerticalLayoutAssigment*
+	//	bindings+=UiBinding*
+	//	processorAssignments+=UiVisibilityProcessorAssignment*
+	//	'}';
+	public UiMobileVerticalLayoutElements getUiMobileVerticalLayoutAccess() {
+		return pUiMobileVerticalLayout;
+	}
+	
+	public ParserRule getUiMobileVerticalLayoutRule() {
+		return getUiMobileVerticalLayoutAccess().getRule();
+	}
+	
+	//UiMobileVerticalLayoutAssigment UiVerticalLayoutAssigment:
+	//	element=UiMobileEmbeddable ('align' alignment=UiAlignment)?;
+	public UiMobileVerticalLayoutAssigmentElements getUiMobileVerticalLayoutAssigmentAccess() {
+		return pUiMobileVerticalLayoutAssigment;
+	}
+	
+	public ParserRule getUiMobileVerticalLayoutAssigmentRule() {
+		return getUiMobileVerticalLayoutAssigmentAccess().getRule();
+	}
+	
+	//UiMobileNavigationRoot:
+	//	{UiMobileNavigationRoot}
+	//	'navRoot'
+	//	name=ID?
+	//	'{'
+	//	contents+=UiMobileNavigationRootAssigment '}';
+	public UiMobileNavigationRootElements getUiMobileNavigationRootAccess() {
+		return pUiMobileNavigationRoot;
+	}
+	
+	public ParserRule getUiMobileNavigationRootRule() {
+		return getUiMobileNavigationRootAccess().getRule();
+	}
+	
+	//UiMobileNavigationRootAssigment:
+	//	element=UiMobileNavigationPage;
+	public UiMobileNavigationRootAssigmentElements getUiMobileNavigationRootAssigmentAccess() {
+		return pUiMobileNavigationRootAssigment;
+	}
+	
+	public ParserRule getUiMobileNavigationRootAssigmentRule() {
+		return getUiMobileNavigationRootAssigmentAccess().getRule();
+	}
+	
+	//UiHorizontalLayout:
+	//	{UiHorizontalLayout}
+	//	'horizontalLayout' ('('
+	//	i18nInfo=UiI18nInfo?
+	//	& readonly?="readonly"?
+	//	& ('styles' styles=STRING)?
+	//	')')?
+	//	name=ID?
+	//	'{'
+	//	//	(autowire?="autowire" 'source' autoWireSource=UiBindingEndpointAssignment)?
+	//	contents+=UiHorizontalLayoutAssigment*
+	//	bindings+=UiBinding*
+	//	processorAssignments+=UiVisibilityProcessorAssignment*
+	//	'}';
+	public UiHorizontalLayoutElements getUiHorizontalLayoutAccess() {
+		return pUiHorizontalLayout;
+	}
+	
+	public ParserRule getUiHorizontalLayoutRule() {
+		return getUiHorizontalLayoutAccess().getRule();
+	}
+	
+	//UiHorizontalLayoutAssigment:
+	//	element=UiEmbeddable ('align' alignment=UiAlignment)?;
+	public UiHorizontalLayoutAssigmentElements getUiHorizontalLayoutAssigmentAccess() {
+		return pUiHorizontalLayoutAssigment;
+	}
+	
+	public ParserRule getUiHorizontalLayoutAssigmentRule() {
+		return getUiHorizontalLayoutAssigmentAccess().getRule();
+	}
+	
+	//UiMobileHorizontalLayout UiHorizontalLayout:
+	//	{UiHorizontalLayout}
+	//	'mobileHorizontalLayout' ('('
+	//	i18nInfo=UiI18nInfo?
+	//	& ('styles' styles=STRING)?
+	//	& readonly?="readonly"?
+	//	')')?
+	//	name=ID?
+	//	'{'
+	//	//	(autowire?="autowire" 'source' autoWireSource=UiBindingEndpointAssignment)?
+	//	contents+=UiMobileHorizontalLayoutAssigment*
+	//	bindings+=UiBinding*
+	//	processorAssignments+=UiVisibilityProcessorAssignment*
+	//	'}';
+	public UiMobileHorizontalLayoutElements getUiMobileHorizontalLayoutAccess() {
+		return pUiMobileHorizontalLayout;
+	}
+	
+	public ParserRule getUiMobileHorizontalLayoutRule() {
+		return getUiMobileHorizontalLayoutAccess().getRule();
+	}
+	
+	//UiMobileHorizontalLayoutAssigment UiHorizontalLayoutAssigment:
+	//	element=UiMobileEmbeddable ('align' alignment=UiAlignment)?;
+	public UiMobileHorizontalLayoutAssigmentElements getUiMobileHorizontalLayoutAssigmentAccess() {
+		return pUiMobileHorizontalLayoutAssigment;
+	}
+	
+	public ParserRule getUiMobileHorizontalLayoutAssigmentRule() {
+		return getUiMobileHorizontalLayoutAssigmentAccess().getRule();
+	}
+	
+	//UiMobileHorizontalButtonGroup UiHorizontalButtonGroup:
+	//	{UiHorizontalButtonGroup}
+	//	'horizontalButtonGroup' ('(' (i18nInfo=UiI18nInfo?
+	//	& ('styles' styles=STRING)?
+	//	& readonly?="readonly"?) ')')?
+	//	name=ID?
+	//	'{'
+	//	contents+=UiMobileHorizontalButtonGroupAssigment*
+	//	bindings+=UiBinding*
+	//	processorAssignments+=UiVisibilityProcessorAssignment*
+	//	'}';
+	public UiMobileHorizontalButtonGroupElements getUiMobileHorizontalButtonGroupAccess() {
+		return pUiMobileHorizontalButtonGroup;
+	}
+	
+	public ParserRule getUiMobileHorizontalButtonGroupRule() {
+		return getUiMobileHorizontalButtonGroupAccess().getRule();
+	}
+	
+	//UiMobileHorizontalButtonGroupAssigment UiHorizontalButtonGroupAssigment:
+	//	element=UiMobileEmbeddable;
+	public UiMobileHorizontalButtonGroupAssigmentElements getUiMobileHorizontalButtonGroupAssigmentAccess() {
+		return pUiMobileHorizontalButtonGroupAssigment;
+	}
+	
+	public ParserRule getUiMobileHorizontalButtonGroupAssigmentRule() {
+		return getUiMobileHorizontalButtonGroupAssigmentAccess().getRule();
+	}
+	
+	//UiMobileVerticalComponentGroup UiVerticalComponentGroup:
+	//	{UiVerticalComponentGroup}
+	//	'verticalGroup' ('(' (i18nInfo=UiI18nInfo?
+	//	& readonly?="readonly"?
+	//	& ('styles' styles=STRING)?)
+	//	')')?
+	//	name=ID?
+	//	'{'
+	//	contents+=UiMobileVerticalComponentGroupAssigment*
+	//	bindings+=UiBinding*
+	//	processorAssignments+=UiVisibilityProcessorAssignment*
+	//	'}';
+	public UiMobileVerticalComponentGroupElements getUiMobileVerticalComponentGroupAccess() {
+		return pUiMobileVerticalComponentGroup;
+	}
+	
+	public ParserRule getUiMobileVerticalComponentGroupRule() {
+		return getUiMobileVerticalComponentGroupAccess().getRule();
+	}
+	
+	//UiMobileVerticalComponentGroupAssigment UiVerticalComponentGroupAssigment:
+	//	element=UiMobileEmbeddable;
+	public UiMobileVerticalComponentGroupAssigmentElements getUiMobileVerticalComponentGroupAssigmentAccess() {
+		return pUiMobileVerticalComponentGroupAssigment;
+	}
+	
+	public ParserRule getUiMobileVerticalComponentGroupAssigmentRule() {
+		return getUiMobileVerticalComponentGroupAssigmentAccess().getRule();
+	}
+	
+	//UiSearchPanel:
+	//	{UiSearchPanel}
+	//	'searchPanel' ('(' (i18nInfo=UiI18nInfo?
+	//	& ('styles' styles=STRING)?)
+	//	')')?
+	//	name=ID?
+	//	'{'
+	//	'type' jvmType=JvmTypeReference ';'?
+	//	contents+=UiSearchField*
+	//	bindings+=UiBinding*
+	//	processorAssignments+=UiVisibilityProcessorAssignment*
+	//	'}';
+	public UiSearchPanelElements getUiSearchPanelAccess() {
+		return pUiSearchPanel;
+	}
+	
+	public ParserRule getUiSearchPanelRule() {
+		return getUiSearchPanelAccess().getRule();
+	}
+	
+	//UiMobileSearchPanel:
+	//	{UiMobileSearchPanel}
+	//	'mobileSearchPanel' ('(' (i18nInfo=UiI18nInfo?
+	//	& ('styles' styles=STRING)?)
+	//	')')?
+	//	name=ID?
+	//	'{'
+	//	'type' jvmType=JvmTypeReference ';'?
+	//	contents+=UiSearchField*
+	//	bindings+=UiBinding*
+	//	processorAssignments+=UiVisibilityProcessorAssignment*
+	//	'}';
+	public UiMobileSearchPanelElements getUiMobileSearchPanelAccess() {
+		return pUiMobileSearchPanel;
+	}
+	
+	public ParserRule getUiMobileSearchPanelRule() {
+		return getUiMobileSearchPanelAccess().getRule();
+	}
+	
+	//UiMobileTabSheet:
+	//	{UiMobileTabSheet}
+	//	'mobileTab' ('(' (i18nInfo=UiI18nInfo?
+	//	& ('styles' styles=STRING)?)
+	//	')')?
+	//	name=ID?
+	//	'{'
+	//	tabs+=UiMobileTabAssignment*
+	//	bindings+=UiBinding*
+	//	processorAssignments+=UiVisibilityProcessorAssignment*
+	//	'}';
+	public UiMobileTabSheetElements getUiMobileTabSheetAccess() {
+		return pUiMobileTabSheet;
+	}
+	
+	public ParserRule getUiMobileTabSheetRule() {
+		return getUiMobileTabSheetAccess().getRule();
+	}
+	
+	//UiMobileTabAssignment:
+	//	'tab' name=ID? element=UiMobileEmbeddable;
+	public UiMobileTabAssignmentElements getUiMobileTabAssignmentAccess() {
+		return pUiMobileTabAssignment;
+	}
+	
+	public ParserRule getUiMobileTabAssignmentRule() {
+		return getUiMobileTabAssignmentAccess().getRule();
+	}
+	
+	//UiTabSheet:
+	//	{UiTabSheet}
+	//	'tabsheet' ('(' (i18nInfo=UiI18nInfo?
+	//	& ('styles' styles=STRING)?)
+	//	')')?
+	//	name=ID?
+	//	'{'
+	//	tabs+=UiTabAssignment*
+	//	bindings+=UiBinding*
+	//	processorAssignments+=UiVisibilityProcessorAssignment*
+	//	'}';
+	public UiTabSheetElements getUiTabSheetAccess() {
+		return pUiTabSheet;
+	}
+	
+	public ParserRule getUiTabSheetRule() {
+		return getUiTabSheetAccess().getRule();
+	}
+	
+	//UiTabAssignment:
+	//	'tab' name=ID? element=UiEmbeddable;
+	public UiTabAssignmentElements getUiTabAssignmentAccess() {
+		return pUiTabAssignment;
+	}
+	
+	public ParserRule getUiTabAssignmentRule() {
+		return getUiTabAssignmentAccess().getRule();
+	}
+	
+	//UiSplitpanel:
+	//	'splitter' ('(' i18nInfo=UiI18nInfo? & ('styles' styles=STRING)? ')')? name=ID
+	//	'{' ('first' firstContent=UiSplitpanelAssigment & 'second' secondContent=UiSplitpanelAssigment & ('splitPos'
+	//	splitPosition=INT)?
+	//	& readonly?="readonly"?) bindings+=UiBinding*
+	//	processorAssignments+=UiVisibilityProcessorAssignment*
+	//	'}';
+	public UiSplitpanelElements getUiSplitpanelAccess() {
+		return pUiSplitpanel;
+	}
+	
+	public ParserRule getUiSplitpanelRule() {
+		return getUiSplitpanelAccess().getRule();
+	}
+	
+	//UiSplitpanelAssigment:
+	//	element=UiEmbeddable;
+	public UiSplitpanelAssigmentElements getUiSplitpanelAssigmentAccess() {
+		return pUiSplitpanelAssigment;
+	}
+	
+	public ParserRule getUiSplitpanelAssigmentRule() {
+		return getUiSplitpanelAssigmentAccess().getRule();
+	}
+	
+	//UiPanel:
+	//	'panel' ('(' (i18nInfo=UiI18nInfo?
+	//	& readonly?="readonly"?
+	//	& ('styles' styles=STRING)?)
+	//	')')?
+	//	name=ID
+	//	'{'
+	//	'content' content=UiEmbeddable
+	//	bindings+=UiBinding*
+	//	processorAssignments+=UiVisibilityProcessorAssignment*
+	//	'}';
+	public UiPanelElements getUiPanelAccess() {
+		return pUiPanel;
+	}
+	
+	public ParserRule getUiPanelRule() {
+		return getUiPanelAccess().getRule();
+	}
+	
+	//UiDialog:
+	//	{UiDialog}
+	//	'dialog' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=ID? '{' ('type' jvmType=JvmTypeReference
+	//	';'?)? (content=UiDialogAssignment ';'?)?
+	//	bindings+=UiBinding*
+	//	processorAssignments+=UiVisibilityProcessorAssignment*
+	//	'}';
+	public UiDialogElements getUiDialogAccess() {
+		return pUiDialog;
+	}
+	
+	public ParserRule getUiDialogRule() {
+		return getUiDialogAccess().getRule();
+	}
+	
+	//UiDialogAssignment:
+	//	element=UiEmbeddable;
+	public UiDialogAssignmentElements getUiDialogAssignmentAccess() {
+		return pUiDialogAssignment;
+	}
+	
+	public ParserRule getUiDialogAssignmentRule() {
+		return getUiDialogAssignmentAccess().getRule();
+	}
+	
+	//UiSearchDialog:
+	//	{UiSearchDialog}
+	//	'searchdialog' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=ID? '{' ('type'
+	//	jvmType=JvmTypeReference)? ('search' '{'
+	//	searchFields+=UiDialogSearchFieldAssignment*
+	//	'}')? ('content' '{'
+	//	content=UiDialogAssignment
+	//	'}')?
+	//	bindings+=UiBinding*
+	//	processorAssignments+=UiVisibilityProcessorAssignment*
+	//	'}';
+	public UiSearchDialogElements getUiSearchDialogAccess() {
+		return pUiSearchDialog;
+	}
+	
+	public ParserRule getUiSearchDialogRule() {
+		return getUiSearchDialogAccess().getRule();
+	}
+	
+	//UiDialogSearchFieldAssignment:
+	//	element=UiSearchField;
+	public UiDialogSearchFieldAssignmentElements getUiDialogSearchFieldAssignmentAccess() {
+		return pUiDialogSearchFieldAssignment;
+	}
+	
+	public ParserRule getUiDialogSearchFieldAssignmentRule() {
+		return getUiDialogSearchFieldAssignmentAccess().getRule();
+	}
+	
+	//UiMobileNavigationPage:
+	//	{UiMobileNavigationPage}
+	//	'navPage' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=ID? '{' ('type' jvmType=JvmTypeReference
+	//	';'?)? ('navbarActions' '{'
+	//	barActions+=UiMobileNavBarAction*
+	//	'}')?
+	//	contents+=UiMobileNavigationPageAssignment*
+	//	bindings+=UiBinding*
+	//	processorAssignments+=UiVisibilityProcessorAssignment*
+	//	'}';
+	public UiMobileNavigationPageElements getUiMobileNavigationPageAccess() {
+		return pUiMobileNavigationPage;
+	}
+	
+	public ParserRule getUiMobileNavigationPageRule() {
+		return getUiMobileNavigationPageAccess().getRule();
+	}
+	
+	//UiMobileNavigationPageAssignment:
+	//	element=UiMobileEmbeddable ('align' alignment=UiAlignment)?;
+	public UiMobileNavigationPageAssignmentElements getUiMobileNavigationPageAssignmentAccess() {
+		return pUiMobileNavigationPageAssignment;
+	}
+	
+	public ParserRule getUiMobileNavigationPageAssignmentRule() {
+		return getUiMobileNavigationPageAssignmentAccess().getRule();
+	}
+	
+	//UiPoint:
+	//	x=INT '/' y=INT;
+	public UiPointElements getUiPointAccess() {
+		return pUiPoint;
+	}
+	
+	public ParserRule getUiPointRule() {
+		return getUiPointAccess().getRule();
+	}
+	
+	//UiTextField:
+	//	{UiTextField}
+	//	'textfield' ('(' (('maxLength=' maxLength=INT)?
+	//	& ('minLength=' minLength=INT)?
+	//	& ('regex=' regex=STRING)?
+	//	& ('styles' styles=STRING)?
+	//	& i18nInfo=UiI18nInfo?
+	//	& readonly?="readonly"?)
+	//	')')?
+	//	name=ID? ('{' (validators+=UiValidator
+	//	| bindings+=UiBinding)*
+	//	processorAssignments+=UiVisibilityProcessorAssignment*
+	//	'}')?;
+	public UiTextFieldElements getUiTextFieldAccess() {
+		return pUiTextField;
+	}
+	
+	public ParserRule getUiTextFieldRule() {
+		return getUiTextFieldAccess().getRule();
+	}
+	
+	//UiPasswordField:
+	//	{UiPasswordField}
+	//	'passwordField' ('(' (('styles' styles=STRING)?
+	//	& i18nInfo=UiI18nInfo?
+	//	& readonly?="readonly"?)
+	//	')')?
+	//	name=ID? ('{' (validators+=UiValidator
+	//	| bindings+=UiBinding)*
+	//	processorAssignments+=UiVisibilityProcessorAssignment*
+	//	'}')?;
+	public UiPasswordFieldElements getUiPasswordFieldAccess() {
+		return pUiPasswordField;
+	}
+	
+	public ParserRule getUiPasswordFieldRule() {
+		return getUiPasswordFieldAccess().getRule();
+	}
+	
+	//UiMaskedTextField:
+	//	{UiMaskedTextField}
+	//	'maskedText' ('(' (('styles' styles=STRING)?
+	//	& ('mask=' mask=STRING)?
+	//	& i18nInfo=UiI18nInfo?
+	//	& readonly?="readonly"?)
+	//	')')?
+	//	name=ID? ('{' (validators+=UiValidator
+	//	| bindings+=UiBinding)*
+	//	processorAssignments+=UiVisibilityProcessorAssignment*
+	//	'}')?;
+	public UiMaskedTextFieldElements getUiMaskedTextFieldAccess() {
+		return pUiMaskedTextField;
+	}
+	
+	public ParserRule getUiMaskedTextFieldRule() {
+		return getUiMaskedTextFieldAccess().getRule();
+	}
+	
+	//UiMaskedNumericField:
+	//	{UiMaskedNumericField}
+	//	'maskedNumeric' ('(' (('styles' styles=STRING)?
+	//	& i18nInfo=UiI18nInfo?
+	//	& readonly?="readonly"?)
+	//	')')?
+	//	name=ID? ('{' (validators+=UiValidator
+	//	| bindings+=UiBinding)*
+	//	processorAssignments+=UiVisibilityProcessorAssignment*
+	//	'}')?;
+	public UiMaskedNumericFieldElements getUiMaskedNumericFieldAccess() {
+		return pUiMaskedNumericField;
+	}
+	
+	public ParserRule getUiMaskedNumericFieldRule() {
+		return getUiMaskedNumericFieldAccess().getRule();
+	}
+	
+	//UiMaskedDecimalField:
+	//	{UiMaskedDecimalField}
+	//	'maskedDecimal' ('(' (('styles' styles=STRING)?
+	//	& ('mask=' mask=STRING)?
+	//	& i18nInfo=UiI18nInfo?
+	//	& readonly?="readonly"?)
+	//	')')?
+	//	name=ID? ('{' (validators+=UiValidator
+	//	| bindings+=UiBinding)*
+	//	processorAssignments+=UiVisibilityProcessorAssignment*
+	//	'}')?;
+	public UiMaskedDecimalFieldElements getUiMaskedDecimalFieldAccess() {
+		return pUiMaskedDecimalField;
+	}
+	
+	public ParserRule getUiMaskedDecimalFieldRule() {
+		return getUiMaskedDecimalFieldAccess().getRule();
+	}
+	
+	//UiPrefixedMaskedTextField:
+	//	{UiPrefixedMaskedTextField}
+	//	'maskedTextWithPrefix' ('(' (('styles' styles=STRING)?
+	//	& ('mask=' mask=STRING)?
+	//	& ('prefixes=' '(' prefixMasks+=UiPrefixToMaskMapEntry (',' prefixMasks+=UiPrefixToMaskMapEntry)* ')')?
+	//	& i18nInfo=UiI18nInfo?
+	//	& readonly?="readonly"?)
+	//	')')?
+	//	name=ID? ('{' (validators+=UiValidator
+	//	| bindings+=UiBinding)*
+	//	processorAssignments+=UiVisibilityProcessorAssignment*
+	//	'}')?;
+	public UiPrefixedMaskedTextFieldElements getUiPrefixedMaskedTextFieldAccess() {
+		return pUiPrefixedMaskedTextField;
+	}
+	
+	public ParserRule getUiPrefixedMaskedTextFieldRule() {
+		return getUiPrefixedMaskedTextFieldAccess().getRule();
+	}
+	
+	//UiPrefixToMaskMapEntry:
+	//	{UiPrefixToMaskMapEntry}
+	//	'prefix' key=STRING 'mask' value=STRING;
+	public UiPrefixToMaskMapEntryElements getUiPrefixToMaskMapEntryAccess() {
+		return pUiPrefixToMaskMapEntry;
+	}
+	
+	public ParserRule getUiPrefixToMaskMapEntryRule() {
+		return getUiPrefixToMaskMapEntryAccess().getRule();
+	}
+	
+	//UiRichTextArea:
+	//	{UiRichTextArea}
+	//	'richtextArea' ('(' (('styles' styles=STRING)?
+	//	& i18nInfo=UiI18nInfo?
+	//	& asBlob?="asBlob"?
+	//	& readonly?="readonly"?)
+	//	')')?
+	//	name=ID? ('{' (validators+=UiValidator
+	//	| bindings+=UiBinding)*
+	//	processorAssignments+=UiVisibilityProcessorAssignment*
+	//	'}')?;
+	public UiRichTextAreaElements getUiRichTextAreaAccess() {
+		return pUiRichTextArea;
+	}
+	
+	public ParserRule getUiRichTextAreaRule() {
+		return getUiRichTextAreaAccess().getRule();
+	}
+	
+	//UiSuggestTextField:
+	//	{UiSuggestTextField}
+	//	'suggestText' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=ID? ('{' (('type'
+	//	jvmType=JvmTypeReference ';'?)?
+	//	& ('captionField' itemCaptionProperty=[JvmOperation] ';'?)?
+	//	& ('filterField' itemFilterProperty=[JvmOperation] ';'?)?
+	//	& ('uuidField' itemUUIDProperty=[JvmOperation] ';'?)?
+	//	& autoHidePopup?='autoHidePopup'?
+	//	& readonly?='readonly'?) (validators+=UiValidator
+	//	| bindings+=UiBinding)*
+	//	processorAssignments+=UiVisibilityProcessorAssignment*
+	//	'}')?;
+	public UiSuggestTextFieldElements getUiSuggestTextFieldAccess() {
+		return pUiSuggestTextField;
+	}
+	
+	public ParserRule getUiSuggestTextFieldRule() {
+		return getUiSuggestTextFieldAccess().getRule();
+	}
+	
+	//UiBeanReferenceField:
+	//	{UiBeanReferenceField}
+	//	'referenceField' ('(' (i18nInfo=UiI18nInfo?
+	//	& ('styles' styles=STRING)?)
+	//	')')?
+	//	name=ID? ('{' (('type' jvmType=JvmTypeReference ';'?)?
+	//	& ('refSource' referenceSourceJvmType=JvmTypeReference ':' referenceSourceField=[JvmField] ';'?)?
+	//	& ('captionField' captionProperty=UiNestedProperty ';'?)?
+	//	& ('descriptionField' descriptionProperty=UiNestedProperty ';'?)?
+	//	& ('imageField' imageProperty=UiNestedProperty ';'?)?
+	//	& ('inMemoryService' inMemoryBeanProvider=JvmTypeReference ';'?)?) (validators+=UiValidator
+	//	| bindings+=UiBinding)*
+	//	processorAssignments+=UiVisibilityProcessorAssignment*
+	//	'}')?;
+	public UiBeanReferenceFieldElements getUiBeanReferenceFieldAccess() {
+		return pUiBeanReferenceField;
+	}
+	
+	public ParserRule getUiBeanReferenceFieldRule() {
+		return getUiBeanReferenceFieldAccess().getRule();
+	}
+	
+	//UiSearchField:
+	//	{UiSearchField}
+	//	'searchfield' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? property=UiNestedProperty;
+	public UiSearchFieldElements getUiSearchFieldAccess() {
+		return pUiSearchField;
+	}
+	
+	public ParserRule getUiSearchFieldRule() {
+		return getUiSearchFieldAccess().getRule();
+	}
+	
+	//UiTextArea:
+	//	{UiTextArea}
+	//	'textarea' ('(' (i18nInfo=UiI18nInfo?
+	//	& readonly?="readonly"?
+	//	& ('styles' styles=STRING)?)
+	//	')')?
+	//	name=ID? ('{' (validators+=UiValidator
+	//	| bindings+=UiBinding)*
+	//	processorAssignments+=UiVisibilityProcessorAssignment*
+	//	'}')?;
+	public UiTextAreaElements getUiTextAreaAccess() {
+		return pUiTextArea;
+	}
+	
+	public ParserRule getUiTextAreaRule() {
+		return getUiTextAreaAccess().getRule();
+	}
+	
+	//UiDateField:
+	//	{UiDateField}
+	//	'datefield' ('(' (dateFormat=UiDateFormat?
+	//	& resolution=UiDateTimeResolution?
+	//	& ('styles' styles=STRING)?
+	//	& i18nInfo=UiI18nInfo?
+	//	& readonly?="readonly"?)
+	//	')')?
+	//	name=ID? ('{' (validators+=UiValidator
+	//	| bindings+=UiBinding)*
+	//	processorAssignments+=UiVisibilityProcessorAssignment*
+	//	'}')?;
+	public UiDateFieldElements getUiDateFieldAccess() {
+		return pUiDateField;
+	}
+	
+	public ParserRule getUiDateFieldRule() {
+		return getUiDateFieldAccess().getRule();
+	}
+	
+	//enum UiDateFormat:
+	//	DATE="date" | DATE_TIME="datetime" | TIME="time";
+	public UiDateFormatElements getUiDateFormatAccess() {
+		return eUiDateFormat;
+	}
+	
+	public EnumRule getUiDateFormatRule() {
+		return getUiDateFormatAccess().getRule();
+	}
+	
+	//enum UiDateTimeResolution:
+	//	UNDEFINED="undefined" | SECOND="second" | MINUTE="minute" | HOUR="hour" | DAY="day" | MONTH="month" | YEAR="year";
+	public UiDateTimeResolutionElements getUiDateTimeResolutionAccess() {
+		return eUiDateTimeResolution;
+	}
+	
+	public EnumRule getUiDateTimeResolutionRule() {
+		return getUiDateTimeResolutionAccess().getRule();
+	}
+	
+	//UiBrowser:
+	//	{UiBrowser}
+	//	'browser' ('(' (i18nInfo=UiI18nInfo?
+	//	& readonly?="readonly"?
+	//	& ('styles' styles=STRING)?)
+	//	')')? name=ID? ('{' (validators+=UiValidator
+	//	| bindings+=UiBinding)*
+	//	processorAssignments+=UiVisibilityProcessorAssignment*
+	//	'}')?;
+	public UiBrowserElements getUiBrowserAccess() {
+		return pUiBrowser;
+	}
+	
+	public ParserRule getUiBrowserRule() {
+		return getUiBrowserAccess().getRule();
+	}
+	
+	//UiProgressBar:
+	//	{UiProgressBar}
+	//	'progressbar' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=ID? ('{' (validators+=UiValidator
+	//	| bindings+=UiBinding)*
+	//	processorAssignments+=UiVisibilityProcessorAssignment*
+	//	'}')?;
+	public UiProgressBarElements getUiProgressBarAccess() {
+		return pUiProgressBar;
+	}
+	
+	public ParserRule getUiProgressBarRule() {
+		return getUiProgressBarAccess().getRule();
+	}
+	
+	//UiImage:
+	//	{UiImage}
+	//	'image' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=ID? ('{' ('iconPath' value=STRING ';'?)?
+	//	bindings+=UiBinding*
+	//	processorAssignments+=UiVisibilityProcessorAssignment*
+	//	'}')?;
+	public UiImageElements getUiImageAccess() {
+		return pUiImage;
+	}
+	
+	public ParserRule getUiImageRule() {
+		return getUiImageAccess().getRule();
+	}
+	
+	//UiTable:
+	//	{UiTable}
+	//	'table' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=ID? ('{' (('type' jvmType=JvmTypeReference
+	//	';'?)?
+	//	& ('selectionType' selectionType=UiSelectionType ';'?)?
+	//	& ('imageField' itemImageProperty=[JvmOperation] ';'?)?
+	//	& (consumeBeanService?='useBeanService' ';'?)?
+	//	& (scrollToBottom?='scrollToBottom' ';'?)?
+	//	& readonly?="readonly"?) columnAssignment=UiColumnsAssignment?
+	//	sortOrderAssignment=UiSortOrderAssignment? (validators+=UiValidator
+	//	| bindings+=UiBinding)*
+	//	processorAssignments+=UiVisibilityProcessorAssignment*
+	//	'}')?;
+	public UiTableElements getUiTableAccess() {
+		return pUiTable;
+	}
+	
+	public ParserRule getUiTableRule() {
+		return getUiTableAccess().getRule();
+	}
+	
+	//UiComboBox:
+	//	{UiComboBox}
+	//	'combo' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=ID? ('{' (('type' jvmType=JvmTypeReference
+	//	';'?)?
+	//	& ('captionField' itemCaptionProperty=[JvmOperation] ';'?)?
+	//	& ('descriptionField' descriptionProperty=UiNestedProperty ';'?)?
+	//	& ('imageField' itemImageProperty=[JvmOperation] ';'?)?
+	//	& (consumeBeanService?='useBeanService' ';'?)?
+	//	& readonly?='readonly'?) (validators+=UiValidator
+	//	| bindings+=UiBinding)*
+	//	processorAssignments+=UiVisibilityProcessorAssignment*
+	//	'}')?;
+	public UiComboBoxElements getUiComboBoxAccess() {
+		return pUiComboBox;
+	}
+	
+	public ParserRule getUiComboBoxRule() {
+		return getUiComboBoxAccess().getRule();
+	}
+	
+	//UiButton:
+	//	{UiButton}
+	//	'button' ('(' (i18nInfo=UiI18nInfo?
+	//	& readonly?='readonly'?
+	//	& ('styles' styles=STRING)?)
+	//	')')? name=ID?;
+	public UiButtonElements getUiButtonAccess() {
+		return pUiButton;
+	}
+	
+	public ParserRule getUiButtonRule() {
+		return getUiButtonAccess().getRule();
+	}
+	
+	//UiMobileNavigationButton:
+	//	{UiMobileNavigationButton}
+	//	'navButton' ('(' (i18nInfo=UiI18nInfo?
+	//	& readonly?="readonly"?
+	//	& ('styles' styles=STRING)?)
+	//	')')?
+	//	name=ID? (targetPage=UiMobileNavigationPage | 'alias'
+	//	targetPageAlias=[UiMobileNavigationPage]);
+	public UiMobileNavigationButtonElements getUiMobileNavigationButtonAccess() {
+		return pUiMobileNavigationButton;
+	}
+	
+	public ParserRule getUiMobileNavigationButtonRule() {
+		return getUiMobileNavigationButtonAccess().getRule();
+	}
+	
+	//UiMobileSwitch UiSwitch:
+	//	{UiSwitch}
+	//	'switchIt' ('(' (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?) ')')? name=ID? ('{'
+	//	processorAssignments+=UiVisibilityProcessorAssignment* (validators+=UiValidator
+	//	| bindings+=UiBinding)*
+	//	'}')?;
+	public UiMobileSwitchElements getUiMobileSwitchAccess() {
+		return pUiMobileSwitch;
+	}
+	
+	public ParserRule getUiMobileSwitchRule() {
+		return getUiMobileSwitchAccess().getRule();
+	}
+	
+	//UiLabel:
+	//	{UiLabel}
+	//	'label' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=ID? ('{'
+	//	processorAssignments+=UiVisibilityProcessorAssignment*
+	//	bindings+=UiBinding*
+	//	'}')?;
+	public UiLabelElements getUiLabelAccess() {
+		return pUiLabel;
+	}
+	
+	public ParserRule getUiLabelRule() {
+		return getUiLabelAccess().getRule();
+	}
+	
+	//UiDecimalField:
+	//	{UiDecimalField}
+	//	'decimalField' ('(' (noGrouping?='noGrouping'?
+	//	& noMarkNegative?='noMarkNegative'?
+	//	& ('styles' styles=STRING)?
+	//	& ('precision=' precision=INT)?
+	//	& i18nInfo=UiI18nInfo?
+	//	& readonly?="readonly"?)
+	//	')')?
+	//	name=ID? ('{' (validators+=UiValidator
+	//	| bindings+=UiBinding)*
+	//	processorAssignments+=UiVisibilityProcessorAssignment*
+	//	'}')?;
+	public UiDecimalFieldElements getUiDecimalFieldAccess() {
+		return pUiDecimalField;
+	}
+	
+	public ParserRule getUiDecimalFieldRule() {
+		return getUiDecimalFieldAccess().getRule();
+	}
+	
+	//UiOptionsGroup:
+	//	{UiOptionsGroup}
+	//	'optionsgroup' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
+	//	name=ID? ('{' (('type' jvmType=JvmTypeReference)?
+	//	& ('selectionType' selectionType=UiSelectionType)?
+	//	& ('captionField' itemCaptionProperty=[JvmOperation])?
+	//	& ('descriptionField' descriptionProperty=UiNestedProperty ';'?)?
+	//	& ('imageField' itemImageProperty=[JvmOperation])?
+	//	& (consumeBeanService?='useBeanService' ';'?)?
+	//	& readonly?="readonly"?) (validators+=UiValidator
+	//	| bindings+=UiBinding)*
+	//	processorAssignments+=UiVisibilityProcessorAssignment*
+	//	'}')?;
+	public UiOptionsGroupElements getUiOptionsGroupAccess() {
+		return pUiOptionsGroup;
+	}
+	
+	public ParserRule getUiOptionsGroupRule() {
+		return getUiOptionsGroupAccess().getRule();
+	}
+	
+	//UiList:
+	//	{UiList}
+	//	'listSelect' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
+	//	name=ID? ('{' (('type' jvmType=JvmTypeReference)?
+	//	& ('selectionType' selectionType=UiSelectionType)?
+	//	& ('captionField' itemCaptionProperty=[JvmOperation])?
+	//	& ('descriptionField' descriptionProperty=UiNestedProperty ';'?)?
+	//	& ('imageField' itemImageProperty=[JvmOperation])?
+	//	& (consumeBeanService?='useBeanService' ';'?)?
+	//	& readonly?="readonly"?) (validators+=UiValidator
+	//	| bindings+=UiBinding)*
+	//	processorAssignments+=UiVisibilityProcessorAssignment*
+	//	'}')?;
+	public UiListElements getUiListAccess() {
+		return pUiList;
+	}
+	
+	public ParserRule getUiListRule() {
+		return getUiListAccess().getRule();
+	}
+	
+	//enum UiSelectionType:
+	//	SINGLE='single' | MULTI='multi' | NONE='none';
+	public UiSelectionTypeElements getUiSelectionTypeAccess() {
+		return eUiSelectionType;
+	}
+	
+	public EnumRule getUiSelectionTypeRule() {
+		return getUiSelectionTypeAccess().getRule();
+	}
+	
+	//enum UiAlignment:
+	//	UNDEFINED="undefined"
+	//	| BOTTOM_CENTER="bottom-center" | BOTTOM_LEFT="bottom-left" | BOTTOM_RIGHT="bottom-right" | BOTTOM_FILL="bottom-fill"
+	//	| MIDDLE_CENTER="middle-center" | MIDDLE_LEFT="middle-left" | MIDDLE_RIGHT="middle-right" | MIDDLE_FILL="middle-fill"
+	//	| TOP_CENTER="top-center" | TOP_LEFT="top-left" | TOP_RIGHT="top-right" | TOP_FILL="top-fill"
+	//	| FILL_CENTER="fill-center" | FILL_LEFT="fill-left" | FILL_RIGHT="fill-right" | FILL_FILL="fill-fill";
+	public UiAlignmentElements getUiAlignmentAccess() {
+		return eUiAlignment;
+	}
+	
+	public EnumRule getUiAlignmentRule() {
+		return getUiAlignmentAccess().getRule();
+	}
+	
+	//UiColumnsAssignment:
+	//	{UiColumnsAssignment}
+	//	'columns' '{'
+	//	columns+=UiColumn*
+	//	'}';
+	public UiColumnsAssignmentElements getUiColumnsAssignmentAccess() {
+		return pUiColumnsAssignment;
+	}
+	
+	public ParserRule getUiColumnsAssignmentRule() {
+		return getUiColumnsAssignmentAccess().getRule();
+	}
+	
+	//UiSortOrderAssignment:
+	//	{UiSortOrderAssignment}
+	//	'sort' '{'
+	//	columns+=UiSortOrder*
+	//	'}';
+	public UiSortOrderAssignmentElements getUiSortOrderAssignmentAccess() {
+		return pUiSortOrderAssignment;
+	}
+	
+	public ParserRule getUiSortOrderAssignmentRule() {
+		return getUiSortOrderAssignmentAccess().getRule();
+	}
+	
+	//UiSortOrder:
+	//	'column' property=UiNestedProperty ('desc' | asc?="asc")? ';'?;
+	public UiSortOrderElements getUiSortOrderAccess() {
+		return pUiSortOrder;
+	}
+	
+	public ParserRule getUiSortOrderRule() {
+		return getUiSortOrderAccess().getRule();
+	}
+	
+	//UiColumn:
+	//	{UiColumn}
+	//	'column' property=UiNestedProperty ('icon' iconName=STRING)? ';'?;
+	public UiColumnElements getUiColumnAccess() {
+		return pUiColumn;
+	}
+	
+	public ParserRule getUiColumnRule() {
+		return getUiColumnAccess().getRule();
+	}
+	
+	//UiEmbeddable:
+	//	UiLayout | UiField | UiAction | UiTabSheet;
+	public UiEmbeddableElements getUiEmbeddableAccess() {
+		return pUiEmbeddable;
+	}
+	
+	public ParserRule getUiEmbeddableRule() {
+		return getUiEmbeddableAccess().getRule();
+	}
+	
+	//UiMobileEmbeddable:
+	//	UiMobileLayout | UiMobileField | UiMobileTabSheet | UiMobileAction;
+	public UiMobileEmbeddableElements getUiMobileEmbeddableAccess() {
+		return pUiMobileEmbeddable;
+	}
+	
+	public ParserRule getUiMobileEmbeddableRule() {
+		return getUiMobileEmbeddableAccess().getRule();
+	}
+	
+	//UiMobileLayout:
+	//	UiMobileHorizontalButtonGroup | UiMobileVerticalComponentGroup | UiMobileNavigationPage | UiMobileHorizontalLayout |
+	//	UiMobileVerticalLayout | UiMobileSearchPanel | UiMobileNavigationRoot;
+	public UiMobileLayoutElements getUiMobileLayoutAccess() {
+		return pUiMobileLayout;
+	}
+	
+	public ParserRule getUiMobileLayoutRule() {
+		return getUiMobileLayoutAccess().getRule();
+	}
+	
+	//UiMobileField:
+	//	UiMobileSwitch | UiTextField | UiMaskedTextField | UiMaskedNumericField | UiMaskedDecimalField |
+	//	UiPrefixedMaskedTextField | UiRichTextArea | UiPasswordField | UiSuggestTextField | UiNumericField | UiTable |
+	//	UiComboBox | UiImage
+	//	| UiSearchField | UiLabel | UiDecimalField | UiTextArea | UiDateField | UiBrowser | UiProgressBar | UiOptionsGroup;
+	public UiMobileFieldElements getUiMobileFieldAccess() {
+		return pUiMobileField;
+	}
+	
+	public ParserRule getUiMobileFieldRule() {
+		return getUiMobileFieldAccess().getRule();
+	}
+	
+	//UiLayout:
+	//	UiGridLayout | UiFormLayout | UiHorizontalLayout | UiVerticalLayout | UiSplitpanel | UiPanel | UiSearchPanel;
+	public UiLayoutElements getUiLayoutAccess() {
+		return pUiLayout;
+	}
+	
+	public ParserRule getUiLayoutRule() {
+		return getUiLayoutAccess().getRule();
+	}
+	
+	//UiField:
+	//	UiTextField | UiMaskedTextField | UiMaskedNumericField | UiMaskedDecimalField | UiPrefixedMaskedTextField |
+	//	UiRichTextArea | UiPasswordField | UiSuggestTextField | UiList | UiNumericField | UiCheckBox | UiTable | UiComboBox |
+	//	UiImage | UiSearchField | UiLabel | UiDecimalField | UiTextArea | UiDateField | UiBrowser | UiProgressBar |
+	//	UiOptionsGroup | UiBeanReferenceField;
+	public UiFieldElements getUiFieldAccess() {
+		return pUiField;
+	}
+	
+	public ParserRule getUiFieldRule() {
+		return getUiFieldAccess().getRule();
+	}
+	
+	//UiAction:
+	//	UiButton;
+	public UiActionElements getUiActionAccess() {
+		return pUiAction;
+	}
+	
+	public ParserRule getUiActionRule() {
+		return getUiActionAccess().getRule();
+	}
+	
+	//UiMobileAction:
+	//	UiMobileNavigationButton | UiButton;
+	public UiMobileActionElements getUiMobileActionAccess() {
+		return pUiMobileAction;
+	}
+	
+	public ParserRule getUiMobileActionRule() {
+		return getUiMobileActionAccess().getRule();
+	}
+	
+	//UiNumericField:
+	//	{UiNumericField}
+	//	'numericField' ('(' (noGrouping?='noGrouping'?
+	//	& ('styles' styles=STRING)?
+	//	& noMarkNegative?='noMarkNegative'?
+	//	& i18nInfo=UiI18nInfo?
+	//	& readonly?="readonly"?)
+	//	')')?
+	//	name=ID? ('{' (validators+=UiValidator
+	//	| bindings+=UiBinding)*
+	//	processorAssignments+=UiVisibilityProcessorAssignment*
+	//	'}')?;
+	public UiNumericFieldElements getUiNumericFieldAccess() {
+		return pUiNumericField;
+	}
+	
+	public ParserRule getUiNumericFieldRule() {
+		return getUiNumericFieldAccess().getRule();
+	}
+	
+	//UiCheckBox:
+	//	{UiCheckBox}
+	//	'checkbox' ('(' (i18nInfo=UiI18nInfo?
+	//	& readonly?="readonly"?
+	//	& ('styles' styles=STRING)?)
+	//	')')? name=ID? ('{' (validators+=UiValidator
+	//	| bindings+=UiBinding)*
+	//	processorAssignments+=UiVisibilityProcessorAssignment*
+	//	'}')?;
+	public UiCheckBoxElements getUiCheckBoxAccess() {
+		return pUiCheckBox;
+	}
+	
+	public ParserRule getUiCheckBoxRule() {
+		return getUiCheckBoxAccess().getRule();
+	}
+	
+	//UiValidator:
+	//	UiMaxLengthValidator | UiMinLengthValidator | UiRegexpValidator | UiXbaseValidator | UiBeanValidationValidator;
+	public UiValidatorElements getUiValidatorAccess() {
+		return pUiValidator;
+	}
+	
+	public ParserRule getUiValidatorRule() {
+		return getUiValidatorAccess().getRule();
+	}
+	
+	//UiMaxLengthValidator:
+	//	{UiMaxLengthValidator}
+	//	'MaxLengthValidator' name=ID? '(' maxLength=INT ')' errorCode=UiErrorCode?;
+	public UiMaxLengthValidatorElements getUiMaxLengthValidatorAccess() {
+		return pUiMaxLengthValidator;
+	}
+	
+	public ParserRule getUiMaxLengthValidatorRule() {
+		return getUiMaxLengthValidatorAccess().getRule();
+	}
+	
+	//UiMinLengthValidator:
+	//	{UiMinLengthValidator}
+	//	'MinLengthValidator' name=ID? '(' minLength=INT ')' errorCode=UiErrorCode?;
+	public UiMinLengthValidatorElements getUiMinLengthValidatorAccess() {
+		return pUiMinLengthValidator;
+	}
+	
+	public ParserRule getUiMinLengthValidatorRule() {
+		return getUiMinLengthValidatorAccess().getRule();
+	}
+	
+	//UiRegexpValidator:
+	//	{UiRegexpValidator}
+	//	'RegexValidator' name=ID? '(' regExpression=STRING ')' errorCode=UiErrorCode?;
+	public UiRegexpValidatorElements getUiRegexpValidatorAccess() {
+		return pUiRegexpValidator;
+	}
+	
+	public ParserRule getUiRegexpValidatorRule() {
+		return getUiRegexpValidatorAccess().getRule();
+	}
+	
+	//UiXbaseValidator:
+	//	{UiXbaseValidator}
+	//	'Expression' name=ID '(' jvmType=JvmTypeReference ')'
+	//	errorCodes+=UiErrorCode* expression=XBlockExpression?;
+	public UiXbaseValidatorElements getUiXbaseValidatorAccess() {
+		return pUiXbaseValidator;
+	}
+	
+	public ParserRule getUiXbaseValidatorRule() {
+		return getUiXbaseValidatorAccess().getRule();
+	}
+	
+	//UiBeanValidationValidator:
+	//	{UiBeanValidationValidator}
+	//	'BeanValidationValidator' name=ID?;
+	public UiBeanValidationValidatorElements getUiBeanValidationValidatorAccess() {
+		return pUiBeanValidationValidator;
+	}
+	
+	public ParserRule getUiBeanValidationValidatorRule() {
+		return getUiBeanValidationValidatorAccess().getRule();
+	}
+	
+	//UiErrorCode:
+	//	'code' name=ID defaultMessage=STRING?;
+	public UiErrorCodeElements getUiErrorCodeAccess() {
+		return pUiErrorCode;
+	}
+	
+	public ParserRule getUiErrorCodeRule() {
+		return getUiErrorCodeAccess().getRule();
+	}
+	
+	//UiVisibilityProcessor:
+	//	{UiVisibilityProcessor}
+	//	'visibility' name=ID '{' (dataUsed+=UiBindingEndpointAlias
+	//	| changeTriggers+=UiChangeTrigger
+	//	| importedElements+=UiTypedBindableRawTypeAlias)*
+	//	rule=UiXbaseVisibilityRule?
+	//	'}';
+	public UiVisibilityProcessorElements getUiVisibilityProcessorAccess() {
+		return pUiVisibilityProcessor;
+	}
+	
+	public ParserRule getUiVisibilityProcessorRule() {
+		return getUiVisibilityProcessorAccess().getRule();
+	}
+	
+	//UiXbaseVisibilityRule:
+	//	expression=XBlockExpression;
+	public UiXbaseVisibilityRuleElements getUiXbaseVisibilityRuleAccess() {
+		return pUiXbaseVisibilityRule;
+	}
+	
+	public ParserRule getUiXbaseVisibilityRuleRule() {
+		return getUiXbaseVisibilityRuleAccess().getRule();
+	}
+	
+	//UiChangeTrigger:
+	//	'fireOn' endpoint=UiBindingEndpointAssignment 'as' alias=ID ';'?;
+	public UiChangeTriggerElements getUiChangeTriggerAccess() {
+		return pUiChangeTrigger;
+	}
+	
+	public ParserRule getUiChangeTriggerRule() {
+		return getUiChangeTriggerAccess().getRule();
+	}
+	
+	//@ 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 getXImportDeclarationRule() {
+		return getXImportDeclarationAccess().getRule();
+	}
+	
+	//XAnnotation:
+	//	{XAnnotation}
+	//	'@' annotationType=[types::JvmAnnotationType|QualifiedName] (=> '(' (elementValuePairs+=XAnnotationElementValuePair
+	//	(',' elementValuePairs+=XAnnotationElementValuePair)*
+	//	| value=XAnnotationElementValueOrCommaList)?
+	//	')')?;
+	public XbaseWithAnnotationsGrammarAccess.XAnnotationElements getXAnnotationAccess() {
+		return gaXbaseWithAnnotations.getXAnnotationAccess();
+	}
+	
+	public ParserRule getXAnnotationRule() {
+		return getXAnnotationAccess().getRule();
+	}
+	
+	//XAnnotationElementValuePair:
+	//	=> (element=[types::JvmOperation|ValidID] '=') value=XAnnotationElementValue;
+	public XbaseWithAnnotationsGrammarAccess.XAnnotationElementValuePairElements getXAnnotationElementValuePairAccess() {
+		return gaXbaseWithAnnotations.getXAnnotationElementValuePairAccess();
+	}
+	
+	public ParserRule getXAnnotationElementValuePairRule() {
+		return getXAnnotationElementValuePairAccess().getRule();
+	}
+	
+	//XAnnotationElementValueOrCommaList xbase::XExpression:
+	//	=> ({xbase::XListLiteral} '#' '[') (elements+=XAnnotationOrExpression (',' elements+=XAnnotationOrExpression)*)? ']'
+	//	| XAnnotationOrExpression ({xbase::XListLiteral.elements+=current} (',' elements+=XAnnotationOrExpression)+)?;
+	public XbaseWithAnnotationsGrammarAccess.XAnnotationElementValueOrCommaListElements getXAnnotationElementValueOrCommaListAccess() {
+		return gaXbaseWithAnnotations.getXAnnotationElementValueOrCommaListAccess();
+	}
+	
+	public ParserRule getXAnnotationElementValueOrCommaListRule() {
+		return getXAnnotationElementValueOrCommaListAccess().getRule();
+	}
+	
+	//XAnnotationElementValue xbase::XExpression:
+	//	=> ({xbase::XListLiteral} '#' '[') (elements+=XAnnotationOrExpression (',' elements+=XAnnotationOrExpression)*)? ']'
+	//	| XAnnotationOrExpression;
+	public XbaseWithAnnotationsGrammarAccess.XAnnotationElementValueElements getXAnnotationElementValueAccess() {
+		return gaXbaseWithAnnotations.getXAnnotationElementValueAccess();
+	}
+	
+	public ParserRule getXAnnotationElementValueRule() {
+		return getXAnnotationElementValueAccess().getRule();
+	}
+	
+	//XAnnotationOrExpression xbase::XExpression:
+	//	XAnnotation | XExpression;
+	public XbaseWithAnnotationsGrammarAccess.XAnnotationOrExpressionElements getXAnnotationOrExpressionAccess() {
+		return gaXbaseWithAnnotations.getXAnnotationOrExpressionAccess();
+	}
+	
+	public ParserRule getXAnnotationOrExpressionRule() {
+		return getXAnnotationOrExpressionAccess().getRule();
+	}
+	
+	//XExpression:
+	//	XAssignment;
+	public XbaseGrammarAccess.XExpressionElements getXExpressionAccess() {
+		return gaXbase.getXExpressionAccess();
+	}
+	
+	public ParserRule getXExpressionRule() {
+		return getXExpressionAccess().getRule();
+	}
+	
+	//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 gaXbase.getXAssignmentAccess();
+	}
+	
+	public ParserRule getXAssignmentRule() {
+		return getXAssignmentAccess().getRule();
+	}
+	
+	//OpSingleAssign:
+	//	'=';
+	public XbaseGrammarAccess.OpSingleAssignElements getOpSingleAssignAccess() {
+		return gaXbase.getOpSingleAssignAccess();
+	}
+	
+	public ParserRule getOpSingleAssignRule() {
+		return getOpSingleAssignAccess().getRule();
+	}
+	
+	//OpMultiAssign:
+	//	'+=' | '-=' | '*=' | '/=' | '%=' |
+	//	'<' '<' '=' |
+	//	'>' '>'? '>=';
+	public XbaseGrammarAccess.OpMultiAssignElements getOpMultiAssignAccess() {
+		return gaXbase.getOpMultiAssignAccess();
+	}
+	
+	public ParserRule getOpMultiAssignRule() {
+		return getOpMultiAssignAccess().getRule();
+	}
+	
+	//XOrExpression XExpression:
+	//	XAndExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpOr])
+	//	rightOperand=XAndExpression)*;
+	public XbaseGrammarAccess.XOrExpressionElements getXOrExpressionAccess() {
+		return gaXbase.getXOrExpressionAccess();
+	}
+	
+	public ParserRule getXOrExpressionRule() {
+		return getXOrExpressionAccess().getRule();
+	}
+	
+	//OpOr:
+	//	'||';
+	public XbaseGrammarAccess.OpOrElements getOpOrAccess() {
+		return gaXbase.getOpOrAccess();
+	}
+	
+	public ParserRule getOpOrRule() {
+		return getOpOrAccess().getRule();
+	}
+	
+	//XAndExpression XExpression:
+	//	XEqualityExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpAnd])
+	//	rightOperand=XEqualityExpression)*;
+	public XbaseGrammarAccess.XAndExpressionElements getXAndExpressionAccess() {
+		return gaXbase.getXAndExpressionAccess();
+	}
+	
+	public ParserRule getXAndExpressionRule() {
+		return getXAndExpressionAccess().getRule();
+	}
+	
+	//OpAnd:
+	//	'&&';
+	public XbaseGrammarAccess.OpAndElements getOpAndAccess() {
+		return gaXbase.getOpAndAccess();
+	}
+	
+	public ParserRule getOpAndRule() {
+		return getOpAndAccess().getRule();
+	}
+	
+	//XEqualityExpression XExpression:
+	//	XRelationalExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpEquality])
+	//	rightOperand=XRelationalExpression)*;
+	public XbaseGrammarAccess.XEqualityExpressionElements getXEqualityExpressionAccess() {
+		return gaXbase.getXEqualityExpressionAccess();
+	}
+	
+	public ParserRule getXEqualityExpressionRule() {
+		return getXEqualityExpressionAccess().getRule();
+	}
+	
+	//OpEquality:
+	//	'==' | '!=' | '===' | '!==';
+	public XbaseGrammarAccess.OpEqualityElements getOpEqualityAccess() {
+		return gaXbase.getOpEqualityAccess();
+	}
+	
+	public ParserRule getOpEqualityRule() {
+		return getOpEqualityAccess().getRule();
+	}
+	
+	//XRelationalExpression XExpression:
+	//	XOtherOperatorExpression (=> ({XInstanceOfExpression.expression=current} 'instanceof') type=JvmTypeReference |
+	//	=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpCompare])
+	//	rightOperand=XOtherOperatorExpression)*;
+	public XbaseGrammarAccess.XRelationalExpressionElements getXRelationalExpressionAccess() {
+		return gaXbase.getXRelationalExpressionAccess();
+	}
+	
+	public ParserRule getXRelationalExpressionRule() {
+		return getXRelationalExpressionAccess().getRule();
+	}
+	
+	//OpCompare:
+	//	'>=' | '<' '=' | '>' | '<';
+	public XbaseGrammarAccess.OpCompareElements getOpCompareAccess() {
+		return gaXbase.getOpCompareAccess();
+	}
+	
+	public ParserRule getOpCompareRule() {
+		return getOpCompareAccess().getRule();
+	}
+	
+	//XOtherOperatorExpression XExpression:
+	//	XAdditiveExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpOther])
+	//	rightOperand=XAdditiveExpression)*;
+	public XbaseGrammarAccess.XOtherOperatorExpressionElements getXOtherOperatorExpressionAccess() {
+		return gaXbase.getXOtherOperatorExpressionAccess();
+	}
+	
+	public ParserRule getXOtherOperatorExpressionRule() {
+		return getXOtherOperatorExpressionAccess().getRule();
+	}
+	
+	//OpOther:
+	//	'->'
+	//	| '..<'
+	//	| '>' '..'
+	//	| '..'
+	//	| '=>'
+	//	| '>' (=> ('>' '>') | '>') | '<' (=> ('<' '<') | '<' | '=>') | '<>'
+	//	| '?:';
+	public XbaseGrammarAccess.OpOtherElements getOpOtherAccess() {
+		return gaXbase.getOpOtherAccess();
+	}
+	
+	public ParserRule getOpOtherRule() {
+		return getOpOtherAccess().getRule();
+	}
+	
+	//XAdditiveExpression XExpression:
+	//	XMultiplicativeExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpAdd])
+	//	rightOperand=XMultiplicativeExpression)*;
+	public XbaseGrammarAccess.XAdditiveExpressionElements getXAdditiveExpressionAccess() {
+		return gaXbase.getXAdditiveExpressionAccess();
+	}
+	
+	public ParserRule getXAdditiveExpressionRule() {
+		return getXAdditiveExpressionAccess().getRule();
+	}
+	
+	//OpAdd:
+	//	'+' | '-';
+	public XbaseGrammarAccess.OpAddElements getOpAddAccess() {
+		return gaXbase.getOpAddAccess();
+	}
+	
+	public ParserRule getOpAddRule() {
+		return getOpAddAccess().getRule();
+	}
+	
+	//XMultiplicativeExpression XExpression:
+	//	XUnaryOperation (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpMulti])
+	//	rightOperand=XUnaryOperation)*;
+	public XbaseGrammarAccess.XMultiplicativeExpressionElements getXMultiplicativeExpressionAccess() {
+		return gaXbase.getXMultiplicativeExpressionAccess();
+	}
+	
+	public ParserRule getXMultiplicativeExpressionRule() {
+		return getXMultiplicativeExpressionAccess().getRule();
+	}
+	
+	//OpMulti:
+	//	'*' | '**' | '/' | '%';
+	public XbaseGrammarAccess.OpMultiElements getOpMultiAccess() {
+		return gaXbase.getOpMultiAccess();
+	}
+	
+	public ParserRule getOpMultiRule() {
+		return getOpMultiAccess().getRule();
+	}
+	
+	//XUnaryOperation XExpression:
+	//	{XUnaryOperation} feature=[types::JvmIdentifiableElement|OpUnary] operand=XUnaryOperation
+	//	| XCastedExpression;
+	public XbaseGrammarAccess.XUnaryOperationElements getXUnaryOperationAccess() {
+		return gaXbase.getXUnaryOperationAccess();
+	}
+	
+	public ParserRule getXUnaryOperationRule() {
+		return getXUnaryOperationAccess().getRule();
+	}
+	
+	//OpUnary:
+	//	"!" | "-" | "+";
+	public XbaseGrammarAccess.OpUnaryElements getOpUnaryAccess() {
+		return gaXbase.getOpUnaryAccess();
+	}
+	
+	public ParserRule getOpUnaryRule() {
+		return getOpUnaryAccess().getRule();
+	}
+	
+	//XCastedExpression XExpression:
+	//	XPostfixOperation (=> ({XCastedExpression.target=current} 'as') type=JvmTypeReference)*;
+	public XbaseGrammarAccess.XCastedExpressionElements getXCastedExpressionAccess() {
+		return gaXbase.getXCastedExpressionAccess();
+	}
+	
+	public ParserRule getXCastedExpressionRule() {
+		return getXCastedExpressionAccess().getRule();
+	}
+	
+	//XPostfixOperation XExpression:
+	//	XMemberFeatureCall => ({XPostfixOperation.operand=current} feature=[types::JvmIdentifiableElement|OpPostfix])?;
+	public XbaseGrammarAccess.XPostfixOperationElements getXPostfixOperationAccess() {
+		return gaXbase.getXPostfixOperationAccess();
+	}
+	
+	public ParserRule getXPostfixOperationRule() {
+		return getXPostfixOperationAccess().getRule();
+	}
+	
+	//OpPostfix:
+	//	"++" | "--";
+	public XbaseGrammarAccess.OpPostfixElements getOpPostfixAccess() {
+		return gaXbase.getOpPostfixAccess();
+	}
+	
+	public ParserRule getOpPostfixRule() {
+		return getOpPostfixAccess().getRule();
+	}
+	
+	//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 gaXbase.getXMemberFeatureCallAccess();
+	}
+	
+	public ParserRule getXMemberFeatureCallRule() {
+		return getXMemberFeatureCallAccess().getRule();
+	}
+	
+	//XPrimaryExpression XExpression:
+	//	XConstructorCall | XBlockExpression | XSwitchExpression | XSynchronizedExpression | XFeatureCall | XLiteral |
+	//	XIfExpression | XForLoopExpression | XBasicForLoopExpression | XWhileExpression | XDoWhileExpression |
+	//	XThrowExpression | XReturnExpression | XTryCatchFinallyExpression | XParenthesizedExpression;
+	public XbaseGrammarAccess.XPrimaryExpressionElements getXPrimaryExpressionAccess() {
+		return gaXbase.getXPrimaryExpressionAccess();
+	}
+	
+	public ParserRule getXPrimaryExpressionRule() {
+		return getXPrimaryExpressionAccess().getRule();
+	}
+	
+	//XLiteral XExpression:
+	//	XCollectionLiteral | XClosure | XBooleanLiteral | XNumberLiteral | XNullLiteral | XStringLiteral | XTypeLiteral;
+	public XbaseGrammarAccess.XLiteralElements getXLiteralAccess() {
+		return gaXbase.getXLiteralAccess();
+	}
+	
+	public ParserRule getXLiteralRule() {
+		return getXLiteralAccess().getRule();
+	}
+	
+	//XCollectionLiteral:
+	//	XSetLiteral | XListLiteral;
+	public XbaseGrammarAccess.XCollectionLiteralElements getXCollectionLiteralAccess() {
+		return gaXbase.getXCollectionLiteralAccess();
+	}
+	
+	public ParserRule getXCollectionLiteralRule() {
+		return getXCollectionLiteralAccess().getRule();
+	}
+	
+	//XSetLiteral:
+	//	{XSetLiteral} '#' '{' (elements+=XExpression (',' elements+=XExpression)*)? '}';
+	public XbaseGrammarAccess.XSetLiteralElements getXSetLiteralAccess() {
+		return gaXbase.getXSetLiteralAccess();
+	}
+	
+	public ParserRule getXSetLiteralRule() {
+		return getXSetLiteralAccess().getRule();
+	}
+	
+	//XListLiteral:
+	//	{XListLiteral} '#' '[' (elements+=XExpression (',' elements+=XExpression)*)? ']';
+	public XbaseGrammarAccess.XListLiteralElements getXListLiteralAccess() {
+		return gaXbase.getXListLiteralAccess();
+	}
+	
+	public ParserRule getXListLiteralRule() {
+		return getXListLiteralAccess().getRule();
+	}
+	
+	//XClosure XExpression:
+	//	=> ({XClosure}
+	//	'[')
+	//	=> ((declaredFormalParameters+=JvmFormalParameter (',' declaredFormalParameters+=JvmFormalParameter)*)?
+	//	explicitSyntax?='|')?
+	//	expression=XExpressionInClosure
+	//	']';
+	public XbaseGrammarAccess.XClosureElements getXClosureAccess() {
+		return gaXbase.getXClosureAccess();
+	}
+	
+	public ParserRule getXClosureRule() {
+		return getXClosureAccess().getRule();
+	}
+	
+	//XExpressionInClosure XExpression:
+	//	{XBlockExpression} (expressions+=XExpressionOrVarDeclaration ';'?)*;
+	public XbaseGrammarAccess.XExpressionInClosureElements getXExpressionInClosureAccess() {
+		return gaXbase.getXExpressionInClosureAccess();
+	}
+	
+	public ParserRule getXExpressionInClosureRule() {
+		return getXExpressionInClosureAccess().getRule();
+	}
+	
+	//XShortClosure XExpression:
+	//	=> ({XClosure} (declaredFormalParameters+=JvmFormalParameter (',' declaredFormalParameters+=JvmFormalParameter)*)?
+	//	explicitSyntax?='|') expression=XExpression;
+	public XbaseGrammarAccess.XShortClosureElements getXShortClosureAccess() {
+		return gaXbase.getXShortClosureAccess();
+	}
+	
+	public ParserRule getXShortClosureRule() {
+		return getXShortClosureAccess().getRule();
+	}
+	
+	//XParenthesizedExpression XExpression:
+	//	'(' XExpression ')';
+	public XbaseGrammarAccess.XParenthesizedExpressionElements getXParenthesizedExpressionAccess() {
+		return gaXbase.getXParenthesizedExpressionAccess();
+	}
+	
+	public ParserRule getXParenthesizedExpressionRule() {
+		return getXParenthesizedExpressionAccess().getRule();
+	}
+	
+	//XIfExpression XExpression:
+	//	{XIfExpression}
+	//	'if' '(' if=XExpression ')'
+	//	then=XExpression (=> 'else' else=XExpression)?;
+	public XbaseGrammarAccess.XIfExpressionElements getXIfExpressionAccess() {
+		return gaXbase.getXIfExpressionAccess();
+	}
+	
+	public ParserRule getXIfExpressionRule() {
+		return getXIfExpressionAccess().getRule();
+	}
+	
+	//XSwitchExpression XExpression:
+	//	{XSwitchExpression}
+	//	'switch' (=> ('(' declaredParam=JvmFormalParameter ':') switch=XExpression ')'
+	//	| => (declaredParam=JvmFormalParameter ':')? switch=XExpression) '{'
+	//	cases+=XCasePart* ('default' ':' default=XExpression)?
+	//	'}';
+	public XbaseGrammarAccess.XSwitchExpressionElements getXSwitchExpressionAccess() {
+		return gaXbase.getXSwitchExpressionAccess();
+	}
+	
+	public ParserRule getXSwitchExpressionRule() {
+		return getXSwitchExpressionAccess().getRule();
+	}
+	
+	//XCasePart:
+	//	{XCasePart} typeGuard=JvmTypeReference? ('case' case=XExpression)? (':' then=XExpression | fallThrough?=',');
+	public XbaseGrammarAccess.XCasePartElements getXCasePartAccess() {
+		return gaXbase.getXCasePartAccess();
+	}
+	
+	public ParserRule getXCasePartRule() {
+		return getXCasePartAccess().getRule();
+	}
+	
+	//XForLoopExpression XExpression:
+	//	=> ({XForLoopExpression}
+	//	'for' '(' declaredParam=JvmFormalParameter ':') forExpression=XExpression ')'
+	//	eachExpression=XExpression;
+	public XbaseGrammarAccess.XForLoopExpressionElements getXForLoopExpressionAccess() {
+		return gaXbase.getXForLoopExpressionAccess();
+	}
+	
+	public ParserRule getXForLoopExpressionRule() {
+		return getXForLoopExpressionAccess().getRule();
+	}
+	
+	//XBasicForLoopExpression XExpression:
+	//	{XBasicForLoopExpression}
+	//	'for' '(' (initExpressions+=XExpressionOrVarDeclaration (',' initExpressions+=XExpressionOrVarDeclaration)*)? ';'
+	//	expression=XExpression? ';' (updateExpressions+=XExpression (',' updateExpressions+=XExpression)*)? ')'
+	//	eachExpression=XExpression;
+	public XbaseGrammarAccess.XBasicForLoopExpressionElements getXBasicForLoopExpressionAccess() {
+		return gaXbase.getXBasicForLoopExpressionAccess();
+	}
+	
+	public ParserRule getXBasicForLoopExpressionRule() {
+		return getXBasicForLoopExpressionAccess().getRule();
+	}
+	
+	//XWhileExpression XExpression:
+	//	{XWhileExpression}
+	//	'while' '(' predicate=XExpression ')'
+	//	body=XExpression;
+	public XbaseGrammarAccess.XWhileExpressionElements getXWhileExpressionAccess() {
+		return gaXbase.getXWhileExpressionAccess();
+	}
+	
+	public ParserRule getXWhileExpressionRule() {
+		return getXWhileExpressionAccess().getRule();
+	}
+	
+	//XDoWhileExpression XExpression:
+	//	{XDoWhileExpression}
+	//	'do'
+	//	body=XExpression
+	//	'while' '(' predicate=XExpression ')';
+	public XbaseGrammarAccess.XDoWhileExpressionElements getXDoWhileExpressionAccess() {
+		return gaXbase.getXDoWhileExpressionAccess();
+	}
+	
+	public ParserRule getXDoWhileExpressionRule() {
+		return getXDoWhileExpressionAccess().getRule();
+	}
+	
+	//XBlockExpression XExpression:
+	//	{XBlockExpression}
+	//	'{' (expressions+=XExpressionOrVarDeclaration ';'?)*
+	//	'}';
+	public XbaseGrammarAccess.XBlockExpressionElements getXBlockExpressionAccess() {
+		return gaXbase.getXBlockExpressionAccess();
+	}
+	
+	public ParserRule getXBlockExpressionRule() {
+		return getXBlockExpressionAccess().getRule();
+	}
+	
+	//XExpressionOrVarDeclaration XExpression:
+	//	XVariableDeclaration | XExpression;
+	public XbaseGrammarAccess.XExpressionOrVarDeclarationElements getXExpressionOrVarDeclarationAccess() {
+		return gaXbase.getXExpressionOrVarDeclarationAccess();
+	}
+	
+	public ParserRule getXExpressionOrVarDeclarationRule() {
+		return getXExpressionOrVarDeclarationAccess().getRule();
+	}
+	
+	//XVariableDeclaration XExpression:
+	//	{XVariableDeclaration} (writeable?='var' | 'val') (=> (type=JvmTypeReference name=ValidID) | name=ValidID) ('='
+	//	right=XExpression)?;
+	public XbaseGrammarAccess.XVariableDeclarationElements getXVariableDeclarationAccess() {
+		return gaXbase.getXVariableDeclarationAccess();
+	}
+	
+	public ParserRule getXVariableDeclarationRule() {
+		return getXVariableDeclarationAccess().getRule();
+	}
+	
+	//JvmFormalParameter types::JvmFormalParameter:
+	//	parameterType=JvmTypeReference? name=ValidID;
+	public XbaseGrammarAccess.JvmFormalParameterElements getJvmFormalParameterAccess() {
+		return gaXbase.getJvmFormalParameterAccess();
+	}
+	
+	public ParserRule getJvmFormalParameterRule() {
+		return getJvmFormalParameterAccess().getRule();
+	}
+	
+	//FullJvmFormalParameter types::JvmFormalParameter:
+	//	parameterType=JvmTypeReference name=ValidID;
+	public XbaseGrammarAccess.FullJvmFormalParameterElements getFullJvmFormalParameterAccess() {
+		return gaXbase.getFullJvmFormalParameterAccess();
+	}
+	
+	public ParserRule getFullJvmFormalParameterRule() {
+		return getFullJvmFormalParameterAccess().getRule();
+	}
+	
+	//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 gaXbase.getXFeatureCallAccess();
+	}
+	
+	public ParserRule getXFeatureCallRule() {
+		return getXFeatureCallAccess().getRule();
+	}
+	
+	//FeatureCallID:
+	//	ValidID | 'extends' | 'static' | 'import' | 'extension';
+	public XbaseGrammarAccess.FeatureCallIDElements getFeatureCallIDAccess() {
+		return gaXbase.getFeatureCallIDAccess();
+	}
+	
+	public ParserRule getFeatureCallIDRule() {
+		return getFeatureCallIDAccess().getRule();
+	}
+	
+	//IdOrSuper:
+	//	FeatureCallID | 'super';
+	public XbaseGrammarAccess.IdOrSuperElements getIdOrSuperAccess() {
+		return gaXbase.getIdOrSuperAccess();
+	}
+	
+	public ParserRule getIdOrSuperRule() {
+		return getIdOrSuperAccess().getRule();
+	}
+	
+	//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 gaXbase.getXConstructorCallAccess();
+	}
+	
+	public ParserRule getXConstructorCallRule() {
+		return getXConstructorCallAccess().getRule();
+	}
+	
+	//XBooleanLiteral XExpression:
+	//	{XBooleanLiteral} ('false' | isTrue?='true');
+	public XbaseGrammarAccess.XBooleanLiteralElements getXBooleanLiteralAccess() {
+		return gaXbase.getXBooleanLiteralAccess();
+	}
+	
+	public ParserRule getXBooleanLiteralRule() {
+		return getXBooleanLiteralAccess().getRule();
+	}
+	
+	//XNullLiteral XExpression:
+	//	{XNullLiteral} 'null';
+	public XbaseGrammarAccess.XNullLiteralElements getXNullLiteralAccess() {
+		return gaXbase.getXNullLiteralAccess();
+	}
+	
+	public ParserRule getXNullLiteralRule() {
+		return getXNullLiteralAccess().getRule();
+	}
+	
+	//XNumberLiteral XExpression:
+	//	{XNumberLiteral} value=Number;
+	public XbaseGrammarAccess.XNumberLiteralElements getXNumberLiteralAccess() {
+		return gaXbase.getXNumberLiteralAccess();
+	}
+	
+	public ParserRule getXNumberLiteralRule() {
+		return getXNumberLiteralAccess().getRule();
+	}
+	
+	//XStringLiteral XExpression:
+	//	{XStringLiteral} value=STRING;
+	public XbaseGrammarAccess.XStringLiteralElements getXStringLiteralAccess() {
+		return gaXbase.getXStringLiteralAccess();
+	}
+	
+	public ParserRule getXStringLiteralRule() {
+		return getXStringLiteralAccess().getRule();
+	}
+	
+	//XTypeLiteral XExpression:
+	//	{XTypeLiteral} 'typeof' '(' type=[types::JvmType|QualifiedName] arrayDimensions+=ArrayBrackets* ')';
+	public XbaseGrammarAccess.XTypeLiteralElements getXTypeLiteralAccess() {
+		return gaXbase.getXTypeLiteralAccess();
+	}
+	
+	public ParserRule getXTypeLiteralRule() {
+		return getXTypeLiteralAccess().getRule();
+	}
+	
+	//XThrowExpression XExpression:
+	//	{XThrowExpression} 'throw' expression=XExpression;
+	public XbaseGrammarAccess.XThrowExpressionElements getXThrowExpressionAccess() {
+		return gaXbase.getXThrowExpressionAccess();
+	}
+	
+	public ParserRule getXThrowExpressionRule() {
+		return getXThrowExpressionAccess().getRule();
+	}
+	
+	//XReturnExpression XExpression:
+	//	{XReturnExpression} 'return' -> expression=XExpression?;
+	public XbaseGrammarAccess.XReturnExpressionElements getXReturnExpressionAccess() {
+		return gaXbase.getXReturnExpressionAccess();
+	}
+	
+	public ParserRule getXReturnExpressionRule() {
+		return getXReturnExpressionAccess().getRule();
+	}
+	
+	//XTryCatchFinallyExpression XExpression:
+	//	{XTryCatchFinallyExpression}
+	//	'try'
+	//	expression=XExpression (catchClauses+=XCatchClause+ (=> 'finally' finallyExpression=XExpression)?
+	//	| 'finally' finallyExpression=XExpression);
+	public XbaseGrammarAccess.XTryCatchFinallyExpressionElements getXTryCatchFinallyExpressionAccess() {
+		return gaXbase.getXTryCatchFinallyExpressionAccess();
+	}
+	
+	public ParserRule getXTryCatchFinallyExpressionRule() {
+		return getXTryCatchFinallyExpressionAccess().getRule();
+	}
+	
+	//XSynchronizedExpression XExpression:
+	//	=> ({XSynchronizedExpression}
+	//	'synchronized' '(') param=XExpression ')' expression=XExpression;
+	public XbaseGrammarAccess.XSynchronizedExpressionElements getXSynchronizedExpressionAccess() {
+		return gaXbase.getXSynchronizedExpressionAccess();
+	}
+	
+	public ParserRule getXSynchronizedExpressionRule() {
+		return getXSynchronizedExpressionAccess().getRule();
+	}
+	
+	//XCatchClause:
+	//	=> 'catch' '(' declaredParam=FullJvmFormalParameter ')' expression=XExpression;
+	public XbaseGrammarAccess.XCatchClauseElements 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))?;
+	public XbaseGrammarAccess.NumberElements 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 '::')+;
+	public XbaseGrammarAccess.StaticQualifierElements 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')))?;
+	public TerminalRule getHEXRule() {
+		return gaXbase.getHEXRule();
+	}
+	
+	//terminal INT returns ecore::EInt:
+	//	'0'..'9' ('0'..'9' | '_')*;
+	public TerminalRule getINTRule() {
+		return gaXbase.getINTRule();
+	}
+	
+	//terminal DECIMAL:
+	//	INT (('e' | 'E') ('+' | '-')? INT)? (('b' | 'B') ('i' | 'I' | 'd' | 'D') | ('l' | 'L' | 'd' | 'D' | 'f' | 'F'))?;
+	public TerminalRule getDECIMALRule() {
+		return gaXbase.getDECIMALRule();
+	}
+	
+	//JvmTypeReference:
+	//	JvmParameterizedTypeReference => ({JvmGenericArrayTypeReference.componentType=current} ArrayBrackets)*
+	//	| XFunctionTypeRef;
+	public XtypeGrammarAccess.JvmTypeReferenceElements getJvmTypeReferenceAccess() {
+		return gaXtype.getJvmTypeReferenceAccess();
+	}
+	
+	public ParserRule getJvmTypeReferenceRule() {
+		return getJvmTypeReferenceAccess().getRule();
+	}
+	
+	//ArrayBrackets:
+	//	'[' ']';
+	public XtypeGrammarAccess.ArrayBracketsElements getArrayBracketsAccess() {
+		return gaXtype.getArrayBracketsAccess();
+	}
+	
+	public ParserRule getArrayBracketsRule() {
+		return getArrayBracketsAccess().getRule();
+	}
+	
+	//XFunctionTypeRef:
+	//	('(' (paramTypes+=JvmTypeReference (',' paramTypes+=JvmTypeReference)*)? ')')? '=>' returnType=JvmTypeReference;
+	public XtypeGrammarAccess.XFunctionTypeRefElements getXFunctionTypeRefAccess() {
+		return gaXtype.getXFunctionTypeRefAccess();
+	}
+	
+	public ParserRule getXFunctionTypeRefRule() {
+		return getXFunctionTypeRefAccess().getRule();
+	}
+	
+	//JvmParameterizedTypeReference:
+	//	type=[JvmType|super::QualifiedName] (=> '<' arguments+=JvmArgumentTypeReference (','
+	//	arguments+=JvmArgumentTypeReference)* '>' (=> ({JvmInnerTypeReference.outer=current} '.') type=[JvmType|ValidID] (=>
+	//	'<' arguments+=JvmArgumentTypeReference (',' arguments+=JvmArgumentTypeReference)* '>')?)*)?;
+	public XtypeGrammarAccess.JvmParameterizedTypeReferenceElements getJvmParameterizedTypeReferenceAccess() {
+		return gaXtype.getJvmParameterizedTypeReferenceAccess();
+	}
+	
+	public ParserRule getJvmParameterizedTypeReferenceRule() {
+		return getJvmParameterizedTypeReferenceAccess().getRule();
+	}
+	
+	//JvmArgumentTypeReference JvmTypeReference:
+	//	JvmTypeReference | JvmWildcardTypeReference;
+	public XtypeGrammarAccess.JvmArgumentTypeReferenceElements getJvmArgumentTypeReferenceAccess() {
+		return gaXtype.getJvmArgumentTypeReferenceAccess();
+	}
+	
+	public ParserRule getJvmArgumentTypeReferenceRule() {
+		return getJvmArgumentTypeReferenceAccess().getRule();
+	}
+	
+	//JvmWildcardTypeReference:
+	//	{JvmWildcardTypeReference} '?' (constraints+=JvmUpperBound constraints+=JvmUpperBoundAnded*
+	//	| constraints+=JvmLowerBound constraints+=JvmLowerBoundAnded*)?;
+	public XtypeGrammarAccess.JvmWildcardTypeReferenceElements getJvmWildcardTypeReferenceAccess() {
+		return gaXtype.getJvmWildcardTypeReferenceAccess();
+	}
+	
+	public ParserRule getJvmWildcardTypeReferenceRule() {
+		return getJvmWildcardTypeReferenceAccess().getRule();
+	}
+	
+	//JvmUpperBound:
+	//	'extends' typeReference=JvmTypeReference;
+	public XtypeGrammarAccess.JvmUpperBoundElements getJvmUpperBoundAccess() {
+		return gaXtype.getJvmUpperBoundAccess();
+	}
+	
+	public ParserRule getJvmUpperBoundRule() {
+		return getJvmUpperBoundAccess().getRule();
+	}
+	
+	//JvmUpperBoundAnded JvmUpperBound:
+	//	'&' typeReference=JvmTypeReference;
+	public XtypeGrammarAccess.JvmUpperBoundAndedElements getJvmUpperBoundAndedAccess() {
+		return gaXtype.getJvmUpperBoundAndedAccess();
+	}
+	
+	public ParserRule getJvmUpperBoundAndedRule() {
+		return getJvmUpperBoundAndedAccess().getRule();
+	}
+	
+	//JvmLowerBound:
+	//	'super' typeReference=JvmTypeReference;
+	public XtypeGrammarAccess.JvmLowerBoundElements getJvmLowerBoundAccess() {
+		return gaXtype.getJvmLowerBoundAccess();
+	}
+	
+	public ParserRule getJvmLowerBoundRule() {
+		return getJvmLowerBoundAccess().getRule();
+	}
+	
+	//JvmLowerBoundAnded JvmLowerBound:
+	//	'&' typeReference=JvmTypeReference;
+	public XtypeGrammarAccess.JvmLowerBoundAndedElements getJvmLowerBoundAndedAccess() {
+		return gaXtype.getJvmLowerBoundAndedAccess();
+	}
+	
+	public ParserRule getJvmLowerBoundAndedRule() {
+		return getJvmLowerBoundAndedAccess().getRule();
+	}
+	
+	//JvmTypeParameter:
+	//	name=ValidID (constraints+=JvmUpperBound constraints+=JvmUpperBoundAnded*)?;
+	public XtypeGrammarAccess.JvmTypeParameterElements getJvmTypeParameterAccess() {
+		return gaXtype.getJvmTypeParameterAccess();
+	}
+	
+	public ParserRule getJvmTypeParameterRule() {
+		return getJvmTypeParameterAccess().getRule();
+	}
+	
+	//QualifiedNameWithWildcard:
+	//	super::QualifiedName '.' '*';
+	public XtypeGrammarAccess.QualifiedNameWithWildcardElements 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+=super::XImportDeclaration+;
+	public XtypeGrammarAccess.XImportSectionElements getXImportSectionAccess() {
+		return gaXtype.getXImportSectionAccess();
+	}
+	
+	public ParserRule getXImportSectionRule() {
+		return getXImportSectionAccess().getRule();
+	}
+	
+	//QualifiedNameInStaticImport:
+	//	(ValidID '.')+;
+	public XtypeGrammarAccess.QualifiedNameInStaticImportElements 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:
+	//	'"' ('\\' . | !('\\' | '"'))* '"'? |
+	//	"'" ('\\' . | !('\\' | "'"))* "'"?;
+	public TerminalRule getSTRINGRule() {
+		return gaXtype.getSTRINGRule();
+	}
+	
+	//terminal ML_COMMENT:
+	//	'/*'->'*/';
+	public TerminalRule getML_COMMENTRule() {
+		return gaXtype.getML_COMMENTRule();
+	}
+	
+	//terminal SL_COMMENT:
+	//	'//' !('\n' | '\r')* ('\r'? '\n')?;
+	public TerminalRule getSL_COMMENTRule() {
+		return gaXtype.getSL_COMMENTRule();
+	}
+	
+	//terminal WS:
+	//	' ' | '\t' | '\r' | '\n'+;
+	public TerminalRule getWSRule() {
+		return gaXtype.getWSRule();
+	}
+	
+	//terminal ANY_OTHER:
+	//	.;
+	public TerminalRule getANY_OTHERRule() {
+		return gaXtype.getANY_OTHERRule();
+	}
+}
diff --git a/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/validation/AbstractUIGrammarValidator.java b/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/validation/AbstractUIGrammarValidator.java
index 93c6f25..076c69c 100644
--- a/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/validation/AbstractUIGrammarValidator.java
+++ b/org.eclipse.osbp.ecview.dsl/src-gen/org/eclipse/osbp/ecview/dsl/validation/AbstractUIGrammarValidator.java
@@ -7,6 +7,9 @@
  *
  * Contributors:
  *         Florian Pirchner - Initial implementation
+ *
+ * generated by Xtext 2.11.0
+ *
  */
 
 package org.eclipse.osbp.ecview.dsl.validation;
@@ -14,16 +17,20 @@
 import java.util.ArrayList;
 import java.util.List;
 import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.osbp.xtext.oxtype.validation.OXtypeValidator;
 
-public class AbstractUIGrammarValidator extends org.eclipse.xtext.xbase.validation.XbaseValidator {
-
+public abstract class AbstractUIGrammarValidator 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/ecview/dsl/uimodel/core"));
-	    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/ecview/dsl/uimodel/core"));
+		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.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/GenerateUIGrammar.mwe2 b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/GenerateUIGrammar.mwe2
index c56af53..5bd0203 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/GenerateUIGrammar.mwe2
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/GenerateUIGrammar.mwe2
@@ -12,206 +12,83 @@
 module org.eclipse.osbp.ecview.dsl.GenerateUIGrammar
 
 import org.eclipse.emf.mwe.utils.*
-import org.eclipse.xtext.generator.*
-import org.eclipse.xtext.ui.generator.*
+import org.eclipse.xtext.xtext.generator.*
+import org.eclipse.xtext.xtext.generator.model.project.*
 
-var fileExtensions = "ui"
-var projectName = "org.eclipse.osbp.ecview.dsl"
-var grammarURI = "classpath:/org/eclipse/osbp/ecview/dsl/UIGrammar.xtext"
-var runtimeProject = "../${projectName}"
-var generateXtendStub = true
-var encoding = "UTF-8"
+var rootPath = ".."
+
+var fileHeaderText = "/**
+ * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf), Loetz GmbH&Co.KG (Heidelberg)
+ * 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:
+ *         Florian Pirchner - Initial implementation
+ *
+ * generated by Xtext \${version}
+ *
+ */
+
+"
 
 Workflow {
-	bean = StandaloneSetup {
-//		uriMap = {
-//			from = "platform:/resource/org.eclipse.osbp.ecview.core.common.model/model/core.genmodel"
-//			to =
-//			"file:///Users/admin/git/osbp-ecview/org.eclipse.osbp.ecview.core.parent/org.eclipse.osbp.ecview.core.common.model/model/core.genmodel"
-//		}
-//		uriMap = {
-//			from = "platform:/plugin/"
-//			to = "platform:/resource/"
-//		}
-//		uriMap = {
-//			from = "platform:/resource/org.eclipse.osbp.ecview.core.common.model/"
-//			to =
-//			"file:///Users/admin/git/osbp-ecview/org.eclipse.osbp.ecview.core.parent/org.eclipse.osbp.ecview.core.common.model/"
-//		}
-//		uriMap = {
-//			from = "platform:/resource/org.eclipse.osbp.ecview.core.extension.model/"
-//			to =
-//			"file:///Users/admin/git/osbp-ecview/org.eclipse.osbp.ecview.core.parent/org.eclipse.osbp.ecview.core.extension.model/"
-//		}
-//		uriMap = {
-//			from = "platform:/resource/org.eclipse.osbp.ecview.semantic.uisemantics/"
-//			to = "file:///Users/admin/git/osbp-ecview-addons/org.eclipse.osbp.ecview.semantic.uisemantics/"
-//		}
-//		uriMap = {
-//			from = "platform:/resource/org.eclipse.osbp.ecview.semantic.uimodel/"
-//			to = "file:///Users/admin/git/osbp-ecview-addons/org.eclipse.osbp.ecview.semantic.uimodel/"
-//		}
-		//		resourceSet = org.eclipse.xtext.resource.XtextResourceSet : theResourceSet {}
-		scanClassPath = true
-		platformUri = "${runtimeProject}/.."
-		registerGeneratedEPackage = "org.eclipse.xtext.xbase.XbasePackage"
-		registerGenModelFile = "platform:/resource/org.eclipse.xtext.xbase/model/Xbase.genmodel"
-		registerGenModelFile = "platform:/resource/org.eclipse.xtext.common.types/model/JavaVMTypes.genmodel"
-		registerEcoreFile = "platform:/resource/org.eclipse.xtext.xbase/model/Xtype.ecore"
-		registerEcoreFile = "platform:/resource/org.eclipse.xtext.common.types/model/JavaVMTypes.ecore"
-		registerGenModelFile = "platform:/resource/org.eclipse.osbp.ecview.dsl/model/UIGrammarCore.genmodel"///*
-//		 * ECView 
-//		 */
-//		registerGeneratedEPackage = "org.eclipse.osbp.ecview.core.common.model.datatypes.DatatypesPackage"
-//		registerGeneratedEPackage = "org.eclipse.osbp.ecview.core.common.model.core.CoreModelPackage"
-//		registerGeneratedEPackage = "org.eclipse.osbp.ecview.core.common.model.binding.BindingPackage"
-//		registerGeneratedEPackage = "org.eclipse.osbp.ecview.core.common.model.validation.ValidationPackage"
-//		registerGeneratedEPackage = "org.eclipse.osbp.ecview.core.common.model.visibility.VisibilityPackage"
-//		registerGeneratedEPackage = "org.eclipse.osbp.ecview.core.extension.model.datatypes.ExtDatatypesPackage"
-//		registerGeneratedEPackage = "org.eclipse.osbp.ecview.core.extension.model.extension.ExtensionModelPackage"
-//		registerGenModelFile = "platform:/resource/org.eclipse.osbp.ecview.core.common.model/model/core.genmodel"
-//		registerGenModelFile = "platform:/resource/org.eclipse.osbp.ecview.core.extension.model/model/extension.genmodel"//
-/*
-		 * UiModelPackages 
-		 */
-		registerGeneratedEPackage = "org.eclipse.osbp.ecview.semantic.uisemantics.UiSemanticsPackage"
-		registerGenModelFile =
-		"platform:/resource/org.eclipse.osbp.ecview.uisemantics/model/UISemanticsGrammar.genmodel"
-		registerGeneratedEPackage = "org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage"
-		registerGenModelFile = "platform:/resource/org.eclipse.osbp.ecview.dsl/model/UIGrammarCore.genmodel"//
-//		registerEcoreFile = "platform:/resource/org.eclipse.osbp.ecview.core.common.model/model/binding.ecore"
-//		registerEcoreFile = "platform:/resource/org.eclipse.osbp.ecview.core.common.model/model/core.ecore"
-//		registerEcoreFile = "platform:/resource/org.eclipse.osbp.ecview.core.common.model/model/datatypes.ecore"
-//		registerEcoreFile = "platform:/resource/org.eclipse.osbp.ecview.core.common.model/model/validation.ecore"
-//		registerEcoreFile = "platform:/resource/org.eclipse.osbp.ecview.core.common.model/model/visibility.ecore"
-//		registerEcoreFile = "platform:/resource/org.eclipse.osbp.ecview.core.extension.model/model/extdatatypes.ecore"
-//		registerEcoreFile = "platform:/resource/org.eclipse.osbp.ecview.core.extension.model/model/extension.ecore"
-//		registerEcoreFile = "platform:/resource/org.eclipse.osbp.ecview.uisemantics/model/UISemanticsGrammar.ecore"
-//		registerEcoreFile = "platform:/resource/org.eclipse.osbp.ecview.dsl/model/UIGrammarCore.ecore"
-	}
 
-	component = DirectoryCleaner {
-		directory = "${runtimeProject}/src-gen"
-	}
+	component = XtextGenerator {
+		configuration = {
+			project = StandardProjectConfig {
+				baseName = "org.eclipse.osbp.ecview.dsl"
+				rootPath = rootPath
+				genericIde = {
+					enabled = true
+					name = "org.eclipse.osbp.ecview.dsl.ide"
+				}
+				runtimeTest = {
+					enabled = false
+				}
+				eclipsePlugin = {
+					enabled = true
+				}
+				eclipsePluginTest = {
+					enabled = false
+				}
+				createEclipseMetaData = true
+			}
+			code = {
+				encoding = "UTF-8"
+				lineDelimiter = "\n"
+				fileHeader = fileHeaderText
+			}
+		}
 
-	component = DirectoryCleaner {
-		directory = "${runtimeProject}/model/generated"
-	}
+		language = StandardLanguage {
+			name = "org.eclipse.osbp.ecview.dsl.UIGrammar"
+			fileExtensions = "ui"
 
-	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 {
-		//			forcedResourceSet = theResourceSet
-			uri = grammarURI
-			fragment = ecore.EcoreGeneratorFragment auto-inject {}
-
-			// 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 {
+			referencedResource = "platform:/resource/org.eclipse.osbp.ecview.uisemantics/model/UISemanticsGrammar.ecore"
+			referencedResource = "platform:/resource/org.eclipse.osbp.ecview.uisemantics/model/UISemanticsGrammar.genmodel"
+			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.ecview.dsl/model/UIGrammarCore.ecore"
+			referencedResource = "platform:/resource/org.eclipse.osbp.ecview.dsl/model/UIGrammarCore.genmodel"
+			
+			generateXtendStubs = false
+			
+			serializer = {
 				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
-					classSplitting = true
-//					fieldsPerClass = "80"
-//					methodsPerClass = "80"
-				}
+			validator = {
+			// composedCheck = "org.eclipse.xtext.validation.NamesAreUniqueValidator"
 			}
 
-			// Xtend-based API for validation
-			fragment = validation.ValidatorFragment auto-inject {
-			//    composedCheck = "org.eclipse.xtext.validation.ImportUriValidator"
-			//    composedCheck = "org.eclipse.xtext.validation.NamesAreUniqueValidator"
+			generator = {
+				generateStub = false
+				generateJavaMain = false
+				generateXtendStub = false
 			}
 
-			// 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 {
-				generateStub=true
-				generateXtendStub=false
-			}
-
-			// 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 {
-				options = {
-					classSplitting = true
-//					fieldsPerClass = "80"
-//					methodsPerClass = "80"
-				}
-			}
-
-			// 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 {}
 		}
 	}
 }
-
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/UIGrammar.xtext b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/UIGrammar.xtext
index afcddf2..9192b47 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/UIGrammar.xtext
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/UIGrammar.xtext
@@ -8,7 +8,7 @@
  * Contributors:
  *         Florian Pirchner - Initial implementation
  */
-grammar org.eclipse.osbp.ecview.dsl.UIGrammar with org.eclipse.xtext.xbase.Xbase
+grammar org.eclipse.osbp.ecview.dsl.UIGrammar with org.eclipse.osbp.xtext.oxtype.OXtype
 
 import "http://osbp.eclipse.org/ecview/dsl/uimodel/semantics" as cfg
 import "http://osbp.eclipse.org/ecview/dsl/uimodel/core"
@@ -19,14 +19,11 @@
 
 UiModel returns UiModel:
 	'package' packageName=QualifiedName
-	imports+=UiImports*
+	importSection=XImportSection?
 	roots+=UiRootElements*;
 
-UiImports returns UiImports:
-	'import' importedNamespace=QualifiedNameWithWildcard (';')?;
-
 UiRootElements returns UiRootElements:
-	UiView | UiViewSet | UiValidatorAlias | UiMobileView;
+	UiView  | UiDisplayView | UiViewSet | UiValidatorAlias | UiMobileView;
 
 UiValidatorAlias returns UiValidatorAlias:
 	'validatorAlias' validator=UiValidator 'as' alias=ID (';')?;
@@ -146,6 +143,26 @@
 	(processorAssignments+=UiVisibilityProcessorAssignment))*
 	'}';
 
+UiDisplayView returns UiDisplayView:
+	'display' name=ID
+	'{'
+	'rootType' jvmType=JvmTypeReference
+	((beanSlots+=UiBeanSlot)
+	|
+	(bindingEndpointAlias+=UiBindingEndpointAlias)
+	| 
+	(bindings+=UiBinding))*
+	
+	content=UiEmbeddable ('align' contentAlignment=UiAlignment)?
+	((bindingEndpointAlias+=UiBindingEndpointAlias)
+	|
+	(bindings+=UiBinding)
+	|
+	(validatorAssignments+=UiValidatorAssignment)
+	|
+	(processorAssignments+=UiVisibilityProcessorAssignment))*
+	'}';
+
 UiExposedAction:
 	name=ID ('icon' iconName=STRING)? 'id' (=> actionReference=[cfg::UxAction|QualifiedName] | actionID=STRING)
 	(checkDirty?='checkDirty')? ('externalCommand' externalCommandId=STRING)? (';')?;
@@ -172,7 +189,7 @@
 	'}';
 
 UiI18nInfo:
-	'i18n' key=STRING;
+	'i18n' (noCaption?='noCaption'|key=STRING);
 
 UiGridLayout returns UiGridLayout:
 	{UiGridLayout}
@@ -719,6 +736,7 @@
 	& ('selectionType' selectionType=UiSelectionType (';')?)?
 	& ('imageField' itemImageProperty=[JvmOperation] (';')?)?
 	& (consumeBeanService?='useBeanService' (';')?)?
+	& (scrollToBottom?='scrollToBottom' (';')?)?
 	& (readonly?="readonly")?)
 	columnAssignment=UiColumnsAssignment?
 	sortOrderAssignment=UiSortOrderAssignment?
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/UIGrammarRuntimeModule.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/UIGrammarRuntimeModule.java
index 10be15e..31e4193 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/UIGrammarRuntimeModule.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/UIGrammarRuntimeModule.java
@@ -10,15 +10,35 @@
  */
 package org.eclipse.osbp.ecview.dsl;
 
-import org.eclipse.xtext.generator.IOutputConfigurationProvider;
-import org.eclipse.xtext.scoping.IScopeProvider;
-import org.eclipse.xtext.xbase.scoping.batch.XbaseBatchScopeProvider;
 import org.eclipse.osbp.ecview.dsl.derivedstate.UiModelDerivedStateComputerx;
 import org.eclipse.osbp.ecview.dsl.generator.OutputConfigurationProvider;
+import org.eclipse.osbp.ecview.dsl.imports.ShouldImportProvider;
 import org.eclipse.osbp.ecview.dsl.name.UiQualifiedNameProvider;
+import org.eclipse.osbp.ecview.dsl.parser.UiGrammarParserCustom;
 import org.eclipse.osbp.ecview.dsl.resource.ResourceDescriptionStrategy;
+import org.eclipse.osbp.ecview.dsl.resource.persistence.FilteringResourceStorageFacade;
 import org.eclipse.osbp.ecview.dsl.scope.ScopeProvider;
-import org.eclipse.osbp.ecview.dsl.scope.UiImportedNamespaceAwareLocalScopeProvider;
+import org.eclipse.osbp.ecview.dsl.scope.ScopingInfoProvider;
+import org.eclipse.osbp.ecview.dsl.scope.eobject.UiModelEObjectImportSectionNamespaceScopeProvider;
+import org.eclipse.osbp.ecview.dsl.scope.jvmtype.UiModelJvmTypesImportSectionNamespaceScopeProvider;
+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.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.scoping.jvmtype.OXJvmTypesImportSectionNamespaceScopeProvider;
+import org.eclipse.xtext.findReferences.TargetURICollector;
+import org.eclipse.xtext.generator.IOutputConfigurationProvider;
+import org.eclipse.xtext.linking.ILinkingService;
+import org.eclipse.xtext.parser.IParser;
+import org.eclipse.xtext.resource.persistence.IResourceStorageFacade;
+import org.eclipse.xtext.scoping.IScopeProvider;
+import org.eclipse.xtext.xbase.imports.RewritableImportSection;
+import org.eclipse.xtext.xbase.jvmmodel.JvmModelTargetURICollector;
+import org.eclipse.xtext.xbase.scoping.batch.IBatchScopeProvider;
+import org.eclipse.xtext.xbase.scoping.batch.XbaseBatchScopeProvider;
 
 import com.google.inject.Binder;
 import com.google.inject.name.Names;
@@ -28,8 +48,19 @@
  * Equinox extension registry.
  */
 @SuppressWarnings("restriction")
-public class UIGrammarRuntimeModule extends
-		org.eclipse.osbp.ecview.dsl.AbstractUIGrammarRuntimeModule {
+public class UIGrammarRuntimeModule extends org.eclipse.osbp.ecview.dsl.AbstractUIGrammarRuntimeModule {
+
+	public Class<? extends IParser> bindIParser() {
+		return UiGrammarParserCustom.class;
+	}
+
+	public Class<? extends IResourceStorageFacade> bindResourceStorageFacade() {
+		return FilteringResourceStorageFacade.class;
+	}
+
+	public Class<? extends TargetURICollector> bindTargetURICollector() {
+		return JvmModelTargetURICollector.class;
+	}
 
 	public Class<? extends org.eclipse.xtext.resource.IDerivedStateComputer> bindIDerivedStateComputer() {
 		return UiModelDerivedStateComputerx.class;
@@ -41,6 +72,11 @@
 	}
 
 	@Override
+	public Class<? extends IBatchScopeProvider> bindIBatchScopeProvider() {
+		return ScopeProvider.class;
+	}
+
+	@Override
 	public Class<? extends XbaseBatchScopeProvider> bindXbaseBatchScopeProvider() {
 		return ScopeProvider.class;
 	}
@@ -48,29 +84,56 @@
 	@Override
 	public void configureIScopeProviderDelegate(Binder binder) {
 		binder.bind(IScopeProvider.class)
-				.annotatedWith(
-						Names.named("org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider.delegate"))
-				.to(UiImportedNamespaceAwareLocalScopeProvider.class);
+				.annotatedWith(Names.named("org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider.delegate"))
+				.to(OXDelegatingNamespaceScopeProvider.class);
 	}
 
 	public Class<? extends org.eclipse.xtext.naming.IQualifiedNameProvider> bindIQualifiedNameProvider() {
 		return UiQualifiedNameProvider.class;
 	}
 
-	// contributed by org.eclipse.xtext.generator.formatting.FormatterFragment
 	public Class<? extends org.eclipse.xtext.formatting.IFormatter> bindIFormatter() {
 		return org.eclipse.osbp.ecview.dsl.formatting.UIGrammarFormatter.class;
 	}
-	
+
 	public Class<? extends org.eclipse.xtext.generator.IGenerator> bindIGenerator() {
 		return org.eclipse.osbp.ecview.dsl.generator.Generator.class;
 	}
-	
+
 	public Class<? extends IOutputConfigurationProvider> bindIOutputConfigurationProvider() {
 		return OutputConfigurationProvider.class;
 	}
-	
+
 	public Class<? extends org.eclipse.xtext.resource.IDefaultResourceDescriptionStrategy> bindIDefaultResourceDescriptionStrategy() {
 		return ResourceDescriptionStrategy.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;
+	}
+
+	public Class<? extends IShouldImportProvider> bindIShouldImportProvider() {
+		return ShouldImportProvider.class;
+	}
+
+	public Class<? extends OXJvmTypesImportSectionNamespaceScopeProvider> bindOXJvmTypesImportSectionNamespaceScopeProvider() {
+		return UiModelJvmTypesImportSectionNamespaceScopeProvider.class;
+	}
+
+	public Class<? extends OXEObjectImportSectionNamespaceScopeProvider> bindOXEObjectImportSectionNamespaceScopeProvider() {
+		return UiModelEObjectImportSectionNamespaceScopeProvider.class;
+	}
+
 }
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/derivedstate/UiModelDerivedStateComputerx.xtend b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/derivedstate/UiModelDerivedStateComputerx.xtend
index 7c5ea7a..48df659 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/derivedstate/UiModelDerivedStateComputerx.xtend
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/derivedstate/UiModelDerivedStateComputerx.xtend
@@ -4,17 +4,21 @@
  * 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:
  *         Florian Pirchner - Initial implementation
  */
 package org.eclipse.osbp.ecview.dsl.derivedstate
 
 import com.google.inject.Inject
+import java.util.HashSet
 import java.util.List
 import java.util.Map
+import java.util.Set
 import java.util.Stack
+import org.eclipse.emf.ecore.EClassifier
 import org.eclipse.emf.ecore.EObject
+import org.eclipse.emf.ecore.EPackage
 import org.eclipse.emf.ecore.resource.ResourceSet
 import org.eclipse.osbp.ecview.core.common.model.binding.BindingFactory
 import org.eclipse.osbp.ecview.core.common.model.binding.YBindingUpdateStrategy
@@ -276,7 +280,7 @@
 			uiModel.installDerivedStateFor(resource, preLinkingPhase)
 		}
 	}
-	
+
 	def void installDerivedStateFor(UiModel eObject, DerivedStateAwareResource resource, boolean preLinkingPhase) {
 
 		super.installDerivedState(resource, preLinkingPhase)
@@ -356,7 +360,7 @@
 		yView.name = object.fullyQualifiedName.toString
 		yView.viewName = object.fullyQualifiedName.toString
 		yView.sharedStateGroup = object.sharedStateGroup
-		yView.category = if(object.viewCategory != null) object.viewCategory.name else null
+		yView.category = if(object.viewCategory !== null) object.viewCategory.name else null
 		yView.contentAlignment = object.contentAlignment.toYAlignment
 		object.associateUi(yView)
 		views += yView
@@ -410,7 +414,7 @@
 	}
 
 	def doAutowire(UiLayout embeddable) {
-		autowireHelper.autowire(embeddable, this, currentView.deviceType == YDeviceType.MOBILE)
+		autowireHelper.autowire(embeddable, this, currentView.deviceType === YDeviceType.MOBILE)
 	}
 
 	def dispatch void map(UiMobileView object) {
@@ -521,7 +525,7 @@
 		val newField = element.create
 		layout.addElement(newField)
 
-		if (eObject.alignment != UiAlignment.UNDEFINED) {
+		if (eObject.alignment !== UiAlignment.UNDEFINED) {
 			val style = layout.addGridLayoutCellStyle(newField)
 			style.alignment = eObject.alignment.toYAlignment
 		}
@@ -566,14 +570,14 @@
 
 		layout.addElement(newField)
 
-		if (eObject.alignment != UiAlignment.UNDEFINED) {
+		if (eObject.alignment !== UiAlignment.UNDEFINED) {
 			val style = layout.addCellStyle(newField)
 			style.alignment = eObject.alignment.toYAlignment
 		}
 		element.map
 
 		if (element instanceof UiField) {
-			if (newField != null) {
+			if (newField !== null) {
 				newField.push
 				val UiField yField = element as UiField
 				yField.validators.forEach [
@@ -615,7 +619,7 @@
 		element.map
 
 		if (element instanceof UiField) {
-			if (newField != null) {
+			if (newField !== null) {
 				newField.push
 				val UiField yField = element as UiField
 				yField.validators.forEach [
@@ -655,7 +659,7 @@
 		val element = eObject.element
 		val newField = element.create
 		layout.addElement(newField)
-		if (eObject.alignment != UiAlignment.UNDEFINED) {
+		if (eObject.alignment !== UiAlignment.UNDEFINED) {
 			val style = layout.addCellStyle(newField)
 			style.alignment = eObject.alignment.toYAlignment
 		}
@@ -678,7 +682,7 @@
 
 		eObject.contents.forEach [
 			val newField = it.create
-			if (newField == null) {
+			if (newField === null) {
 				return
 			}
 			yPanel.addElement(newField)
@@ -708,7 +712,7 @@
 
 		eObject.contents.forEach [
 			val newField = it.create
-			if (newField == null) {
+			if (newField === null) {
 				return
 			}
 			yPanel.addElement(newField)
@@ -752,7 +756,7 @@
 		val element = eObject.element
 		val newField = element.create
 
-		if (newField == null) {
+		if (newField === null) {
 			return
 		}
 
@@ -777,7 +781,7 @@
 		val element = eObject.content
 		val newField = element.create
 
-		if (newField == null) {
+		if (newField === null) {
 			return
 		}
 
@@ -785,7 +789,7 @@
 		element.map
 
 		if (element instanceof UiField) {
-			if (newField != null) {
+			if (newField !== null) {
 				newField.push
 				val UiField yField = element as UiField
 				yField.validators.forEach [
@@ -991,7 +995,7 @@
 			it.map
 		]
 
-		if (eObject.bindings != null) {
+		if (eObject.bindings !== null) {
 			eObject.bindings.forEach [
 				it.map
 			]
@@ -1010,7 +1014,7 @@
 		layout.label = eObject.name
 		layout.labelI18nKey = eObject.toI18nKey
 
-		if (eObject.jvmType != null) {
+		if (eObject.jvmType !== null) {
 			layout.typeQualifiedName = eObject.jvmType.qualifiedName
 			layout.type = loadClass(eObject.eResource.resourceSet, eObject.jvmType.qualifiedName)
 		}
@@ -1023,7 +1027,7 @@
 
 		eObject.content?.map
 
-		if (eObject.bindings != null) {
+		if (eObject.bindings !== null) {
 			eObject.bindings.forEach [
 				it.map
 			]
@@ -1047,11 +1051,11 @@
 		dialog.labelI18nKey = eObject.toI18nKey
 
 		val YOpenDialogCommand command = peek
-		if (command != null) {
+		if (command !== null) {
 			command.dialog = dialog
 		}
 
-		if (eObject.jvmType != null) {
+		if (eObject.jvmType !== null) {
 			dialog.typeQualifiedName = eObject.jvmType.qualifiedName
 			dialog.type = loadClass(eObject.eResource.resourceSet, eObject.jvmType.qualifiedName)
 		}
@@ -1085,7 +1089,7 @@
 		// pop content
 		pop
 
-		if (eObject.bindings != null) {
+		if (eObject.bindings !== null) {
 			eObject.bindings.forEach [
 				it.map
 			]
@@ -1124,7 +1128,7 @@
 		val element = eObject.element
 
 		val UiNestedProperty property = element.property
-		if (property != null) {
+		if (property !== null) {
 			val JvmType type = property.typeofLastSegment
 
 			var YField newField = null
@@ -1136,7 +1140,7 @@
 				newField = ExtensionModelFactory.eINSTANCE.createYBooleanSearchField
 			}
 
-			if (newField != null) {
+			if (newField !== null) {
 				layout.elements += newField
 			}
 		}
@@ -1167,7 +1171,7 @@
 		val newField = element.create
 		layout.addElement(newField)
 
-		if (eObject.alignment != UiAlignment.UNDEFINED) {
+		if (eObject.alignment !== UiAlignment.UNDEFINED) {
 			val style = layout.addCellStyle(newField)
 			style.alignment = eObject.alignment.toYAlignment
 		}
@@ -1205,7 +1209,7 @@
 		val YFormLayout layout = peek
 		val element = eObject.element
 		val newField = element.create
-		if (newField == null) {
+		if (newField === null) {
 			return
 		}
 		layout.addElement(newField)
@@ -1231,7 +1235,7 @@
 			it.map
 		]
 
-		if (eObject.bindings != null) {
+		if (eObject.bindings !== null) {
 			eObject.bindings.forEach [
 				it.map
 			]
@@ -1252,7 +1256,7 @@
 			it.map
 		]
 
-		if (eObject.bindings != null) {
+		if (eObject.bindings !== null) {
 			eObject.bindings.forEach [
 				it.map
 			]
@@ -1269,19 +1273,19 @@
 		val YTable yField = eObject.associatedUi
 		yField.push
 
-		if (eObject.columnAssignment != null) {
+		if (eObject.columnAssignment !== null) {
 			eObject.columnAssignment.columns.forEach [
 				it.map
 			]
 		}
 
-		if (eObject.sortOrderAssignment != null) {
+		if (eObject.sortOrderAssignment !== null) {
 			eObject.sortOrderAssignment.columns.forEach [
 				it.map
 			]
 		}
 
-		if (eObject.bindings != null) {
+		if (eObject.bindings !== null) {
 			eObject.bindings.forEach [
 				it.map
 			]
@@ -1298,7 +1302,7 @@
 		val YImage yField = eObject.associatedUi
 		yField.push
 
-		if (eObject.bindings != null) {
+		if (eObject.bindings !== null) {
 			eObject.bindings.forEach [
 				it.map
 			]
@@ -1311,7 +1315,7 @@
 		val YField yField = eObject.associatedUi
 		yField.push
 
-		if (eObject.bindings != null) {
+		if (eObject.bindings !== null) {
 			eObject.bindings.forEach [
 				it.map
 			]
@@ -1325,8 +1329,6 @@
 	}
 
 	def dispatch void map(UiButton object) {
-		val YButton yField = object.associatedUi
-
 		object.bindings.forEach [
 			it.map
 		]
@@ -1338,8 +1340,6 @@
 	}
 
 	def dispatch void map(UiMobileNavBarAction object) {
-		val VMNavigationBarButton yField = object.associatedUi
-
 		object.bindings.forEach [
 			it.map
 		]
@@ -1347,18 +1347,17 @@
 		object.processorAssignments.forEach [
 			it.map
 		]
-
 	}
 
 	def dispatch void map(UiMobileNavigationButton object) {
 		val VMNavigationButton button = object.associatedUi
 
 		button.push
-		if (object.targetPage != null) {
+		if (object.targetPage !== null) {
 			val page = object.targetPage.create as VMNavigationPage
 			button.page = page
 			object.targetPage.map
-		} else if (object.targetPageAlias != null) {
+		} else if (object.targetPageAlias !== null) {
 			object.targetPageAlias.map
 		}
 
@@ -1385,16 +1384,17 @@
 		yColumn.icon = eObject.iconName
 
 		val UiNestedProperty property = eObject.property
-		if (property != null) {
+		if (property !== null) {
 			yColumn.propertyPath = property.toPathString
 		}
 
 		yColumn.orderable = eObject.orderable
 		yColumn.visible = eObject.visible
 		yColumn.labelI18nKey = eObject.toI18nKey
-		if (yColumn.icon == null || yColumn.icon.equals("")) {
-			yColumn.icon = eObject.toI18nKey + ".image"
-		}
+		// removed for while
+//		if (yColumn.icon === null || yColumn.icon.equals("")) {
+//			yColumn.icon = eObject.toI18nKey + ".image"
+//		}
 
 		yField.columns += yColumn
 	}
@@ -1407,7 +1407,7 @@
 		yColumn.asc = eObject.asc
 
 		val UiNestedProperty property = eObject.property
-		if (property != null) {
+		if (property !== null) {
 			yColumn.propertyPath = property.toPathString
 		}
 
@@ -1499,9 +1499,9 @@
 		val YField yField = eObject.field.associatedUi
 		yField.push
 
-		if (eObject.validatorAlias != null) {
+		if (eObject.validatorAlias !== null) {
 			eObject.validatorAlias.map
-		} else if (eObject.validatorDef != null) {
+		} else if (eObject.validatorDef !== null) {
 			eObject.validatorDef.map
 		}
 		pop
@@ -1509,7 +1509,7 @@
 
 	def dispatch void map(UiExposedAction object) {
 		val YExposedAction yAction = CoreModelFactory.eINSTANCE.createYExposedAction
-		if (object.actionReference != null) {
+		if (object.actionReference !== null) {
 			yAction.id = object.actionReference.name
 			yAction.externalCommandId = object.actionReference.externalCommandId
 			yAction.initialEnabled = !object.actionReference.initialDisabled
@@ -1520,11 +1520,11 @@
 		yAction.label = object.name
 		yAction.labelI18nKey = object.toI18nKey
 		yAction.icon = object.iconName
-		if (yAction.icon == null || yAction.icon.equals("")) {
+		if (yAction.icon === null || yAction.icon.equals("")) {
 			yAction.icon = object.toI18nKey + ".image"
 		}
 		yAction.checkDirty = object.checkDirty
-		if (object.externalCommandId != null) {
+		if (object.externalCommandId !== null) {
 			yAction.externalCommandId = object.externalCommandId
 		}
 
@@ -1542,11 +1542,11 @@
 	}
 
 	def dispatch void map(UiValidatorAlias eObject) {
-		if (viewContext.length == 0) {
+		if (viewContext.length === 0) {
 			return
 		}
 
-	//		eObject.validator.map
+	// eObject.validator.map
 	}
 
 	def dispatch void map(UiVisibilityProcessorAssignment eObject) {
@@ -1602,7 +1602,7 @@
 		eObject.associateUi(newValidator)
 
 		val YField yField = peek
-		if (yField != null) {
+		if (yField !== null) {
 			yField.validators += newValidator
 		}
 	}
@@ -1616,7 +1616,7 @@
 		eObject.associateUi(newValidator)
 
 		val YField yField = peek
-		if (yField != null) {
+		if (yField !== null) {
 			yField.validators += newValidator
 		}
 	}
@@ -1628,7 +1628,7 @@
 		eObject.associateUi(newValidator)
 
 		val YField yField = peek
-		if (yField != null) {
+		if (yField !== null) {
 			yField.validators += newValidator
 		}
 	}
@@ -1642,7 +1642,7 @@
 		eObject.associateUi(newValidator)
 
 		val YField yField = peek
-		if (yField != null) {
+		if (yField !== null) {
 			yField.validators += newValidator
 		}
 	}
@@ -1653,7 +1653,7 @@
 		val JvmGenericType jvmType = if(jvmTypes.size > 0) eObject.getJvmElements.get(0) as JvmGenericType
 
 		val YField yField = peek
-		if (jvmType != null && yField != null) {
+		if (jvmType !== null && yField !== null) {
 			val YClassDelegateValidator yValidator = factory.createClassDelegateValidator
 			eObject.associateUi(yValidator)
 			yValidator.className = jvmType.qualifiedName
@@ -1714,12 +1714,12 @@
 		textField.useSuggestions = true
 		textField.autoHidePopup = object.autoHidePopup
 
-		if (object.jvmType != null) {
+		if (object.jvmType !== null) {
 			textField.typeQualifiedName = object.jvmType.qualifiedName
 			textField.type = loadClass(object.eResource.resourceSet, object.jvmType.qualifiedName)
 		}
 
-		if (object.itemCaptionProperty != null) {
+		if (object.itemCaptionProperty !== null) {
 			textField.itemCaptionProperty = OperationExtensions.toPropertyName(object.itemCaptionProperty?.simpleName)
 		} else {
 			textField.itemCaptionProperty = BeanHelper.findCaptionProperty(textField.type)
@@ -1740,30 +1740,30 @@
 		field.useBeanService = object.consumeBeanService
 		field.labelI18nKey = object.toI18nKey
 
-		if (object.jvmType != null) {
+		if (object.jvmType !== null) {
 			field.typeQualifiedName = object.jvmType.qualifiedName
 			field.type = loadClass(object.eResource.resourceSet, object.jvmType.qualifiedName)
 		}
 
 		val UiNestedProperty captionProperty = object.captionProperty
-		if (captionProperty != null) {
+		if (captionProperty !== null) {
 			field.captionPropertyPath = captionProperty.toPathString
 		} else {
 			field.captionPropertyPath = BeanHelper.findCaptionProperty(field.type)
 		}
 
 		val UiNestedProperty imageProperty = object.imageProperty
-		if (imageProperty != null) {
+		if (imageProperty !== null) {
 			field.imagePropertyPath = imageProperty.toPathString
 		}
 
-		if (object.inMemoryBeanProvider != null) {
+		if (object.inMemoryBeanProvider !== null) {
 			field.inMemoryBeanProviderQualifiedName = object.inMemoryBeanProvider.qualifiedName
 			field.inMemoryBeanProvider = loadClass(object.eResource.resourceSet,
 				object.inMemoryBeanProvider.qualifiedName)
 		}
 
-		if (object.referenceSourceJvmType != null) {
+		if (object.referenceSourceJvmType !== null) {
 			field.referenceSourceTypeQualifiedName = object.referenceSourceJvmType.qualifiedName
 			field.referenceSourceType = loadClass(object.eResource.resourceSet,
 				object.referenceSourceJvmType.qualifiedName)
@@ -1851,7 +1851,7 @@
 			optionsGroup.initialEnabled = !object.readonly
 			optionsGroup.cssClass = object.styles
 
-			if (object.jvmType != null) {
+			if (object.jvmType !== null) {
 				optionsGroup.typeQualifiedName = object.jvmType.qualifiedName
 				optionsGroup.type = loadClass(object.eResource.resourceSet, object.jvmType.qualifiedName)
 			}
@@ -1869,12 +1869,13 @@
 			optionsGroup.selectionType = object.selectionType.convert
 			optionsGroup.initialEnabled = !object.readonly
 
-			if (object.jvmType != null) {
+			if (object.jvmType !== null) {
 				optionsGroup.typeQualifiedName = object.jvmType.qualifiedName
 				optionsGroup.type = loadClass(object.eResource.resourceSet, object.jvmType.qualifiedName)
 			}
-			if (object.itemCaptionProperty != null) {
-				optionsGroup.captionProperty = OperationExtensions.toPropertyName(object.itemCaptionProperty?.simpleName)
+			if (object.itemCaptionProperty !== null) {
+				optionsGroup.captionProperty = OperationExtensions.toPropertyName(
+					object.itemCaptionProperty?.simpleName)
 			} else {
 				optionsGroup.captionProperty = BeanHelper.findCaptionProperty(optionsGroup.type)
 			}
@@ -1898,7 +1899,7 @@
 			list.initialEnabled = !object.readonly
 			list.cssClass = object.styles
 
-			if (object.jvmType != null) {
+			if (object.jvmType !== null) {
 				list.typeQualifiedName = object.jvmType.qualifiedName
 				list.type = loadClass(object.eResource.resourceSet, object.jvmType.qualifiedName)
 			}
@@ -1916,11 +1917,11 @@
 			list.selectionType = object.selectionType.convert
 			list.initialEnabled = !object.readonly
 
-			if (object.jvmType != null) {
+			if (object.jvmType !== null) {
 				list.typeQualifiedName = object.jvmType.qualifiedName
 				list.type = loadClass(object.eResource.resourceSet, object.jvmType.qualifiedName)
 			}
-			if (object.itemCaptionProperty != null) {
+			if (object.itemCaptionProperty !== null) {
 				list.captionProperty = OperationExtensions.toPropertyName(object.itemCaptionProperty?.simpleName)
 			} else {
 				list.captionProperty = BeanHelper.findCaptionProperty(list.type)
@@ -2001,10 +2002,11 @@
 		table.selectionType = object.selectionType.convert
 		table.initialEnabled = !object.readonly
 		table.cssClass = object.styles
+		table.scrollToBottom = object.scrollToBottom
 
 		table.itemImageProperty = OperationExtensions.toPropertyName(object.itemImageProperty?.simpleName)
 
-		if (object.jvmType != null) {
+		if (object.jvmType !== null) {
 			table.typeQualifiedName = object.jvmType.qualifiedName
 			table.type = loadClass(object.eResource.resourceSet, object.jvmType.qualifiedName)
 		}
@@ -2016,9 +2018,9 @@
 
 	def dispatch YField create(UiSearchField eObject) {
 		val UiNestedProperty property = eObject.property
-		if (property != null) {
+		if (property !== null) {
 			val JvmType type = property.typeofLastSegment
-			if (type == null) {
+			if (type === null) {
 				return null
 			}
 
@@ -2045,7 +2047,7 @@
 				newField = temp
 			}
 
-			if (newField != null) {
+			if (newField !== null) {
 				newField.id = UiModelGrammarUtil.getPathId(eObject)
 				newField.labelI18nKey = eObject.toI18nKey
 				newField.initialEnabled = !eObject.readonly
@@ -2108,6 +2110,7 @@
 		field.label = object.name
 		field.labelI18nKey = object.toI18nKey
 		field.initialEnabled = !object.readonly
+		field.cssClass = object.styles
 
 		object.associateUi(field)
 
@@ -2121,6 +2124,7 @@
 		field.label = object.name
 		field.labelI18nKey = object.toI18nKey
 		field.initialEnabled = !object.readonly
+		field.cssClass = object.styles
 
 		object.associateUi(field)
 
@@ -2167,7 +2171,7 @@
 			field.initialEnabled = !object.readonly
 			field.cssClass = object.styles
 
-			if (object.jvmType != null) {
+			if (object.jvmType !== null) {
 				field.typeQualifiedName = object.jvmType.qualifiedName
 				field.type = loadClass(object.eResource.resourceSet, object.jvmType.qualifiedName)
 			}
@@ -2184,12 +2188,12 @@
 			field.labelI18nKey = object.toI18nKey
 			field.initialEnabled = !object.readonly
 
-			if (object.jvmType != null) {
+			if (object.jvmType !== null) {
 				field.typeQualifiedName = object.jvmType.qualifiedName
 				field.type = loadClass(object.eResource.resourceSet, object.jvmType.qualifiedName)
 			}
 
-			if (object.itemCaptionProperty != null) {
+			if (object.itemCaptionProperty !== null) {
 				field.captionProperty = OperationExtensions.toPropertyName(object.itemCaptionProperty?.simpleName)
 			} else {
 				field.captionProperty = BeanHelper.findCaptionProperty(field.type)
@@ -2402,13 +2406,13 @@
 			layout.addElement(embeddable as YEmbeddable)
 		} else if (context instanceof YView) {
 			val YView yView = context as YView
-			yView.content = embeddable  as YEmbeddable
+			yView.content = embeddable as YEmbeddable
 		} else if (context instanceof YTab) {
 			val YTab yTab = context as YTab
-			yTab.embeddable = embeddable  as YEmbeddable
+			yTab.embeddable = embeddable as YEmbeddable
 		} else if (context instanceof VMTab) {
 			val VMTab yTab = context as VMTab
-			yTab.embeddable = embeddable  as YEmbeddable
+			yTab.embeddable = embeddable as YEmbeddable
 		} else if (context instanceof VMNavigationButton) {
 			val VMNavigationButton yButton = context as VMNavigationButton
 			yButton.page = embeddable as VMNavigationPage
@@ -2444,12 +2448,12 @@
 		val target = object.target
 
 		var UiBindingEndpointAssignment sourceEndpoint = source as UiBindingEndpointAssignment
-		if (sourceAlias != null) {
+		if (sourceAlias !== null) {
 			sourceEndpoint = sourceAlias.endpoint as UiBindingEndpointAssignment
 		}
-		var UiBindingEndpointAssignment targetEndpoint = target  as UiBindingEndpointAssignment
-		if (targetAlias != null) {
-			targetEndpoint = targetAlias.endpoint  as UiBindingEndpointAssignment
+		var UiBindingEndpointAssignment targetEndpoint = target as UiBindingEndpointAssignment
+		if (targetAlias !== null) {
+			targetEndpoint = targetAlias.endpoint as UiBindingEndpointAssignment
 		}
 
 		if (!object.listBinding) {
@@ -2508,23 +2512,23 @@
 			field = associatedUi(targetInfo.bindingRoot) as YField;
 		}
 
-		if (field != null) {
-			if (sourceInfo.deepestJvmField != null) {
+		if (field !== null) {
+			if (sourceInfo.deepestJvmField !== null) {
 				val jvmField = sourceInfo.deepestJvmField
-				if (jvmField != null) {
+				if (jvmField !== null) {
 					type = jvmField.declaringType
 					property = OperationExtensions.toPropertyName(jvmField.simpleName)
 				}
-			} else if (targetInfo.deepestJvmField != null) {
+			} else if (targetInfo.deepestJvmField !== null) {
 				val jvmField = sourceInfo.deepestJvmField
-				if (jvmField != null) {
+				if (jvmField !== null) {
 					type = jvmField.declaringType
 					property = OperationExtensions.toPropertyName(jvmField.simpleName)
 				}
 			}
 		}
 
-		if (type != null && property != null && field != null) {
+		if (type !== null && property !== null && field !== null) {
 			for (yValidator : field.validators) {
 				yValidator.type = loadClass(sourceAssignment.eResource.resourceSet, type.qualifiedName)
 
@@ -2538,7 +2542,7 @@
 	}
 
 	def YValueBindingEndpoint createValueBindingEndpoint(UiBindingEndpointAssignment epDef) {
-		if (epDef == null) {
+		if (epDef === null) {
 			return null
 		}
 		var YValueBindingEndpoint result = null;
@@ -2552,7 +2556,7 @@
 			val YBeanSlotValueBindingEndpoint ep = factory.createBeanSlotValueBindingEndpoint
 			ep.beanSlot = yBeanSlot
 			ep.attributePath = info.path.toString
-			if (ep.attributePath == null || ep.attributePath.equals("")) {
+			if (ep.attributePath === null || ep.attributePath.equals("")) {
 
 				// bind the value in the slot
 				ep.attributePath = "value"
@@ -2563,12 +2567,13 @@
 			val YECViewModelValueBindingEndpoint ep = factory.createECViewModelValueBindingEndpoint
 			ep.element = yElement
 			ep.propertyPath = info.path.toString
-			if (info.typeForBinding != null) {
+			if (info.typeForBinding !== null) {
 				ep.typeQualifiedName = info.typeForBinding.qualifiedName
 				ep.type = loadClass(epDef.eResource.resourceSet, ep.typeQualifiedName)
 			}
-			if (ep.type != null && ep.type.isAssignableFrom(typeof(EObject))) {
-				ep.emfNsURI = yElement.eClass.EPackage.nsURI
+			if (ep.type !== null && typeof(EObject).isAssignableFrom(ep.type)) {
+				val classifier = findEClassifierFor(epDef.eResource.resourceSet, ep.type.simpleName)
+				ep.emfNsURI = if(classifier !== null) classifier.EPackage.nsURI else null
 			}
 
 			// calculate default I18nKey
@@ -2635,7 +2640,7 @@
 
 			pendingMappings += [
 				yCommand.table = command.table.associatedUi
-			]
+			] as Runnable
 
 			result = yCommand.createTriggerEndpoint
 		} else if (info.bindingRoot instanceof UiRemoveFromTableCommand) {
@@ -2647,7 +2652,7 @@
 
 			pendingMappings += [
 				yCommand.table = command.table.associatedUi
-			]
+			] as Runnable
 
 			result = yCommand.createTriggerEndpoint
 		} else if (info.bindingRoot instanceof UiSendEventCommand) {
@@ -2671,7 +2676,7 @@
 			val targetEP = command.target as UiBindingEndpointAssignment
 
 			yCommand.target = targetEP.createValueBindingEndpoint
-			if (command.jvmType != null) {
+			if (command.jvmType !== null) {
 
 				yCommand.typeQualifiedName = command.jvmType.qualifiedName
 				yCommand.type = loadClass(command.eResource.resourceSet, command.jvmType.qualifiedName)
@@ -2679,18 +2684,18 @@
 				val BindingInfoHelper.BindingInfo targetInfo = new BindingInfoHelper.BindingInfo
 				bindingInfoHelper.collectBindingInfo(targetEP, targetInfo);
 
-				if (targetInfo.typeOfBoundProperty != null) {
+				if (targetInfo.typeOfBoundProperty !== null) {
 
 					// if there is a property path
 					yCommand.typeQualifiedName = targetInfo.typeOfBoundProperty.qualifiedName
 					yCommand.type = loadClass(epDef.eResource.resourceSet, yCommand.typeQualifiedName)
-				} else if (targetInfo.typeForBinding != null) {
+				} else if (targetInfo.typeForBinding !== null) {
 
 					// use the root object
 					yCommand.typeQualifiedName = targetInfo.typeForBinding.qualifiedName
 					yCommand.type = loadClass(epDef.eResource.resourceSet, yCommand.typeQualifiedName)
 				}
-				if (yCommand.type != null && yCommand.type.isAssignableFrom(typeof(EObject))) {
+				if (yCommand.type !== null && yCommand.type.isAssignableFrom(typeof(EObject))) {
 					// TODO later for EObjects
 				}
 			}
@@ -2701,9 +2706,34 @@
 		return result
 	}
 
+	/**
+	 * Attention: If EClasses not named uniquely, this method may return the wrong.<br>
+	 * The nsURI from the classifier is required for databinding to find the proper EClass and EFeature for ep.type.
+	 */
+	def findEClassifierFor(ResourceSet resourceSet, String eClassName) {
+		val Set<EClassifier> matches = newHashSet()
+		for (String nsUri : new HashSet(EPackage.Registry.INSTANCE.keySet())) {
+			try {
+				val pkg = EPackage.Registry.INSTANCE.getEPackage(nsUri)
+				val classifier = pkg.getEClassifier(eClassName)
+				if (classifier !== null) {
+					matches += classifier
+				}
+			} catch (Exception ex) {
+				// nothing to do - smooks throws exception if no classifier found	
+			}
+		}
+		if (matches.empty) {
+			LOGGER.error("Could not find classifier for name %s", eClassName)
+		} else if (matches.size > 1) {
+			LOGGER.error("Found %s classifiers for name %s", Integer.toString(matches.size), eClassName)
+		}
+		return if(matches.isEmpty) return null else matches.iterator.next
+	}
+
 	def UiMobileNavigationHandler findNavHandler(UiBindingEndpointAssignment assignment) {
 		var EObject temp = assignment;
-		while (temp.eContainer != null) {
+		while (temp.eContainer !== null) {
 			temp = temp.eContainer
 			if (temp instanceof UiMobileNavigationHandler) {
 				return temp as UiMobileNavigationHandler
@@ -2713,7 +2743,7 @@
 	}
 
 	def YListBindingEndpoint createListBindingEndpoint(UiBindingEndpointAssignment epDef) {
-		if (epDef == null) {
+		if (epDef === null) {
 			return null
 		}
 
@@ -2734,11 +2764,11 @@
 			val YECViewModelListBindingEndpoint ep = factory.createECViewModelListBindingEndpoint
 			ep.element = yElement
 			ep.propertyPath = info.path.toString
-			if (info.typeForBinding != null) {
+			if (info.typeForBinding !== null) {
 				ep.typeQualifiedName = info.typeForBinding.qualifiedName
 				ep.type = loadClass(epDef.eResource.resourceSet, ep.typeQualifiedName)
 			}
-			if (yElement != null) {
+			if (yElement !== null) {
 				ep.emfNsURI = yElement.eClass.EPackage.nsURI
 			}
 			result = ep
@@ -2751,7 +2781,7 @@
 		val temp = alias.endpoint;
 		if (temp instanceof UiBindingEndpointAssignment) {
 			val UiBindingEndpointAssignment assign = temp as UiBindingEndpointAssignment
-			if (assign.typedBindableAlias != null && assign.typedBindableAlias instanceof UiBindingEndpointAlias) {
+			if (assign.typedBindableAlias !== null && assign.typedBindableAlias instanceof UiBindingEndpointAlias) {
 				resolve(assign.typedBindableAlias as UiBindingEndpointAlias)
 			}
 		}
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/extensions/BindableTypeProvider.xtend b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/extensions/BindableTypeProvider.xtend
index 1c3f0f4..594e865 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/extensions/BindableTypeProvider.xtend
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/extensions/BindableTypeProvider.xtend
@@ -40,14 +40,14 @@
 	}
 
 	def JvmTypeReference getTypeReference(EObject expression, boolean includeParent) {
-		if (expression == null) {
+		if (expression === null) {
 			TypesFactory.eINSTANCE.createJvmUnknownTypeReference
 		}
 
 		var result = expression.doGetTypeReference
-		if ((result == null || result instanceof JvmUnknownTypeReference) && includeParent) {
+		if ((result === null || result instanceof JvmUnknownTypeReference) && includeParent) {
 			var temp = expression
-			while ((result == null || result instanceof JvmUnknownTypeReference) && temp.eContainer != null) {
+			while ((result === null || result instanceof JvmUnknownTypeReference) && temp.eContainer !== null) {
 				temp = temp.eContainer
 				result = temp.doGetTypeReference
 			}
@@ -57,7 +57,7 @@
 	}
 
 	def JvmType getType(EObject expression) {
-		return if(expression != null && expression.getTypeReference != null) expression.getTypeReference.type
+		return if(expression !== null && expression.getTypeReference !== null) expression.getTypeReference.type
 	}
 
 	def dispatch JvmTypeReference doGetTypeReference(UiBeanSlot beanSlot) {
@@ -67,10 +67,10 @@
 	def dispatch JvmTypeReference doGetTypeReference(UiBindingEndpointAlias alias) {
 		val UiBindingEndpointAssignment aliasEP = alias.getEndpoint() as UiBindingEndpointAssignment;
 		
-		if(aliasEP.path != null){
+		if(aliasEP.path !== null){
 			return aliasEP.getPath().getTypeReferenceOfLastSegment()	
 		}else{
-			if(aliasEP.typedBindableDef != null){
+			if(aliasEP.typedBindableDef !== null){
 				return aliasEP.typedBindableDef.doGetTypeReference
 			}else{
 				return aliasEP.typedBindableAlias.doGetTypeReference
@@ -79,9 +79,9 @@
 	}
 
 	def dispatch JvmTypeReference doGetTypeReference(UiBindingEndpointAssignment epDef) {
-		if (epDef.typedBindableAlias != null) {
+		if (epDef.typedBindableAlias !== null) {
 				return epDef.typedBindableAlias.doGetTypeReference
-		} else if (epDef.typedBindableDef != null) {
+		} else if (epDef.typedBindableDef !== null) {
 			return epDef.typedBindableDef.doGetTypeReference
 		}
 	}
@@ -95,7 +95,7 @@
 		val UiBinding binding = assignment.eContainer() as UiBinding
 
 		// epDef is source bindable
-		if (binding.source == assignment) {
+		if (binding.source === assignment) {
 			val UiBindingExpression targetDef = binding.target
 			return targetDef.getTypeReference(true)
 		} else {
@@ -105,15 +105,15 @@
 	}
 
 	def dispatch JvmTypeReference doGetTypeReference(UiTypedBindableDef tbDef) {
-		if (tbDef == null || tbDef.method == null) {
+		if (tbDef === null || tbDef.method === null) {
 			return TypesFactory.eINSTANCE.createJvmUnknownTypeReference
 		}
 		var type = tbDef.method.jvmType
-		if (type == null) {
+		if (type === null) {
 			return null
 		}
 		val fqn = type.qualifiedName
-		if (fqn != null && fqn.equals(typeof(Object).name)) {
+		if (fqn !== null && fqn.equals(typeof(Object).name)) {
 			val rawBindable = tbDef.rawBindableOfLastSegment
 			if (rawBindable instanceof UiTypeProvider) {
 				type = rawBindable.doGetTypeReference
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/extensions/BindableTypeResolver.xtend b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/extensions/BindableTypeResolver.xtend
index 29c5cbd..c66fdbb 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/extensions/BindableTypeResolver.xtend
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/extensions/BindableTypeResolver.xtend
@@ -40,14 +40,14 @@
 	}
 
 	def JvmTypeReference resolveTypeReference(EObject expression, boolean includeParent) {
-		if (expression == null) {
+		if (expression === null) {
 			TypesFactory.eINSTANCE.createJvmUnknownTypeReference
 		}
 
 		var result = expression.doResolveTypeReference
-		if ((result == null || result instanceof JvmUnknownTypeReference) && includeParent) {
+		if ((result === null || result instanceof JvmUnknownTypeReference) && includeParent) {
 			var temp = expression
-			while ((result == null || result instanceof JvmUnknownTypeReference) && temp.eContainer != null) {
+			while ((result === null || result instanceof JvmUnknownTypeReference) && temp.eContainer !== null) {
 				temp = temp.eContainer
 				result = temp.doResolveTypeReference
 			}
@@ -57,7 +57,7 @@
 	}
 
 	def JvmType resolveType(EObject expression) {
-		return if(expression != null) expression.resolveTypeReference?.type
+		return if(expression !== null) expression.resolveTypeReference?.type
 	}
 
 	def dispatch JvmTypeReference doResolveTypeReference(UiBeanSlot beanSlot) {
@@ -66,7 +66,7 @@
 
 	def dispatch JvmTypeReference doResolveTypeReference(UiBindingEndpointAlias alias) {
 		val UiBindingEndpointAssignment aliasEP = alias.getEndpoint() as UiBindingEndpointAssignment;
-		if (aliasEP.getPath() != null) {
+		if (aliasEP.getPath() !== null) {
 			return aliasEP.getPath().typeReferenceOfLastSegment;
 		} else {
 			return aliasEP.doResolveTypeReference
@@ -74,12 +74,12 @@
 	}
 
 	def dispatch JvmTypeReference doResolveTypeReference(UiBindingEndpointAssignment epDef) {
-		if (epDef.path != null) {
+		if (epDef.path !== null) {
 			return epDef.path.doResolveTypeReference
 		}
-		if (epDef.typedBindableAlias != null) {
+		if (epDef.typedBindableAlias !== null) {
 			return epDef.typedBindableAlias.doResolveTypeReference
-		} else if (epDef.typedBindableDef != null) {
+		} else if (epDef.typedBindableDef !== null) {
 			return epDef.typedBindableDef.doResolveTypeReference
 		}
 	}
@@ -93,7 +93,7 @@
 		val UiBinding binding = assignment.eContainer() as UiBinding
 
 		// epDef is source bindable
-		if (binding.source == assignment) {
+		if (binding.source === assignment) {
 			val UiBindingExpression targetDef = binding.target
 			return targetDef.resolveTypeReference(true)
 		} else {
@@ -103,15 +103,15 @@
 	}
 
 	def dispatch JvmTypeReference doResolveTypeReference(UiTypedBindableDef tbDef) {
-		if (tbDef == null || tbDef.method == null) {
+		if (tbDef === null || tbDef.method === null) {
 			return TypesFactory.eINSTANCE.createJvmUnknownTypeReference
 		}
 		var type = tbDef.method.jvmType
-		if (type == null) {
+		if (type === null) {
 			return null
 		}
 		val fqn = type.qualifiedName
-		if (fqn != null && fqn.equals(typeof(Object).name)) {
+		if (fqn !== null && fqn.equals(typeof(Object).name)) {
 			val rawBindable = tbDef.rawBindableOfLastSegment
 			if (rawBindable instanceof UiTypeProvider) {
 				type = rawBindable.doResolveTypeReference
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/extensions/BindingInfoHelper.xtend b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/extensions/BindingInfoHelper.xtend
index 9d884a1..9f2186b 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/extensions/BindingInfoHelper.xtend
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/extensions/BindingInfoHelper.xtend
@@ -25,6 +25,8 @@
 import org.eclipse.osbp.ecview.semantic.uimodel.UiEmbeddable
 import org.eclipse.osbp.ecview.semantic.uimodel.UiModel
 import org.eclipse.osbp.ecview.semantic.uimodel.UiTypedBindableDef
+import org.eclipse.xtext.common.types.JvmDeclaredType
+import java.util.Collection
 
 class BindingInfoHelper {
 
@@ -32,21 +34,21 @@
 	BindableTypeProvider typeOfBoundPropertyProvider;
 
 	def dispatch void collectBindingInfo(UiBindingEndpointAssignment assignment, BindingInfo info) {
-		var result = if(info != null) info else new BindingInfo
-		if (assignment.typedBindableAlias != null) {
+		var result = if(info !== null) info else new BindingInfo
+		if (assignment.typedBindableAlias !== null) {
 			assignment.typedBindableAlias.collectBindingInfo(result)
 		} else {
 			assignment.typedBindableDef.collectBindingInfo(result)
 		}
 
 		// on the way back up the structure, collect the path
-		if (assignment.path != null) {
+		if (assignment.path !== null) {
 			info.appendPath(assignment.path.toPathString)
 			info.typeOfBoundProperty = assignment.path.typeofLastSegment
 			info.deepestJvmField = assignment.path.operationofLastSegment
 
 			val pathType = assignment.path.typeofSecondLastSegment
-			if (info.typeForBinding == null && pathType != null) {
+			if (info.typeForBinding === null && pathType !== null) {
 				info.typeForBinding = pathType
 			}
 		}
@@ -67,7 +69,7 @@
 		info.typeForBinding = typeOfBoundPropertyProvider.getType(definition)
 		info.bindingRoot = definition.rawBindableOfLastSegment
 		val bindingMethod = definition.method
-		if (bindingMethod != null) {
+		if (bindingMethod !== null) {
 			if (!bindingMethod.targetName.nullOrEmpty) {
 				info.appendPath(bindingMethod.targetName)
 			} else {
@@ -96,9 +98,9 @@
 		val uiModel = embeddable.uiModel
 		for (EObject object : EcoreUtil.getAllContents(uiModel, true).toIterable) {
 			if (object instanceof UiTypedBindableDef) {
-				if (object.rawBindable == embeddable) {
+				if (object.rawBindable === embeddable) {
 					val UiBinding found = findBinding(object as UiTypedBindableDef)
-					if (found != null) {
+					if (found !== null) {
 						result += found
 					}
 				}
@@ -114,7 +116,7 @@
 	 */
 	def UiBinding findBinding(UiTypedBindableDef bindableDef) {
 		var parent = bindableDef.eContainer
-		while (parent != null) {
+		while (parent !== null) {
 			if (parent instanceof UiBinding) {
 				return parent
 			} else {
@@ -139,11 +141,11 @@
 		val uiModel = embeddable.uiModel
 		for (EObject object : EcoreUtil.getAllContents(uiModel, true).toIterable) {
 			if (object instanceof UiTypedBindableDef) {
-				if (propertyName == null || object.method != null && object.method.name != null && object.method.name.equals(propertyName)) {
-					if (object.rawBindable == embeddable || object.rawBindableOfLastSegment == embeddable) {
+				if (propertyName === null || object.method !== null && object.method.name !== null && object.method.name.equals(propertyName)) {
+					if (object.rawBindable === embeddable || object.rawBindableOfLastSegment === embeddable) {
 						val UiBindingEndpointAssignment found = findOppositeEndpointAssignment(
 							object as UiTypedBindableDef)
-						if (found != null) {
+						if (found !== null) {
 							result += found
 						}
 					}
@@ -183,11 +185,11 @@
 	def UiBindingEndpointAssignment findOppositeEndpointAssignment(UiTypedBindableDef bindableDef) {
 		var EObject child = bindableDef
 		var parent = bindableDef.eContainer
-		while (parent != null) {
+		while (parent !== null) {
 			if (parent instanceof UiBinding) {
-				if (parent.source == child) {
+				if (parent.source === child) {
 					return parent.target as UiBindingEndpointAssignment
-				} else if (parent.target == child) {
+				} else if (parent.target === child) {
 					return parent.source as UiBindingEndpointAssignment
 				}
 			} else {
@@ -206,7 +208,7 @@
 	 * @return the package name of the eObject.
 	 */
 	def String getPackage(EObject eObject) {
-		if (eObject == null) {
+		if (eObject === null) {
 			return "";
 		}
 		if (eObject instanceof UiModel) {
@@ -223,7 +225,7 @@
 	 * @return the UiModel of the eObject.
 	 */
 	def UiModel getUiModel(EObject eObject) {
-		if (eObject == null) {
+		if (eObject === null) {
 			return null;
 		}
 		if (eObject instanceof UiModel) {
@@ -310,6 +312,17 @@
 
 		def StringBuilder getPath() {
 			return path
+		} 
+		
+		def boolean isNested() {
+			return path.toString.contains(".")
+		}
+		
+		def boolean isCollection() {
+			if(typeForBinding instanceof JvmDeclaredType) {
+				return typeForBinding.extendedInterfaces.exists[it.qualifiedName.equals(Collection.canonicalName)]
+			}
+			return false
 		}
 	}
 }
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/extensions/I18nKeyProvider.xtend b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/extensions/I18nKeyProvider.xtend
index ea49eb9..30382bd 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/extensions/I18nKeyProvider.xtend
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/extensions/I18nKeyProvider.xtend
@@ -29,6 +29,7 @@
 import org.eclipse.xtext.common.types.JvmOperation
 import org.eclipse.xtext.common.types.JvmType
 import org.eclipse.xtext.naming.IQualifiedNameProvider
+import org.eclipse.osbp.ecview.core.common.model.core.util.II18nConstants
 
 class I18nKeyProvider {
 
@@ -36,83 +37,110 @@
 	@Inject BindingInfoHelper bindingInfoHelper;
 
 	def dispatch String toI18nKey(UiEmbeddable embeddable) {
-		if (embeddable.i18nInfo != null && embeddable.i18nInfo.key != null) {
+		if(embeddable.i18nInfo !== null && embeddable.i18nInfo.noCaption){
+			return II18nConstants.NO_CAPTION
+		} 
+		
+		if (embeddable.i18nInfo !== null && embeddable.i18nInfo.key !== null) {
 			return embeddable.i18nInfo.key;
 		}
 
 		if (embeddable instanceof UiField) {
 			val String i18nKey = toI18nKeyByBindings(embeddable)
-			if (i18nKey != null && !i18nKey.equals("")) {
+			if (i18nKey !== null && !i18nKey.equals("")) {
 				return i18nKey;
 			}
 		}
-		return if(embeddable.name != null) embeddable.name else ""
+		return if(embeddable.name !== null) embeddable.name else ""
 	}
 
 	def dispatch String toI18nKey(UiTable element) {
-		if (element.i18nInfo != null && element.i18nInfo.key != null) {
+		if(element.i18nInfo !== null && element.i18nInfo.noCaption){
+			return II18nConstants.NO_CAPTION
+		} 
+		
+		if (element.i18nInfo !== null && element.i18nInfo.key !== null) {
 			return element.i18nInfo.key;
-		} else if (element.jvmType != null) {
+		} else if (element.jvmType !== null) {
 			return element.jvmType.simpleName
 		}
-		return if(element.name != null) element.name else ""
+		return if(element.name !== null) element.name else ""
 	}
 
 	def dispatch String toI18nKey(UiList element) {
-		if (element.i18nInfo != null && element.i18nInfo.key != null) {
+		if(element.i18nInfo !== null && element.i18nInfo.noCaption){
+			return II18nConstants.NO_CAPTION
+		} 
+		
+		if (element.i18nInfo !== null && element.i18nInfo.key !== null) {
 			return element.i18nInfo.key;
-		} else if (element.jvmType != null) {
+		} else if (element.jvmType !== null) {
 			return element.jvmType.simpleName
 		}
-		return if(element.name != null) element.name else ""
+		return if(element.name !== null) element.name else ""
 	}
 
 	def dispatch String toI18nKey(UiOptionsGroup element) {
-		if (element.i18nInfo != null && element.i18nInfo.key != null) {
+		if(element.i18nInfo !== null && element.i18nInfo.noCaption){
+			return II18nConstants.NO_CAPTION
+		} 
+		
+		if (element.i18nInfo !== null && element.i18nInfo.key !== null) {
 			return element.i18nInfo.key;
-		} else if (element.jvmType != null) {
+		} else if (element.jvmType !== null) {
 			return element.jvmType.simpleName
 		}
-		return if(element.name != null) element.name else ""
+		return if(element.name !== null) element.name else ""
 	}
 
 	def dispatch String toI18nKey(UiComboBox element) {
-		if (element.i18nInfo != null && element.i18nInfo.key != null) {
+		if(element.i18nInfo !== null && element.i18nInfo.noCaption){
+			return II18nConstants.NO_CAPTION
+		} 
+		if (element.i18nInfo !== null && element.i18nInfo.key !== null) {
 			return element.i18nInfo.key;
-		} else if (element.jvmType != null) {
+		} else if (element.jvmType !== null) {
 			return element.jvmType.simpleName
 		}
-		return if(element.name != null) element.name else ""
+		return if(element.name !== null) element.name else ""
 	}
 
 	def dispatch String toI18nKey(UiSearchPanel element) {
-		if (element.i18nInfo != null && element.i18nInfo.key != null) {
+		if(element.i18nInfo !== null && element.i18nInfo.noCaption){
+			return II18nConstants.NO_CAPTION
+		} 
+		if (element.i18nInfo !== null && element.i18nInfo.key !== null) {
 			return element.i18nInfo.key;
-		} else if (element.jvmType != null) {
+		} else if (element.jvmType !== null) {
 			return element.jvmType.simpleName
 		}
-		return if(element.name != null) element.name else ""
+		return if(element.name !== null) element.name else ""
 	}
 
 	def dispatch String toI18nKey(UiBeanReferenceField element) {
-		if (element.i18nInfo != null && element.i18nInfo.key != null) {
+		
+		if(element.i18nInfo !== null && element.i18nInfo.noCaption){
+			return II18nConstants.NO_CAPTION
+		} 
+		
+		if (element.i18nInfo !== null && element.i18nInfo.key !== null) {
 			return element.i18nInfo.key;
-		} else if (element.jvmType != null) {
+		} else if (element.jvmType !== null) {
 			return element.jvmType.simpleName
 		}
-		return if(element.name != null) element.name else ""
+		return if(element.name !== null) element.name else ""
 	}
 
 	def dispatch String toI18nKey(UiColumn column) {
 		val UiTable table = column.eContainer.eContainer as UiTable
 
-		if (column.i18nInfo != null && column.i18nInfo.key != null) {
+		if (column.i18nInfo !== null && column.i18nInfo.key !== null) {
 			return column.i18nInfo.key;
-		} else if (table.jvmType != null) {
+		} else if (table.jvmType !== null) {
 			val UiNestedProperty property = column.property
-			if (property != null) {
+			if (property !== null) {
 				val path = property.toPathString
-				if (path == null) {
+				if (path === null) {
 					return table.jvmType.simpleName
 				} else if (path.contains(".")) {
 					return property.simpleGetterNameOfLastSegment
@@ -122,7 +150,7 @@
 			}
 		} else {
 			val UiNestedProperty property = column.property
-			if (property != null) {
+			if (property !== null) {
 				val parent = column.eContainer().eContainer() as UiEmbeddable
 				return parent.name + "." + property.toPathString
 			}
@@ -131,7 +159,7 @@
 	}
 
 	def dispatch String toI18nKey(UiExposedAction action) {
-		if (action.actionReference != null) {
+		if (action.actionReference !== null) {
 			return action.actionReference.name
 		} else {
 			return action.actionID
@@ -139,13 +167,17 @@
 	}
 
 	def dispatch String toI18nKey(UiSearchField embeddable) {
-		if (embeddable.i18nInfo != null && embeddable.i18nInfo.key != null) {
+		if(embeddable.i18nInfo !== null && embeddable.i18nInfo.noCaption){
+			return II18nConstants.NO_CAPTION
+		} 
+		
+		if (embeddable.i18nInfo !== null && embeddable.i18nInfo.key !== null) {
 			return embeddable.i18nInfo.key;
 		} else {
 			val UiNestedProperty property = embeddable.property
-			if (property != null) {
+			if (property !== null) {
 				val String i18nKey = toI18nKeyByBindings(property)
-				if (i18nKey != null && !i18nKey.equals("")) {
+				if (i18nKey !== null && !i18nKey.equals("")) {
 					return i18nKey;
 				}
 				return "search." + property.toPathString
@@ -155,7 +187,7 @@
 	}
 
 	def dispatch String toI18nKey(UiTabAssignment embeddable) {
-		if (embeddable.i18nInfo != null && embeddable.i18nInfo.key != null) {
+		if (embeddable.i18nInfo !== null && embeddable.i18nInfo.key !== null) {
 			return embeddable.i18nInfo.key;
 		}
 		return embeddable.name
@@ -172,11 +204,11 @@
 
 			if (!ops.empty) {
 				val JvmOperation op = ops.get(0)
-				if(op == null){
+				if(op === null){
 					return null
 				}
 				val JvmType type = op.declaringType
-				if (type == null) {
+				if (type === null) {
 					return null
 				}
 				return ops.get(0).simpleName.toPropertyName
@@ -185,11 +217,11 @@
 	}
 
 	def String toI18nKeyByBindings(UiNestedProperty property) {
-		if (property != null) {
+		if (property !== null) {
 			val JvmOperation op = property.operationofLastSegment
-			if (op != null) {
+			if (op !== null) {
 				val JvmType type = op.declaringType
-				if (type == null) {
+				if (type === null) {
 					return null
 				}
 				return op.simpleName.toPropertyName
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/extensions/OperationExtensions.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/extensions/OperationExtensions.java
index 35da932..6a778b6 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/extensions/OperationExtensions.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/extensions/OperationExtensions.java
@@ -12,11 +12,19 @@
 package org.eclipse.osbp.ecview.dsl.extensions;
 
 import java.util.LinkedHashMap;
-import java.util.List;
 import java.util.Map;
 
+import org.eclipse.osbp.runtime.common.annotations.Dirty;
+import org.eclipse.osbp.runtime.common.annotations.Id;
+import org.eclipse.osbp.runtime.common.annotations.Version;
+import org.eclipse.xtext.common.types.JvmAnnotationReference;
+import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.EReference;
+import org.eclipse.osbp.dsl.semantic.dto.LDto;
+import org.eclipse.osbp.dsl.semantic.dto.LDtoAbstractAttribute;
+import org.eclipse.xtext.common.types.JvmAnnotationReference;
+import org.eclipse.xtext.common.types.JvmAnnotationType;
 import org.eclipse.xtext.common.types.JvmDeclaredType;
 import org.eclipse.xtext.common.types.JvmFeature;
 import org.eclipse.xtext.common.types.JvmField;
@@ -43,15 +51,12 @@
 		}
 		String tempName = null;
 		if (isSetter(simpleName)) {
-			tempName = StringExtensions.toFirstLower(simpleName.replaceFirst(
-					"set", ""));
+			tempName = StringExtensions.toFirstLower(simpleName.replaceFirst("set", ""));
 		} else if (isGetter(simpleName)) {
 			if (simpleName.startsWith("get")) {
-				tempName = StringExtensions.toFirstLower(simpleName
-						.replaceFirst("get", ""));
+				tempName = StringExtensions.toFirstLower(simpleName.replaceFirst("get", ""));
 			} else {
-				tempName = StringExtensions.toFirstLower(simpleName
-						.replaceFirst("is", ""));
+				tempName = StringExtensions.toFirstLower(simpleName.replaceFirst("is", ""));
 			}
 		}
 		return tempName;
@@ -89,8 +94,7 @@
 	 *            the type
 	 * @return the operation infos
 	 */
-	public static Map<String, OperationInfo> getOperationInfos(
-			JvmDeclaredType type) {
+	public static Map<String, OperationInfo> getOperationInfos(JvmDeclaredType type) {
 		return getOperationInfos(type, true);
 	}
 
@@ -100,16 +104,16 @@
 	 * @param type
 	 * @return
 	 */
-	public static Map<String, OperationInfo> getOperationInfos(
-			JvmDeclaredType type, boolean includeSuperType) {
+	public static Map<String, OperationInfo> getOperationInfos(JvmDeclaredType type, boolean includeSuperType) {
 		// Changed from HashMap to LinkedHashMap due to #203.
 		Map<String, OperationInfo> infos = new LinkedHashMap<String, OperationInfo>();
-		
-//		List<JvmFeature> features = (List<JvmFeature>) (includeSuperType ? type.getAllFeatures() : type.getDeclaredOperations());
-		
+
+		// List<JvmFeature> features = (List<JvmFeature>) (includeSuperType ?
+		// type.getAllFeatures() : type.getDeclaredOperations());
+
 		for (JvmFeature feature : type.getAllFeatures()) {
 			if (!includeSuperType) {
-				if(type != feature.eContainer()) {
+				if (type != feature.eContainer()) {
 					continue;
 				}
 			}
@@ -123,8 +127,7 @@
 				continue;
 			}
 
-			if (!isSetter(operation.getSimpleName())
-					&& operation.getParameters().size() > 1) {
+			if (!isSetter(operation.getSimpleName()) && operation.getParameters().size() > 1) {
 				continue;
 			}
 
@@ -141,13 +144,11 @@
 				continue;
 			}
 
-			if (!isGetter(operation.getSimpleName())
-					&& !isSetter(operation.getSimpleName())) {
+			if (!isGetter(operation.getSimpleName()) && !isSetter(operation.getSimpleName())) {
 				continue;
 			}
 
-			String id = calcId(operation.getDeclaringType(),
-					operation.getSimpleName());
+			String id = calcId(operation.getDeclaringType(), operation.getSimpleName());
 			if (!infos.containsKey(id)) {
 				OperationInfo info = new OperationInfo();
 				info.id = id;
@@ -179,8 +180,7 @@
 		for (JvmFeature feature : type.getAllFeatures()) {
 			if (feature instanceof JvmField) {
 				JvmField field = (JvmField) feature;
-				String id = calcFieldId(field.getDeclaringType(),
-						field.getSimpleName());
+				String id = calcFieldId(field.getDeclaringType(), field.getSimpleName());
 				if (infos.containsKey(id)) {
 					OperationInfo info = infos.get(id);
 					info.setField(field);
@@ -217,8 +217,7 @@
 	 *            the simple name
 	 * @return the string
 	 */
-	public static String calcFieldId(JvmDeclaredType declaringType,
-			String simpleName) {
+	public static String calcFieldId(JvmDeclaredType declaringType, String simpleName) {
 		return declaringType.getQualifiedName() + ":" + simpleName;
 	}
 
@@ -229,19 +228,19 @@
 
 		/** The id. */
 		private String id;
-		
+
 		/** The name. */
 		private String name;
-		
+
 		/** The readonly. */
 		private boolean readonly;
-		
+
 		/** The getter. */
 		private JvmOperation getter;
-		
+
 		/** The setter. */
 		private JvmOperation setter;
-		
+
 		/** The field. */
 		private JvmField field;
 
@@ -303,6 +302,52 @@
 		}
 
 		/**
+		 * Returns true, if the info has an annotation matching the given
+		 * annotationType.
+		 * 
+		 * @param annotationType
+		 * @return
+		 */
+		public boolean hasAnnotation(Class<?> annotationType) {
+			if (field == null) {
+				return false;
+			}
+			for (JvmAnnotationReference annotation : field.getAnnotations()) {
+				if (annotation.getAnnotation().getQualifiedName().equals(annotationType.getName())) {
+					return true;
+				}
+			}
+			return false;
+		}
+
+		/**
+		 * Returns true, if the field is and id or uuid.
+		 * 
+		 * @return
+		 */
+		public boolean isIdOrUUID() {
+			return hasAnnotation(Id.class);
+		}
+
+		/**
+		 * Returns true, if the field is a version field.
+		 * 
+		 * @return
+		 */
+		public boolean isVersion() {
+			return hasAnnotation(Version.class);
+		}
+
+		/**
+		 * Returns true, if the field is a dirty field.
+		 * 
+		 * @return
+		 */
+		public boolean isDirtyMark() {
+			return hasAnnotation(Dirty.class);
+		}
+
+		/**
 		 * Gets the getter.
 		 *
 		 * @return the getter
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/formatting/UIGrammarFormatter.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/formatting/UIGrammarFormatter.java
index f5c347d..d2fd755 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/formatting/UIGrammarFormatter.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/formatting/UIGrammarFormatter.java
@@ -9,13 +9,8 @@
  *         Florian Pirchner - Initial implementation
  */
 
-
 package org.eclipse.osbp.ecview.dsl.formatting;
 
-import org.eclipse.xtext.Keyword;
-import org.eclipse.xtext.formatting.impl.AbstractDeclarativeFormatter;
-import org.eclipse.xtext.formatting.impl.FormattingConfig;
-import org.eclipse.xtext.xbase.formatting.XbaseFormatter;
 import org.eclipse.osbp.ecview.dsl.services.UIGrammarGrammarAccess;
 import org.eclipse.osbp.ecview.dsl.services.UIGrammarGrammarAccess.UiBeanReferenceFieldElements;
 import org.eclipse.osbp.ecview.dsl.services.UIGrammarGrammarAccess.UiBeanSlotElements;
@@ -68,10 +63,14 @@
 import org.eclipse.osbp.ecview.dsl.services.UIGrammarGrammarAccess.UiViewSetElements;
 import org.eclipse.osbp.ecview.dsl.services.UIGrammarGrammarAccess.UiVisibilityProcessorElements;
 import org.eclipse.osbp.ecview.dsl.services.UIGrammarGrammarAccess.UiXbaseVisibilityRuleElements;
+import org.eclipse.xtext.Keyword;
+import org.eclipse.xtext.formatting.impl.AbstractDeclarativeFormatter;
+import org.eclipse.xtext.formatting.impl.FormattingConfig;
+import org.eclipse.xtext.xbase.formatting.XbaseFormatter;
 
 import com.google.inject.Inject;
 
-@SuppressWarnings({"restriction", "deprecation", "unused"})
+@SuppressWarnings({ "restriction", "deprecation", "unused" })
 public class UIGrammarFormatter extends AbstractDeclarativeFormatter {
 
 	@Inject
@@ -92,6 +91,8 @@
 		c.setLinewrap(0, 1, 2).before(f.getML_COMMENTRule());
 		c.setLinewrap(0, 1, 2).after(f.getML_COMMENTRule());
 
+		c.setLinewrap(1,1,2).around(ga.getOXtypeGrammarAccess().getXImportDeclarationRule());
+		
 		// Modell
 		configureUiModel(c, f.getUiModelAccess());
 		// IDEView
@@ -569,7 +570,7 @@
 			UIGrammarGrammarAccess.UiModelElements ele) {
 		// linewrap
 		c.setLinewrap(1, 1, 2).after(ele.getPackageNameAssignment_1());
-		c.setLinewrap(1, 1, 2).around(ele.getImportsAssignment_2());
+		c.setLinewrap(1, 1, 2).around(ele.getImportSectionAssignment_2());
 		// c.setLinewrap().around(ele.getRootsAssignment_3());
 	}
 
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/generator/Generator.xtend b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/generator/Generator.xtend
index f3559ce..e0d2616 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/generator/Generator.xtend
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/generator/Generator.xtend
@@ -16,9 +16,9 @@
 import org.eclipse.emf.ecore.util.EcoreUtil
 import org.eclipse.emf.ecore.xmi.XMLResource
 import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl
-import org.eclipse.xtext.generator.IFileSystemAccess
-import org.eclipse.osbp.dsl.xtext.lazyresolver.generator.DelegatingGenerator
 import org.eclipse.osbp.ecview.core.common.model.core.YView
+import org.eclipse.osbp.xtext.oxtype.hooks.DelegatingGenerator
+import org.eclipse.xtext.generator.IFileSystemAccess
 
 class Generator extends DelegatingGenerator {
 
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/name/UiQualifiedNameProvider.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/name/UiQualifiedNameProvider.java
index 3ebf08f..b124f92 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/name/UiQualifiedNameProvider.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/name/UiQualifiedNameProvider.java
@@ -12,11 +12,6 @@
 package org.eclipse.osbp.ecview.dsl.name;
 
 import org.eclipse.emf.ecore.EObject;
-import org.eclipse.xtext.naming.IQualifiedNameConverter;
-import org.eclipse.xtext.naming.QualifiedName;
-import org.eclipse.xtext.xbase.lib.StringExtensions;
-import org.eclipse.xtext.xbase.scoping.XbaseQualifiedNameProvider;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiBeanSlot;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiBindingEndpointAlias;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiEmbeddable;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiErrorCode;
@@ -28,6 +23,10 @@
 import org.eclipse.osbp.ecview.semantic.uimodel.UiView;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiVisibilityProcessor;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiVisibilityProperty;
+import org.eclipse.xtext.naming.IQualifiedNameConverter;
+import org.eclipse.xtext.naming.QualifiedName;
+import org.eclipse.xtext.xbase.lib.StringExtensions;
+import org.eclipse.xtext.xbase.scoping.XbaseQualifiedNameProvider;
 
 import com.google.inject.Inject;
 
@@ -105,13 +104,14 @@
 								getPackage(code), yValidator.getName(),
 								code.getName()));
 			}
-		} else if (obj instanceof UiBeanSlot) {
-			UiBeanSlot uiBeanSlot = (UiBeanSlot) obj;
-			if (uiBeanSlot.getName() == null) {
-				return QualifiedName.create("notDefined");
-			} else {
-				return converter.toQualifiedName(uiBeanSlot.getName());
-			}
+			// } else
+			// if (obj instanceof UiBeanSlot) {
+			// UiBeanSlot uiBeanSlot = (UiBeanSlot) obj;
+			// if (uiBeanSlot.getName() == null) {
+			// return QualifiedName.create("notDefined");
+			// } else {
+			// return converter.toQualifiedName(uiBeanSlot.getName());
+			// }
 		} else if (obj instanceof UiValidatorAlias) {
 			UiValidatorAlias uiValidator = (UiValidatorAlias) obj;
 			if (uiValidator.getName() == null) {
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/scope/BatchScopeProvider.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/scope/BatchScopeProvider.java
index d404408..edd7553 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/scope/BatchScopeProvider.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/scope/BatchScopeProvider.java
@@ -14,77 +14,4 @@
 
 public class BatchScopeProvider extends ScopeProvider {
 
-//	@Inject
-//	private TypeReferences types;
-//
-//	@Override
-//	public IScope getScope(EObject context, EReference reference) {
-//		if (reference == UiModelPackage.Literals.UI_BINDING_ENDPOINT_DEF__ENDPOINT) {
-//			return new BindingEndpointDefMethodScope(super.getScope(context,
-//					reference), (UiBindingEndpointDef) context);
-//		} else if (reference == UiModelPackage.Literals.UI_BINDING_ENDPOINT_DEF__PATH) {
-//			return createBindingEndpointDefPathScope(context);
-//		} else if (reference == UiModelPackage.Literals.UI_PATH_SEGMENT__JVM_FIELD) {
-//			return createPathSegmentJvmFieldScope(context);
-//		}
-//		return super.getScope(context, reference);
-//	}
-//
-//	/**
-//	 * Creates a scope that returns the jvm fields available for the current
-//	 * state.
-//	 * 
-//	 * @param context
-//	 * @return
-//	 */
-//	private IScope createPathSegmentJvmFieldScope(EObject context) {
-//		UiPathSegmentImpl segment = (UiPathSegmentImpl) context;
-//		if (segment.eContainer() instanceof UiBindingEndpointDef) {
-//			UiBindingEndpointDef parent = (UiBindingEndpointDef) segment
-//					.eContainer();
-//			UxEndpointDef uxEndpointDef = (UxEndpointDef) parent.getEndpoint();
-//			YElement bindable = parent.getBindable();
-//
-//			JvmTypeReference expectedType = uxEndpointDef.getJvmType();
-//			if (expectedType.getQualifiedName().equals(Void.class.getName())) {
-//				if (bindable instanceof YBeanSlot) {
-//					YBeanSlot slot = (YBeanSlot) bindable;
-//					return new BindingPathScope(types.findDeclaredType(
-//							slot.getValueTypeQualifiedName(), context));
-//				}
-//				throw new IllegalStateException("Not a valid input! " + context);
-//			} else {
-//				return new BindingPathScope(expectedType.getType());
-//			}
-//		} else {
-//			UiPathSegment parent = (UiPathSegment) segment.eContainer();
-//			return new BindingPathScope(parent.getJvmField().getType()
-//					.getType());
-//		}
-//	}
-//
-//	/**
-//	 * Creates a scope returning the available jvm fields for the current state.
-//	 * 
-//	 * @param context
-//	 * @return
-//	 */
-//	private IScope createBindingEndpointDefPathScope(EObject context) {
-//		UiBindingEndpointDef parent = (UiBindingEndpointDef) context;
-//		UxEndpointDef uxEndpointDef = (UxEndpointDef) parent.getEndpoint();
-//		YElement bindable = parent.getBindable();
-//
-//		JvmTypeReference expectedType = uxEndpointDef.getJvmType();
-//		if (expectedType.getQualifiedName().equals(Void.class.getName())) {
-//			if (bindable instanceof YBeanSlot) {
-//				YBeanSlot slot = (YBeanSlot) bindable;
-//				return new BindingPathScope(types.findDeclaredType(
-//						slot.getValueType(), context));
-//			}
-//		} else {
-//			return new BindingPathScope(expectedType.getType());
-//		}
-//
-//		return IScope.NULLSCOPE;
-//	}
 }
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/scope/BindingEndpointDefBindMethodScope.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/scope/BindingEndpointDefBindMethodScope.java
index 40fcc4f..7cac196 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/scope/BindingEndpointDefBindMethodScope.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/scope/BindingEndpointDefBindMethodScope.java
@@ -15,18 +15,18 @@
 import java.util.Collections;
 import java.util.List;
 
-import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.osbp.ecview.semantic.uimodel.UiRawBindable;
+import org.eclipse.osbp.ecview.semantic.uimodel.UiTypedBindableDef;
+import org.eclipse.osbp.ecview.semantic.uisemantics.UiSemanticsPackage;
+import org.eclipse.osbp.ecview.semantic.uisemantics.UxAvailableBindings;
+import org.eclipse.osbp.ecview.semantic.uisemantics.UxBindingableOption;
+import org.eclipse.osbp.ecview.semantic.uisemantics.UxElementDefinition;
 import org.eclipse.xtext.resource.EObjectDescription;
 import org.eclipse.xtext.resource.IEObjectDescription;
 import org.eclipse.xtext.resource.IResourceDescriptions;
 import org.eclipse.xtext.scoping.IScope;
 import org.eclipse.xtext.scoping.impl.AbstractScope;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiRawBindable;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiTypedBindableDef;
-import org.eclipse.osbp.ecview.semantic.uisemantics.UiSemanticsPackage;
-import org.eclipse.osbp.ecview.semantic.uisemantics.UxElementDefinition;
-import org.eclipse.osbp.ecview.semantic.uisemantics.UxEndpointDef;
 
 public class BindingEndpointDefBindMethodScope extends AbstractScope {
 
@@ -40,6 +40,31 @@
 		bindingEndpointDef = context;
 	}
 
+//	@Override
+//	protected Iterable<IEObjectDescription> getAllLocalElements() {
+//		UiRawBindable yEmb = bindingEndpointDef.getRawBindableOfLastSegment();
+//		if (yEmb == null) {
+//			return Collections.emptyList();
+//		}
+//		List<IEObjectDescription> result = new ArrayList<IEObjectDescription>();
+//		for (IEObjectDescription des : desc
+//				.getExportedObjectsByType(UiSemanticsPackage.Literals.UX_BINDINGABLE_OPTION)) {
+//			UxEndpointDef binding = (UxEndpointDef) des.getEObjectOrProxy();
+//			binding = (UxEndpointDef) EcoreUtil.resolve(binding,
+//					bindingEndpointDef);
+//			EObject parent = binding.eContainer();
+//			if (parent == null) {
+//				continue;
+//			}
+//			UxElementDefinition elementDef = (UxElementDefinition) parent
+//					.eContainer();
+//			if (elementDef.getUri().getEClass().isSuperTypeOf(yEmb.eClass())) {
+//				result.add(EObjectDescription.create(binding.getName(), binding));
+//			}
+//		}
+//		return result;
+//	}
+	
 	@Override
 	protected Iterable<IEObjectDescription> getAllLocalElements() {
 		UiRawBindable yEmb = bindingEndpointDef.getRawBindableOfLastSegment();
@@ -48,19 +73,25 @@
 		}
 		List<IEObjectDescription> result = new ArrayList<IEObjectDescription>();
 		for (IEObjectDescription des : desc
-				.getExportedObjectsByType(UiSemanticsPackage.Literals.UX_BINDINGABLE_OPTION)) {
-			UxEndpointDef binding = (UxEndpointDef) des.getEObjectOrProxy();
-			binding = (UxEndpointDef) EcoreUtil.resolve(binding,
+				.getExportedObjectsByType(UiSemanticsPackage.Literals.UX_AVAILABLE_BINDINGS)) {
+			UxAvailableBindings available = (UxAvailableBindings) des.getEObjectOrProxy();
+			available = (UxAvailableBindings) EcoreUtil.resolve(available,
 					bindingEndpointDef);
-			EObject parent = binding.eContainer();
-			if (parent == null) {
+			UxElementDefinition elementDef = (UxElementDefinition) available.eContainer();
+			if (elementDef == null) {
 				continue;
 			}
-			UxElementDefinition elementDef = (UxElementDefinition) parent
-					.eContainer();
+			List<String> targets = new ArrayList<>(available.getBindings().size() * 2);
 			if (elementDef.getUri().getEClass().isSuperTypeOf(yEmb.eClass())) {
-				result.add(EObjectDescription.create(binding.getName(), binding));
+				for (UxBindingableOption binding : available.getBindings()) {
+					if(targets.contains(binding.getTargetName() != null ? binding.getTargetName() : binding.getName())) {
+						continue;
+					}
+					targets.add(binding.getTargetName() != null ? binding.getTargetName() : binding.getName());
+					result.add(EObjectDescription.create(binding.getName(), binding));
+				}
 			}
+			
 		}
 		return result;
 	}
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/scope/BindingEndpointDefRawBindableScope.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/scope/BindingEndpointDefRawBindableScope.java
index e9b95b6..0444f43 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/scope/BindingEndpointDefRawBindableScope.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/scope/BindingEndpointDefRawBindableScope.java
@@ -57,37 +57,6 @@
 		return Collections.emptyList();
 	}
 
-	// protected List<IEObjectDescription> collectRawBindables(EObject
-	// container) {
-	// List<IEObjectDescription> result = new ArrayList<IEObjectDescription>();
-	// for (EObject object : container.eContents()) {
-	// if (object instanceof UiRawBindable
-	// && isValid(((UiRawBindable) object).getName())) {
-	// result.add(EObjectDescription.create(
-	// ((UiRawBindable) object).getName(), object));
-	// } else if (object instanceof UiRawBindableProvider) {
-	// // direct children may be of type UiRawBindable
-	// result.addAll(collectRawBindables(object));
-	// }
-	// }
-	// return result;
-	// }
-
-	// protected List<IEObjectDescription> collectRawBindables(
-	// UiTypedBindableDef def) {
-	// EObject rawBindableParent = findRawBindableParent(def);
-	// if (rawBindableParent == null) {
-	// rawBindableParent = findView(def);
-	// }
-	// List<IEObjectDescription> result =
-	// collectRawBindables(rawBindableParent);
-	// return result;
-	// }
-
-	// private boolean isValid(String value) {
-	// return value != null && !value.equals("");
-	// }
-
 	private UiRawBindable findRawBindableParent(EObject eObject) {
 		UiRawBindable result = null;
 		while (eObject != null && eObject.eContainer() != null) {
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/scope/ScopeProvider.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/scope/ScopeProvider.java
index 9ae3af2..6f238fd 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/scope/ScopeProvider.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/scope/ScopeProvider.java
@@ -15,6 +15,7 @@
 import org.eclipse.emf.ecore.EReference;
 import org.eclipse.osbp.ecview.core.common.model.core.YBeanSlot;
 import org.eclipse.osbp.ecview.dsl.extensions.BindableTypeProvider;
+import org.eclipse.osbp.ecview.dsl.scoping.UIGrammarScopeProvider;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiBeanReferenceField;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiBindingEndpointAssignment;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage;
@@ -39,7 +40,7 @@
 import com.google.inject.Inject;
 
 @SuppressWarnings("restriction")
-public class ScopeProvider extends XbaseBatchScopeProvider {
+public class ScopeProvider extends UIGrammarScopeProvider {
 
 	@Inject
 	private TypeReferences types;
@@ -120,7 +121,7 @@
 		}  else if (reference == UiModelPackage.Literals.UI_BINDING_ENDPOINT_ASSIGNMENT__TYPED_BINDABLE_ALIAS) {
 			return new TypedBindableScope(context);
 		} 
-		return super.getScope(getView(context), reference);
+		return super.getScope(context, reference);
 	}
 
 	private UiView getView(EObject eObject) {
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/validation/UIGrammarValidator.xtend b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/validation/UIGrammarValidator.xtend
index 641d682..2fafc27 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/validation/UIGrammarValidator.xtend
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/validation/UIGrammarValidator.xtend
@@ -4,7 +4,7 @@
  * 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:
  *         Florian Pirchner - Initial implementation
  */
@@ -14,10 +14,14 @@
 import java.util.List
 import org.eclipse.osbp.ecview.core.common.IAccessible
 import org.eclipse.osbp.ecview.dsl.extensions.BeanHelper
+import org.eclipse.osbp.ecview.dsl.extensions.BindingInfoHelper
 import org.eclipse.osbp.ecview.dsl.extensions.TypeHelper
 import org.eclipse.osbp.ecview.dsl.lib.IECViewLibMarker
 import org.eclipse.osbp.ecview.semantic.uimodel.UiBeanReferenceField
 import org.eclipse.osbp.ecview.semantic.uimodel.UiBeanSlot
+import org.eclipse.osbp.ecview.semantic.uimodel.UiBinding
+import org.eclipse.osbp.ecview.semantic.uimodel.UiBindingEndpointAlias
+import org.eclipse.osbp.ecview.semantic.uimodel.UiBindingEndpointAssignment
 import org.eclipse.osbp.ecview.semantic.uimodel.UiComboBox
 import org.eclipse.osbp.ecview.semantic.uimodel.UiList
 import org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage
@@ -36,7 +40,7 @@
 //import org.eclipse.xtext.validation.Check
 /**
  * Custom validation rules. 
- *
+ * 
  * see http://www.eclipse.org/Xtext/documentation.html#validation
  */
 class UIGrammarValidator extends AbstractUIGrammarValidator {
@@ -54,19 +58,21 @@
 	ITypeLoaderFactory typeLoaderFactory;
 	ITypeLoader typeLoader
 
+	@Inject BindingInfoHelper bindingInfoHelper;
+
 	@Inject extension TypeHelper
 	@Inject extension IQualifiedNameProvider
 
-	//  public static val INVALID_NAME = 'invalidName'
+	// 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 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 checkSearchField(UiSearchField field) {
 		val JvmType type = field.property.typeofLastSegment
@@ -88,7 +94,7 @@
 	@Check
 	def checkCaptionProperty(UiOptionsGroup field) {
 		var String result = null
-		if (field.itemCaptionProperty != null) {
+		if (field.itemCaptionProperty !== null) {
 			return
 		}
 
@@ -98,12 +104,12 @@
 
 		val typeLoader = typeLoaderFactory.createTypeLoader(field.eResource.resourceSet)
 		val type = typeLoader.findTypeByName(field.jvmType?.qualifiedName)
-		if (type != null) {
+		if (type !== null) {
 			result = BeanHelper.findCaptionProperty(type)
 		}
 		typeLoader.dispose
 
-		if (result == null) {
+		if (result === null) {
 			warning("Caption property could not be calculated by Type.", field,
 				UiModelPackage.Literals.UI_OPTIONS_GROUP__ITEM_CAPTION_PROPERTY)
 		}
@@ -112,7 +118,7 @@
 	@Check
 	def checkCaptionProperty(UiList field) {
 		var String result = null
-		if (field.itemCaptionProperty != null) {
+		if (field.itemCaptionProperty !== null) {
 			return
 		}
 
@@ -122,12 +128,12 @@
 
 		val typeLoader = typeLoaderFactory.createTypeLoader(field.eResource.resourceSet)
 		val type = typeLoader.findTypeByName(field.jvmType?.qualifiedName)
-		if (type != null) {
+		if (type !== null) {
 			result = BeanHelper.findCaptionProperty(type)
 		}
 		typeLoader.dispose
 
-		if (result == null) {
+		if (result === null) {
 			warning("Caption property could not be calculated by Type.", field,
 				UiModelPackage.Literals.UI_LIST__ITEM_CAPTION_PROPERTY)
 		}
@@ -136,7 +142,7 @@
 	@Check
 	def checkCaptionProperty(UiComboBox field) {
 		var String result = null
-		if (field.itemCaptionProperty != null) {
+		if (field.itemCaptionProperty !== null) {
 			return
 		}
 
@@ -146,12 +152,12 @@
 
 		val typeLoader = typeLoaderFactory.createTypeLoader(field.eResource.resourceSet)
 		val type = typeLoader.findTypeByName(field.jvmType?.qualifiedName)
-		if (type != null) {
+		if (type !== null) {
 			result = BeanHelper.findCaptionProperty(type)
 		}
 		typeLoader.dispose
 
-		if (result == null) {
+		if (result === null) {
 			warning("Caption property could not be calculated by Type.", field,
 				UiModelPackage.Literals.UI_COMBO_BOX__ITEM_CAPTION_PROPERTY)
 		}
@@ -160,7 +166,7 @@
 	@Check
 	def checkBeanSlot(UiBeanSlot beanSlot) {
 		val type = beanSlot.jvmType.type
-		if (type == null) {
+		if (type === null) {
 			return
 		}
 
@@ -174,19 +180,19 @@
 	@Check
 	def checkCaptionProperty(UiBeanReferenceField field) {
 		var String result = null
-		if (field.captionProperty != null) {
+		if (field.captionProperty !== null) {
 			return
 		}
 
 		val typeLoader = typeLoaderFactory.createTypeLoader(field.eResource.resourceSet)
 		val type = typeLoader.findTypeByName(field.jvmType?.qualifiedName)
 
-		if (type != null) {
+		if (type !== null) {
 			result = BeanHelper.findCaptionProperty(type)
 		}
 		typeLoader.dispose
 
-		if (result == null) {
+		if (result === null) {
 			warning("Caption property could not be calculated by Type.", field,
 				UiModelPackage.Literals.UI_BEAN_REFERENCE_FIELD__CAPTION_PROPERTY)
 		}
@@ -195,42 +201,44 @@
 	@Check
 	def void checkClassPath(UiView model) {
 		val TypeReferences typeReferences = getServices().getTypeReferences();
-		val JvmGenericType listType = typeReferences.findDeclaredType(typeof(List), model)  as JvmGenericType;
-		if (listType == null || listType.getTypeParameters().isEmpty()) {
+		val JvmGenericType listType = typeReferences.findDeclaredType(typeof(List), model) as JvmGenericType;
+		if (listType === null || listType.getTypeParameters().isEmpty()) {
 			error("Couldn't find a JDK 1.5 or higher on the project's classpath.", model,
 				UiModelPackage.Literals.UI_NAMED_ELEMENT__NAME, CODE__MISSING__JDK_1_5);
 		}
-		if (typeReferences.findDeclaredType("org.eclipse.osbp.runtime.common.annotations.Dispose", model) == null) {
+		if (typeReferences.findDeclaredType("org.eclipse.osbp.runtime.common.annotations.Dispose", model) === null) {
 			error("Couldn't find the mandatory library 'org.eclipse.osbp.runtime.common' on the project's classpath.",
 				model, UiModelPackage.Literals.UI_NAMED_ELEMENT__NAME, CODE__MISSING__L_RUNTIME_COMMON);
 		}
-		if (typeReferences.findDeclaredType(typeof(Extension), model) == null) {
+		if (typeReferences.findDeclaredType(typeof(Extension), model) === null) {
 			error(
-				"Couldn't find the mandatory library 'org.eclipse.xtext.xbase.lib' 2.7.3 or higher on the project's classpath.",
+				"Couldn't find the mandatory library 'org.eclipse.xtext.xbase.lib' 2.11.0 or higher on the project's classpath.",
 				model, UiModelPackage.Literals.UI_NAMED_ELEMENT__NAME, CODE__MISSING__XBASE_LIB);
 		}
-		if (typeReferences.findDeclaredType(typeof(IAccessible), model) == null) {
+		if (typeReferences.findDeclaredType(typeof(IAccessible), model) === null) {
 			error(
 				"Couldn't find the mandatory library 'org.eclipse.osbp.ecview.core.common' on the project's classpath.",
 				model, UiModelPackage.Literals.UI_NAMED_ELEMENT__NAME, CODE__MISSING__L_ECVIEW_COMMON);
 		}
-		if (typeReferences.findDeclaredType("org.eclipse.osbp.dsl.dto.lib.services.IDTOService", model) == null) {
+		if (typeReferences.findDeclaredType("org.eclipse.osbp.dsl.dto.lib.services.impl.AbstractDTOService", model) ===
+			null) {
 			warning(
 				"Couldn't find the mandatory library 'org.eclipse.osbp.dsl.dto.lib' on the project's classpath. This may cause resolving problems.",
 				model, UiModelPackage.Literals.UI_NAMED_ELEMENT__NAME, CODE__MISSING__DTO_LIB);
 		}
-		if (typeReferences.findDeclaredType(typeof(IECViewLibMarker), model) == null) {
+		if (typeReferences.findDeclaredType(typeof(IECViewLibMarker), model) === null) {
 			warning(
 				"Couldn't find the mandatory library 'org.eclipse.osbp.ecview.dsl.lib' on the project's classpath. This may cause resolving problems.",
 				model, UiModelPackage.Literals.UI_NAMED_ELEMENT__NAME, CODE__MISSING__L_ECVIEW_DSL_LIB);
 		}
 
-		//		if (typeReferences.findDeclaredType("java.persistence.Persistence", model) == null) {
-		//			warning(
-		//				"Couldn't find the optional library 'javax.persistence' 2.1.0 or higher on the project's classpath. If you are using JPA-Dto-Services, the library is mandatory.",
-		//				model, UiModelPackage.Literals.UI_NAMED_ELEMENT__NAME, CODE__MISSING__JAVAX_PERSISTENCE);
-		//		}
-		if (typeReferences.findDeclaredType("org.eclipse.osbp.dsl.common.datatypes.IDatatypeConstants", model) == null) {
+		// if (typeReferences.findDeclaredType("java.persistence.Persistence", model) === null) {
+		// warning(
+		// "Couldn't find the optional library 'javax.persistence' 2.1.0 or higher on the project's classpath. If you are using JPA-Dto-Services, the library is mandatory.",
+		// model, UiModelPackage.Literals.UI_NAMED_ELEMENT__NAME, CODE__MISSING__JAVAX_PERSISTENCE);
+		// }
+		if (typeReferences.findDeclaredType("org.eclipse.osbp.dsl.common.datatypes.IDatatypeConstants", model) ===
+			null) {
 			warning(
 				"Couldn't find the optional library 'org.eclipse.osbp.dsl.datatype.lib' on the project's classpath. This may cause resolving problems.",
 				model, UiModelPackage.Literals.UI_NAMED_ELEMENT__NAME, CODE__MISSING__DATATYPE_LIB);
@@ -242,10 +250,50 @@
 		val set = newHashSet()
 		model.beanSlots.forEach [
 			if (set.contains(it.name)) {
-				error("Duplicate datasource name.", model, UiModelPackage.Literals.UI_CONTEXT__BEAN_SLOTS, model.beanSlots.indexOf(it))
+				error("Duplicate datasource name.", model, UiModelPackage.Literals.UI_CONTEXT__BEAN_SLOTS,
+					model.beanSlots.indexOf(it))
 			} else {
 				set += it.name
 			}
 		]
 	}
+
+	@Check
+	def void checkBinding(UiBinding object) {
+		val UiBindingEndpointAlias sourceAlias = object.sourceAlias as UiBindingEndpointAlias
+		val source = object.source
+		val UiBindingEndpointAlias targetAlias = object.targetAlias as UiBindingEndpointAlias
+		val target = object.target
+
+		var UiBindingEndpointAssignment sourceEndpoint = source as UiBindingEndpointAssignment
+		if (sourceAlias !== null) {
+			sourceEndpoint = sourceAlias.endpoint as UiBindingEndpointAssignment
+		}
+		var UiBindingEndpointAssignment targetEndpoint = target as UiBindingEndpointAssignment
+		if (targetAlias !== null) {
+			targetEndpoint = targetAlias.endpoint as UiBindingEndpointAssignment
+		}
+
+		val BindingInfoHelper.BindingInfo sourceInfo = new BindingInfoHelper.BindingInfo
+		bindingInfoHelper.collectBindingInfo(source, sourceInfo);
+
+		val BindingInfoHelper.BindingInfo targetInfo = new BindingInfoHelper.BindingInfo
+		bindingInfoHelper.collectBindingInfo(target, targetInfo);
+
+		if (object.isListBinding) {
+			if (sourceInfo.isNested && sourceInfo.isCollection) {
+				error("No list binding here since the collection is nested!", object,
+					UiModelPackage.Literals.UI_BINDING__SOURCE)
+			}
+			if (targetInfo.isNested && targetInfo.isCollection) {
+				error("No list binding here since the collection is nested!", object,
+					UiModelPackage.Literals.UI_BINDING__TARGET)
+			}
+		} else {
+			if (!sourceInfo.isNested && !targetInfo.isNested && sourceInfo.isCollection && targetInfo.isCollection) {
+				error("Use list binding here. You are binding two NON-nested collections!", object,
+					UiModelPackage.Literals.UI_BINDING__SOURCE)
+			}
+		}
+	}
 }
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiAddToTableCommand.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiAddToTableCommand.java
index ab090bb..643886d 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiAddToTableCommand.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiAddToTableCommand.java
@@ -18,10 +18,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiAddToTableCommand#getTable <em>Table</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiAddToTableCommand()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiAlignment.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiAlignment.java
index afdefcd..d31794e 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiAlignment.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiAlignment.java
@@ -458,6 +458,8 @@
 	 * Returns the '<em><b>Ui Alignment</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 UiAlignment get(String literal) {
@@ -474,6 +476,8 @@
 	 * Returns the '<em><b>Ui Alignment</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 UiAlignment getByName(String name) {
@@ -490,6 +494,8 @@
 	 * Returns the '<em><b>Ui Alignment</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 UiAlignment get(int value) {
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiBeanReferenceField.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiBeanReferenceField.java
index ab475a7..3cd1ead 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiBeanReferenceField.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiBeanReferenceField.java
@@ -21,6 +21,7 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiBeanReferenceField#getCaptionProperty <em>Caption Property</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiBeanReferenceField#getImageProperty <em>Image Property</em>}</li>
@@ -29,7 +30,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiBeanReferenceField#getReferenceSourceJvmType <em>Reference Source Jvm Type</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiBeanReferenceField#getReferenceSourceField <em>Reference Source Field</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiBeanReferenceField()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiBeanServiceConsumer.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiBeanServiceConsumer.java
index 1b9cba8..3e97bd3 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiBeanServiceConsumer.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiBeanServiceConsumer.java
@@ -19,10 +19,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiBeanServiceConsumer#isConsumeBeanService <em>Consume Bean Service</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiBeanServiceConsumer()
  * @model interface="true" abstract="true"
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiBeanSlot.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiBeanSlot.java
index 2f22fba..9f023fd 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiBeanSlot.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiBeanSlot.java
@@ -20,12 +20,12 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiBeanSlot#getJvmType <em>Jvm Type</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiBeanSlot#getEClass <em>EClass</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiBeanSlot#getEventTopic <em>Event Topic</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiBeanSlot()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiBeanValidationValidator.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiBeanValidationValidator.java
index 03126be..8e92a7a 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiBeanValidationValidator.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiBeanValidationValidator.java
@@ -21,10 +21,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiBeanValidationValidator#getErrorCode <em>Error Code</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiBeanValidationValidator()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiBinding.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiBinding.java
index 02eed5f..8ddd30f 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiBinding.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiBinding.java
@@ -19,6 +19,7 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiBinding#getSource <em>Source</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiBinding#getSourceAlias <em>Source Alias</em>}</li>
@@ -28,7 +29,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiBinding#getTargetAlias <em>Target Alias</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiBinding#isListBinding <em>List Binding</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiBinding()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiBindingEndpointAlias.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiBindingEndpointAlias.java
index def971e..ddbc4f0 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiBindingEndpointAlias.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiBindingEndpointAlias.java
@@ -18,11 +18,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiBindingEndpointAlias#getAlias <em>Alias</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiBindingEndpointAlias#getEndpoint <em>Endpoint</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiBindingEndpointAlias()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiBindingEndpointAssignment.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiBindingEndpointAssignment.java
index 2bcdc27..c1016a5 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiBindingEndpointAssignment.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiBindingEndpointAssignment.java
@@ -18,12 +18,12 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiBindingEndpointAssignment#getTypedBindableDef <em>Typed Bindable Def</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiBindingEndpointAssignment#getPath <em>Path</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiBindingEndpointAssignment#getTypedBindableAlias <em>Typed Bindable Alias</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiBindingEndpointAssignment()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiChangeTrigger.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiChangeTrigger.java
index 9ab2c72..08aefd4 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiChangeTrigger.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiChangeTrigger.java
@@ -19,12 +19,12 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiChangeTrigger#getEndpoint <em>Endpoint</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiChangeTrigger#getEndpointAlias <em>Endpoint Alias</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiChangeTrigger#getAlias <em>Alias</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiChangeTrigger()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiColumn.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiColumn.java
index d7670af..c54e3c0 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiColumn.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiColumn.java
@@ -18,6 +18,7 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiColumn#getIconName <em>Icon Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiColumn#isVisible <em>Visible</em>}</li>
@@ -28,7 +29,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiColumn#getExpandRatio <em>Expand Ratio</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiColumn#getProperty <em>Property</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiColumn()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiColumnsAssignment.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiColumnsAssignment.java
index 2e60d95..99d7347 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiColumnsAssignment.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiColumnsAssignment.java
@@ -19,10 +19,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiColumnsAssignment#getColumns <em>Columns</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiColumnsAssignment()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiComboBox.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiComboBox.java
index 50d5cb9..0501db5 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiComboBox.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiComboBox.java
@@ -20,12 +20,12 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiComboBox#getItemCaptionProperty <em>Item Caption Property</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiComboBox#getItemImageProperty <em>Item Image Property</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiComboBox#getDescriptionProperty <em>Description Property</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiComboBox()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiCommandBindableDef.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiCommandBindableDef.java
index 2f80c98..a5fd052 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiCommandBindableDef.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiCommandBindableDef.java
@@ -18,10 +18,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiCommandBindableDef#getCommand <em>Command</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiCommandBindableDef()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiContext.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiContext.java
index df26f3b..9899643 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiContext.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiContext.java
@@ -19,13 +19,13 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiContext#getBeanSlots <em>Bean Slots</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiContext#getBindingEndpointAlias <em>Binding Endpoint Alias</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiContext#getBindings <em>Bindings</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiContext#getSharedStateGroup <em>Shared State Group</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiContext()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiDateField.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiDateField.java
index 07cc1ea..a28fdb4 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiDateField.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiDateField.java
@@ -18,11 +18,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiDateField#getDateFormat <em>Date Format</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiDateField#getResolution <em>Resolution</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiDateField()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiDateFormat.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiDateFormat.java
index 342597b..0319bd4 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiDateFormat.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiDateFormat.java
@@ -126,6 +126,8 @@
 	 * Returns the '<em><b>Ui Date Format</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 UiDateFormat get(String literal) {
@@ -142,6 +144,8 @@
 	 * Returns the '<em><b>Ui Date Format</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 UiDateFormat getByName(String name) {
@@ -158,6 +162,8 @@
 	 * Returns the '<em><b>Ui Date Format</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 UiDateFormat get(int value) {
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiDateTimeResolution.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiDateTimeResolution.java
index 81ba322..3dda878 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiDateTimeResolution.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiDateTimeResolution.java
@@ -226,6 +226,8 @@
 	 * Returns the '<em><b>Ui Date Time Resolution</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 UiDateTimeResolution get(String literal) {
@@ -242,6 +244,8 @@
 	 * Returns the '<em><b>Ui Date Time Resolution</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 UiDateTimeResolution getByName(String name) {
@@ -258,6 +262,8 @@
 	 * Returns the '<em><b>Ui Date Time Resolution</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 UiDateTimeResolution get(int value) {
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiDecimalField.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiDecimalField.java
index e56a73e..d2e61a6 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiDecimalField.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiDecimalField.java
@@ -18,12 +18,12 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiDecimalField#getPrecision <em>Precision</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiDecimalField#isNoGrouping <em>No Grouping</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiDecimalField#isNoMarkNegative <em>No Mark Negative</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiDecimalField()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiDialog.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiDialog.java
index 3146138..535f92f 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiDialog.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiDialog.java
@@ -18,10 +18,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiDialog#getContent <em>Content</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiDialog()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiDialogAssignment.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiDialogAssignment.java
index 1cdc4e6..d0a61b1 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiDialogAssignment.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiDialogAssignment.java
@@ -18,10 +18,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiDialogAssignment#getElement <em>Element</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiDialogAssignment()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiDialogSearchFieldAssignment.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiDialogSearchFieldAssignment.java
index f64ae68..52f2014 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiDialogSearchFieldAssignment.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiDialogSearchFieldAssignment.java
@@ -18,10 +18,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiDialogSearchFieldAssignment#getElement <em>Element</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiDialogSearchFieldAssignment()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiEmbeddable.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiEmbeddable.java
index d789638..252d866 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiEmbeddable.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiEmbeddable.java
@@ -20,13 +20,13 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiEmbeddable#getBindings <em>Bindings</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiEmbeddable#isReadonly <em>Readonly</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiEmbeddable#isInvisible <em>Invisible</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiEmbeddable#getStyles <em>Styles</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiEmbeddable()
  * @model interface="true" abstract="true"
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiErrorCode.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiErrorCode.java
index 20b11ef..96d8938 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiErrorCode.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiErrorCode.java
@@ -18,10 +18,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiErrorCode#getDefaultMessage <em>Default Message</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiErrorCode()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiExposedAction.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiExposedAction.java
index c4cd006..faa9ede 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiExposedAction.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiExposedAction.java
@@ -19,6 +19,7 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiExposedAction#getActionReference <em>Action Reference</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiExposedAction#getActionID <em>Action ID</em>}</li>
@@ -26,7 +27,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiExposedAction#isCheckDirty <em>Check Dirty</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiExposedAction#getExternalCommandId <em>External Command Id</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiExposedAction()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiField.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiField.java
index ab992b9..37f1d9b 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiField.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiField.java
@@ -20,10 +20,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiField#getValidators <em>Validators</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiField()
  * @model interface="true" abstract="true"
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiFlatAlignment.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiFlatAlignment.java
index 3a71e0b..854d61b 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiFlatAlignment.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiFlatAlignment.java
@@ -126,6 +126,8 @@
 	 * Returns the '<em><b>Ui Flat Alignment</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 UiFlatAlignment get(String literal) {
@@ -142,6 +144,8 @@
 	 * Returns the '<em><b>Ui Flat Alignment</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 UiFlatAlignment getByName(String name) {
@@ -158,6 +162,8 @@
 	 * Returns the '<em><b>Ui Flat Alignment</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 UiFlatAlignment get(int value) {
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiFormLayout.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiFormLayout.java
index aeaab78..07066c1 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiFormLayout.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiFormLayout.java
@@ -19,10 +19,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiFormLayout#getContents <em>Contents</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiFormLayout()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiFormLayoutAssigment.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiFormLayoutAssigment.java
index f7ea417..2d6ae53 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiFormLayoutAssigment.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiFormLayoutAssigment.java
@@ -18,10 +18,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiFormLayoutAssigment#getElement <em>Element</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiFormLayoutAssigment()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiGridLayout.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiGridLayout.java
index 7bb506a..09895d5 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiGridLayout.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiGridLayout.java
@@ -19,11 +19,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiGridLayout#getContents <em>Contents</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiGridLayout#getColumns <em>Columns</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiGridLayout()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiGridLayoutAssigment.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiGridLayoutAssigment.java
index f69014c..3e68193 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiGridLayoutAssigment.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiGridLayoutAssigment.java
@@ -18,13 +18,13 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiGridLayoutAssigment#getElement <em>Element</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiGridLayoutAssigment#getFrom <em>From</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiGridLayoutAssigment#getTo <em>To</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiGridLayoutAssigment#getAlignment <em>Alignment</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiGridLayoutAssigment()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiHorizontalButtonGroup.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiHorizontalButtonGroup.java
index 444acb6..f191407 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiHorizontalButtonGroup.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiHorizontalButtonGroup.java
@@ -19,10 +19,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiHorizontalButtonGroup#getContents <em>Contents</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiHorizontalButtonGroup()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiHorizontalButtonGroupAssigment.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiHorizontalButtonGroupAssigment.java
index 5e6ed28..35c9f44 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiHorizontalButtonGroupAssigment.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiHorizontalButtonGroupAssigment.java
@@ -18,10 +18,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiHorizontalButtonGroupAssigment#getElement <em>Element</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiHorizontalButtonGroupAssigment()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiHorizontalLayout.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiHorizontalLayout.java
index 8b4f16f..4a5d2a5 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiHorizontalLayout.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiHorizontalLayout.java
@@ -19,10 +19,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiHorizontalLayout#getContents <em>Contents</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiHorizontalLayout()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiHorizontalLayoutAssigment.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiHorizontalLayoutAssigment.java
index fa6d399..331ddaa 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiHorizontalLayoutAssigment.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiHorizontalLayoutAssigment.java
@@ -18,11 +18,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiHorizontalLayoutAssigment#getElement <em>Element</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiHorizontalLayoutAssigment#getAlignment <em>Alignment</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiHorizontalLayoutAssigment()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiI18nInfo.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiI18nInfo.java
index 3bff72f..db7ab5f 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiI18nInfo.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiI18nInfo.java
@@ -19,10 +19,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiI18nInfo#getKey <em>Key</em>}</li>
+ *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiI18nInfo#isNoCaption <em>No Caption</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiI18nInfo()
  * @model
@@ -55,4 +56,30 @@
 	 */
 	void setKey(String value);
 
+	/**
+	 * Returns the value of the '<em><b>No Caption</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>No Caption</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>No Caption</em>' attribute.
+	 * @see #setNoCaption(boolean)
+	 * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiI18nInfo_NoCaption()
+	 * @model
+	 * @generated
+	 */
+	boolean isNoCaption();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.ecview.semantic.uimodel.UiI18nInfo#isNoCaption <em>No Caption</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>No Caption</em>' attribute.
+	 * @see #isNoCaption()
+	 * @generated
+	 */
+	void setNoCaption(boolean value);
+
 } // UiI18nInfo
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiI18nInfoable.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiI18nInfoable.java
index 0795aba..48eed93 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiI18nInfoable.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiI18nInfoable.java
@@ -19,10 +19,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiI18nInfoable#getI18nInfo <em>I1 8n Info</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiI18nInfoable()
  * @model interface="true" abstract="true"
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiIDEView.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiIDEView.java
index 261cfa3..9076fac 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiIDEView.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiIDEView.java
@@ -20,10 +20,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiIDEView#getExposedActions <em>Exposed Actions</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiIDEView()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiImage.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiImage.java
index d2036b3..0f5e134 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiImage.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiImage.java
@@ -18,10 +18,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiImage#getValue <em>Value</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiImage()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiImports.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiImports.java
deleted file mode 100644
index 98a32bb..0000000
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiImports.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf, Austria), 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:
- *         Florian Pirchner - Initial implementation
- */
-package org.eclipse.osbp.ecview.semantic.uimodel;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Ui Imports</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiImports#getImportedNamespace <em>Imported Namespace</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiImports()
- * @model
- * @generated
- */
-public interface UiImports extends UiNamedElement {
-	/**
-	 * Returns the value of the '<em><b>Imported Namespace</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Imported Namespace</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * 
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Imported Namespace</em>' attribute.
-	 * @see #setImportedNamespace(String)
-	 * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiImports_ImportedNamespace()
-	 * @model required="true"
-	 * @generated
-	 */
-	String getImportedNamespace();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.osbp.ecview.semantic.uimodel.UiImports#getImportedNamespace <em>Imported Namespace</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Imported Namespace</em>' attribute.
-	 * @see #getImportedNamespace()
-	 * @generated
-	 */
-	void setImportedNamespace(String value);
-
-} // UiImports
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiLayout.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiLayout.java
index 87ba30f..289feb2 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiLayout.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiLayout.java
@@ -19,11 +19,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiLayout#isAutowire <em>Autowire</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiLayout#getAutoWireSource <em>Auto Wire Source</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiLayout()
  * @model interface="true" abstract="true"
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiList.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiList.java
index cac116b..5ac51f8 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiList.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiList.java
@@ -20,13 +20,13 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiList#getSelectionType <em>Selection Type</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiList#getItemImageProperty <em>Item Image Property</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiList#getItemCaptionProperty <em>Item Caption Property</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiList#getDescriptionProperty <em>Description Property</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiList()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMaskedDecimalField.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMaskedDecimalField.java
index 6fdd4c5..d76a543 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMaskedDecimalField.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMaskedDecimalField.java
@@ -10,10 +10,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiMaskedDecimalField#getMask <em>Mask</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiMaskedDecimalField()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMaskedTextField.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMaskedTextField.java
index 59e4cdc..c992931 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMaskedTextField.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMaskedTextField.java
@@ -10,10 +10,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiMaskedTextField#getMask <em>Mask</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiMaskedTextField()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMaxLengthValidator.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMaxLengthValidator.java
index dd8938b..b2b4fbb 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMaxLengthValidator.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMaxLengthValidator.java
@@ -18,11 +18,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiMaxLengthValidator#getMaxLength <em>Max Length</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiMaxLengthValidator#getErrorCode <em>Error Code</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiMaxLengthValidator()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMinLengthValidator.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMinLengthValidator.java
index 1ae4727..8822e3a 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMinLengthValidator.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMinLengthValidator.java
@@ -18,11 +18,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiMinLengthValidator#getMinLength <em>Min Length</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiMinLengthValidator#getErrorCode <em>Error Code</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiMinLengthValidator()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMobileNavBarAction.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMobileNavBarAction.java
index f561d0b..6d55a58 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMobileNavBarAction.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMobileNavBarAction.java
@@ -19,12 +19,12 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavBarAction#getActionReference <em>Action Reference</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavBarAction#getActionID <em>Action ID</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavBarAction#getIconName <em>Icon Name</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiMobileNavBarAction()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMobileNavigationButton.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMobileNavigationButton.java
index af7eb03..f4914ad 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMobileNavigationButton.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMobileNavigationButton.java
@@ -18,11 +18,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationButton#getTargetPage <em>Target Page</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationButton#getTargetPageAlias <em>Target Page Alias</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiMobileNavigationButton()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMobileNavigationCommand.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMobileNavigationCommand.java
index cbfcd82..dd2623f 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMobileNavigationCommand.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMobileNavigationCommand.java
@@ -18,11 +18,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationCommand#getTargetPage <em>Target Page</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationCommand#getTargetPageAlias <em>Target Page Alias</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiMobileNavigationCommand()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMobileNavigationPage.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMobileNavigationPage.java
index c74ebc4..21b64ea 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMobileNavigationPage.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMobileNavigationPage.java
@@ -20,11 +20,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationPage#getContents <em>Contents</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationPage#getBarActions <em>Bar Actions</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiMobileNavigationPage()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMobileNavigationPageAssignment.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMobileNavigationPageAssignment.java
index 6fa2808..fd1c83a 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMobileNavigationPageAssignment.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMobileNavigationPageAssignment.java
@@ -18,11 +18,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationPageAssignment#getElement <em>Element</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationPageAssignment#getAlignment <em>Alignment</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiMobileNavigationPageAssignment()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMobileNavigationRoot.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMobileNavigationRoot.java
index 7b654ac..c0ba689 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMobileNavigationRoot.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMobileNavigationRoot.java
@@ -19,10 +19,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationRoot#getContents <em>Contents</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiMobileNavigationRoot()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMobileNavigationRootAssigment.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMobileNavigationRootAssigment.java
index d17e2d3..b152491 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMobileNavigationRootAssigment.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMobileNavigationRootAssigment.java
@@ -18,10 +18,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationRootAssigment#getElement <em>Element</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiMobileNavigationRootAssigment()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMobileSearchPanel.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMobileSearchPanel.java
index 2a6fe4f..f6f3b75 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMobileSearchPanel.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMobileSearchPanel.java
@@ -19,10 +19,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileSearchPanel#getContents <em>Contents</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiMobileSearchPanel()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMobileTabAssignment.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMobileTabAssignment.java
index 0beb10e..dda849e 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMobileTabAssignment.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMobileTabAssignment.java
@@ -18,10 +18,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileTabAssignment#getElement <em>Element</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiMobileTabAssignment()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMobileTabSheet.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMobileTabSheet.java
index 970d47d..7a61479 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMobileTabSheet.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiMobileTabSheet.java
@@ -20,10 +20,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileTabSheet#getTabs <em>Tabs</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiMobileTabSheet()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiModel.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiModel.java
index e6979c1..648922b 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiModel.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiModel.java
@@ -11,6 +11,7 @@
 package org.eclipse.osbp.ecview.semantic.uimodel;
 
 import org.eclipse.emf.common.util.EList;
+import org.eclipse.xtext.xtype.XImportSection;
 
 /**
  * <!-- begin-user-doc -->
@@ -19,12 +20,12 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiModel#getPackageName <em>Package Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiModel#getRoots <em>Roots</em>}</li>
- *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiModel#getImports <em>Imports</em>}</li>
+ *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiModel#getImportSection <em>Import Section</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiModel()
  * @model
@@ -74,19 +75,29 @@
 	EList<UiRootElements> getRoots();
 
 	/**
-	 * Returns the value of the '<em><b>Imports</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.osbp.ecview.semantic.uimodel.UiImports}.
+	 * Returns the value of the '<em><b>Import Section</b></em>' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <p>
-	 * If the meaning of the '<em>Imports</em>' containment reference list isn't clear,
+	 * If the meaning of the '<em>Import Section</em>' reference isn't clear,
 	 * there really should be more of a description here...
-	 * 
+	 * </p>
 	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Imports</em>' containment reference list.
-	 * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiModel_Imports()
+	 * @return the value of the '<em>Import Section</em>' containment reference.
+	 * @see #setImportSection(XImportSection)
+	 * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiModel_ImportSection()
 	 * @model containment="true" resolveProxies="true"
 	 * @generated
 	 */
-	EList<UiImports> getImports();
+	XImportSection getImportSection();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.ecview.semantic.uimodel.UiModel#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);
 
 } // UiModel
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiModelFactory.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiModelFactory.java
index 2e92da8..a05648d 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiModelFactory.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiModelFactory.java
@@ -39,15 +39,6 @@
 	UiModel createUiModel();
 
 	/**
-	 * Returns a new object of class '<em>Ui Imports</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Ui Imports</em>'.
-	 * @generated
-	 */
-	UiImports createUiImports();
-
-	/**
 	 * Returns a new object of class '<em>Ui Context</em>'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -102,6 +93,15 @@
 	UiIDEView createUiIDEView();
 
 	/**
+	 * Returns a new object of class '<em>Ui Display View</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Ui Display View</em>'.
+	 * @generated
+	 */
+	UiDisplayView createUiDisplayView();
+
+	/**
 	 * Returns a new object of class '<em>Ui Mobile View</em>'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiModelPackage.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiModelPackage.java
index 192bbb3..039d9b3 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiModelPackage.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiModelPackage.java
@@ -148,13 +148,13 @@
 	int UI_MODEL__ROOTS = UI_NAMED_ELEMENT_FEATURE_COUNT + 1;
 
 	/**
-	 * The feature id for the '<em><b>Imports</b></em>' containment reference list.
+	 * The feature id for the '<em><b>Import Section</b></em>' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int UI_MODEL__IMPORTS = UI_NAMED_ELEMENT_FEATURE_COUNT + 2;
+	int UI_MODEL__IMPORT_SECTION = UI_NAMED_ELEMENT_FEATURE_COUNT + 2;
 
 	/**
 	 * The number of structural features of the '<em>Ui Model</em>' class.
@@ -166,52 +166,6 @@
 	int UI_MODEL_FEATURE_COUNT = UI_NAMED_ELEMENT_FEATURE_COUNT + 3;
 
 	/**
-	 * The meta object id for the '{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiImportsImpl <em>Ui Imports</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.osbp.ecview.semantic.uimodel.impl.UiImportsImpl
-	 * @see org.eclipse.osbp.ecview.semantic.uimodel.impl.UiModelPackageImpl#getUiImports()
-	 * @generated
-	 */
-	int UI_IMPORTS = 2;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int UI_IMPORTS__ID = UI_NAMED_ELEMENT__ID;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int UI_IMPORTS__NAME = UI_NAMED_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Imported Namespace</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int UI_IMPORTS__IMPORTED_NAMESPACE = UI_NAMED_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>Ui Imports</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int UI_IMPORTS_FEATURE_COUNT = UI_NAMED_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
 	 * The meta object id for the '{@link org.eclipse.osbp.ecview.semantic.uimodel.UiRootElements <em>Ui Root Elements</em>}' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -256,7 +210,7 @@
 	 * @see org.eclipse.osbp.ecview.semantic.uimodel.impl.UiModelPackageImpl#getUiContext()
 	 * @generated
 	 */
-	int UI_CONTEXT = 3;
+	int UI_CONTEXT = 2;
 
 	/**
 	 * The feature id for the '<em><b>Id</b></em>' attribute.
@@ -329,7 +283,7 @@
 	 * @see org.eclipse.osbp.ecview.semantic.uimodel.impl.UiModelPackageImpl#getUiExposedAction()
 	 * @generated
 	 */
-	int UI_EXPOSED_ACTION = 4;
+	int UI_EXPOSED_ACTION = 3;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiViewImpl <em>Ui View</em>}' class.
@@ -339,7 +293,7 @@
 	 * @see org.eclipse.osbp.ecview.semantic.uimodel.impl.UiModelPackageImpl#getUiView()
 	 * @generated
 	 */
-	int UI_VIEW = 6;
+	int UI_VIEW = 5;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiIDEViewImpl <em>Ui IDE View</em>}' class.
@@ -349,7 +303,7 @@
 	 * @see org.eclipse.osbp.ecview.semantic.uimodel.impl.UiModelPackageImpl#getUiIDEView()
 	 * @generated
 	 */
-	int UI_IDE_VIEW = 9;
+	int UI_IDE_VIEW = 8;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiPointImpl <em>Ui Point</em>}' class.
@@ -409,7 +363,7 @@
 	 * @see org.eclipse.osbp.ecview.semantic.uimodel.impl.UiModelPackageImpl#getUiViewSet()
 	 * @generated
 	 */
-	int UI_VIEW_SET = 5;
+	int UI_VIEW_SET = 4;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileViewImpl <em>Ui Mobile View</em>}' class.
@@ -658,7 +612,7 @@
 	 * @see org.eclipse.osbp.ecview.semantic.uimodel.impl.UiModelPackageImpl#getUiDialog()
 	 * @generated
 	 */
-	int UI_DIALOG = 7;
+	int UI_DIALOG = 6;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.osbp.ecview.semantic.uimodel.UiField <em>Ui Field</em>}' class.
@@ -698,7 +652,7 @@
 	 * @see org.eclipse.osbp.ecview.semantic.uimodel.impl.UiModelPackageImpl#getUiDialogAssignment()
 	 * @generated
 	 */
-	int UI_DIALOG_ASSIGNMENT = 8;
+	int UI_DIALOG_ASSIGNMENT = 7;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiNestedFieldImpl <em>Ui Nested Field</em>}' class.
@@ -1774,6 +1728,151 @@
 	int UI_IDE_VIEW_FEATURE_COUNT = UI_VIEW_FEATURE_COUNT + 1;
 
 	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiDisplayViewImpl <em>Ui Display View</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.ecview.semantic.uimodel.impl.UiDisplayViewImpl
+	 * @see org.eclipse.osbp.ecview.semantic.uimodel.impl.UiModelPackageImpl#getUiDisplayView()
+	 * @generated
+	 */
+	int UI_DISPLAY_VIEW = 9;
+
+	/**
+	 * The feature id for the '<em><b>Id</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UI_DISPLAY_VIEW__ID = UI_IDE_VIEW__ID;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UI_DISPLAY_VIEW__NAME = UI_IDE_VIEW__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Bean Slots</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UI_DISPLAY_VIEW__BEAN_SLOTS = UI_IDE_VIEW__BEAN_SLOTS;
+
+	/**
+	 * The feature id for the '<em><b>Binding Endpoint Alias</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UI_DISPLAY_VIEW__BINDING_ENDPOINT_ALIAS = UI_IDE_VIEW__BINDING_ENDPOINT_ALIAS;
+
+	/**
+	 * The feature id for the '<em><b>Bindings</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UI_DISPLAY_VIEW__BINDINGS = UI_IDE_VIEW__BINDINGS;
+
+	/**
+	 * The feature id for the '<em><b>Shared State Group</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UI_DISPLAY_VIEW__SHARED_STATE_GROUP = UI_IDE_VIEW__SHARED_STATE_GROUP;
+
+	/**
+	 * The feature id for the '<em><b>Processor Assignments</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UI_DISPLAY_VIEW__PROCESSOR_ASSIGNMENTS = UI_IDE_VIEW__PROCESSOR_ASSIGNMENTS;
+
+	/**
+	 * The feature id for the '<em><b>Jvm Type</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UI_DISPLAY_VIEW__JVM_TYPE = UI_IDE_VIEW__JVM_TYPE;
+
+	/**
+	 * The feature id for the '<em><b>View Set</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UI_DISPLAY_VIEW__VIEW_SET = UI_IDE_VIEW__VIEW_SET;
+
+	/**
+	 * The feature id for the '<em><b>Content</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UI_DISPLAY_VIEW__CONTENT = UI_IDE_VIEW__CONTENT;
+
+	/**
+	 * The feature id for the '<em><b>Content Alignment</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UI_DISPLAY_VIEW__CONTENT_ALIGNMENT = UI_IDE_VIEW__CONTENT_ALIGNMENT;
+
+	/**
+	 * The feature id for the '<em><b>Validator Assignments</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UI_DISPLAY_VIEW__VALIDATOR_ASSIGNMENTS = UI_IDE_VIEW__VALIDATOR_ASSIGNMENTS;
+
+	/**
+	 * The feature id for the '<em><b>View Category</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UI_DISPLAY_VIEW__VIEW_CATEGORY = UI_IDE_VIEW__VIEW_CATEGORY;
+
+	/**
+	 * The feature id for the '<em><b>Exposed Actions</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UI_DISPLAY_VIEW__EXPOSED_ACTIONS = UI_IDE_VIEW__EXPOSED_ACTIONS;
+
+	/**
+	 * The number of structural features of the '<em>Ui Display View</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UI_DISPLAY_VIEW_FEATURE_COUNT = UI_IDE_VIEW_FEATURE_COUNT + 0;
+
+	/**
 	 * The feature id for the '<em><b>Id</b></em>' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -4685,13 +4784,22 @@
 	int UI_TABLE__SORT_ORDER_ASSIGNMENT = UI_FIELD_FEATURE_COUNT + 5;
 
 	/**
+	 * The feature id for the '<em><b>Scroll To Bottom</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UI_TABLE__SCROLL_TO_BOTTOM = UI_FIELD_FEATURE_COUNT + 6;
+
+	/**
 	 * The number of structural features of the '<em>Ui Table</em>' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int UI_TABLE_FEATURE_COUNT = UI_FIELD_FEATURE_COUNT + 6;
+	int UI_TABLE_FEATURE_COUNT = UI_FIELD_FEATURE_COUNT + 7;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiComboBoxImpl <em>Ui Combo Box</em>}' class.
@@ -8759,13 +8867,22 @@
 	int UI_I1_8N_INFO__KEY = 0;
 
 	/**
+	 * The feature id for the '<em><b>No Caption</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UI_I1_8N_INFO__NO_CAPTION = 1;
+
+	/**
 	 * The number of structural features of the '<em>Ui I1 8n Info</em>' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int UI_I1_8N_INFO_FEATURE_COUNT = 1;
+	int UI_I1_8N_INFO_FEATURE_COUNT = 2;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.osbp.ecview.semantic.uimodel.UiI18nInfoable <em>Ui I1 8n Infoable</em>}' class.
@@ -10645,36 +10762,15 @@
 	EReference getUiModel_Roots();
 
 	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.ecview.semantic.uimodel.UiModel#getImports <em>Imports</em>}'.
+	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.ecview.semantic.uimodel.UiModel#getImportSection <em>Import Section</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Imports</em>'.
-	 * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModel#getImports()
+	 * @return the meta object for the containment reference '<em>Import Section</em>'.
+	 * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModel#getImportSection()
 	 * @see #getUiModel()
 	 * @generated
 	 */
-	EReference getUiModel_Imports();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.osbp.ecview.semantic.uimodel.UiImports <em>Ui Imports</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Ui Imports</em>'.
-	 * @see org.eclipse.osbp.ecview.semantic.uimodel.UiImports
-	 * @generated
-	 */
-	EClass getUiImports();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.ecview.semantic.uimodel.UiImports#getImportedNamespace <em>Imported Namespace</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Imported Namespace</em>'.
-	 * @see org.eclipse.osbp.ecview.semantic.uimodel.UiImports#getImportedNamespace()
-	 * @see #getUiImports()
-	 * @generated
-	 */
-	EAttribute getUiImports_ImportedNamespace();
+	EReference getUiModel_ImportSection();
 
 	/**
 	 * Returns the meta object for class '{@link org.eclipse.osbp.ecview.semantic.uimodel.UiContext <em>Ui Context</em>}'.
@@ -10924,6 +11020,16 @@
 	EReference getUiIDEView_ExposedActions();
 
 	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.ecview.semantic.uimodel.UiDisplayView <em>Ui Display View</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Ui Display View</em>'.
+	 * @see org.eclipse.osbp.ecview.semantic.uimodel.UiDisplayView
+	 * @generated
+	 */
+	EClass getUiDisplayView();
+
+	/**
 	 * Returns the meta object for class '{@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileView <em>Ui Mobile View</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -12382,6 +12488,17 @@
 	EReference getUiTable_SortOrderAssignment();
 
 	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.ecview.semantic.uimodel.UiTable#isScrollToBottom <em>Scroll To Bottom</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Scroll To Bottom</em>'.
+	 * @see org.eclipse.osbp.ecview.semantic.uimodel.UiTable#isScrollToBottom()
+	 * @see #getUiTable()
+	 * @generated
+	 */
+	EAttribute getUiTable_ScrollToBottom();
+
+	/**
 	 * Returns the meta object for class '{@link org.eclipse.osbp.ecview.semantic.uimodel.UiComboBox <em>Ui Combo Box</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -13579,6 +13696,17 @@
 	EAttribute getUiI18nInfo_Key();
 
 	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.ecview.semantic.uimodel.UiI18nInfo#isNoCaption <em>No Caption</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>No Caption</em>'.
+	 * @see org.eclipse.osbp.ecview.semantic.uimodel.UiI18nInfo#isNoCaption()
+	 * @see #getUiI18nInfo()
+	 * @generated
+	 */
+	EAttribute getUiI18nInfo_NoCaption();
+
+	/**
 	 * Returns the meta object for class '{@link org.eclipse.osbp.ecview.semantic.uimodel.UiI18nInfoable <em>Ui I1 8n Infoable</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -14374,30 +14502,12 @@
 		EReference UI_MODEL__ROOTS = eINSTANCE.getUiModel_Roots();
 
 		/**
-		 * The meta object literal for the '<em><b>Imports</b></em>' containment reference list feature.
+		 * The meta object literal for the '<em><b>Import Section</b></em>' containment reference feature.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
 		 * @generated
 		 */
-		EReference UI_MODEL__IMPORTS = eINSTANCE.getUiModel_Imports();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiImportsImpl <em>Ui Imports</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.osbp.ecview.semantic.uimodel.impl.UiImportsImpl
-		 * @see org.eclipse.osbp.ecview.semantic.uimodel.impl.UiModelPackageImpl#getUiImports()
-		 * @generated
-		 */
-		EClass UI_IMPORTS = eINSTANCE.getUiImports();
-
-		/**
-		 * The meta object literal for the '<em><b>Imported Namespace</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute UI_IMPORTS__IMPORTED_NAMESPACE = eINSTANCE.getUiImports_ImportedNamespace();
+		EReference UI_MODEL__IMPORT_SECTION = eINSTANCE.getUiModel_ImportSection();
 
 		/**
 		 * The meta object literal for the '{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiContextImpl <em>Ui Context</em>}' class.
@@ -14596,6 +14706,16 @@
 		EReference UI_IDE_VIEW__EXPOSED_ACTIONS = eINSTANCE.getUiIDEView_ExposedActions();
 
 		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiDisplayViewImpl <em>Ui Display View</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.ecview.semantic.uimodel.impl.UiDisplayViewImpl
+		 * @see org.eclipse.osbp.ecview.semantic.uimodel.impl.UiModelPackageImpl#getUiDisplayView()
+		 * @generated
+		 */
+		EClass UI_DISPLAY_VIEW = eINSTANCE.getUiDisplayView();
+
+		/**
 		 * The meta object literal for the '{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileViewImpl <em>Ui Mobile View</em>}' class.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
@@ -15790,6 +15910,14 @@
 		EReference UI_TABLE__SORT_ORDER_ASSIGNMENT = eINSTANCE.getUiTable_SortOrderAssignment();
 
 		/**
+		 * The meta object literal for the '<em><b>Scroll To Bottom</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute UI_TABLE__SCROLL_TO_BOTTOM = eINSTANCE.getUiTable_ScrollToBottom();
+
+		/**
 		 * The meta object literal for the '{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiComboBoxImpl <em>Ui Combo Box</em>}' class.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
@@ -16866,6 +16994,14 @@
 		EAttribute UI_I1_8N_INFO__KEY = eINSTANCE.getUiI18nInfo_Key();
 
 		/**
+		 * The meta object literal for the '<em><b>No Caption</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute UI_I1_8N_INFO__NO_CAPTION = eINSTANCE.getUiI18nInfo_NoCaption();
+
+		/**
 		 * The meta object literal for the '{@link org.eclipse.osbp.ecview.semantic.uimodel.UiI18nInfoable <em>Ui I1 8n Infoable</em>}' class.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiNamedElement.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiNamedElement.java
index d3816e0..bcf7f0d 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiNamedElement.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiNamedElement.java
@@ -19,11 +19,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiNamedElement#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiNamedElement#getName <em>Name</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiNamedElement()
  * @model interface="true" abstract="true"
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiNestedField.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiNestedField.java
index 20e9485..bb50b8f 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiNestedField.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiNestedField.java
@@ -19,11 +19,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiNestedField#getPath <em>Path</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiNestedField#getField <em>Field</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiNestedField()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiNestedProperty.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiNestedProperty.java
index 7f50f7e..c89f194 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiNestedProperty.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiNestedProperty.java
@@ -20,11 +20,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiNestedProperty#getPath <em>Path</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiNestedProperty#getGetter <em>Getter</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiNestedProperty()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiNumericField.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiNumericField.java
index a819b45..b8ac2a7 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiNumericField.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiNumericField.java
@@ -18,11 +18,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiNumericField#isNoGrouping <em>No Grouping</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiNumericField#isNoMarkNegative <em>No Mark Negative</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiNumericField()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiOpenDialogCommand.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiOpenDialogCommand.java
index 9df8eb7..d6b28cc 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiOpenDialogCommand.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiOpenDialogCommand.java
@@ -18,10 +18,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiOpenDialogCommand#getDialog <em>Dialog</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiOpenDialogCommand()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiOptionsGroup.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiOptionsGroup.java
index f4f133c..fcfa6b4 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiOptionsGroup.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiOptionsGroup.java
@@ -19,13 +19,13 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiOptionsGroup#getSelectionType <em>Selection Type</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiOptionsGroup#getItemImageProperty <em>Item Image Property</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiOptionsGroup#getItemCaptionProperty <em>Item Caption Property</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiOptionsGroup#getDescriptionProperty <em>Description Property</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiOptionsGroup()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiPanel.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiPanel.java
index 9c54d6c..81bd0be 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiPanel.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiPanel.java
@@ -18,11 +18,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiPanel#getContent <em>Content</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiPanel#getContentAlignment <em>Content Alignment</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiPanel()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiPathSegment.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiPathSegment.java
index 66854c0..0011b2d 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiPathSegment.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiPathSegment.java
@@ -21,11 +21,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiPathSegment#getPath <em>Path</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiPathSegment#getGetter <em>Getter</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiPathSegment()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiPoint.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiPoint.java
index 0dbf4c6..c4a1afd 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiPoint.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiPoint.java
@@ -19,11 +19,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiPoint#getX <em>X</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiPoint#getY <em>Y</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiPoint()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiPrefixedMaskedTextField.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiPrefixedMaskedTextField.java
index 2a237dc..be049a5 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiPrefixedMaskedTextField.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiPrefixedMaskedTextField.java
@@ -11,11 +11,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiPrefixedMaskedTextField#getMask <em>Mask</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiPrefixedMaskedTextField#getPrefixMasks <em>Prefix Masks</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiPrefixedMaskedTextField()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiRawBindablePathSegment.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiRawBindablePathSegment.java
index 094192c..2ca44e4 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiRawBindablePathSegment.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiRawBindablePathSegment.java
@@ -18,12 +18,12 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiRawBindablePathSegment#getRawBindable <em>Raw Bindable</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiRawBindablePathSegment#getPath <em>Path</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiRawBindablePathSegment#isToParent <em>To Parent</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiRawBindablePathSegment()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiRegexpValidator.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiRegexpValidator.java
index e04a617..fa077c7 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiRegexpValidator.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiRegexpValidator.java
@@ -18,11 +18,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiRegexpValidator#getRegExpression <em>Reg Expression</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiRegexpValidator#getErrorCode <em>Error Code</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiRegexpValidator()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiRemoveFromTableCommand.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiRemoveFromTableCommand.java
index 0a79c06..3ee54be 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiRemoveFromTableCommand.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiRemoveFromTableCommand.java
@@ -18,10 +18,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiRemoveFromTableCommand#getTable <em>Table</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiRemoveFromTableCommand()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiRichTextArea.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiRichTextArea.java
index 6dbf8da..af04dfa 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiRichTextArea.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiRichTextArea.java
@@ -10,10 +10,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiRichTextArea#isAsBlob <em>As Blob</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiRichTextArea()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSearchDialog.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSearchDialog.java
index 9fbb21e..a8e96f7 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSearchDialog.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSearchDialog.java
@@ -20,11 +20,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiSearchDialog#getSearchFields <em>Search Fields</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiSearchDialog#getContent <em>Content</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiSearchDialog()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSearchField.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSearchField.java
index 37669ce..f8f1537 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSearchField.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSearchField.java
@@ -19,10 +19,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiSearchField#getProperty <em>Property</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiSearchField()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSearchPanel.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSearchPanel.java
index 025d747..86bac4e 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSearchPanel.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSearchPanel.java
@@ -19,10 +19,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiSearchPanel#getContents <em>Contents</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiSearchPanel()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSearchWithDialogCommand.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSearchWithDialogCommand.java
index 1147c59..95c32c7 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSearchWithDialogCommand.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSearchWithDialogCommand.java
@@ -18,10 +18,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiSearchWithDialogCommand#getDialog <em>Dialog</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiSearchWithDialogCommand()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSelectionType.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSelectionType.java
index ba27f19..12170bb 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSelectionType.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSelectionType.java
@@ -126,6 +126,8 @@
 	 * Returns the '<em><b>Ui Selection 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 UiSelectionType get(String literal) {
@@ -142,6 +144,8 @@
 	 * Returns the '<em><b>Ui Selection 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 UiSelectionType getByName(String name) {
@@ -158,6 +162,8 @@
 	 * Returns the '<em><b>Ui Selection 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 UiSelectionType get(int value) {
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSendEventCommand.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSendEventCommand.java
index 651678b..b3754a1 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSendEventCommand.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSendEventCommand.java
@@ -18,11 +18,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiSendEventCommand#getEventTopic <em>Event Topic</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiSendEventCommand#isNoAutoTrigger <em>No Auto Trigger</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiSendEventCommand()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSetNewInstanceCommand.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSetNewInstanceCommand.java
index 8d7e35c..8376ed8 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSetNewInstanceCommand.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSetNewInstanceCommand.java
@@ -20,11 +20,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiSetNewInstanceCommand#getTarget <em>Target</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiSetNewInstanceCommand#getJvmType <em>Jvm Type</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiSetNewInstanceCommand()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSortOrder.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSortOrder.java
index 4d8399d..045a750 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSortOrder.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSortOrder.java
@@ -10,11 +10,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiSortOrder#getProperty <em>Property</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiSortOrder#isAsc <em>Asc</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiSortOrder()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSortOrderAssignment.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSortOrderAssignment.java
index 527b9d8..063c4e2 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSortOrderAssignment.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSortOrderAssignment.java
@@ -11,10 +11,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiSortOrderAssignment#getColumns <em>Columns</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiSortOrderAssignment()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSplitpanel.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSplitpanel.java
index 05e411c..8985251 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSplitpanel.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSplitpanel.java
@@ -18,13 +18,13 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiSplitpanel#getFirstContent <em>First Content</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiSplitpanel#getSecondContent <em>Second Content</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiSplitpanel#getSplitPosition <em>Split Position</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiSplitpanel#isHorizontal <em>Horizontal</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiSplitpanel()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSplitpanelAssigment.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSplitpanelAssigment.java
index 97c5a98..94dc03e 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSplitpanelAssigment.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSplitpanelAssigment.java
@@ -18,11 +18,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiSplitpanelAssigment#getElement <em>Element</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiSplitpanelAssigment#getAlignment <em>Alignment</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiSplitpanelAssigment()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSuggestTextField.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSuggestTextField.java
index 99190e3..fd7a325 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSuggestTextField.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiSuggestTextField.java
@@ -12,13 +12,13 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiSuggestTextField#getItemCaptionProperty <em>Item Caption Property</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiSuggestTextField#getItemFilterProperty <em>Item Filter Property</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiSuggestTextField#getItemUUIDProperty <em>Item UUID Property</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiSuggestTextField#isAutoHidePopup <em>Auto Hide Popup</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiSuggestTextField()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiTabAssignment.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiTabAssignment.java
index be4c6df..ec7dc11 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiTabAssignment.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiTabAssignment.java
@@ -18,10 +18,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiTabAssignment#getElement <em>Element</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiTabAssignment()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiTabSheet.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiTabSheet.java
index bd2f0f0..ac86ffd 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiTabSheet.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiTabSheet.java
@@ -20,10 +20,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiTabSheet#getTabs <em>Tabs</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiTabSheet()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiTable.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiTable.java
index d186312..1f4e63e 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiTable.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiTable.java
@@ -20,13 +20,14 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiTable#getColumnAssignment <em>Column Assignment</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiTable#getSelectionType <em>Selection Type</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiTable#getItemImageProperty <em>Item Image Property</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiTable#getSortOrderAssignment <em>Sort Order Assignment</em>}</li>
+ *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiTable#isScrollToBottom <em>Scroll To Bottom</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiTable()
  * @model
@@ -141,4 +142,30 @@
 	 */
 	void setSortOrderAssignment(UiSortOrderAssignment value);
 
+	/**
+	 * Returns the value of the '<em><b>Scroll To Bottom</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Scroll To Bottom</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Scroll To Bottom</em>' attribute.
+	 * @see #setScrollToBottom(boolean)
+	 * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiTable_ScrollToBottom()
+	 * @model
+	 * @generated
+	 */
+	boolean isScrollToBottom();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.ecview.semantic.uimodel.UiTable#isScrollToBottom <em>Scroll To Bottom</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Scroll To Bottom</em>' attribute.
+	 * @see #isScrollToBottom()
+	 * @generated
+	 */
+	void setScrollToBottom(boolean value);
+
 } // UiTable
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiTextField.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiTextField.java
index 8d91cb2..3c1e8da 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiTextField.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiTextField.java
@@ -18,12 +18,12 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiTextField#getMaxLength <em>Max Length</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiTextField#getMinLength <em>Min Length</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiTextField#getRegex <em>Regex</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiTextField()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiTypeProvider.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiTypeProvider.java
index 9be4f0f..7aec77d 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiTypeProvider.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiTypeProvider.java
@@ -20,10 +20,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiTypeProvider#getJvmType <em>Jvm Type</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiTypeProvider()
  * @model interface="true" abstract="true"
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiTypedBindableDef.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiTypedBindableDef.java
index beb43bd..378939f 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiTypedBindableDef.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiTypedBindableDef.java
@@ -19,12 +19,12 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiTypedBindableDef#getRawBindable <em>Raw Bindable</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiTypedBindableDef#getRawBindablePath <em>Raw Bindable Path</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiTypedBindableDef#getMethod <em>Method</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiTypedBindableDef()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiTypedBindableRawType.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiTypedBindableRawType.java
index 62bbfaf..f4cbe02 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiTypedBindableRawType.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiTypedBindableRawType.java
@@ -16,11 +16,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiTypedBindableRawType#getRawBindable <em>Raw Bindable</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiTypedBindableRawType#getRawBindablePath <em>Raw Bindable Path</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiTypedBindableRawType()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiTypedBindableRawTypeAlias.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiTypedBindableRawTypeAlias.java
index 5524a56..5b59f23 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiTypedBindableRawTypeAlias.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiTypedBindableRawTypeAlias.java
@@ -18,11 +18,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiTypedBindableRawTypeAlias#getAlias <em>Alias</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiTypedBindableRawTypeAlias#getType <em>Type</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiTypedBindableRawTypeAlias()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiValidatorAlias.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiValidatorAlias.java
index 9385bac..93b3969 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiValidatorAlias.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiValidatorAlias.java
@@ -18,11 +18,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiValidatorAlias#getAlias <em>Alias</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiValidatorAlias#getValidator <em>Validator</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiValidatorAlias()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiValidatorAssignment.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiValidatorAssignment.java
index 3ab65c7..759d711 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiValidatorAssignment.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiValidatorAssignment.java
@@ -18,12 +18,12 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiValidatorAssignment#getField <em>Field</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiValidatorAssignment#getValidatorDef <em>Validator Def</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiValidatorAssignment#getValidatorAlias <em>Validator Alias</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiValidatorAssignment()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiValidatorDef.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiValidatorDef.java
index 6c6538c..1ac8694 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiValidatorDef.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiValidatorDef.java
@@ -19,11 +19,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiValidatorDef#getValidator <em>Validator</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiValidatorDef#getJvmType <em>Jvm Type</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiValidatorDef()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiVerticalComponentGroup.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiVerticalComponentGroup.java
index bd48b50..b8f267b 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiVerticalComponentGroup.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiVerticalComponentGroup.java
@@ -19,10 +19,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiVerticalComponentGroup#getContents <em>Contents</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiVerticalComponentGroup()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiVerticalComponentGroupAssigment.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiVerticalComponentGroupAssigment.java
index 5ddd991..ffbaf3e 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiVerticalComponentGroupAssigment.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiVerticalComponentGroupAssigment.java
@@ -18,10 +18,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiVerticalComponentGroupAssigment#getElement <em>Element</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiVerticalComponentGroupAssigment()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiVerticalLayout.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiVerticalLayout.java
index a0659ed..2f19826 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiVerticalLayout.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiVerticalLayout.java
@@ -19,10 +19,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiVerticalLayout#getContents <em>Contents</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiVerticalLayout()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiVerticalLayoutAssigment.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiVerticalLayoutAssigment.java
index 39dedee..667d379 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiVerticalLayoutAssigment.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiVerticalLayoutAssigment.java
@@ -18,11 +18,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiVerticalLayoutAssigment#getElement <em>Element</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiVerticalLayoutAssigment#getAlignment <em>Alignment</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiVerticalLayoutAssigment()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiView.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiView.java
index 0363bd6..ed82707 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiView.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiView.java
@@ -22,6 +22,7 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiView#getViewSet <em>View Set</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiView#getContent <em>Content</em>}</li>
@@ -29,7 +30,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiView#getValidatorAssignments <em>Validator Assignments</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiView#getViewCategory <em>View Category</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiView()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiVisibilityProcessable.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiVisibilityProcessable.java
index 82819ad..84496d3 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiVisibilityProcessable.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiVisibilityProcessable.java
@@ -20,10 +20,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiVisibilityProcessable#getProcessorAssignments <em>Processor Assignments</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiVisibilityProcessable()
  * @model abstract="true"
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiVisibilityProcessor.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiVisibilityProcessor.java
index b92ea9f..c79f742 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiVisibilityProcessor.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiVisibilityProcessor.java
@@ -19,13 +19,13 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiVisibilityProcessor#getDataUsed <em>Data Used</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiVisibilityProcessor#getChangeTriggers <em>Change Triggers</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiVisibilityProcessor#getImportedElements <em>Imported Elements</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiVisibilityProcessor#getRule <em>Rule</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiVisibilityProcessor()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiVisibilityProcessorAssignment.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiVisibilityProcessorAssignment.java
index 624dee5..6c6a0e7 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiVisibilityProcessorAssignment.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiVisibilityProcessorAssignment.java
@@ -19,11 +19,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiVisibilityProcessorAssignment#getProcessor <em>Processor</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiVisibilityProcessorAssignment#getProcessorAlias <em>Processor Alias</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiVisibilityProcessorAssignment()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiVisibilityProcessorDef.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiVisibilityProcessorDef.java
index fd6c00f..254b410 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiVisibilityProcessorDef.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiVisibilityProcessorDef.java
@@ -18,10 +18,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiVisibilityProcessorDef#getProcessor <em>Processor</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiVisibilityProcessorDef()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiVisibilityPropertiesAssignment.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiVisibilityPropertiesAssignment.java
index 11579ce..fe2f9d0 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiVisibilityPropertiesAssignment.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiVisibilityPropertiesAssignment.java
@@ -20,10 +20,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiVisibilityPropertiesAssignment#getProperties <em>Properties</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiVisibilityPropertiesAssignment()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiVisibilityProperty.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiVisibilityProperty.java
index 398b55e..c6d6419 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiVisibilityProperty.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiVisibilityProperty.java
@@ -19,11 +19,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiVisibilityProperty#getBindableDef <em>Bindable Def</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiVisibilityProperty#getAssignmentExpression <em>Assignment Expression</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiVisibilityProperty()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiXbaseValidator.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiXbaseValidator.java
index e33405c..63c5f36 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiXbaseValidator.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiXbaseValidator.java
@@ -21,12 +21,12 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiXbaseValidator#getExpression <em>Expression</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiXbaseValidator#getJvmType <em>Jvm Type</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiXbaseValidator#getErrorCodes <em>Error Codes</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiXbaseValidator()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiXbaseVisibilityRule.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiXbaseVisibilityRule.java
index 5b933c1..b05c4ab 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiXbaseVisibilityRule.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/UiXbaseVisibilityRule.java
@@ -19,10 +19,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.UiXbaseVisibilityRule#getExpression <em>Expression</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage#getUiXbaseVisibilityRule()
  * @model
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiActionImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiActionImpl.java
index 0749ad3..94c73a0 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiActionImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiActionImpl.java
@@ -34,6 +34,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiActionImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiActionImpl#getName <em>Name</em>}</li>
@@ -43,7 +44,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiActionImpl#isInvisible <em>Invisible</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiActionImpl#getStyles <em>Styles</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiAddToTableCommandImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiAddToTableCommandImpl.java
index fe4f339..898695c 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiAddToTableCommandImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiAddToTableCommandImpl.java
@@ -29,12 +29,12 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiAddToTableCommandImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiAddToTableCommandImpl#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiAddToTableCommandImpl#getTable <em>Table</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiBeanReferenceFieldImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiBeanReferenceFieldImpl.java
index 8466102..dd4a218 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiBeanReferenceFieldImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiBeanReferenceFieldImpl.java
@@ -42,6 +42,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiBeanReferenceFieldImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiBeanReferenceFieldImpl#getName <em>Name</em>}</li>
@@ -60,7 +61,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiBeanReferenceFieldImpl#getReferenceSourceJvmType <em>Reference Source Jvm Type</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiBeanReferenceFieldImpl#getReferenceSourceField <em>Reference Source Field</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiBeanSlotImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiBeanSlotImpl.java
index 75168b9..36e3a30 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiBeanSlotImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiBeanSlotImpl.java
@@ -27,6 +27,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiBeanSlotImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiBeanSlotImpl#getName <em>Name</em>}</li>
@@ -34,7 +35,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiBeanSlotImpl#getEClass <em>EClass</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiBeanSlotImpl#getEventTopic <em>Event Topic</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiBeanValidationValidatorImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiBeanValidationValidatorImpl.java
index 9dd1960..88e989e 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiBeanValidationValidatorImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiBeanValidationValidatorImpl.java
@@ -35,13 +35,13 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiBeanValidationValidatorImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiBeanValidationValidatorImpl#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiBeanValidationValidatorImpl#getI18nInfo <em>I1 8n Info</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiBeanValidationValidatorImpl#getErrorCode <em>Error Code</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiBindingEndpointAliasImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiBindingEndpointAliasImpl.java
index 7c23106..019755c 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiBindingEndpointAliasImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiBindingEndpointAliasImpl.java
@@ -27,13 +27,13 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiBindingEndpointAliasImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiBindingEndpointAliasImpl#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiBindingEndpointAliasImpl#getAlias <em>Alias</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiBindingEndpointAliasImpl#getEndpoint <em>Endpoint</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiBindingEndpointAssignmentImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiBindingEndpointAssignmentImpl.java
index fb3e35a..e5298ed 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiBindingEndpointAssignmentImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiBindingEndpointAssignmentImpl.java
@@ -29,6 +29,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiBindingEndpointAssignmentImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiBindingEndpointAssignmentImpl#getName <em>Name</em>}</li>
@@ -36,7 +37,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiBindingEndpointAssignmentImpl#getPath <em>Path</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiBindingEndpointAssignmentImpl#getTypedBindableAlias <em>Typed Bindable Alias</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiBindingImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiBindingImpl.java
index 8cf5966..ef5eb1a 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiBindingImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiBindingImpl.java
@@ -28,6 +28,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiBindingImpl#getSource <em>Source</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiBindingImpl#getSourceAlias <em>Source Alias</em>}</li>
@@ -37,7 +38,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiBindingImpl#getTargetAlias <em>Target Alias</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiBindingImpl#isListBinding <em>List Binding</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiBrowserImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiBrowserImpl.java
index 9e1fd04..02db2ba 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiBrowserImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiBrowserImpl.java
@@ -38,6 +38,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiBrowserImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiBrowserImpl#getName <em>Name</em>}</li>
@@ -48,7 +49,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiBrowserImpl#getStyles <em>Styles</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiBrowserImpl#getValidators <em>Validators</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiButtonImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiButtonImpl.java
index 642b800..e4daf39 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiButtonImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiButtonImpl.java
@@ -19,8 +19,6 @@
  * <!-- begin-user-doc -->
  * An implementation of the model object '<em><b>Ui Button</b></em>'.
  * <!-- end-user-doc -->
- * <p>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiChangeTriggerImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiChangeTriggerImpl.java
index e8503a2..cc8aa37 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiChangeTriggerImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiChangeTriggerImpl.java
@@ -28,12 +28,12 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiChangeTriggerImpl#getEndpoint <em>Endpoint</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiChangeTriggerImpl#getEndpointAlias <em>Endpoint Alias</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiChangeTriggerImpl#getAlias <em>Alias</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiCheckBoxImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiCheckBoxImpl.java
index b938f9f..4492887 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiCheckBoxImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiCheckBoxImpl.java
@@ -36,6 +36,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiCheckBoxImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiCheckBoxImpl#getName <em>Name</em>}</li>
@@ -46,7 +47,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiCheckBoxImpl#getStyles <em>Styles</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiCheckBoxImpl#getValidators <em>Validators</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiColumnImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiColumnImpl.java
index 30b9c69..806cd72 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiColumnImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiColumnImpl.java
@@ -36,6 +36,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiColumnImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiColumnImpl#getName <em>Name</em>}</li>
@@ -54,7 +55,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiColumnImpl#getExpandRatio <em>Expand Ratio</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiColumnImpl#getProperty <em>Property</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiColumnsAssignmentImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiColumnsAssignmentImpl.java
index d6f8d23..47ee313 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiColumnsAssignmentImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiColumnsAssignmentImpl.java
@@ -37,6 +37,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiColumnsAssignmentImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiColumnsAssignmentImpl#getName <em>Name</em>}</li>
@@ -48,7 +49,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiColumnsAssignmentImpl#getValidators <em>Validators</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiColumnsAssignmentImpl#getColumns <em>Columns</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiComboBoxImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiComboBoxImpl.java
index 94f6319..5d847cf 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiComboBoxImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiComboBoxImpl.java
@@ -42,6 +42,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiComboBoxImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiComboBoxImpl#getName <em>Name</em>}</li>
@@ -57,7 +58,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiComboBoxImpl#getItemImageProperty <em>Item Image Property</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiComboBoxImpl#getDescriptionProperty <em>Description Property</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiCommandBindableDefImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiCommandBindableDefImpl.java
index de213c5..766a0d7 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiCommandBindableDefImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiCommandBindableDefImpl.java
@@ -26,12 +26,12 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiCommandBindableDefImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiCommandBindableDefImpl#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiCommandBindableDefImpl#getCommand <em>Command</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiContextImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiContextImpl.java
index 65badea..892d94a 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiContextImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiContextImpl.java
@@ -32,6 +32,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiContextImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiContextImpl#getName <em>Name</em>}</li>
@@ -40,7 +41,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiContextImpl#getBindings <em>Bindings</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiContextImpl#getSharedStateGroup <em>Shared State Group</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiDateFieldImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiDateFieldImpl.java
index e15c1c6..8be655b 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiDateFieldImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiDateFieldImpl.java
@@ -39,6 +39,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiDateFieldImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiDateFieldImpl#getName <em>Name</em>}</li>
@@ -51,7 +52,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiDateFieldImpl#getDateFormat <em>Date Format</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiDateFieldImpl#getResolution <em>Resolution</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiDecimalFieldImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiDecimalFieldImpl.java
index 6f98941..0b2e3e8 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiDecimalFieldImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiDecimalFieldImpl.java
@@ -37,6 +37,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiDecimalFieldImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiDecimalFieldImpl#getName <em>Name</em>}</li>
@@ -50,7 +51,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiDecimalFieldImpl#isNoGrouping <em>No Grouping</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiDecimalFieldImpl#isNoMarkNegative <em>No Mark Negative</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiDialogAssignmentImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiDialogAssignmentImpl.java
index 91bcdaa..8d2d860 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiDialogAssignmentImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiDialogAssignmentImpl.java
@@ -26,12 +26,12 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiDialogAssignmentImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiDialogAssignmentImpl#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiDialogAssignmentImpl#getElement <em>Element</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiDialogImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiDialogImpl.java
index 2ec6994..ea30c22 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiDialogImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiDialogImpl.java
@@ -37,6 +37,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiDialogImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiDialogImpl#getName <em>Name</em>}</li>
@@ -48,7 +49,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiDialogImpl#getJvmType <em>Jvm Type</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiDialogImpl#getContent <em>Content</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiDialogSearchFieldAssignmentImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiDialogSearchFieldAssignmentImpl.java
index d5e1531..0e8cb32 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiDialogSearchFieldAssignmentImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiDialogSearchFieldAssignmentImpl.java
@@ -26,12 +26,12 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiDialogSearchFieldAssignmentImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiDialogSearchFieldAssignmentImpl#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiDialogSearchFieldAssignmentImpl#getElement <em>Element</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiErrorCodeImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiErrorCodeImpl.java
index dd5a69b..58c8fb6 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiErrorCodeImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiErrorCodeImpl.java
@@ -26,12 +26,12 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiErrorCodeImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiErrorCodeImpl#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiErrorCodeImpl#getDefaultMessage <em>Default Message</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiExposedActionImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiExposedActionImpl.java
index c54b676..b068700 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiExposedActionImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiExposedActionImpl.java
@@ -24,6 +24,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiExposedActionImpl#getActionReference <em>Action Reference</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiExposedActionImpl#getActionID <em>Action ID</em>}</li>
@@ -31,7 +32,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiExposedActionImpl#isCheckDirty <em>Check Dirty</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiExposedActionImpl#getExternalCommandId <em>External Command Id</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiFormLayoutAssigmentImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiFormLayoutAssigmentImpl.java
index 4130126..f222b93 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiFormLayoutAssigmentImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiFormLayoutAssigmentImpl.java
@@ -26,12 +26,12 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiFormLayoutAssigmentImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiFormLayoutAssigmentImpl#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiFormLayoutAssigmentImpl#getElement <em>Element</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiFormLayoutImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiFormLayoutImpl.java
index 7533746..c6a5871 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiFormLayoutImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiFormLayoutImpl.java
@@ -35,6 +35,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiFormLayoutImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiFormLayoutImpl#getName <em>Name</em>}</li>
@@ -47,7 +48,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiFormLayoutImpl#getAutoWireSource <em>Auto Wire Source</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiFormLayoutImpl#getContents <em>Contents</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiGridLayoutAssigmentImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiGridLayoutAssigmentImpl.java
index 7c91ad2..f501bf3 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiGridLayoutAssigmentImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiGridLayoutAssigmentImpl.java
@@ -28,6 +28,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiGridLayoutAssigmentImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiGridLayoutAssigmentImpl#getName <em>Name</em>}</li>
@@ -36,7 +37,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiGridLayoutAssigmentImpl#getTo <em>To</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiGridLayoutAssigmentImpl#getAlignment <em>Alignment</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiGridLayoutImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiGridLayoutImpl.java
index 572e3ef..4ae85d2 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiGridLayoutImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiGridLayoutImpl.java
@@ -35,6 +35,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiGridLayoutImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiGridLayoutImpl#getName <em>Name</em>}</li>
@@ -48,7 +49,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiGridLayoutImpl#getContents <em>Contents</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiGridLayoutImpl#getColumns <em>Columns</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiHorizontalButtonGroupAssigmentImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiHorizontalButtonGroupAssigmentImpl.java
index 9bda1f2..cc2aed9 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiHorizontalButtonGroupAssigmentImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiHorizontalButtonGroupAssigmentImpl.java
@@ -26,12 +26,12 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiHorizontalButtonGroupAssigmentImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiHorizontalButtonGroupAssigmentImpl#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiHorizontalButtonGroupAssigmentImpl#getElement <em>Element</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiHorizontalButtonGroupImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiHorizontalButtonGroupImpl.java
index 8f05d1f..46c019a 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiHorizontalButtonGroupImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiHorizontalButtonGroupImpl.java
@@ -36,6 +36,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiHorizontalButtonGroupImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiHorizontalButtonGroupImpl#getName <em>Name</em>}</li>
@@ -48,7 +49,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiHorizontalButtonGroupImpl#getAutoWireSource <em>Auto Wire Source</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiHorizontalButtonGroupImpl#getContents <em>Contents</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiHorizontalLayoutAssigmentImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiHorizontalLayoutAssigmentImpl.java
index a21fec9..e5988f6 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiHorizontalLayoutAssigmentImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiHorizontalLayoutAssigmentImpl.java
@@ -27,13 +27,13 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiHorizontalLayoutAssigmentImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiHorizontalLayoutAssigmentImpl#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiHorizontalLayoutAssigmentImpl#getElement <em>Element</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiHorizontalLayoutAssigmentImpl#getAlignment <em>Alignment</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiHorizontalLayoutImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiHorizontalLayoutImpl.java
index 76f2c75..1a81d38 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiHorizontalLayoutImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiHorizontalLayoutImpl.java
@@ -37,6 +37,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiHorizontalLayoutImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiHorizontalLayoutImpl#getName <em>Name</em>}</li>
@@ -49,7 +50,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiHorizontalLayoutImpl#getAutoWireSource <em>Auto Wire Source</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiHorizontalLayoutImpl#getContents <em>Contents</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiI18nInfoImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiI18nInfoImpl.java
index 6eac8ec..5314e0d 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiI18nInfoImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiI18nInfoImpl.java
@@ -26,10 +26,11 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiI18nInfoImpl#getKey <em>Key</em>}</li>
+ *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiI18nInfoImpl#isNoCaption <em>No Caption</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
@@ -55,6 +56,26 @@
 	protected String key = KEY_EDEFAULT;
 
 	/**
+	 * The default value of the '{@link #isNoCaption() <em>No Caption</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isNoCaption()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean NO_CAPTION_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isNoCaption() <em>No Caption</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isNoCaption()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean noCaption = NO_CAPTION_EDEFAULT;
+
+	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
@@ -99,11 +120,34 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	public boolean isNoCaption() {
+		return noCaption;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setNoCaption(boolean newNoCaption) {
+		boolean oldNoCaption = noCaption;
+		noCaption = newNoCaption;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, UiModelPackage.UI_I1_8N_INFO__NO_CAPTION, oldNoCaption, noCaption));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case UiModelPackage.UI_I1_8N_INFO__KEY:
 				return getKey();
+			case UiModelPackage.UI_I1_8N_INFO__NO_CAPTION:
+				return isNoCaption();
 		}
 		return super.eGet(featureID, resolve, coreType);
 	}
@@ -119,6 +163,9 @@
 			case UiModelPackage.UI_I1_8N_INFO__KEY:
 				setKey((String)newValue);
 				return;
+			case UiModelPackage.UI_I1_8N_INFO__NO_CAPTION:
+				setNoCaption((Boolean)newValue);
+				return;
 		}
 		super.eSet(featureID, newValue);
 	}
@@ -134,6 +181,9 @@
 			case UiModelPackage.UI_I1_8N_INFO__KEY:
 				setKey(KEY_EDEFAULT);
 				return;
+			case UiModelPackage.UI_I1_8N_INFO__NO_CAPTION:
+				setNoCaption(NO_CAPTION_EDEFAULT);
+				return;
 		}
 		super.eUnset(featureID);
 	}
@@ -148,6 +198,8 @@
 		switch (featureID) {
 			case UiModelPackage.UI_I1_8N_INFO__KEY:
 				return KEY_EDEFAULT == null ? key != null : !KEY_EDEFAULT.equals(key);
+			case UiModelPackage.UI_I1_8N_INFO__NO_CAPTION:
+				return noCaption != NO_CAPTION_EDEFAULT;
 		}
 		return super.eIsSet(featureID);
 	}
@@ -164,6 +216,8 @@
 		StringBuffer result = new StringBuffer(super.toString());
 		result.append(" (key: ");
 		result.append(key);
+		result.append(", noCaption: ");
+		result.append(noCaption);
 		result.append(')');
 		return result.toString();
 	}
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiIDEViewImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiIDEViewImpl.java
index ad03a36..2d02693 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiIDEViewImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiIDEViewImpl.java
@@ -27,10 +27,10 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiIDEViewImpl#getExposedActions <em>Exposed Actions</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiImageImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiImageImpl.java
index 26fe282..30d67f3 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiImageImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiImageImpl.java
@@ -37,6 +37,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiImageImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiImageImpl#getName <em>Name</em>}</li>
@@ -48,7 +49,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiImageImpl#getValidators <em>Validators</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiImageImpl#getValue <em>Value</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiImportsImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiImportsImpl.java
deleted file mode 100644
index 4420ebc..0000000
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiImportsImpl.java
+++ /dev/null
@@ -1,276 +0,0 @@
-/**
- * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf, Austria), 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:
- *         Florian Pirchner - Initial implementation
- */
-package org.eclipse.osbp.ecview.semantic.uimodel.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiImports;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Ui Imports</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiImportsImpl#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiImportsImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiImportsImpl#getImportedNamespace <em>Imported Namespace</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class UiImportsImpl extends MinimalEObjectImpl.Container implements UiImports {
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * 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 #getImportedNamespace() <em>Imported Namespace</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getImportedNamespace()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String IMPORTED_NAMESPACE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getImportedNamespace() <em>Imported Namespace</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getImportedNamespace()
-	 * @generated
-	 * @ordered
-	 */
-	protected String importedNamespace = IMPORTED_NAMESPACE_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected UiImportsImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return UiModelPackage.Literals.UI_IMPORTS;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UiModelPackage.UI_IMPORTS__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- 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, UiModelPackage.UI_IMPORTS__NAME, oldName, name));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getImportedNamespace() {
-		return importedNamespace;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setImportedNamespace(String newImportedNamespace) {
-		String oldImportedNamespace = importedNamespace;
-		importedNamespace = newImportedNamespace;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UiModelPackage.UI_IMPORTS__IMPORTED_NAMESPACE, oldImportedNamespace, importedNamespace));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UiModelPackage.UI_IMPORTS__ID:
-				return getId();
-			case UiModelPackage.UI_IMPORTS__NAME:
-				return getName();
-			case UiModelPackage.UI_IMPORTS__IMPORTED_NAMESPACE:
-				return getImportedNamespace();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UiModelPackage.UI_IMPORTS__ID:
-				setId((String)newValue);
-				return;
-			case UiModelPackage.UI_IMPORTS__NAME:
-				setName((String)newValue);
-				return;
-			case UiModelPackage.UI_IMPORTS__IMPORTED_NAMESPACE:
-				setImportedNamespace((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UiModelPackage.UI_IMPORTS__ID:
-				setId(ID_EDEFAULT);
-				return;
-			case UiModelPackage.UI_IMPORTS__NAME:
-				setName(NAME_EDEFAULT);
-				return;
-			case UiModelPackage.UI_IMPORTS__IMPORTED_NAMESPACE:
-				setImportedNamespace(IMPORTED_NAMESPACE_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UiModelPackage.UI_IMPORTS__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-			case UiModelPackage.UI_IMPORTS__NAME:
-				return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-			case UiModelPackage.UI_IMPORTS__IMPORTED_NAMESPACE:
-				return IMPORTED_NAMESPACE_EDEFAULT == null ? importedNamespace != null : !IMPORTED_NAMESPACE_EDEFAULT.equals(importedNamespace);
-		}
-		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(" (id: ");
-		result.append(id);
-		result.append(", name: ");
-		result.append(name);
-		result.append(", importedNamespace: ");
-		result.append(importedNamespace);
-		result.append(')');
-		return result.toString();
-	}
-
-} //UiImportsImpl
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiLabelImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiLabelImpl.java
index 97e1ee9..49a3cd8 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiLabelImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiLabelImpl.java
@@ -37,6 +37,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiLabelImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiLabelImpl#getName <em>Name</em>}</li>
@@ -47,7 +48,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiLabelImpl#getStyles <em>Styles</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiLabelImpl#getValidators <em>Validators</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiListImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiListImpl.java
index a1fd4f3..eb52814 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiListImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiListImpl.java
@@ -40,6 +40,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiListImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiListImpl#getName <em>Name</em>}</li>
@@ -56,7 +57,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiListImpl#getItemCaptionProperty <em>Item Caption Property</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiListImpl#getDescriptionProperty <em>Description Property</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMaskedDecimalFieldImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMaskedDecimalFieldImpl.java
index 90c8684..cdc3cbf 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMaskedDecimalFieldImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMaskedDecimalFieldImpl.java
@@ -34,6 +34,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMaskedDecimalFieldImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMaskedDecimalFieldImpl#getName <em>Name</em>}</li>
@@ -45,7 +46,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMaskedDecimalFieldImpl#getValidators <em>Validators</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMaskedDecimalFieldImpl#getMask <em>Mask</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMaskedNumericFieldImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMaskedNumericFieldImpl.java
index 26e5693..356e513 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMaskedNumericFieldImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMaskedNumericFieldImpl.java
@@ -34,6 +34,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMaskedNumericFieldImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMaskedNumericFieldImpl#getName <em>Name</em>}</li>
@@ -44,7 +45,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMaskedNumericFieldImpl#getStyles <em>Styles</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMaskedNumericFieldImpl#getValidators <em>Validators</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMaskedTextFieldImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMaskedTextFieldImpl.java
index 1fefc16..575ed73 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMaskedTextFieldImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMaskedTextFieldImpl.java
@@ -34,6 +34,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMaskedTextFieldImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMaskedTextFieldImpl#getName <em>Name</em>}</li>
@@ -45,7 +46,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMaskedTextFieldImpl#getValidators <em>Validators</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMaskedTextFieldImpl#getMask <em>Mask</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMaxLengthValidatorImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMaxLengthValidatorImpl.java
index a2bd243..f44c2b9 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMaxLengthValidatorImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMaxLengthValidatorImpl.java
@@ -28,6 +28,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMaxLengthValidatorImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMaxLengthValidatorImpl#getName <em>Name</em>}</li>
@@ -35,7 +36,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMaxLengthValidatorImpl#getMaxLength <em>Max Length</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMaxLengthValidatorImpl#getErrorCode <em>Error Code</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMinLengthValidatorImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMinLengthValidatorImpl.java
index eed38ff..dea9a2f 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMinLengthValidatorImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMinLengthValidatorImpl.java
@@ -28,6 +28,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMinLengthValidatorImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMinLengthValidatorImpl#getName <em>Name</em>}</li>
@@ -35,7 +36,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMinLengthValidatorImpl#getMinLength <em>Min Length</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMinLengthValidatorImpl#getErrorCode <em>Error Code</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileActionImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileActionImpl.java
index 68607e6..ab2137f 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileActionImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileActionImpl.java
@@ -35,6 +35,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileActionImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileActionImpl#getName <em>Name</em>}</li>
@@ -44,7 +45,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileActionImpl#isInvisible <em>Invisible</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileActionImpl#getStyles <em>Styles</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileNavBarActionImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileNavBarActionImpl.java
index 01851e1..7b8ee6a 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileNavBarActionImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileNavBarActionImpl.java
@@ -24,12 +24,12 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileNavBarActionImpl#getActionReference <em>Action Reference</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileNavBarActionImpl#getActionID <em>Action ID</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileNavBarActionImpl#getIconName <em>Icon Name</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileNavigationButtonImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileNavigationButtonImpl.java
index f2b5de1..609a0db 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileNavigationButtonImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileNavigationButtonImpl.java
@@ -25,11 +25,11 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileNavigationButtonImpl#getTargetPage <em>Target Page</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileNavigationButtonImpl#getTargetPageAlias <em>Target Page Alias</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileNavigationCommandImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileNavigationCommandImpl.java
index c257632..66eb64a 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileNavigationCommandImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileNavigationCommandImpl.java
@@ -26,13 +26,13 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileNavigationCommandImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileNavigationCommandImpl#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileNavigationCommandImpl#getTargetPage <em>Target Page</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileNavigationCommandImpl#getTargetPageAlias <em>Target Page Alias</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileNavigationPageAssignmentImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileNavigationPageAssignmentImpl.java
index 9c14afa..5b69b88 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileNavigationPageAssignmentImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileNavigationPageAssignmentImpl.java
@@ -27,13 +27,13 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileNavigationPageAssignmentImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileNavigationPageAssignmentImpl#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileNavigationPageAssignmentImpl#getElement <em>Element</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileNavigationPageAssignmentImpl#getAlignment <em>Alignment</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileNavigationPageImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileNavigationPageImpl.java
index f137244..7ea4afc 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileNavigationPageImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileNavigationPageImpl.java
@@ -40,6 +40,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileNavigationPageImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileNavigationPageImpl#getName <em>Name</em>}</li>
@@ -54,7 +55,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileNavigationPageImpl#getContents <em>Contents</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileNavigationPageImpl#getBarActions <em>Bar Actions</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileNavigationRootAssigmentImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileNavigationRootAssigmentImpl.java
index bd74eb0..335d0cd 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileNavigationRootAssigmentImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileNavigationRootAssigmentImpl.java
@@ -29,12 +29,12 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileNavigationRootAssigmentImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileNavigationRootAssigmentImpl#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileNavigationRootAssigmentImpl#getElement <em>Element</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileNavigationRootImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileNavigationRootImpl.java
index 7bb06ed..c1774dd 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileNavigationRootImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileNavigationRootImpl.java
@@ -43,6 +43,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileNavigationRootImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileNavigationRootImpl#getName <em>Name</em>}</li>
@@ -55,7 +56,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileNavigationRootImpl#getAutoWireSource <em>Auto Wire Source</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileNavigationRootImpl#getContents <em>Contents</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileSearchPanelImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileSearchPanelImpl.java
index 6fbef7d..7917ca0 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileSearchPanelImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileSearchPanelImpl.java
@@ -45,6 +45,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileSearchPanelImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileSearchPanelImpl#getName <em>Name</em>}</li>
@@ -58,7 +59,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileSearchPanelImpl#getJvmType <em>Jvm Type</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileSearchPanelImpl#getContents <em>Contents</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileTabAssignmentImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileTabAssignmentImpl.java
index 210c8b9..16062af 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileTabAssignmentImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileTabAssignmentImpl.java
@@ -35,6 +35,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileTabAssignmentImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileTabAssignmentImpl#getName <em>Name</em>}</li>
@@ -45,7 +46,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileTabAssignmentImpl#getStyles <em>Styles</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileTabAssignmentImpl#getElement <em>Element</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileTabSheetImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileTabSheetImpl.java
index 4a106e1..b8103f8 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileTabSheetImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileTabSheetImpl.java
@@ -35,6 +35,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileTabSheetImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileTabSheetImpl#getName <em>Name</em>}</li>
@@ -45,7 +46,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileTabSheetImpl#getStyles <em>Styles</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiMobileTabSheetImpl#getTabs <em>Tabs</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileViewImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileViewImpl.java
index cd20874..606803d 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileViewImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiMobileViewImpl.java
@@ -18,8 +18,6 @@
  * <!-- begin-user-doc -->
  * An implementation of the model object '<em><b>Ui Mobile View</b></em>'.
  * <!-- end-user-doc -->
- * <p>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiModelFactoryImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiModelFactoryImpl.java
index c664304..81ec9af 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiModelFactoryImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiModelFactoryImpl.java
@@ -18,86 +18,6 @@
 import org.eclipse.emf.ecore.impl.EFactoryImpl;
 import org.eclipse.emf.ecore.plugin.EcorePlugin;
 import org.eclipse.osbp.ecview.semantic.uimodel.*;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiAction;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiBeanSlot;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiBinding;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiBindingEndpointAlias;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiBindingEndpointAssignment;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiBrowser;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiButton;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiChangeTrigger;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiCheckBox;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiColumn;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiColumnsAssignment;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiComboBox;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiCommandBindableDef;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiContext;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiDateField;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiDecimalField;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiDialog;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiDialogAssignment;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiDialogSearchFieldAssignment;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiFlatAlignment;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiFormLayout;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiFormLayoutAssigment;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiGridLayout;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiGridLayoutAssigment;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiHorizontalButtonGroup;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiHorizontalButtonGroupAssigment;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiHorizontalLayout;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiHorizontalLayoutAssigment;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiIDEView;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiImage;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiImports;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiLabel;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiList;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiMaxLengthValidator;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiMinLengthValidator;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiMobileAction;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationButton;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationCommand;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationPage;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationPageAssignment;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiMobileTabAssignment;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiMobileTabSheet;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiMobileView;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiModel;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiModelFactory;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiNumericField;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiOpenDialogCommand;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiOptionsGroup;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiPathSegment;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiPoint;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiProgressBar;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiRawBindablePathSegment;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiRegexpValidator;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiSearchDialog;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiSearchField;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiSearchWithDialogCommand;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiSelectionType;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiSwitch;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiTabAssignment;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiTabSheet;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiTable;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiTextArea;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiTextField;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiTypedBindableDef;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiValidatorAlias;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiValidatorAssignment;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiValidatorDef;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiVerticalComponentGroup;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiVerticalComponentGroupAssigment;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiVerticalLayout;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiVerticalLayoutAssigment;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiView;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiViewSet;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiVisibilityProcessor;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiVisibilityProcessorAssignment;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiVisibilityPropertiesAssignment;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiVisibilityProperty;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiXbaseValidator;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiXbaseVisibilityRule;
 
 /**
  * <!-- begin-user-doc -->
@@ -144,7 +64,6 @@
 	public EObject create(EClass eClass) {
 		switch (eClass.getClassifierID()) {
 			case UiModelPackage.UI_MODEL: return createUiModel();
-			case UiModelPackage.UI_IMPORTS: return createUiImports();
 			case UiModelPackage.UI_CONTEXT: return createUiContext();
 			case UiModelPackage.UI_EXPOSED_ACTION: return createUiExposedAction();
 			case UiModelPackage.UI_VIEW_SET: return createUiViewSet();
@@ -152,6 +71,7 @@
 			case UiModelPackage.UI_DIALOG: return createUiDialog();
 			case UiModelPackage.UI_DIALOG_ASSIGNMENT: return createUiDialogAssignment();
 			case UiModelPackage.UI_IDE_VIEW: return createUiIDEView();
+			case UiModelPackage.UI_DISPLAY_VIEW: return createUiDisplayView();
 			case UiModelPackage.UI_MOBILE_VIEW: return createUiMobileView();
 			case UiModelPackage.UI_POINT: return createUiPoint();
 			case UiModelPackage.UI_BEAN_SLOT: return createUiBeanSlot();
@@ -318,16 +238,6 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public UiImports createUiImports() {
-		UiImportsImpl uiImports = new UiImportsImpl();
-		return uiImports;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
 	public UiContext createUiContext() {
 		UiContextImpl uiContext = new UiContextImpl();
 		return uiContext;
@@ -398,6 +308,16 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	public UiDisplayView createUiDisplayView() {
+		UiDisplayViewImpl uiDisplayView = new UiDisplayViewImpl();
+		return uiDisplayView;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	public UiMobileView createUiMobileView() {
 		UiMobileViewImpl uiMobileView = new UiMobileViewImpl();
 		return uiMobileView;
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiModelImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiModelImpl.java
index 34a06d9..0ce2873 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiModelImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiModelImpl.java
@@ -11,7 +11,6 @@
 package org.eclipse.osbp.ecview.semantic.uimodel.impl;
 
 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;
@@ -21,10 +20,10 @@
 import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
 import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiImports;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiModel;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiRootElements;
+import org.eclipse.xtext.xtype.XImportSection;
 
 /**
  * <!-- begin-user-doc -->
@@ -32,14 +31,14 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiModelImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiModelImpl#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiModelImpl#getPackageName <em>Package Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiModelImpl#getRoots <em>Roots</em>}</li>
- *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiModelImpl#getImports <em>Imports</em>}</li>
+ *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiModelImpl#getImportSection <em>Import Section</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
@@ -115,14 +114,14 @@
 	protected EList<UiRootElements> roots;
 
 	/**
-	 * The cached value of the '{@link #getImports() <em>Imports</em>}' containment reference list.
+	 * The cached value of the '{@link #getImportSection() <em>Import Section</em>}' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @see #getImports()
+	 * @see #getImportSection()
 	 * @generated
 	 * @ordered
 	 */
-	protected EList<UiImports> imports;
+	protected XImportSection importSection;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -167,22 +166,22 @@
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @generated
 	 */
 	public String getName() {
-		return name;
+		return getPackageName();
 	}
 
 	/**
 	 * <!-- 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, UiModelPackage.UI_MODEL__NAME, oldName, name));
+		
+		setPackageName(newName);
 	}
 
 	/**
@@ -223,11 +222,65 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList<UiImports> getImports() {
-		if (imports == null) {
-			imports = new EObjectContainmentEList.Resolving<UiImports>(UiImports.class, this, UiModelPackage.UI_MODEL__IMPORTS);
+	public XImportSection getImportSection() {
+		if (importSection != null && importSection.eIsProxy()) {
+			InternalEObject oldImportSection = (InternalEObject)importSection;
+			importSection = (XImportSection)eResolveProxy(oldImportSection);
+			if (importSection != oldImportSection) {
+				InternalEObject newImportSection = (InternalEObject)importSection;
+				NotificationChain msgs = oldImportSection.eInverseRemove(this, EOPPOSITE_FEATURE_BASE - UiModelPackage.UI_MODEL__IMPORT_SECTION, null, null);
+				if (newImportSection.eInternalContainer() == null) {
+					msgs = newImportSection.eInverseAdd(this, EOPPOSITE_FEATURE_BASE - UiModelPackage.UI_MODEL__IMPORT_SECTION, null, msgs);
+				}
+				if (msgs != null) msgs.dispatch();
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, UiModelPackage.UI_MODEL__IMPORT_SECTION, oldImportSection, importSection));
+			}
 		}
-		return imports;
+		return importSection;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public XImportSection basicGetImportSection() {
+		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, UiModelPackage.UI_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 - UiModelPackage.UI_MODEL__IMPORT_SECTION, null, msgs);
+			if (newImportSection != null)
+				msgs = ((InternalEObject)newImportSection).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - UiModelPackage.UI_MODEL__IMPORT_SECTION, null, msgs);
+			msgs = basicSetImportSection(newImportSection, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, UiModelPackage.UI_MODEL__IMPORT_SECTION, newImportSection, newImportSection));
 	}
 
 	/**
@@ -240,8 +293,8 @@
 		switch (featureID) {
 			case UiModelPackage.UI_MODEL__ROOTS:
 				return ((InternalEList<?>)getRoots()).basicRemove(otherEnd, msgs);
-			case UiModelPackage.UI_MODEL__IMPORTS:
-				return ((InternalEList<?>)getImports()).basicRemove(otherEnd, msgs);
+			case UiModelPackage.UI_MODEL__IMPORT_SECTION:
+				return basicSetImportSection(null, msgs);
 		}
 		return super.eInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -262,8 +315,9 @@
 				return getPackageName();
 			case UiModelPackage.UI_MODEL__ROOTS:
 				return getRoots();
-			case UiModelPackage.UI_MODEL__IMPORTS:
-				return getImports();
+			case UiModelPackage.UI_MODEL__IMPORT_SECTION:
+				if (resolve) return getImportSection();
+				return basicGetImportSection();
 		}
 		return super.eGet(featureID, resolve, coreType);
 	}
@@ -290,9 +344,8 @@
 				getRoots().clear();
 				getRoots().addAll((Collection<? extends UiRootElements>)newValue);
 				return;
-			case UiModelPackage.UI_MODEL__IMPORTS:
-				getImports().clear();
-				getImports().addAll((Collection<? extends UiImports>)newValue);
+			case UiModelPackage.UI_MODEL__IMPORT_SECTION:
+				setImportSection((XImportSection)newValue);
 				return;
 		}
 		super.eSet(featureID, newValue);
@@ -318,8 +371,8 @@
 			case UiModelPackage.UI_MODEL__ROOTS:
 				getRoots().clear();
 				return;
-			case UiModelPackage.UI_MODEL__IMPORTS:
-				getImports().clear();
+			case UiModelPackage.UI_MODEL__IMPORT_SECTION:
+				setImportSection((XImportSection)null);
 				return;
 		}
 		super.eUnset(featureID);
@@ -341,8 +394,8 @@
 				return PACKAGE_NAME_EDEFAULT == null ? packageName != null : !PACKAGE_NAME_EDEFAULT.equals(packageName);
 			case UiModelPackage.UI_MODEL__ROOTS:
 				return roots != null && !roots.isEmpty();
-			case UiModelPackage.UI_MODEL__IMPORTS:
-				return imports != null && !imports.isEmpty();
+			case UiModelPackage.UI_MODEL__IMPORT_SECTION:
+				return importSection != null;
 		}
 		return super.eIsSet(featureID);
 	}
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiModelPackageImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiModelPackageImpl.java
index ba92fda..8daf249 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiModelPackageImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiModelPackageImpl.java
@@ -20,6 +20,7 @@
 import org.eclipse.emf.ecore.impl.EPackageImpl;
 import org.eclipse.xtext.common.types.TypesPackage;
 import org.eclipse.xtext.xbase.XbasePackage;
+import org.eclipse.xtext.xtype.XtypePackage;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiAction;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiAddToTableCommand;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiAlignment;
@@ -48,6 +49,7 @@
 import org.eclipse.osbp.ecview.semantic.uimodel.UiDialog;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiDialogAssignment;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiDialogSearchFieldAssignment;
+import org.eclipse.osbp.ecview.semantic.uimodel.UiDisplayView;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiEmbeddable;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiErrorCode;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiExposedAction;
@@ -65,7 +67,6 @@
 import org.eclipse.osbp.ecview.semantic.uimodel.UiI18nInfoable;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiIDEView;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiImage;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiImports;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiLabel;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiLayout;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiLayoutAssignment;
@@ -183,13 +184,6 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	private EClass uiImportsEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
 	private EClass uiContextEClass = null;
 
 	/**
@@ -239,6 +233,13 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	private EClass uiDisplayViewEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	private EClass uiMobileViewEClass = null;
 
 	/**
@@ -1233,7 +1234,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EReference getUiModel_Imports() {
+	public EReference getUiModel_ImportSection() {
 		return (EReference)uiModelEClass.getEStructuralFeatures().get(2);
 	}
 
@@ -1242,24 +1243,6 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EClass getUiImports() {
-		return uiImportsEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getUiImports_ImportedNamespace() {
-		return (EAttribute)uiImportsEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
 	public EClass getUiContext() {
 		return uiContextEClass;
 	}
@@ -1476,6 +1459,15 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	public EClass getUiDisplayView() {
+		return uiDisplayViewEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	public EClass getUiMobileView() {
 		return uiMobileViewEClass;
 	}
@@ -2565,6 +2557,15 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	public EAttribute getUiTable_ScrollToBottom() {
+		return (EAttribute)uiTableEClass.getEStructuralFeatures().get(4);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	public EClass getUiComboBox() {
 		return uiComboBoxEClass;
 	}
@@ -3798,6 +3799,15 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	public EAttribute getUiI18nInfo_NoCaption() {
+		return (EAttribute)uiI18nInfoEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	public EClass getUiI18nInfoable() {
 		return uiI18nInfoableEClass;
 	}
@@ -4359,10 +4369,7 @@
 		uiModelEClass = createEClass(UI_MODEL);
 		createEAttribute(uiModelEClass, UI_MODEL__PACKAGE_NAME);
 		createEReference(uiModelEClass, UI_MODEL__ROOTS);
-		createEReference(uiModelEClass, UI_MODEL__IMPORTS);
-
-		uiImportsEClass = createEClass(UI_IMPORTS);
-		createEAttribute(uiImportsEClass, UI_IMPORTS__IMPORTED_NAMESPACE);
+		createEReference(uiModelEClass, UI_MODEL__IMPORT_SECTION);
 
 		uiContextEClass = createEClass(UI_CONTEXT);
 		createEReference(uiContextEClass, UI_CONTEXT__BEAN_SLOTS);
@@ -4395,6 +4402,8 @@
 		uiIDEViewEClass = createEClass(UI_IDE_VIEW);
 		createEReference(uiIDEViewEClass, UI_IDE_VIEW__EXPOSED_ACTIONS);
 
+		uiDisplayViewEClass = createEClass(UI_DISPLAY_VIEW);
+
 		uiMobileViewEClass = createEClass(UI_MOBILE_VIEW);
 
 		uiPointEClass = createEClass(UI_POINT);
@@ -4558,6 +4567,7 @@
 		createEAttribute(uiTableEClass, UI_TABLE__SELECTION_TYPE);
 		createEReference(uiTableEClass, UI_TABLE__ITEM_IMAGE_PROPERTY);
 		createEReference(uiTableEClass, UI_TABLE__SORT_ORDER_ASSIGNMENT);
+		createEAttribute(uiTableEClass, UI_TABLE__SCROLL_TO_BOTTOM);
 
 		uiComboBoxEClass = createEClass(UI_COMBO_BOX);
 		createEReference(uiComboBoxEClass, UI_COMBO_BOX__ITEM_CAPTION_PROPERTY);
@@ -4750,6 +4760,7 @@
 
 		uiI18nInfoEClass = createEClass(UI_I1_8N_INFO);
 		createEAttribute(uiI18nInfoEClass, UI_I1_8N_INFO__KEY);
+		createEAttribute(uiI18nInfoEClass, UI_I1_8N_INFO__NO_CAPTION);
 
 		uiI18nInfoableEClass = createEClass(UI_I1_8N_INFOABLE);
 		createEReference(uiI18nInfoableEClass, UI_I1_8N_INFOABLE__I18N_INFO);
@@ -4859,6 +4870,7 @@
 		setNsURI(eNS_URI);
 
 		// Obtain other dependent packages
+		XtypePackage theXtypePackage = (XtypePackage)EPackage.Registry.INSTANCE.getEPackage(XtypePackage.eNS_URI);
 		UiSemanticsPackage theUiSemanticsPackage = (UiSemanticsPackage)EPackage.Registry.INSTANCE.getEPackage(UiSemanticsPackage.eNS_URI);
 		TypesPackage theTypesPackage = (TypesPackage)EPackage.Registry.INSTANCE.getEPackage(TypesPackage.eNS_URI);
 		EcorePackage theEcorePackage = (EcorePackage)EPackage.Registry.INSTANCE.getEPackage(EcorePackage.eNS_URI);
@@ -4870,7 +4882,6 @@
 
 		// Add supertypes to classes
 		uiModelEClass.getESuperTypes().add(this.getUiNamedElement());
-		uiImportsEClass.getESuperTypes().add(this.getUiNamedElement());
 		uiContextEClass.getESuperTypes().add(this.getUiRootElements());
 		uiExposedActionEClass.getESuperTypes().add(this.getUiAction());
 		uiViewSetEClass.getESuperTypes().add(this.getUiContext());
@@ -4883,6 +4894,7 @@
 		uiDialogEClass.getESuperTypes().add(this.getUiI18nInfoable());
 		uiDialogAssignmentEClass.getESuperTypes().add(this.getUiLayoutAssignment());
 		uiIDEViewEClass.getESuperTypes().add(this.getUiView());
+		uiDisplayViewEClass.getESuperTypes().add(this.getUiIDEView());
 		uiMobileViewEClass.getESuperTypes().add(this.getUiView());
 		uiBeanSlotEClass.getESuperTypes().add(this.getUiTypedBindable());
 		uiRootElementsEClass.getESuperTypes().add(this.getUiNamedElement());
@@ -5052,10 +5064,7 @@
 		initEClass(uiModelEClass, UiModel.class, "UiModel", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 		initEAttribute(getUiModel_PackageName(), ecorePackage.getEString(), "packageName", null, 1, 1, UiModel.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEReference(getUiModel_Roots(), this.getUiRootElements(), null, "roots", null, 0, -1, UiModel.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getUiModel_Imports(), this.getUiImports(), null, "imports", null, 0, -1, UiModel.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(uiImportsEClass, UiImports.class, "UiImports", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getUiImports_ImportedNamespace(), ecorePackage.getEString(), "importedNamespace", null, 1, 1, UiImports.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getUiModel_ImportSection(), theXtypePackage.getXImportSection(), null, "importSection", null, 0, 1, UiModel.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
 		initEClass(uiContextEClass, UiContext.class, "UiContext", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 		initEReference(getUiContext_BeanSlots(), this.getUiBeanSlot(), null, "beanSlots", null, 0, -1, UiContext.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
@@ -5088,6 +5097,8 @@
 		initEClass(uiIDEViewEClass, UiIDEView.class, "UiIDEView", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 		initEReference(getUiIDEView_ExposedActions(), this.getUiExposedAction(), null, "exposedActions", null, 0, -1, UiIDEView.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
+		initEClass(uiDisplayViewEClass, UiDisplayView.class, "UiDisplayView", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
 		initEClass(uiMobileViewEClass, UiMobileView.class, "UiMobileView", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 
 		initEClass(uiPointEClass, UiPoint.class, "UiPoint", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
@@ -5251,6 +5262,7 @@
 		initEAttribute(getUiTable_SelectionType(), this.getUiSelectionType(), "selectionType", "SINGLE", 1, 1, UiTable.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEReference(getUiTable_ItemImageProperty(), theTypesPackage.getJvmOperation(), null, "itemImageProperty", null, 0, 1, UiTable.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEReference(getUiTable_SortOrderAssignment(), this.getUiSortOrderAssignment(), null, "sortOrderAssignment", null, 0, 1, UiTable.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getUiTable_ScrollToBottom(), ecorePackage.getEBoolean(), "scrollToBottom", null, 0, 1, UiTable.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
 		initEClass(uiComboBoxEClass, UiComboBox.class, "UiComboBox", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 		initEReference(getUiComboBox_ItemCaptionProperty(), theTypesPackage.getJvmOperation(), null, "itemCaptionProperty", null, 0, 1, UiComboBox.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
@@ -5443,6 +5455,7 @@
 
 		initEClass(uiI18nInfoEClass, UiI18nInfo.class, "UiI18nInfo", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 		initEAttribute(getUiI18nInfo_Key(), ecorePackage.getEString(), "key", null, 0, 1, UiI18nInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getUiI18nInfo_NoCaption(), theEcorePackage.getEBoolean(), "noCaption", null, 0, 1, UiI18nInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
 		initEClass(uiI18nInfoableEClass, UiI18nInfoable.class, "UiI18nInfoable", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 		initEReference(getUiI18nInfoable_I18nInfo(), this.getUiI18nInfo(), null, "i18nInfo", null, 0, 1, UiI18nInfoable.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiNestedFieldImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiNestedFieldImpl.java
index d9cc76f..aba0edc 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiNestedFieldImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiNestedFieldImpl.java
@@ -31,13 +31,13 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiNestedFieldImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiNestedFieldImpl#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiNestedFieldImpl#getPath <em>Path</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiNestedFieldImpl#getField <em>Field</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiNestedPropertyImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiNestedPropertyImpl.java
index 670fc51..d29e4b8 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiNestedPropertyImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiNestedPropertyImpl.java
@@ -29,13 +29,13 @@
  * <em><b>Ui Nested Property</b></em>'. <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiNestedPropertyImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiNestedPropertyImpl#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiNestedPropertyImpl#getPath <em>Path</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiNestedPropertyImpl#getGetter <em>Getter</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiNumericFieldImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiNumericFieldImpl.java
index 9f2c399..c72a44e 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiNumericFieldImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiNumericFieldImpl.java
@@ -37,6 +37,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiNumericFieldImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiNumericFieldImpl#getName <em>Name</em>}</li>
@@ -49,7 +50,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiNumericFieldImpl#isNoGrouping <em>No Grouping</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiNumericFieldImpl#isNoMarkNegative <em>No Mark Negative</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiOpenDialogCommandImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiOpenDialogCommandImpl.java
index 47870e2..31433f6 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiOpenDialogCommandImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiOpenDialogCommandImpl.java
@@ -26,12 +26,12 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiOpenDialogCommandImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiOpenDialogCommandImpl#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiOpenDialogCommandImpl#getDialog <em>Dialog</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiOptionsGroupImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiOptionsGroupImpl.java
index 8e34ac0..adfe4e4 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiOptionsGroupImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiOptionsGroupImpl.java
@@ -42,6 +42,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiOptionsGroupImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiOptionsGroupImpl#getName <em>Name</em>}</li>
@@ -58,7 +59,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiOptionsGroupImpl#getItemCaptionProperty <em>Item Caption Property</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiOptionsGroupImpl#getDescriptionProperty <em>Description Property</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiPanelImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiPanelImpl.java
index 6b0b2a8..2edd575 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiPanelImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiPanelImpl.java
@@ -36,6 +36,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiPanelImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiPanelImpl#getName <em>Name</em>}</li>
@@ -49,7 +50,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiPanelImpl#getContent <em>Content</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiPanelImpl#getContentAlignment <em>Content Alignment</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiPasswordFieldImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiPasswordFieldImpl.java
index 85bace0..70c5351 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiPasswordFieldImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiPasswordFieldImpl.java
@@ -34,6 +34,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiPasswordFieldImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiPasswordFieldImpl#getName <em>Name</em>}</li>
@@ -44,7 +45,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiPasswordFieldImpl#getStyles <em>Styles</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiPasswordFieldImpl#getValidators <em>Validators</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiPathSegmentImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiPathSegmentImpl.java
index 721cdf0..042aeaa 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiPathSegmentImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiPathSegmentImpl.java
@@ -28,11 +28,11 @@
  * <em><b>Ui Path Segment</b></em>'. <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiPathSegmentImpl#getPath <em>Path</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiPathSegmentImpl#getGetter <em>Getter</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiPointImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiPointImpl.java
index f20e721..a7a9ab0 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiPointImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiPointImpl.java
@@ -23,11 +23,11 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiPointImpl#getX <em>X</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiPointImpl#getY <em>Y</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiPrefixToMaskMapEntryImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiPrefixToMaskMapEntryImpl.java
index b6508ab..98ca1e1 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiPrefixToMaskMapEntryImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiPrefixToMaskMapEntryImpl.java
@@ -21,11 +21,11 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiPrefixToMaskMapEntryImpl#getTypedKey <em>Key</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiPrefixToMaskMapEntryImpl#getTypedValue <em>Value</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiPrefixedMaskedTextFieldImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiPrefixedMaskedTextFieldImpl.java
index 25584d1..787e0ee 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiPrefixedMaskedTextFieldImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiPrefixedMaskedTextFieldImpl.java
@@ -31,6 +31,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiPrefixedMaskedTextFieldImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiPrefixedMaskedTextFieldImpl#getName <em>Name</em>}</li>
@@ -43,7 +44,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiPrefixedMaskedTextFieldImpl#getMask <em>Mask</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiPrefixedMaskedTextFieldImpl#getPrefixMasks <em>Prefix Masks</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiProgressBarImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiProgressBarImpl.java
index 74f3a7c..a61ba1a 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiProgressBarImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiProgressBarImpl.java
@@ -37,6 +37,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiProgressBarImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiProgressBarImpl#getName <em>Name</em>}</li>
@@ -47,7 +48,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiProgressBarImpl#getStyles <em>Styles</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiProgressBarImpl#getValidators <em>Validators</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiRawBindablePathSegmentImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiRawBindablePathSegmentImpl.java
index 4ebf740..362e116 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiRawBindablePathSegmentImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiRawBindablePathSegmentImpl.java
@@ -25,12 +25,12 @@
  * <em><b>Ui Raw Bindable Path Segment</b></em>'. <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiRawBindablePathSegmentImpl#getRawBindable <em>Raw Bindable</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiRawBindablePathSegmentImpl#getPath <em>Path</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiRawBindablePathSegmentImpl#isToParent <em>To Parent</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiRegexpValidatorImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiRegexpValidatorImpl.java
index 3af5909..327e86f 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiRegexpValidatorImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiRegexpValidatorImpl.java
@@ -28,6 +28,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiRegexpValidatorImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiRegexpValidatorImpl#getName <em>Name</em>}</li>
@@ -35,7 +36,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiRegexpValidatorImpl#getRegExpression <em>Reg Expression</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiRegexpValidatorImpl#getErrorCode <em>Error Code</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiRemoveFromTableCommandImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiRemoveFromTableCommandImpl.java
index 60d3f88..3c02a85 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiRemoveFromTableCommandImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiRemoveFromTableCommandImpl.java
@@ -28,12 +28,12 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiRemoveFromTableCommandImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiRemoveFromTableCommandImpl#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiRemoveFromTableCommandImpl#getTable <em>Table</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiRichTextAreaImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiRichTextAreaImpl.java
index 3209c71..62ec557 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiRichTextAreaImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiRichTextAreaImpl.java
@@ -34,6 +34,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiRichTextAreaImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiRichTextAreaImpl#getName <em>Name</em>}</li>
@@ -45,7 +46,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiRichTextAreaImpl#getValidators <em>Validators</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiRichTextAreaImpl#isAsBlob <em>As Blob</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSearchDialogImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSearchDialogImpl.java
index fa705c9..f6a7163 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSearchDialogImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSearchDialogImpl.java
@@ -38,6 +38,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSearchDialogImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSearchDialogImpl#getName <em>Name</em>}</li>
@@ -50,7 +51,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSearchDialogImpl#getSearchFields <em>Search Fields</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSearchDialogImpl#getContent <em>Content</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSearchFieldImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSearchFieldImpl.java
index 9917c23..0d8f003 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSearchFieldImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSearchFieldImpl.java
@@ -37,6 +37,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSearchFieldImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSearchFieldImpl#getName <em>Name</em>}</li>
@@ -48,7 +49,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSearchFieldImpl#getValidators <em>Validators</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSearchFieldImpl#getProperty <em>Property</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSearchPanelImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSearchPanelImpl.java
index 823dd4d..235a152 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSearchPanelImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSearchPanelImpl.java
@@ -37,6 +37,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSearchPanelImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSearchPanelImpl#getName <em>Name</em>}</li>
@@ -50,7 +51,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSearchPanelImpl#getJvmType <em>Jvm Type</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSearchPanelImpl#getContents <em>Contents</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSearchWithDialogCommandImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSearchWithDialogCommandImpl.java
index 430bbd6..31e1697 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSearchWithDialogCommandImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSearchWithDialogCommandImpl.java
@@ -26,12 +26,12 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSearchWithDialogCommandImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSearchWithDialogCommandImpl#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSearchWithDialogCommandImpl#getDialog <em>Dialog</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSendEventCommandImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSendEventCommandImpl.java
index 3963d89..59b8285 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSendEventCommandImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSendEventCommandImpl.java
@@ -23,13 +23,13 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSendEventCommandImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSendEventCommandImpl#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSendEventCommandImpl#getEventTopic <em>Event Topic</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSendEventCommandImpl#isNoAutoTrigger <em>No Auto Trigger</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSetNewInstanceCommandImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSetNewInstanceCommandImpl.java
index adf60b6..069cfbc 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSetNewInstanceCommandImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSetNewInstanceCommandImpl.java
@@ -33,13 +33,13 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSetNewInstanceCommandImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSetNewInstanceCommandImpl#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSetNewInstanceCommandImpl#getTarget <em>Target</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSetNewInstanceCommandImpl#getJvmType <em>Jvm Type</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSortOrderAssignmentImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSortOrderAssignmentImpl.java
index f1b6052..e3b167e 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSortOrderAssignmentImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSortOrderAssignmentImpl.java
@@ -33,6 +33,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSortOrderAssignmentImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSortOrderAssignmentImpl#getName <em>Name</em>}</li>
@@ -44,7 +45,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSortOrderAssignmentImpl#getValidators <em>Validators</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSortOrderAssignmentImpl#getColumns <em>Columns</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSortOrderImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSortOrderImpl.java
index d2db518..d34b05e 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSortOrderImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSortOrderImpl.java
@@ -27,6 +27,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSortOrderImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSortOrderImpl#getName <em>Name</em>}</li>
@@ -39,7 +40,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSortOrderImpl#getProperty <em>Property</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSortOrderImpl#isAsc <em>Asc</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSplitpanelAssigmentImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSplitpanelAssigmentImpl.java
index 8d99c11..c687ab1 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSplitpanelAssigmentImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSplitpanelAssigmentImpl.java
@@ -30,13 +30,13 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSplitpanelAssigmentImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSplitpanelAssigmentImpl#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSplitpanelAssigmentImpl#getElement <em>Element</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSplitpanelAssigmentImpl#getAlignment <em>Alignment</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSplitpanelImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSplitpanelImpl.java
index efca31f..5efc73c 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSplitpanelImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSplitpanelImpl.java
@@ -35,6 +35,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSplitpanelImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSplitpanelImpl#getName <em>Name</em>}</li>
@@ -50,7 +51,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSplitpanelImpl#getSplitPosition <em>Split Position</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSplitpanelImpl#isHorizontal <em>Horizontal</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiStringToStringMapEntryImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiStringToStringMapEntryImpl.java
index 0004d76..b977b2a 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiStringToStringMapEntryImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiStringToStringMapEntryImpl.java
@@ -21,11 +21,11 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiStringToStringMapEntryImpl#getTypedKey <em>Key</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiStringToStringMapEntryImpl#getTypedValue <em>Value</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSuggestTextFieldImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSuggestTextFieldImpl.java
index f001ab9..8c36fa4 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSuggestTextFieldImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSuggestTextFieldImpl.java
@@ -39,6 +39,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSuggestTextFieldImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSuggestTextFieldImpl#getName <em>Name</em>}</li>
@@ -55,7 +56,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSuggestTextFieldImpl#getItemUUIDProperty <em>Item UUID Property</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSuggestTextFieldImpl#isAutoHidePopup <em>Auto Hide Popup</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSwitchImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSwitchImpl.java
index 5f360fc..28937b9 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSwitchImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiSwitchImpl.java
@@ -36,6 +36,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSwitchImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSwitchImpl#getName <em>Name</em>}</li>
@@ -46,7 +47,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSwitchImpl#getStyles <em>Styles</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiSwitchImpl#getValidators <em>Validators</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiTabAssignmentImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiTabAssignmentImpl.java
index a23f09d..12e85bb 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiTabAssignmentImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiTabAssignmentImpl.java
@@ -29,13 +29,13 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiTabAssignmentImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiTabAssignmentImpl#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiTabAssignmentImpl#getI18nInfo <em>I1 8n Info</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiTabAssignmentImpl#getElement <em>Element</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiTabSheetImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiTabSheetImpl.java
index f945a5a..4dc721b 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiTabSheetImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiTabSheetImpl.java
@@ -35,6 +35,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiTabSheetImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiTabSheetImpl#getName <em>Name</em>}</li>
@@ -45,7 +46,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiTabSheetImpl#getStyles <em>Styles</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiTabSheetImpl#getTabs <em>Tabs</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiTableImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiTableImpl.java
index 52d6ae5..d91dbbc 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiTableImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiTableImpl.java
@@ -43,6 +43,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiTableImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiTableImpl#getName <em>Name</em>}</li>
@@ -58,8 +59,8 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiTableImpl#getSelectionType <em>Selection Type</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiTableImpl#getItemImageProperty <em>Item Image Property</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiTableImpl#getSortOrderAssignment <em>Sort Order Assignment</em>}</li>
+ *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiTableImpl#isScrollToBottom <em>Scroll To Bottom</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
@@ -275,6 +276,26 @@
 	protected UiSortOrderAssignment sortOrderAssignment;
 
 	/**
+	 * The default value of the '{@link #isScrollToBottom() <em>Scroll To Bottom</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isScrollToBottom()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean SCROLL_TO_BOTTOM_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isScrollToBottom() <em>Scroll To Bottom</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isScrollToBottom()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean scrollToBottom = SCROLL_TO_BOTTOM_EDEFAULT;
+
+	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
@@ -684,6 +705,27 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	public boolean isScrollToBottom() {
+		return scrollToBottom;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setScrollToBottom(boolean newScrollToBottom) {
+		boolean oldScrollToBottom = scrollToBottom;
+		scrollToBottom = newScrollToBottom;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, UiModelPackage.UI_TABLE__SCROLL_TO_BOTTOM, oldScrollToBottom, scrollToBottom));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	public JvmTypeReference getJvmType() {
 		if (jvmType != null && jvmType.eIsProxy()) {
 			InternalEObject oldJvmType = (InternalEObject)jvmType;
@@ -831,6 +873,8 @@
 			case UiModelPackage.UI_TABLE__SORT_ORDER_ASSIGNMENT:
 				if (resolve) return getSortOrderAssignment();
 				return basicGetSortOrderAssignment();
+			case UiModelPackage.UI_TABLE__SCROLL_TO_BOTTOM:
+				return isScrollToBottom();
 		}
 		return super.eGet(featureID, resolve, coreType);
 	}
@@ -888,6 +932,9 @@
 			case UiModelPackage.UI_TABLE__SORT_ORDER_ASSIGNMENT:
 				setSortOrderAssignment((UiSortOrderAssignment)newValue);
 				return;
+			case UiModelPackage.UI_TABLE__SCROLL_TO_BOTTOM:
+				setScrollToBottom((Boolean)newValue);
+				return;
 		}
 		super.eSet(featureID, newValue);
 	}
@@ -942,6 +989,9 @@
 			case UiModelPackage.UI_TABLE__SORT_ORDER_ASSIGNMENT:
 				setSortOrderAssignment((UiSortOrderAssignment)null);
 				return;
+			case UiModelPackage.UI_TABLE__SCROLL_TO_BOTTOM:
+				setScrollToBottom(SCROLL_TO_BOTTOM_EDEFAULT);
+				return;
 		}
 		super.eUnset(featureID);
 	}
@@ -982,6 +1032,8 @@
 				return itemImageProperty != null;
 			case UiModelPackage.UI_TABLE__SORT_ORDER_ASSIGNMENT:
 				return sortOrderAssignment != null;
+			case UiModelPackage.UI_TABLE__SCROLL_TO_BOTTOM:
+				return scrollToBottom != SCROLL_TO_BOTTOM_EDEFAULT;
 		}
 		return super.eIsSet(featureID);
 	}
@@ -1110,6 +1162,8 @@
 		result.append(consumeBeanService);
 		result.append(", selectionType: ");
 		result.append(selectionType);
+		result.append(", scrollToBottom: ");
+		result.append(scrollToBottom);
 		result.append(')');
 		return result.toString();
 	}
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiTextAreaImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiTextAreaImpl.java
index 4c08da2..e4ecb9c 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiTextAreaImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiTextAreaImpl.java
@@ -37,6 +37,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiTextAreaImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiTextAreaImpl#getName <em>Name</em>}</li>
@@ -47,7 +48,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiTextAreaImpl#getStyles <em>Styles</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiTextAreaImpl#getValidators <em>Validators</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiTextFieldImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiTextFieldImpl.java
index a7b2da1..cb37db2 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiTextFieldImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiTextFieldImpl.java
@@ -37,6 +37,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiTextFieldImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiTextFieldImpl#getName <em>Name</em>}</li>
@@ -50,7 +51,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiTextFieldImpl#getMinLength <em>Min Length</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiTextFieldImpl#getRegex <em>Regex</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiTypedBindableDefImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiTypedBindableDefImpl.java
index 71ba011..8494e8c 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiTypedBindableDefImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiTypedBindableDefImpl.java
@@ -27,6 +27,7 @@
  * <em><b>Ui Typed Bindable Def</b></em>'. <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiTypedBindableDefImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiTypedBindableDefImpl#getName <em>Name</em>}</li>
@@ -34,7 +35,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiTypedBindableDefImpl#getRawBindablePath <em>Raw Bindable Path</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiTypedBindableDefImpl#getMethod <em>Method</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiTypedBindableRawTypeAliasImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiTypedBindableRawTypeAliasImpl.java
index 3bd1b3e..0aa020d 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiTypedBindableRawTypeAliasImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiTypedBindableRawTypeAliasImpl.java
@@ -29,13 +29,13 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiTypedBindableRawTypeAliasImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiTypedBindableRawTypeAliasImpl#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiTypedBindableRawTypeAliasImpl#getAlias <em>Alias</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiTypedBindableRawTypeAliasImpl#getType <em>Type</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiTypedBindableRawTypeImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiTypedBindableRawTypeImpl.java
index a5a6267..baa138b 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiTypedBindableRawTypeImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiTypedBindableRawTypeImpl.java
@@ -28,13 +28,13 @@
  * <em><b>Ui Typed Bindable Raw Type</b></em>'. <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiTypedBindableRawTypeImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiTypedBindableRawTypeImpl#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiTypedBindableRawTypeImpl#getRawBindable <em>Raw Bindable</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiTypedBindableRawTypeImpl#getRawBindablePath <em>Raw Bindable Path</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiValidatorAliasImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiValidatorAliasImpl.java
index 131d8fa..6da2179 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiValidatorAliasImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiValidatorAliasImpl.java
@@ -26,13 +26,13 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiValidatorAliasImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiValidatorAliasImpl#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiValidatorAliasImpl#getAlias <em>Alias</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiValidatorAliasImpl#getValidator <em>Validator</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiValidatorAssignmentImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiValidatorAssignmentImpl.java
index aef7649..3f5b9b7 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiValidatorAssignmentImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiValidatorAssignmentImpl.java
@@ -28,6 +28,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiValidatorAssignmentImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiValidatorAssignmentImpl#getName <em>Name</em>}</li>
@@ -35,7 +36,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiValidatorAssignmentImpl#getValidatorDef <em>Validator Def</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiValidatorAssignmentImpl#getValidatorAlias <em>Validator Alias</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiValidatorDefImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiValidatorDefImpl.java
index 15c2d28..4886e60 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiValidatorDefImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiValidatorDefImpl.java
@@ -27,13 +27,13 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiValidatorDefImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiValidatorDefImpl#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiValidatorDefImpl#getValidator <em>Validator</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiValidatorDefImpl#getJvmType <em>Jvm Type</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVerticalComponentGroupAssigmentImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVerticalComponentGroupAssigmentImpl.java
index a136aa4..31c7919 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVerticalComponentGroupAssigmentImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVerticalComponentGroupAssigmentImpl.java
@@ -26,12 +26,12 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiVerticalComponentGroupAssigmentImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiVerticalComponentGroupAssigmentImpl#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiVerticalComponentGroupAssigmentImpl#getElement <em>Element</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVerticalComponentGroupImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVerticalComponentGroupImpl.java
index bc7314b..4e775dd 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVerticalComponentGroupImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVerticalComponentGroupImpl.java
@@ -36,6 +36,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiVerticalComponentGroupImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiVerticalComponentGroupImpl#getName <em>Name</em>}</li>
@@ -48,7 +49,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiVerticalComponentGroupImpl#getAutoWireSource <em>Auto Wire Source</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiVerticalComponentGroupImpl#getContents <em>Contents</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVerticalLayoutAssigmentImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVerticalLayoutAssigmentImpl.java
index a92cd5d..f072d56 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVerticalLayoutAssigmentImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVerticalLayoutAssigmentImpl.java
@@ -27,13 +27,13 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiVerticalLayoutAssigmentImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiVerticalLayoutAssigmentImpl#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiVerticalLayoutAssigmentImpl#getElement <em>Element</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiVerticalLayoutAssigmentImpl#getAlignment <em>Alignment</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVerticalLayoutImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVerticalLayoutImpl.java
index e16bf31..cfd3299 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVerticalLayoutImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVerticalLayoutImpl.java
@@ -37,6 +37,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiVerticalLayoutImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiVerticalLayoutImpl#getName <em>Name</em>}</li>
@@ -49,7 +50,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiVerticalLayoutImpl#getAutoWireSource <em>Auto Wire Source</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiVerticalLayoutImpl#getContents <em>Contents</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiViewImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiViewImpl.java
index f4a2114..b1d0b5d 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiViewImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiViewImpl.java
@@ -39,6 +39,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiViewImpl#getProcessorAssignments <em>Processor Assignments</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiViewImpl#getJvmType <em>Jvm Type</em>}</li>
@@ -48,7 +49,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiViewImpl#getValidatorAssignments <em>Validator Assignments</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiViewImpl#getViewCategory <em>View Category</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiViewSetImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiViewSetImpl.java
index aec6ad6..1a031e2 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiViewSetImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiViewSetImpl.java
@@ -18,8 +18,6 @@
  * <!-- begin-user-doc -->
  * An implementation of the model object '<em><b>Ui View Set</b></em>'.
  * <!-- end-user-doc -->
- * <p>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVisibilityProcessableImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVisibilityProcessableImpl.java
index a801c4a..4dfb9f9 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVisibilityProcessableImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVisibilityProcessableImpl.java
@@ -28,10 +28,10 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiVisibilityProcessableImpl#getProcessorAssignments <em>Processor Assignments</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVisibilityProcessorAssignmentImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVisibilityProcessorAssignmentImpl.java
index 3078ff0..1fafddd 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVisibilityProcessorAssignmentImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVisibilityProcessorAssignmentImpl.java
@@ -26,11 +26,11 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiVisibilityProcessorAssignmentImpl#getProcessor <em>Processor</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiVisibilityProcessorAssignmentImpl#getProcessorAlias <em>Processor Alias</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVisibilityProcessorDefImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVisibilityProcessorDefImpl.java
index a4e3e72..2458b7e 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVisibilityProcessorDefImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVisibilityProcessorDefImpl.java
@@ -26,12 +26,12 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiVisibilityProcessorDefImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiVisibilityProcessorDefImpl#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiVisibilityProcessorDefImpl#getProcessor <em>Processor</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVisibilityProcessorImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVisibilityProcessorImpl.java
index 5417fd1..a435d22 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVisibilityProcessorImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVisibilityProcessorImpl.java
@@ -33,6 +33,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiVisibilityProcessorImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiVisibilityProcessorImpl#getName <em>Name</em>}</li>
@@ -41,7 +42,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiVisibilityProcessorImpl#getImportedElements <em>Imported Elements</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiVisibilityProcessorImpl#getRule <em>Rule</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVisibilityPropertiesAssignmentImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVisibilityPropertiesAssignmentImpl.java
index c9dd83e..870e3e9 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVisibilityPropertiesAssignmentImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVisibilityPropertiesAssignmentImpl.java
@@ -29,10 +29,10 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiVisibilityPropertiesAssignmentImpl#getProperties <em>Properties</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVisibilityPropertyImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVisibilityPropertyImpl.java
index 4d9824d..ffc6474 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVisibilityPropertyImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVisibilityPropertyImpl.java
@@ -27,13 +27,13 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiVisibilityPropertyImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiVisibilityPropertyImpl#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiVisibilityPropertyImpl#getBindableDef <em>Bindable Def</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiVisibilityPropertyImpl#getAssignmentExpression <em>Assignment Expression</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVisibilityRuleImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVisibilityRuleImpl.java
index 646f139..77c4ae1 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVisibilityRuleImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiVisibilityRuleImpl.java
@@ -23,11 +23,11 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiVisibilityRuleImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiVisibilityRuleImpl#getName <em>Name</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiXbaseValidatorImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiXbaseValidatorImpl.java
index 81494a9..442f61a 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiXbaseValidatorImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiXbaseValidatorImpl.java
@@ -34,6 +34,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiXbaseValidatorImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiXbaseValidatorImpl#getName <em>Name</em>}</li>
@@ -42,7 +43,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiXbaseValidatorImpl#getJvmType <em>Jvm Type</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiXbaseValidatorImpl#getErrorCodes <em>Error Codes</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiXbaseVisibilityRuleImpl.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiXbaseVisibilityRuleImpl.java
index 2df7dbe..1248215 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiXbaseVisibilityRuleImpl.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/impl/UiXbaseVisibilityRuleImpl.java
@@ -25,10 +25,10 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uimodel.impl.UiXbaseVisibilityRuleImpl#getExpression <em>Expression</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/util/UiModelAdapterFactory.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/util/UiModelAdapterFactory.java
index 6c1716f..f2f9015 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/util/UiModelAdapterFactory.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/util/UiModelAdapterFactory.java
@@ -82,10 +82,6 @@
 				return createUiModelAdapter();
 			}
 			@Override
-			public Adapter caseUiImports(UiImports object) {
-				return createUiImportsAdapter();
-			}
-			@Override
 			public Adapter caseUiContext(UiContext object) {
 				return createUiContextAdapter();
 			}
@@ -114,6 +110,10 @@
 				return createUiIDEViewAdapter();
 			}
 			@Override
+			public Adapter caseUiDisplayView(UiDisplayView object) {
+				return createUiDisplayViewAdapter();
+			}
+			@Override
 			public Adapter caseUiMobileView(UiMobileView object) {
 				return createUiMobileViewAdapter();
 			}
@@ -642,20 +642,6 @@
 	}
 
 	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.ecview.semantic.uimodel.UiImports <em>Ui Imports</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.ecview.semantic.uimodel.UiImports
-	 * @generated
-	 */
-	public Adapter createUiImportsAdapter() {
-		return null;
-	}
-
-	/**
 	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.ecview.semantic.uimodel.UiContext <em>Ui Context</em>}'.
 	 * <!-- begin-user-doc -->
 	 * This default implementation returns null so that we can easily ignore cases;
@@ -754,6 +740,20 @@
 	}
 
 	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.ecview.semantic.uimodel.UiDisplayView <em>Ui Display View</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.ecview.semantic.uimodel.UiDisplayView
+	 * @generated
+	 */
+	public Adapter createUiDisplayViewAdapter() {
+		return null;
+	}
+
+	/**
 	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileView <em>Ui Mobile View</em>}'.
 	 * <!-- begin-user-doc -->
 	 * This default implementation returns null so that we can easily ignore cases;
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/util/UiModelSwitch.java b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/util/UiModelSwitch.java
index aa9bb4c..b9179b9 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/util/UiModelSwitch.java
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/semantic/uimodel/util/UiModelSwitch.java
@@ -54,7 +54,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
 	 */
@@ -86,13 +86,6 @@
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case UiModelPackage.UI_IMPORTS: {
-				UiImports uiImports = (UiImports)theEObject;
-				T result = caseUiImports(uiImports);
-				if (result == null) result = caseUiNamedElement(uiImports);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
 			case UiModelPackage.UI_CONTEXT: {
 				UiContext uiContext = (UiContext)theEObject;
 				T result = caseUiContext(uiContext);
@@ -168,6 +161,20 @@
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
+			case UiModelPackage.UI_DISPLAY_VIEW: {
+				UiDisplayView uiDisplayView = (UiDisplayView)theEObject;
+				T result = caseUiDisplayView(uiDisplayView);
+				if (result == null) result = caseUiIDEView(uiDisplayView);
+				if (result == null) result = caseUiView(uiDisplayView);
+				if (result == null) result = caseUiContext(uiDisplayView);
+				if (result == null) result = caseUiVisibilityProcessable(uiDisplayView);
+				if (result == null) result = caseUiRawBindable(uiDisplayView);
+				if (result == null) result = caseUiTypeProvider(uiDisplayView);
+				if (result == null) result = caseUiRootElements(uiDisplayView);
+				if (result == null) result = caseUiNamedElement(uiDisplayView);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
 			case UiModelPackage.UI_MOBILE_VIEW: {
 				UiMobileView uiMobileView = (UiMobileView)theEObject;
 				T result = caseUiMobileView(uiMobileView);
@@ -1447,21 +1454,6 @@
 	}
 
 	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Ui Imports</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>Ui Imports</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public T caseUiImports(UiImports object) {
-		return null;
-	}
-
-	/**
 	 * Returns the result of interpreting the object as an instance of '<em>Ui Context</em>'.
 	 * <!-- begin-user-doc -->
 	 * This implementation returns null;
@@ -1567,6 +1559,21 @@
 	}
 
 	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Ui Display View</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>Ui Display View</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseUiDisplayView(UiDisplayView object) {
+		return null;
+	}
+
+	/**
 	 * Returns the result of interpreting the object as an instance of '<em>Ui Mobile View</em>'.
 	 * <!-- begin-user-doc -->
 	 * This implementation returns null;
diff --git a/org.eclipse.osbp.ecview.eclipse.ui.examples/META-INF/MANIFEST.MF b/org.eclipse.osbp.ecview.eclipse.ui.examples/META-INF/MANIFEST.MF
index df96696..22db3ef 100644
--- a/org.eclipse.osbp.ecview.eclipse.ui.examples/META-INF/MANIFEST.MF
+++ b/org.eclipse.osbp.ecview.eclipse.ui.examples/META-INF/MANIFEST.MF
@@ -9,7 +9,7 @@
  org.eclipse.core.runtime;bundle-version="3.9.0",
  org.eclipse.emf.common.ui;bundle-version="2.8.0",
  org.eclipse.ui.ide;bundle-version="3.9.0"
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-ActivationPolicy: lazy
 Import-Package: javax.inject;version="1.0.0",
  org.slf4j;version="1.7.2"
diff --git a/org.eclipse.osbp.ecview.examples.vaadin/.project b/org.eclipse.osbp.ecview.examples.vaadin/.project
index 44d72b4..5bd3ca5 100644
--- a/org.eclipse.osbp.ecview.examples.vaadin/.project
+++ b/org.eclipse.osbp.ecview.examples.vaadin/.project
@@ -4,7 +4,7 @@
 	<comment></comment>
 	<projects>
 	</projects>
-<buildSpec>
+	<buildSpec>
 		<buildCommand>
 			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
 			<arguments>
@@ -16,6 +16,11 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
+			<name>org.eclipse.babel.editor.rbeBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
 			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>
@@ -25,5 +30,6 @@
 		<nature>org.eclipse.m2e.core.maven2Nature</nature>
 		<nature>org.eclipse.jdt.core.javanature</nature>
 		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+		<nature>org.eclipse.babel.editor.rbeNature</nature>
 	</natures>
 </projectDescription>
diff --git a/org.eclipse.osbp.ecview.feature.ide/feature.xml b/org.eclipse.osbp.ecview.feature.ide/feature.xml
index f85b09c..ccf34c9 100644
--- a/org.eclipse.osbp.ecview.feature.ide/feature.xml
+++ b/org.eclipse.osbp.ecview.feature.ide/feature.xml
@@ -1,20 +1,22 @@
 <?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 -->
-<!--#======================================================================= -->
-
-<feature
-        id="org.eclipse.osbp.ecview.feature.ide"
-        label="%featureName"
-        version="0.9.0.qualifier"
-        provider-name="%providerName">
+<!--
+ *                                                                            
+ * 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 
+-->
+	<feature 
+		id="org.eclipse.osbp.ecview.feature.ide" 
+		label="%featureName" 
+		version="0.9.0.qualifier" 
+		provider-name="%providerName"
+		plugin="org.eclipse.osbp.ecview.dsl.ide">
         
     <description>
         %description
@@ -29,16 +31,30 @@
     </license>
         
     <url>
-    <discovery label="Xtext 2.7.3" url="http://download.eclipse.org/modeling/tmf/xtext/updates/composite/releases/"/>
-    <discovery label="luna" url="http://download.eclipse.org/releases/luna"/>
+    <discovery label="Xtext 2.11.0" url="http://download.eclipse.org/modeling/tmf/xtext/updates/composite/releases/"/>
+    <discovery label="Neon" url="http://download.eclipse.org/releases/neon"/>
     </url>
         
     <requires>
-        <import feature="org.eclipse.xtext.sdk" version="2.7.3" match="equivalent"/>
+        <import feature="org.eclipse.xtext.sdk" version="2.11.0" match="equivalent"/>
         <import feature="org.eclipse.osbp.ecview.feature.runtime" version="0.9.0" match="equivalent"/>
     </requires>
         
     <plugin
+        id="org.eclipse.osbp.ecview.dsl.ide"
+        download-size="0"
+        install-size="0"
+        version="0.0.0"
+        unpack="false"/>
+        
+    <plugin
+        id="org.eclipse.osbp.ecview.uisemantics.ide"
+        download-size="0"
+        install-size="0"
+        version="0.0.0"
+        unpack="false"/>
+        
+    <plugin
         id="org.eclipse.osbp.ecview.dsl.ui"
         download-size="0"
         install-size="0"
diff --git a/org.eclipse.osbp.ecview.feature.jetty/feature.xml b/org.eclipse.osbp.ecview.feature.jetty/feature.xml
index ad10b1f..2dc3503 100644
--- a/org.eclipse.osbp.ecview.feature.jetty/feature.xml
+++ b/org.eclipse.osbp.ecview.feature.jetty/feature.xml
@@ -1,20 +1,22 @@
 <?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 -->
-<!--#======================================================================= -->
-
-<feature
-        id="org.eclipse.osbp.ecview.feature.jetty"
-        label="%featureName"
-        version="0.9.0.qualifier"
-        provider-name="%providerName">
+<!--
+ *                                                                            
+ * 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 
+-->
+<feature 
+	id="org.eclipse.osbp.ecview.feature.jetty" 
+	label="%featureName" 
+	version="0.9.0.qualifier" 
+	provider-name="%providerName"
+	plugin="org.eclipse.osbp.ecview.jetty.manager">
         
     <description>
         %description
@@ -29,8 +31,8 @@
     </license>
         
     <url>
-    <discovery label="Xtext 2.7.3" url="http://download.eclipse.org/modeling/tmf/xtext/updates/composite/releases/"/>
-    <discovery label="luna" url="http://download.eclipse.org/releases/luna"/>
+    <discovery label="Xtext 2.11.0" url="http://download.eclipse.org/modeling/tmf/xtext/updates/composite/releases/"/>
+    <discovery label="Neon" url="http://download.eclipse.org/releases/neon"/>
     </url>
         
     <requires>
@@ -44,4 +46,4 @@
         version="0.0.0"
         unpack="false"/>
         
-</feature>
+</feature>
\ No newline at end of file
diff --git a/org.eclipse.osbp.ecview.feature.runtime/feature.xml b/org.eclipse.osbp.ecview.feature.runtime/feature.xml
index 8a12d51..ea84940 100644
--- a/org.eclipse.osbp.ecview.feature.runtime/feature.xml
+++ b/org.eclipse.osbp.ecview.feature.runtime/feature.xml
@@ -14,7 +14,8 @@
         id="org.eclipse.osbp.ecview.feature.runtime"
         label="%featureName"
         version="0.9.0.qualifier"
-        provider-name="%providerName">
+        provider-name="%providerName"
+		plugin="org.eclipse.osbp.ecview.dsl">
         
     <description>
         %description
@@ -29,8 +30,8 @@
     </license>
         
     <url>
-    <discovery label="Xtext 2.7.3" url="http://download.eclipse.org/modeling/tmf/xtext/updates/composite/releases/"/>
-    <discovery label="luna" url="http://download.eclipse.org/releases/luna"/>
+    <discovery label="Xtext 2.11.0" url="http://download.eclipse.org/modeling/tmf/xtext/updates/composite/releases/"/>
+    <discovery label="Neon" url="http://download.eclipse.org/releases/neon"/>
     </url>
         
     <plugin
diff --git a/org.eclipse.osbp.ecview.feature.runtimeonly/feature.xml b/org.eclipse.osbp.ecview.feature.runtimeonly/feature.xml
index 596df6a..e265972 100644
--- a/org.eclipse.osbp.ecview.feature.runtimeonly/feature.xml
+++ b/org.eclipse.osbp.ecview.feature.runtimeonly/feature.xml
@@ -1,20 +1,10 @@
 <?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 -->
-<!--#======================================================================= -->
-
-<feature
-        id="org.eclipse.osbp.ecview.feature.runtimeonly"
-        label="%featureName"
-        version="0.9.0.qualifier"
-        provider-name="%providerName">
+	<feature 
+		id="org.eclipse.osbp.ecview.feature.runtimeonly" 
+		label="%featureName" 
+		version="0.9.0.qualifier" 
+		provider-name="%providerName"
+		plugin="org.eclipse.osbp.ecview.xtext.builder.participant">
         
     <description>
         %description
@@ -29,8 +19,8 @@
     </license>
         
     <url>
-    <discovery label="Xtext 2.7.3" url="http://download.eclipse.org/modeling/tmf/xtext/updates/composite/releases/"/>
-    <discovery label="luna" url="http://download.eclipse.org/releases/luna"/>
+    <discovery label="Xtext 2.11.0" url="http://download.eclipse.org/modeling/tmf/xtext/updates/composite/releases/"/>
+    <discovery label="Neon" url="http://download.eclipse.org/releases/neon"/>
     </url>
         
     <requires>
@@ -43,12 +33,12 @@
         install-size="0"
         version="0.0.0"
         unpack="false"/>
-        
+<!--        
     <plugin
         id="org.eclipse.osbp.ecview.xtext.builder.participant.i18n"
         download-size="0"
         install-size="0"
         version="0.0.0"
         unpack="false"/>
-        
-</feature>
+-->        
+</feature>
\ No newline at end of file
diff --git a/org.eclipse.osbp.ecview.jetty.manager/META-INF/MANIFEST.MF b/org.eclipse.osbp.ecview.jetty.manager/META-INF/MANIFEST.MF
index 73f99ed..5343cae 100644
--- a/org.eclipse.osbp.ecview.jetty.manager/META-INF/MANIFEST.MF
+++ b/org.eclipse.osbp.ecview.jetty.manager/META-INF/MANIFEST.MF
@@ -4,7 +4,7 @@
 Bundle-Vendor: Eclipse OSBP
 Bundle-Version: 0.9.0.qualifier
 Bundle-SymbolicName: org.eclipse.osbp.ecview.jetty.manager
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Export-Package: org.eclipse.osbp.ecview.jetty.manager;version="0.9.0"
 Import-Package: javax.servlet;version="2.4.0",
  org.osgi.framework;version="1.7.0",
@@ -13,11 +13,13 @@
  org.osgi.service.component.annotations;version="1.2.0",
  org.osgi.service.http;version="1.2.1",
  org.osgi.util.tracker;version="1.5.1"
-Require-Bundle: org.eclipse.jetty.server;bundle-version="[8.1.14,9.0.0)",
- org.eclipse.jetty.servlet;bundle-version="[8.1.14,9.0.0)",
- org.eclipse.jetty.http;bundle-version="[8.1.14,9.0.0)",
- org.eclipse.jetty.io;bundle-version="[8.1.14,9.0.0)",
- org.eclipse.jetty.security;bundle-version="[8.1.14,9.0.0)",
- org.eclipse.jetty.util;bundle-version="[8.1.14,9.0.0)",
- org.eclipse.equinox.http.servlet;bundle-version="1.1.500"
+Require-Bundle: org.eclipse.equinox.http.servlet;bundle-version="1.3.1",
+ org.eclipse.jetty.continuation;bundle-version="9.4.1",
+ org.eclipse.jetty.http;bundle-version="9.4.1",
+ org.eclipse.jetty.io;bundle-version="9.4.1",
+ org.eclipse.jetty.security;bundle-version="9.4.1",
+ org.eclipse.jetty.server;bundle-version="9.4.1",
+ org.eclipse.jetty.servlet;bundle-version="9.4.1",
+ org.eclipse.jetty.util;bundle-version="9.4.1",
+ org.eclipse.jetty.xml;bundle-version="9.4.1"
 Bundle-Activator: org.eclipse.osbp.ecview.jetty.manager.impl.Activator
diff --git a/org.eclipse.osbp.ecview.jetty.manager/src/org/eclipse/osbp/ecview/jetty/manager/IJettyManager.java b/org.eclipse.osbp.ecview.jetty.manager/src/org/eclipse/osbp/ecview/jetty/manager/IJettyManager.java
index 162adfb..a862409 100644
--- a/org.eclipse.osbp.ecview.jetty.manager/src/org/eclipse/osbp/ecview/jetty/manager/IJettyManager.java
+++ b/org.eclipse.osbp.ecview.jetty.manager/src/org/eclipse/osbp/ecview/jetty/manager/IJettyManager.java
@@ -58,8 +58,17 @@
 	 */
 	public static final String SERVICE_TYPE__MOBILE = "mobile";
 	/**
+	 * Service for display
+	 */
+	public static final String SERVICE_TYPE__DISPLAY = "display";
+	/**
 	 * The context path postfix for the mobile contextPath: {contextPath}mobile
 	 */
 	public static final String MOBILE_POSTFIX = "mobile";
+	
+	/**
+	 * The context path postfix for child UIs. contextPath: {contextPath}child
+	 */
+	public static final String DISPLAY_PREFIX = "display";
 
 }
diff --git a/org.eclipse.osbp.ecview.jetty.manager/src/org/eclipse/osbp/ecview/jetty/manager/impl/JettyManager.java b/org.eclipse.osbp.ecview.jetty.manager/src/org/eclipse/osbp/ecview/jetty/manager/impl/JettyManager.java
index 75d0e9f..dbe5033 100644
--- a/org.eclipse.osbp.ecview.jetty.manager/src/org/eclipse/osbp/ecview/jetty/manager/impl/JettyManager.java
+++ b/org.eclipse.osbp.ecview.jetty.manager/src/org/eclipse/osbp/ecview/jetty/manager/impl/JettyManager.java
@@ -25,11 +25,9 @@
 
 import org.eclipse.equinox.http.servlet.HttpServiceServlet;
 import org.eclipse.jetty.server.Connector;
+import org.eclipse.jetty.server.NetworkTrafficServerConnector;
 import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.bio.SocketConnector;
 import org.eclipse.jetty.server.handler.ContextHandlerCollection;
-import org.eclipse.jetty.server.nio.SelectChannelConnector;
-import org.eclipse.jetty.server.session.HashSessionManager;
 import org.eclipse.jetty.server.session.SessionHandler;
 import org.eclipse.jetty.servlet.ServletContextHandler;
 import org.eclipse.jetty.servlet.ServletHolder;
@@ -80,6 +78,13 @@
 	public String getMobileContextPath() {
 		return contextPath + MOBILE_POSTFIX;
 	}
+	
+	/**
+	 * @return the contextPath
+	 */
+	public String getDisplayContextPath() {
+		return contextPath + DISPLAY_PREFIX;
+	}
 
 	public synchronized void stop() {
 		if (server != null) {
@@ -102,18 +107,18 @@
 		this.workDir = workDir;
 
 		stop();
-		Server server = new Server();
+		this.server = new Server();
 
 		Connector httpConnector = createHttpConnector();
 		server.addConnector(httpConnector);
 
 		ContextHandlerCollection handlers = new ContextHandlerCollection();
-		ServletContextHandler applicationContext = createServletContext(
-				getContextPath(), SERVICE_TYPE__APPLICATION);
-		ServletContextHandler mobileContext = createServletContext(
-				getMobileContextPath(), SERVICE_TYPE__MOBILE);
+		ServletContextHandler applicationContext = createServletContext(getContextPath(), SERVICE_TYPE__APPLICATION);
+		ServletContextHandler mobileContext = createServletContext(getMobileContextPath(), SERVICE_TYPE__MOBILE);
+		ServletContextHandler displayContext = createServletContext(getDisplayContextPath(), SERVICE_TYPE__DISPLAY);
 		handlers.addHandler(applicationContext);
 		handlers.addHandler(mobileContext);
+		handlers.addHandler(displayContext);
 
 		server.setHandler(handlers);
 		try {
@@ -121,17 +126,13 @@
 		} catch (Exception e) {
 			throw new RuntimeException(e.getMessage(), e);
 		}
-		this.server = server;
 	}
 
-	protected ServletContextHandler createServletContext(String contextPath,
-			String serviceType) {
-		ServletHolder holder = new ServletHolder(
-				new InternalHttpServiceServlet());
+	protected ServletContextHandler createServletContext(String contextPath, String serviceType) {
+		ServletHolder holder = new ServletHolder(new InternalHttpServiceServlet());
 		holder.setInitOrder(0);
 		holder.setInitParameter(Constants.SERVICE_VENDOR, "OSBP.org"); //$NON-NLS-1$
-		holder.setInitParameter(Constants.SERVICE_DESCRIPTION,
-				"ECView" + contextPath); //$NON-NLS-1$
+		holder.setInitParameter(Constants.SERVICE_DESCRIPTION, "ECView" + contextPath); //$NON-NLS-1$
 		holder.setInitParameter(PROP_SERVICE_TYPE, serviceType);
 		holder.setInitParameter(HTTP_PORT, Integer.toString(port));
 		holder.setInitParameter(OTHER_INFO, contextPath);
@@ -147,43 +148,40 @@
 	}
 
 	private Connector createHttpConnector() {
-		Connector connector;
-		if (getDefaultNIOEnablement()) {
-			connector = new SelectChannelConnector();
-		} else {
-			connector = new SocketConnector();
-		}
+		NetworkTrafficServerConnector connector = new NetworkTrafficServerConnector(server);
 		connector.setPort(port);
 		return connector;
 	}
 
-	private Boolean getDefaultNIOEnablement() {
-		Properties systemProperties = System.getProperties();
-		String javaVendor = systemProperties.getProperty("java.vendor", ""); //$NON-NLS-1$ //$NON-NLS-2$
-		if (javaVendor.equals("IBM Corporation")) { //$NON-NLS-1$
-			String javaVersion = systemProperties.getProperty(
-					"java.version", ""); //$NON-NLS-1$ //$NON-NLS-2$
-			if (javaVersion.startsWith("1.4")) //$NON-NLS-1$
-				return Boolean.FALSE;
-			// Note: no problems currently logged with 1.5
-			if (javaVersion.equals("1.6.0")) { //$NON-NLS-1$
-				String jclVersion = systemProperties.getProperty(
-						"java.jcl.version", ""); //$NON-NLS-1$ //$NON-NLS-2$
-				if (jclVersion.startsWith("2007")) //$NON-NLS-1$
-					return Boolean.FALSE;
-				if (jclVersion.startsWith("2008") && !jclVersion.startsWith("200811") && !jclVersion.startsWith("200812")) //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-					return Boolean.FALSE;
-			}
-		}
-		return Boolean.TRUE;
-	}
+	// private Boolean getDefaultNIOEnablement() {
+	// Properties systemProperties = System.getProperties();
+	// String javaVendor = systemProperties.getProperty("java.vendor", "");
+	// //$NON-NLS-1$ //$NON-NLS-2$
+	// if (javaVendor.equals("IBM Corporation")) { //$NON-NLS-1$
+	// String javaVersion = systemProperties.getProperty("java.version", "");
+	// //$NON-NLS-1$ //$NON-NLS-2$
+	// if (javaVersion.startsWith("1.4")) //$NON-NLS-1$
+	// return Boolean.FALSE;
+	// // Note: no problems currently logged with 1.5
+	// if (javaVersion.equals("1.6.0")) { //$NON-NLS-1$
+	// String jclVersion = systemProperties.getProperty("java.jcl.version", "");
+	// //$NON-NLS-1$ //$NON-NLS-2$
+	// if (jclVersion.startsWith("2007")) //$NON-NLS-1$
+	// return Boolean.FALSE;
+	// if (jclVersion.startsWith("2008") && !jclVersion.startsWith("200811")
+	// //$NON-NLS-1$ //$NON-NLS-2$
+	// && !jclVersion.startsWith("200812")) //$NON-NLS-1$
+	// return Boolean.FALSE;
+	// }
+	// }
+	// return Boolean.TRUE;
+	// }
 
 	private ServletContextHandler createHttpContext(String contextPath) {
 		ServletContextHandler httpContext = new ServletContextHandler();
 		// hack in the mime type for xsd until jetty fixes it (bug 393218)
 		httpContext.getMimeTypes().addMimeMapping("xsd", "application/xml"); //$NON-NLS-1$ //$NON-NLS-2$
-		httpContext.setAttribute(INTERNAL_CONTEXT_CLASSLOADER, Thread
-				.currentThread().getContextClassLoader());
+		httpContext.setAttribute(INTERNAL_CONTEXT_CLASSLOADER, Thread.currentThread().getContextClassLoader());
 		httpContext.setClassLoader(this.getClass().getClassLoader());
 		httpContext.setContextPath(contextPath);
 
@@ -191,9 +189,7 @@
 		contextWorkDir.mkdir();
 		httpContext.setAttribute(CONTEXT_TEMPDIR, contextWorkDir);
 
-		HashSessionManager sessionManager = new HashSessionManager();
-
-		httpContext.setSessionHandler(new SessionHandler(sessionManager));
+		httpContext.setSessionHandler(new SessionHandler());
 
 		return httpContext;
 	}
@@ -205,8 +201,7 @@
 
 		public void init(ServletConfig config) throws ServletException {
 			ServletContext context = config.getServletContext();
-			contextLoader = (ClassLoader) context
-					.getAttribute(INTERNAL_CONTEXT_CLASSLOADER);
+			contextLoader = (ClassLoader) context.getAttribute(INTERNAL_CONTEXT_CLASSLOADER);
 
 			Thread thread = Thread.currentThread();
 			ClassLoader current = thread.getContextClassLoader();
@@ -230,8 +225,7 @@
 			contextLoader = null;
 		}
 
-		public void service(ServletRequest req, ServletResponse res)
-				throws ServletException, IOException {
+		public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
 			Thread thread = Thread.currentThread();
 			ClassLoader current = thread.getContextClassLoader();
 			thread.setContextClassLoader(contextLoader);
diff --git a/org.eclipse.osbp.ecview.uisemantics.tests/.project b/org.eclipse.osbp.ecview.uisemantics.tests/.project
index ac4f015..34de15e 100644
--- a/org.eclipse.osbp.ecview.uisemantics.tests/.project
+++ b/org.eclipse.osbp.ecview.uisemantics.tests/.project
@@ -20,15 +20,9 @@
 			<arguments>
 			</arguments>
 		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
 	</buildSpec>
 	<natures>
 		<nature>org.eclipse.jdt.core.javanature</nature>
 		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
 	</natures>
 </projectDescription>
diff --git a/org.eclipse.osbp.ecview.uisemantics.tests/META-INF/MANIFEST.MF b/org.eclipse.osbp.ecview.uisemantics.tests/META-INF/MANIFEST.MF
index 68ee362..ddcd6ca 100644
--- a/org.eclipse.osbp.ecview.uisemantics.tests/META-INF/MANIFEST.MF
+++ b/org.eclipse.osbp.ecview.uisemantics.tests/META-INF/MANIFEST.MF
@@ -1,16 +1,26 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
-Bundle-Name: org.eclipse.osbp.ecview.uisemantics.tests
-Bundle-Vendor: Eclipse OSBP
+Bundle-Name: %pluginName
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
 Bundle-Version: 0.9.0.qualifier
-Bundle-SymbolicName: org.eclipse.osbp.ecview.uisemantics.tests;singleton:=true
+Bundle-ClassPath: .
+Bundle-SymbolicName: org.eclipse.osbp.ecview.tests;singleton:=true
 Bundle-ActivationPolicy: lazy
-Require-Bundle: org.eclipse.osbp.ecview.uisemantics;bundle-version="[0.9.0,0.10.0)",
+Require-Bundle: org.eclipse.osbp.ecview.uisemantics;bundle-version="[0.9.0,0.10.0)";visibility:=reexport,
+ org.eclipse.emf.ecore;visibility:=reexport,
+ org.eclipse.xtext.common.types;visibility:=reexport,
+ org.eclipse.xtext.xbase;visibility:=reexport,
+ org.eclipse.emf.ecore.xmi;visibility:=reexport,
+ org.junit;visibility:=reexport,
  org.eclipse.osbp.ecview.uisemantics.ui;bundle-version="[0.9.0,0.10.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.objectweb.asm;bundle-version="[5.0.1,6.0.0)";resolution:=optional,
+ org.eclipse.xtext.xbase.lib,
+ org.eclipse.xtext.testing,
+ org.eclipse.xtext.xbase.testing
 Import-Package: org.apache.log4j,
  org.junit;version="4.5.0",
  org.junit.runner;version="4.5.0",
@@ -20,4 +30,6 @@
  org.junit.runners.model;version="4.5.0",
  org.hamcrest.core
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Export-Package: org.eclipse.osbp.ecview.uisemantics;version="0.9.0"
+Export-Package: org.eclipse.osbp.ecview.uisemantics;version="0.9.0",
+ org.eclipse.osbp.ecview.semantic.uisemantics.tests,
+ org.eclipse.osbp.ecview.uisemantics.tests;x-internal=true
diff --git a/org.eclipse.osbp.ecview.uisemantics.tests/src-gen/org/eclipse/osbp/ecview/uisemantics/UISemanticsGrammarInjectorProvider.java b/org.eclipse.osbp.ecview.uisemantics.tests/src-gen/org/eclipse/osbp/ecview/uisemantics/UISemanticsGrammarInjectorProvider.java
deleted file mode 100644
index 16875ae..0000000
--- a/org.eclipse.osbp.ecview.uisemantics.tests/src-gen/org/eclipse/osbp/ecview/uisemantics/UISemanticsGrammarInjectorProvider.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/**
- * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf), Loetz GmbH&Co.KG (Heidelberg)
- * 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:
- *         Florian Pirchner - Initial implementation
- */
-
-package org.eclipse.osbp.ecview.uisemantics;
-
-import org.eclipse.xtext.junit4.GlobalRegistries;
-import org.eclipse.xtext.junit4.GlobalRegistries.GlobalStateMemento;
-import org.eclipse.xtext.junit4.IInjectorProvider;
-import org.eclipse.xtext.junit4.IRegistryConfigurator;
-
-import com.google.inject.Injector;
-
-public class UISemanticsGrammarInjectorProvider implements IInjectorProvider, IRegistryConfigurator {
-	
-    protected GlobalStateMemento stateBeforeInjectorCreation;
-	protected GlobalStateMemento stateAfterInjectorCreation;
-	protected Injector injector;
-
-	static {
-		GlobalRegistries.initializeDefaults();
-	}
-
-	public Injector getInjector()
-	{
-		if (injector == null) {
-			stateBeforeInjectorCreation = GlobalRegistries.makeCopyOfGlobalState();
-			this.injector = internalCreateInjector();
-			stateAfterInjectorCreation = GlobalRegistries.makeCopyOfGlobalState();
-		}
-		return injector;
-	}
-	
-	protected Injector internalCreateInjector() {
-	    return new UISemanticsGrammarStandaloneSetup().createInjectorAndDoEMFRegistration();
-	}
-
-	public void restoreRegistry() {
-		stateBeforeInjectorCreation.restoreGlobalState();
-	}
-
-	public void setupRegistry() {
-		getInjector();
-		stateAfterInjectorCreation.restoreGlobalState();
-	}
-}
diff --git a/org.eclipse.osbp.ecview.uisemantics.tests/src-gen/org/eclipse/osbp/ecview/uisemantics/UISemanticsGrammarUiInjectorProvider.java b/org.eclipse.osbp.ecview.uisemantics.tests/src-gen/org/eclipse/osbp/ecview/uisemantics/UISemanticsGrammarUiInjectorProvider.java
deleted file mode 100644
index e031e39..0000000
--- a/org.eclipse.osbp.ecview.uisemantics.tests/src-gen/org/eclipse/osbp/ecview/uisemantics/UISemanticsGrammarUiInjectorProvider.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/**
- * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf), Loetz GmbH&Co.KG (Heidelberg)
- * 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:
- *         Florian Pirchner - Initial implementation
- */
-
-package org.eclipse.osbp.ecview.uisemantics;
-
-import org.eclipse.xtext.junit4.IInjectorProvider;
-
-import com.google.inject.Injector;
-
-public class UISemanticsGrammarUiInjectorProvider implements IInjectorProvider {
-	
-	public Injector getInjector() {
-		return org.eclipse.osbp.ecview.uisemantics.ui.internal.UISemanticsGrammarActivator.getInstance().getInjector("org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar");
-	}
-	
-}
diff --git a/org.eclipse.osbp.ecview.uisemantics.ui/META-INF/MANIFEST.MF b/org.eclipse.osbp.ecview.uisemantics.ui/META-INF/MANIFEST.MF
index 1aa9a31..772f21b 100644
--- a/org.eclipse.osbp.ecview.uisemantics.ui/META-INF/MANIFEST.MF
+++ b/org.eclipse.osbp.ecview.uisemantics.ui/META-INF/MANIFEST.MF
@@ -6,33 +6,24 @@
 Bundle-SymbolicName: org.eclipse.osbp.ecview.uisemantics.ui;singleton:=true
 Bundle-ActivationPolicy: lazy
 Require-Bundle: org.eclipse.osbp.ecview.uisemantics;bundle-version="[0.9.0,0.10.0)";visibility:=reexport,
- org.eclipse.xtext.ui;bundle-version="[2.7.3,2.8.0)",
+ org.eclipse.osbp.ecview.uisemantics.ide;bundle-version="[0.9.0,0.10.0)",
+ org.eclipse.xtext.ui;bundle-version="[2.11.0,2.12.0)",
  org.eclipse.ui.editors;bundle-version="3.5.0",
  org.eclipse.ui.ide;bundle-version="3.5.0",
- org.eclipse.xtext.ui.shared;bundle-version="[2.7.3,2.8.0)",
- org.eclipse.xtext.xbase.ui;bundle-version="[2.7.3,2.8.0)",
+ org.eclipse.xtext.ui.shared;bundle-version="[2.11.0,2.12.0)",
+ org.eclipse.xtext.xbase.ui;bundle-version="[2.11.0,2.12.0)",
  org.eclipse.ui,
- org.eclipse.xtext.builder;bundle-version="[2.7.3,2.8.0)",
+ org.eclipse.xtext.builder;bundle-version="[2.11.0,2.12.0)",
  org.antlr.runtime,
- org.eclipse.xtext.common.types.ui;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.common.types.ui;bundle-version="[2.11.0,2.12.0)",
+ org.eclipse.xtext.ui.codetemplates.ui;bundle-version="[2.11.0,2.12.0)",
  org.eclipse.compare,
- org.eclipse.xtext.xbase.lib;bundle-version="[2.7.3,2.8.0)",
- org.eclipse.jdt.debug.ui
+ org.eclipse.xtext.xbase.lib;bundle-version="[2.11.0,2.12.0)",
+ org.eclipse.jdt.debug.ui,
+ org.eclipse.xtend.lib;resolution:=optional
 Import-Package: org.apache.log4j
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Export-Package: org.eclipse.osbp.ecview.uisemantics.ui.contentassist;version="0.9.0",
- org.eclipse.osbp.ecview.uisemantics.ui.contentassist.antlr;
-  uses:="org.eclipse.xtext,
-   org.eclipse.osbp.ecview.uisemantics.services,
-   org.eclipse.xtext.ui.editor.contentassist.antlr.internal,
-   org.eclipse.osbp.ecview.uisemantics.ui.contentassist.antlr.internal,
-   org.eclipse.xtext.ui.codetemplates.ui.partialEditing,
-   org.eclipse.xtext.ui.editor.contentassist.antlr";version="0.9.0",
- org.eclipse.osbp.ecview.uisemantics.ui.internal;
-  uses:="org.eclipse.ui.plugin,
-   org.osgi.framework,
-   com.google.inject";version="0.9.0",
- org.eclipse.osbp.ecview.uisemantics.ui.quickfix;
-  uses:="org.eclipse.xtext.xbase.ui.quickfix";version="0.9.0"
-Bundle-Activator: org.eclipse.osbp.ecview.uisemantics.ui.internal.UISemanticsGrammarActivator
+ org.eclipse.osbp.ecview.uisemantics.ui.internal; uses:="org.eclipse.ui.plugin,  org.osgi.framework,  com.google.inject";version="0.9.0",
+ org.eclipse.osbp.ecview.uisemantics.ui.quickfix; uses:="org.eclipse.xtext.xbase.ui.quickfix";version="0.9.0"
+Bundle-Activator: org.eclipse.osbp.ecview.uisemantics.ui.internal.UisemanticsActivator
diff --git a/org.eclipse.osbp.ecview.uisemantics.ui/plugin.xml_gen b/org.eclipse.osbp.ecview.uisemantics.ui/plugin.xml_gen
index 7805df0..62511f4 100644
--- a/org.eclipse.osbp.ecview.uisemantics.ui/plugin.xml_gen
+++ b/org.eclipse.osbp.ecview.uisemantics.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.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.XtextEditor"
-            contributorClass="org.eclipse.ui.editors.text.TextEditorActionContributor"
-            default="true"
-            extensions="uisemantic"
-            id="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar"
-            matchingStrategy="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.xbase.ui.editor.JavaEditorInputMatcher"
-            name="UISemanticsGrammar Editor">
-        </editor>
-    </extension>
-    <extension
-        point="org.eclipse.ui.handlers">
-        <handler
-            class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.hyperlinking.OpenDeclarationHandler"
-            commandId="org.eclipse.xtext.ui.editor.hyperlinking.OpenDeclaration">
-            <activeWhen>
-                <reference
-                    definitionId="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.Editor.opened">
-                </reference>
-            </activeWhen>
-        </handler>
-        <handler
-            class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.handler.ValidateActionHandler"
-            commandId="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.validate">
-         <activeWhen>
-            <reference
-                    definitionId="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.Editor.opened">
-            </reference>
-         </activeWhen>
-      	</handler>
-      	<!-- copy qualified name -->
-        <handler
-            class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory: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.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.XtextEditor"
+			contributorClass="org.eclipse.ui.editors.text.TextEditorActionContributor"
+			default="true"
+			extensions="uisemantic"
+			id="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar"
+			matchingStrategy="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.xbase.ui.editor.JavaEditorInputMatcher"
+			name="UISemanticsGrammar Editor">
+		</editor>
+	</extension>
+	<extension
+		point="org.eclipse.ui.handlers">
+		<handler
+			class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.hyperlinking.OpenDeclarationHandler"
+			commandId="org.eclipse.xtext.ui.editor.hyperlinking.OpenDeclaration">
+			<activeWhen>
+				<reference
+					definitionId="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.Editor.opened">
+				</reference>
+			</activeWhen>
+		</handler>
+		<handler
+			class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.handler.ValidateActionHandler"
+			commandId="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.validate">
+		<activeWhen>
+			<reference
+					definitionId="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.Editor.opened">
+			</reference>
+		</activeWhen>
+		</handler>
+		<!-- copy qualified name -->
+		<handler
+			class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedNameHandler"
+			commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName">
+			<activeWhen>
 				<reference definitionId="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.Editor.opened" />
-            </activeWhen>
-        </handler>
-        <handler
-            class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedNameHandler"
-            commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedName">
-            <activeWhen>
-            	<and>
-            		<reference definitionId="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.XtextEditor.opened" />
-	                <iterate>
+			</activeWhen>
+		</handler>
+		<handler
+			class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedNameHandler"
+			commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedName">
+			<activeWhen>
+				<and>
+					<reference definitionId="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.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.ecview.uisemantics.UISemanticsGrammar.Editor.opened">
-            <and>
-                <reference definitionId="isActiveEditorAnInstanceOfXtextEditor"/>
-                <with variable="activeEditor">
-                    <test property="org.eclipse.xtext.ui.editor.XtextEditor.languageName" 
-                        value="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar" 
-                        forcePluginActivation="true"/>
-                </with>        
-            </and>
-        </definition>
-        <definition id="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.XtextEditor.opened">
-            <and>
-                <reference definitionId="isXtextEditorActive"/>
-                <with variable="activeEditor">
-                    <test property="org.eclipse.xtext.ui.editor.XtextEditor.languageName" 
-                        value="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar" 
-                        forcePluginActivation="true"/>
-                </with>        
-            </and>
-        </definition>
-    </extension>
-    <extension
-            point="org.eclipse.ui.preferencePages">
-        <page
-            class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.preferences.LanguageRootPreferencePage"
-            id="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar"
-            name="UISemanticsGrammar">
-            <keywordReference id="org.eclipse.osbp.ecview.uisemantics.ui.keyword_UISemanticsGrammar"/>
-        </page>
-        <page
-            category="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar"
-            class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.syntaxcoloring.SyntaxColoringPreferencePage"
-            id="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.coloring"
-            name="Syntax Coloring">
-            <keywordReference id="org.eclipse.osbp.ecview.uisemantics.ui.keyword_UISemanticsGrammar"/>
-        </page>
-        <page
-            category="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar"
-            class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.templates.XtextTemplatePreferencePage"
-            id="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.templates"
-            name="Templates">
-            <keywordReference id="org.eclipse.osbp.ecview.uisemantics.ui.keyword_UISemanticsGrammar"/>
-        </page>
-    </extension>
-    <extension
-            point="org.eclipse.ui.propertyPages">
-        <page
-            class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.preferences.LanguageRootPreferencePage"
-            id="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar"
-            name="UISemanticsGrammar">
-            <keywordReference id="org.eclipse.osbp.ecview.uisemantics.ui.keyword_UISemanticsGrammar"/>
-            <enabledWhen>
-	            <adapt type="org.eclipse.core.resources.IProject"/>
+			</activeWhen>
+		</handler>
+	</extension>
+	<extension point="org.eclipse.core.expressions.definitions">
+		<definition id="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.Editor.opened">
+			<and>
+				<reference definitionId="isActiveEditorAnInstanceOfXtextEditor"/>
+				<with variable="activeEditor">
+					<test property="org.eclipse.xtext.ui.editor.XtextEditor.languageName"
+						value="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar"
+						forcePluginActivation="true"/>
+				</with>
+			</and>
+		</definition>
+		<definition id="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.XtextEditor.opened">
+			<and>
+				<reference definitionId="isXtextEditorActive"/>
+				<with variable="activeEditor">
+					<test property="org.eclipse.xtext.ui.editor.XtextEditor.languageName"
+						value="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar"
+						forcePluginActivation="true"/>
+				</with>
+			</and>
+		</definition>
+	</extension>
+	<extension
+			point="org.eclipse.ui.preferencePages">
+		<page
+			class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.preferences.LanguageRootPreferencePage"
+			id="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar"
+			name="UISemanticsGrammar">
+			<keywordReference id="org.eclipse.osbp.ecview.uisemantics.ui.keyword_UISemanticsGrammar"/>
+		</page>
+		<page
+			category="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar"
+			class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.syntaxcoloring.SyntaxColoringPreferencePage"
+			id="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.coloring"
+			name="Syntax Coloring">
+			<keywordReference id="org.eclipse.osbp.ecview.uisemantics.ui.keyword_UISemanticsGrammar"/>
+		</page>
+		<page
+			category="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar"
+			class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.templates.XtextTemplatePreferencePage"
+			id="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.templates"
+			name="Templates">
+			<keywordReference id="org.eclipse.osbp.ecview.uisemantics.ui.keyword_UISemanticsGrammar"/>
+		</page>
+	</extension>
+	<extension
+			point="org.eclipse.ui.propertyPages">
+		<page
+			class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.preferences.LanguageRootPreferencePage"
+			id="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar"
+			name="UISemanticsGrammar">
+			<keywordReference id="org.eclipse.osbp.ecview.uisemantics.ui.keyword_UISemanticsGrammar"/>
+			<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.ecview.uisemantics.ui.keyword_UISemanticsGrammar"
-            label="UISemanticsGrammar"/>
-    </extension>
-    <extension
-         point="org.eclipse.ui.commands">
-      <command
-            description="Trigger expensive validation"
-            id="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.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.ecview.uisemantics.UISemanticsGrammar.validate"
-                 style="push"
-                 tooltip="Trigger expensive validation">
-            <visibleWhen checkEnabled="false">
-                <reference
-                    definitionId="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.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.ecview.uisemantics.UISemanticsGrammar.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.ecview.uisemantics.UISemanticsGrammar.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.ecview.uisemantics.ui.keyword_UISemanticsGrammar"
+			label="UISemanticsGrammar"/>
+	</extension>
+	<extension
+		point="org.eclipse.ui.commands">
+	<command
+			description="Trigger expensive validation"
+			id="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.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.ecview.uisemantics.UISemanticsGrammar.validate"
+				 style="push"
+				 tooltip="Trigger expensive validation">
+			<visibleWhen checkEnabled="false">
+				<reference
+					definitionId="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.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.ecview.uisemantics.UISemanticsGrammar.XtextEditor.opened" />
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.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.ecview.uisemantics.UISemanticsGrammar.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.ecview.uisemantics.UISemanticsGrammar.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.ecview.uisemantics.UISemanticsGrammar.Editor.opened">
-                	</reference>
-            	</visibleWhen>
+					<reference definitionId="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.Editor.opened">
+					</reference>
+				</visibleWhen>
 			</command>
 		</menuContribution>
 	</extension>
 	<extension point="org.eclipse.ui.handlers">
-	    <handler
-            class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.findrefs.FindReferencesHandler"
-            commandId="org.eclipse.xtext.ui.editor.FindReferences">
-            <activeWhen>
-                <reference
-                    definitionId="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.Editor.opened">
-                </reference>
-            </activeWhen>
-        </handler>
-    </extension>   
-
-<!-- adding resource factories -->
-
+		<handler
+			class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.findrefs.FindReferencesHandler"
+			commandId="org.eclipse.xtext.ui.editor.FindReferences">
+			<activeWhen>
+				<reference
+					definitionId="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.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.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.resource.IResourceUIServiceProvider"
-            uriExtension="uisemantic">
-        </resourceServiceProvider>
-    </extension>
-
-
+		<resourceServiceProvider
+			class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.resource.IResourceUIServiceProvider"
+			uriExtension="uisemantic">
+		</resourceServiceProvider>
+	</extension>
 	<!-- marker definitions for org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar -->
 	<extension
-	        id="uisemanticsgrammar.check.fast"
-	        name="UISemanticsGrammar Problem"
-	        point="org.eclipse.core.resources.markers">
-	    <super type="org.eclipse.xtext.ui.check.fast"/>
-	    <persistent value="true"/>
+			id="uisemanticsgrammar.check.fast"
+			name="UISemanticsGrammar Problem"
+			point="org.eclipse.core.resources.markers">
+		<super type="org.eclipse.xtext.ui.check.fast"/>
+		<persistent value="true"/>
 	</extension>
 	<extension
-	        id="uisemanticsgrammar.check.normal"
-	        name="UISemanticsGrammar Problem"
-	        point="org.eclipse.core.resources.markers">
-	    <super type="org.eclipse.xtext.ui.check.normal"/>
-	    <persistent value="true"/>
+			id="uisemanticsgrammar.check.normal"
+			name="UISemanticsGrammar Problem"
+			point="org.eclipse.core.resources.markers">
+		<super type="org.eclipse.xtext.ui.check.normal"/>
+		<persistent value="true"/>
 	</extension>
 	<extension
-	        id="uisemanticsgrammar.check.expensive"
-	        name="UISemanticsGrammar Problem"
-	        point="org.eclipse.core.resources.markers">
-	    <super type="org.eclipse.xtext.ui.check.expensive"/>
-	    <persistent value="true"/>
+			id="uisemanticsgrammar.check.expensive"
+			name="UISemanticsGrammar 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.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.builder.IXtextBuilderParticipant"
-            fileExtensions="uisemantic"
-            >
-      </participant>
-   </extension>
-   <extension
-            point="org.eclipse.ui.preferencePages">
-        <page
-            category="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar"
-            class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.builder.preferences.BuilderPreferencePage"
-            id="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.compiler.preferencePage"
-            name="Compiler">
-            <keywordReference id="org.eclipse.osbp.ecview.uisemantics.ui.keyword_UISemanticsGrammar"/>
-        </page>
-    </extension>
-    <extension
-            point="org.eclipse.ui.propertyPages">
-        <page
-            category="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar"
-            class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.builder.preferences.BuilderPreferencePage"
-            id="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.compiler.propertyPage"
-            name="Compiler">
-            <keywordReference id="org.eclipse.osbp.ecview.uisemantics.ui.keyword_UISemanticsGrammar"/>
-            <enabledWhen>
-	            <adapt type="org.eclipse.core.resources.IProject"/>
+	<extension point="org.eclipse.xtext.builder.participant">
+		<participant
+			class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.builder.IXtextBuilderParticipant"
+			fileExtensions="uisemantic"/>
+	</extension>
+	<extension point="org.eclipse.ui.preferencePages">
+		<page
+			category="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar"
+			class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.builder.preferences.BuilderPreferencePage"
+			id="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.compiler.preferencePage"
+			name="Compiler">
+			<keywordReference id="org.eclipse.osbp.ecview.uisemantics.ui.keyword_UISemanticsGrammar"/>
+		</page>
+	</extension>
+	<extension point="org.eclipse.ui.propertyPages">
+		<page
+			category="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar"
+			class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.builder.preferences.BuilderPreferencePage"
+			id="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.compiler.propertyPage"
+			name="Compiler">
+			<keywordReference id="org.eclipse.osbp.ecview.uisemantics.ui.keyword_UISemanticsGrammar"/>
+			<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.ecview.uisemantics.UISemanticsGrammar.OpenGeneratedCode"
+				style="push">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.Editor.opened" />
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<extension point="org.eclipse.ui.handlers">
+		<handler
+			class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.generator.trace.OpenGeneratedFileHandler"
+			commandId="org.eclipse.xtext.ui.OpenGeneratedFileCommand">
+			<activeWhen>
+				<reference definitionId="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.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.ecview.uisemantics.UISemanticsGrammar -->
-    <extension
-            point="org.eclipse.ui.ide.markerResolution">
-        <markerResolutionGenerator
-            class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
-            markerType="org.eclipse.osbp.ecview.uisemantics.ui.uisemanticsgrammar.check.fast">
-            <attribute
-                name="FIXABLE_KEY"
-                value="true">
-            </attribute>
-        </markerResolutionGenerator>
-        <markerResolutionGenerator
-            class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
-            markerType="org.eclipse.osbp.ecview.uisemantics.ui.uisemanticsgrammar.check.normal">
-            <attribute
-                name="FIXABLE_KEY"
-                value="true">
-            </attribute>
-        </markerResolutionGenerator>
-        <markerResolutionGenerator
-            class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
-            markerType="org.eclipse.osbp.ecview.uisemantics.ui.uisemanticsgrammar.check.expensive">
-            <attribute
-                name="FIXABLE_KEY"
-                value="true">
-            </attribute>
-        </markerResolutionGenerator>
-    </extension>
-   	<!-- Rename Refactoring -->
+	<!-- quickfix marker resolution generator for org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar -->
+	<extension
+			point="org.eclipse.ui.ide.markerResolution">
+		<markerResolutionGenerator
+			class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
+			markerType="org.eclipse.osbp.ecview.uisemantics.ui.uisemanticsgrammar.check.fast">
+			<attribute
+				name="FIXABLE_KEY"
+				value="true">
+			</attribute>
+		</markerResolutionGenerator>
+		<markerResolutionGenerator
+			class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
+			markerType="org.eclipse.osbp.ecview.uisemantics.ui.uisemanticsgrammar.check.normal">
+			<attribute
+				name="FIXABLE_KEY"
+				value="true">
+			</attribute>
+		</markerResolutionGenerator>
+		<markerResolutionGenerator
+			class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
+			markerType="org.eclipse.osbp.ecview.uisemantics.ui.uisemanticsgrammar.check.expensive">
+			<attribute
+				name="FIXABLE_KEY"
+				value="true">
+			</attribute>
+		</markerResolutionGenerator>
+	</extension>
+	<!-- Rename Refactoring -->
 	<extension point="org.eclipse.ui.handlers">
 		<handler 
 			class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory: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.ecview.uisemantics.UISemanticsGrammar.Editor.opened">
-               </reference>
-            </visibleWhen>
-         </command>
-      </menuContribution>
-   </extension>
-   <extension point="org.eclipse.ui.preferencePages">
-	    <page
-	        category="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar"
-	        class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.refactoring.ui.RefactoringPreferencePage"
-	        id="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.refactoring"
-	        name="Refactoring">
-	        <keywordReference id="org.eclipse.osbp.ecview.uisemantics.ui.keyword_UISemanticsGrammar"/>
-	    </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.ecview.uisemantics.UISemanticsGrammar.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.ecview.uisemantics.UISemanticsGrammar"
+			class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.refactoring.ui.RefactoringPreferencePage"
+			id="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.refactoring"
+			name="Refactoring">
+			<keywordReference id="org.eclipse.osbp.ecview.uisemantics.ui.keyword_UISemanticsGrammar"/>
+		</page>
+	</extension>
+	<!-- Type Hierarchy  -->
+	<extension point="org.eclipse.ui.handlers">
 		<handler 
 			class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.xbase.ui.hierarchy.OpenTypeHierarchyHandler"
 			commandId="org.eclipse.xtext.xbase.ui.hierarchy.OpenTypeHierarchy">
@@ -399,29 +405,29 @@
 			</activeWhen>
 		</handler>
 		<handler
-            class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.xbase.ui.imports.OrganizeImportsHandler"
-            commandId="org.eclipse.xtext.xbase.ui.organizeImports">
-           	<activeWhen>
+			class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.xbase.ui.imports.OrganizeImportsHandler"
+			commandId="org.eclipse.xtext.xbase.ui.organizeImports">
+			<activeWhen>
 				<reference
 					definitionId="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.Editor.opened">
 				</reference>
 			</activeWhen>
-        </handler>
+		</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.ecview.uisemantics.UISemanticsGrammar.Editor.opened">
-                    </reference>
-                </visibleWhen>
-            </command>  
-        </menuContribution>
+		<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.ecview.uisemantics.UISemanticsGrammar.Editor.opened">
+					</reference>
+				</visibleWhen>
+			</command>
+		</menuContribution>
 		<menuContribution
 			locationURI="popup:#TextEditorContext?after=group.open">
 			<command commandId="org.eclipse.xtext.xbase.ui.hierarchy.OpenTypeHierarchy"
@@ -444,8 +450,7 @@
 		</menuContribution>
 	</extension>
 	<!-- Call Hierachy -->
-	<extension
-		point="org.eclipse.ui.handlers">
+	<extension point="org.eclipse.ui.handlers">
 		<handler 
 			class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.xbase.ui.hierarchy.OpenCallHierachyHandler"
 			commandId="org.eclipse.xtext.xbase.ui.hierarchy.OpenCallHierarchy">
@@ -456,7 +461,6 @@
 			</activeWhen>
 		</handler>
 	</extension>
-	
 	<extension point="org.eclipse.ui.menus">
 		<menuContribution
 			locationURI="popup:#TextEditorContext?after=group.open">
@@ -469,50 +473,49 @@
 			</command>
 		</menuContribution>
 	</extension>
-	<extension
-         point="org.eclipse.core.runtime.adapters">
-      <factory class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory: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.ecview.uisemantics.UISemanticsGrammar" 
-                          id="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.rulerActions">
-	     <action
-	             label="Not Used"
-	             class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.debug.ui.actions.RulerToggleBreakpointActionDelegate"
-	             style="push"
-	             actionID="RulerDoubleClick"
-	             id="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.doubleClickBreakpointAction"/>
-	  </editorContribution>
-   </extension>
-   <extension point="org.eclipse.ui.popupMenus">
-      <viewerContribution
-         targetID="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.RulerContext"
-         id="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.RulerPopupActions">
-         <action
-            label="Toggle Breakpoint"
-            class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.debug.ui.actions.RulerToggleBreakpointActionDelegate"
-            menubarPath="debug"
-            id="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.rulerContextMenu.toggleBreakpointAction">
-         </action>
-         <action
-            label="Not used"
-            class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.debug.ui.actions.RulerEnableDisableBreakpointActionDelegate"
-            menubarPath="debug"
-            id="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.rulerContextMenu.enableDisableBreakpointAction">
-         </action>
-         <action
-           label="Breakpoint Properties"
-           helpContextId="breakpoint_properties_action_context"
-           class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.jdt.debug.ui.actions.JavaBreakpointPropertiesRulerActionDelegate"
-           menubarPath="group.properties"
-           id="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.rulerContextMenu.openBreapointPropertiesAction">
-         </action>
-      </viewerContribution>
-   </extension>
-    <!-- Introduce Local Variable Refactoring -->
+	<extension point="org.eclipse.core.runtime.adapters">
+		<factory class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory: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.ecview.uisemantics.UISemanticsGrammar" 
+			id="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.rulerActions">
+			<action
+				label="Not Used"
+	 			class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.debug.ui.actions.RulerToggleBreakpointActionDelegate"
+				style="push"
+				actionID="RulerDoubleClick"
+				id="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.doubleClickBreakpointAction"/>
+		</editorContribution>
+	</extension>
+	<extension point="org.eclipse.ui.popupMenus">
+		<viewerContribution
+			targetID="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.RulerContext"
+			id="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.RulerPopupActions">
+			<action
+				label="Toggle Breakpoint"
+				class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.debug.ui.actions.RulerToggleBreakpointActionDelegate"
+				menubarPath="debug"
+				id="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.rulerContextMenu.toggleBreakpointAction">
+			</action>
+			<action
+				label="Not used"
+				class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.debug.ui.actions.RulerEnableDisableBreakpointActionDelegate"
+				menubarPath="debug"
+				id="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.rulerContextMenu.enableDisableBreakpointAction">
+			</action>
+			<action
+				label="Breakpoint Properties"
+				helpContextId="breakpoint_properties_action_context"
+				class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.jdt.debug.ui.actions.JavaBreakpointPropertiesRulerActionDelegate"
+				menubarPath="group.properties"
+				id="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.rulerContextMenu.openBreapointPropertiesAction">
+			</action>
+		</viewerContribution>
+	</extension>
+	<!-- Introduce Local Variable Refactoring -->
 	<extension point="org.eclipse.ui.handlers">
 		<handler 
 			class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.xbase.ui.refactoring.ExtractVariableHandler"
@@ -524,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.ecview.uisemantics.UISemanticsGrammar.Editor.opened">
-               </reference>
-            </visibleWhen>
-         </command>
-      </menuContribution>
-   </extension>  
-   <!-- Open implementation -->
-   <extension point="org.eclipse.ui.handlers">
-      <handler
-            class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory: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.ecview.uisemantics.UISemanticsGrammar.Editor.opened">
+					</reference>
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<!-- Open implementation -->
+	<extension point="org.eclipse.ui.handlers">
+		<handler
+			class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.xbase.ui.navigation.OpenImplementationHandler"
+			commandId="org.eclipse.xtext.xbase.ui.OpenImplementationCommand">
+			<activeWhen>
 				<reference
 					definitionId="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.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.ecview.uisemantics.UISemanticsGrammar.Editor.opened">
-              </reference>
-		</visibleWhen>
-         </command>
-      </menuContribution>
-   </extension>
-
-  <extension point="org.eclipse.compare.contentViewers">
-    <viewer id="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.compare.contentViewers"
-            class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.compare.InjectableViewerCreator"
-            extensions="uisemantic">
-    </viewer>
-  </extension>
-  <extension point="org.eclipse.compare.contentMergeViewers">
-    <viewer id="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.compare.contentMergeViewers"
-            class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.compare.InjectableViewerCreator"
-            extensions="uisemantic" label="UISemanticsGrammar Compare">
-     </viewer>
-  </extension>
-  <extension point="org.eclipse.ui.editors.documentProviders">
-    <provider id="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.editors.documentProviders"
-            class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.model.XtextDocumentProvider"
-            extensions="uisemantic">
-    </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.ecview.uisemantics.UISemanticsGrammar.Editor.opened">
+					</reference>
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<extension point="org.eclipse.compare.contentViewers">
+		<viewer id="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.compare.contentViewers"
+			class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.compare.InjectableViewerCreator"
+			extensions="uisemantic">
+		</viewer>
+	</extension>
+	<extension point="org.eclipse.compare.contentMergeViewers">
+		<viewer id="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.compare.contentMergeViewers"
+			class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.compare.InjectableViewerCreator"
+			extensions="uisemantic" label="UISemanticsGrammar Compare">
+		</viewer>
+	</extension>
+	<extension point="org.eclipse.ui.editors.documentProviders">
+		<provider id="org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.editors.documentProviders"
+			class="org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarExecutableExtensionFactory:org.eclipse.xtext.ui.editor.model.XtextDocumentProvider"
+			extensions="uisemantic">
+		</provider>
+	</extension>
+	<extension point="org.eclipse.team.core.fileTypes">
+		<fileTypes
+			extension="uisemantic"
+			type="text">
+		</fileTypes>
+	</extension>
 </plugin>
diff --git a/org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/AbstractUISemanticsGrammarUiModule.java b/org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/AbstractUISemanticsGrammarUiModule.java
index ce8193e..956fc3b 100644
--- a/org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/AbstractUISemanticsGrammarUiModule.java
+++ b/org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/AbstractUISemanticsGrammarUiModule.java
@@ -7,371 +7,400 @@
  *
  * Contributors:
  *         Florian Pirchner - Initial implementation
+ *
+ * generated by Xtext 2.11.0
+ *
  */
 
 package org.eclipse.osbp.ecview.uisemantics.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.ecview.uisemantics.ide.contentassist.antlr.PartialUISemanticsGrammarContentAssistParser;
+import org.eclipse.osbp.ecview.uisemantics.ide.contentassist.antlr.UISemanticsGrammarParser;
+import org.eclipse.osbp.ecview.uisemantics.ide.contentassist.antlr.internal.InternalUISemanticsGrammarLexer;
+import org.eclipse.osbp.ecview.uisemantics.ui.contentassist.UISemanticsGrammarProposalProvider;
+import org.eclipse.osbp.ecview.uisemantics.ui.labeling.UISemanticsGrammarDescriptionLabelProvider;
+import org.eclipse.osbp.ecview.uisemantics.ui.labeling.UISemanticsGrammarLabelProvider;
+import org.eclipse.osbp.ecview.uisemantics.ui.outline.UISemanticsGrammarOutlineTreeProvider;
+import org.eclipse.osbp.ecview.uisemantics.ui.quickfix.UISemanticsGrammarQuickfixProvider;
+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.imports.IUnresolvedTypeResolver;
+import org.eclipse.xtext.xbase.ui.DefaultXbaseUiModule;
+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.ecview.uisemantics.ui.UISemanticsGrammarUiModule}
+ * Manual modifications go to {@link UISemanticsGrammarUiModule}.
  */
 @SuppressWarnings("all")
-public abstract class AbstractUISemanticsGrammarUiModule extends DefaultUiModule {
-	
+public abstract class AbstractUISemanticsGrammarUiModule extends DefaultXbaseUiModule {
+
 	public AbstractUISemanticsGrammarUiModule(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.ecview.uisemantics.parser.antlr.internal.InternalUISemanticsGrammarLexer.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(InternalUISemanticsGrammarLexer.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.ecview.uisemantics.parser.antlr.internal.InternalUISemanticsGrammarLexer.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 UISemanticsGrammarParser.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(InternalUISemanticsGrammarLexer.class).toProvider(LexerProvider.create(InternalUISemanticsGrammarLexer.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.ecview.uisemantics.ui.labeling.UISemanticsGrammarLabelProvider.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.ecview.uisemantics.ui.labeling.UISemanticsGrammarDescriptionLabelProvider.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.ecview.uisemantics.ui.outline.UISemanticsGrammarOutlineTreeProvider.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.ecview.uisemantics.ui.outline.UISemanticsGrammarOutlineTreeProvider.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.ecview.uisemantics.ui.quickfix.UISemanticsGrammarQuickfixProvider.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.ecview.uisemantics.ui.contentassist.UISemanticsGrammarProposalProvider.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.labeling.LabelProviderFragment2
+	public Class<? extends ILabelProvider> bindILabelProvider() {
+		return UISemanticsGrammarLabelProvider.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(UISemanticsGrammarDescriptionLabelProvider.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.ecview.uisemantics.ui.contentassist.antlr.UISemanticsGrammarParser.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.outline.OutlineTreeProviderFragment2
+	public Class<? extends IOutlineTreeProvider> bindIOutlineTreeProvider() {
+		return UISemanticsGrammarOutlineTreeProvider.class;
 	}
-
-	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrUiGeneratorFragment
-	public void configureContentAssistLexerProvider(com.google.inject.Binder binder) {
-		binder.bind(org.eclipse.osbp.ecview.uisemantics.ui.contentassist.antlr.internal.InternalUISemanticsGrammarLexer.class).toProvider(org.eclipse.xtext.parser.antlr.LexerProvider.create(org.eclipse.osbp.ecview.uisemantics.ui.contentassist.antlr.internal.InternalUISemanticsGrammarLexer.class));
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.outline.OutlineTreeProviderFragment2
+	public Class<? extends IOutlineTreeStructureProvider> bindIOutlineTreeStructureProvider() {
+		return UISemanticsGrammarOutlineTreeProvider.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.ecview.uisemantics.ui.contentassist.antlr.internal.InternalUISemanticsGrammarLexer.class);
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.quickfix.QuickfixProviderFragment2
+	public Class<? extends IssueResolutionProvider> bindIssueResolutionProvider() {
+		return UISemanticsGrammarQuickfixProvider.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 UISemanticsGrammarProposalProvider.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.access.jdt.IJavaProjectProvider> bindIJavaProjectProvider() {
-		return org.eclipse.xtext.common.types.xtext.ui.XtextResourceSetBasedProjectProvider.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.xbase.XbaseGeneratorFragment2
+	public Class<? extends ReferenceQueryExecutor> bindReferenceQueryExecutor() {
+		return JvmModelReferenceQueryExecutor.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.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.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.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 IDependentElementsCalculator> bindIDependentElementsCalculator() {
+		return JvmModelDependentElementsCalculator.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 IRenameRefactoringProvider> bindIRenameRefactoringProvider() {
+		return CombinedJvmJdtRenameRefactoringProvider.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 IReferenceUpdater> bindIReferenceUpdater() {
+		return XbaseReferenceUpdater.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 IRenameContextFactory> bindIRenameContextFactory() {
+		return CombinedJvmJdtRenameContextFactory.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 IRenameStrategy> bindIRenameStrategy() {
+		return DefaultJvmModelRenameStrategy.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 JdtRenameParticipant.ContextFactory> bindJdtRenameParticipant$ContextFactory() {
+		return JvmModelJdtRenameParticipantContext.ContextFactory.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 OutlineNodeElementOpener> bindOutlineNodeElementOpener() {
+		return JvmOutlineNodeElementOpener.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 Class<? extends GlobalURIEditorOpener> bindGlobalURIEditorOpener() {
+		return GlobalDerivedMemberAwareURIEditorOpener.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 IJavaSearchParticipation> bindIJavaSearchParticipation() {
+		return IJavaSearchParticipation.No.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 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.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 IUnresolvedTypeResolver> bindIUnresolvedTypeResolver() {
+		return InteractiveUnresolvedTypeResolver.class;
 	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.xbase.imports.IUnresolvedTypeResolver> bindIUnresolvedTypeResolver() {
-		return org.eclipse.xtext.xbase.ui.imports.InteractiveUnresolvedTypeResolver.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.xtext.common.types.xtext.ui.ITypesProposalProvider> bindITypesProposalProvider() {
-		return org.eclipse.xtext.xbase.ui.contentassist.ImportingTypesProposalProvider.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.ui.editor.templates.XtextTemplateContextType> bindXtextTemplateContextType() {
-		return org.eclipse.xtext.xbase.ui.templates.XbaseTemplateContextType.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 PartialUISemanticsGrammarContentAssistParser.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.ecview.uisemantics.ui.contentassist.antlr.PartialUISemanticsGrammarContentAssistParser.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.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/UISemanticsGrammarExecutableExtensionFactory.java b/org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/UISemanticsGrammarExecutableExtensionFactory.java
index f2beea4..b6e96f1 100644
--- a/org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/UISemanticsGrammarExecutableExtensionFactory.java
+++ b/org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/UISemanticsGrammarExecutableExtensionFactory.java
@@ -7,17 +7,18 @@
  *
  * Contributors:
  *         Florian Pirchner - Initial implementation
+ *
+ * generated by Xtext 2.11.0
+ *
  */
 
 package org.eclipse.osbp.ecview.uisemantics.ui;
 
+import com.google.inject.Injector;
+import org.eclipse.osbp.ecview.uisemantics.ui.internal.UisemanticsActivator;
 import org.eclipse.xtext.ui.guice.AbstractGuiceAwareExecutableExtensionFactory;
 import org.osgi.framework.Bundle;
 
-import com.google.inject.Injector;
-
-import org.eclipse.osbp.ecview.uisemantics.ui.internal.UISemanticsGrammarActivator;
-
 /**
  * This class was generated. Customizations should only happen in a newly
  * introduced subclass. 
@@ -26,12 +27,12 @@
 
 	@Override
 	protected Bundle getBundle() {
-		return UISemanticsGrammarActivator.getInstance().getBundle();
+		return UisemanticsActivator.getInstance().getBundle();
 	}
 	
 	@Override
 	protected Injector getInjector() {
-		return UISemanticsGrammarActivator.getInstance().getInjector(UISemanticsGrammarActivator.ORG_ECLIPSE_OSBP_ECVIEW_UISEMANTICS_UISEMANTICSGRAMMAR);
+		return UisemanticsActivator.getInstance().getInjector(UisemanticsActivator.ORG_ECLIPSE_OSBP_ECVIEW_UISEMANTICS_UISEMANTICSGRAMMAR);
 	}
 	
 }
diff --git a/org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/AbstractUISemanticsGrammarProposalProvider.java b/org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/AbstractUISemanticsGrammarProposalProvider.java
index 72d4ea7..64271b3 100644
--- a/org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/AbstractUISemanticsGrammarProposalProvider.java
+++ b/org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/AbstractUISemanticsGrammarProposalProvider.java
@@ -7,23 +7,28 @@
  *
  * Contributors:
  *         Florian Pirchner - Initial implementation
+ *
+ * generated by Xtext 2.11.0
+ *
  */
 
 package org.eclipse.osbp.ecview.uisemantics.ui.contentassist;
 
 import org.eclipse.emf.ecore.EObject;
-import org.eclipse.xtext.*;
-import org.eclipse.xtext.ui.editor.contentassist.ICompletionProposalAcceptor;
+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;
+import org.eclipse.xtext.xbase.ui.contentassist.XbaseProposalProvider;
 
 /**
- * Represents a generated, default implementation of superclass {@link org.eclipse.xtext.xbase.ui.contentassist.XbaseProposalProvider}.
+ * Represents a generated, default implementation of superclass {@link XbaseProposalProvider}.
  * Methods are dynamically dispatched on the first parameter, i.e., you can override them 
  * with a more concrete subtype. 
  */
-@SuppressWarnings("all")
-public class AbstractUISemanticsGrammarProposalProvider extends org.eclipse.xtext.xbase.ui.contentassist.XbaseProposalProvider {
-		
+public abstract class AbstractUISemanticsGrammarProposalProvider extends XbaseProposalProvider {
+
 	public void completeUxModel_ImportSection(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
@@ -48,24 +53,6 @@
 	public void completeUxViewCategory_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
-	public void completeXImportDeclaration_Static(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
-		// subclasses may override
-	}
-	public void completeXImportDeclaration_Extension(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
-		// subclasses may override
-	}
-	public void completeXImportDeclaration_ImportedType(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
-		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
-	}
-	public void completeXImportDeclaration_Wildcard(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
-		// subclasses may override
-	}
-	public void completeXImportDeclaration_MemberName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
-		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
-	}
-	public void completeXImportDeclaration_ImportedNamespace(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
-		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
-	}
 	public void completeXImportDeclaration_ImportedEPackage(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
@@ -102,6 +89,9 @@
 	public void completeUxElementURI_EClass(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
 	}
+	public void completeUxAvailableBindings_SuperElement(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
 	public void completeUxAvailableBindings_Bindings(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
@@ -129,7 +119,7 @@
 	public void completeUxVisibleableOption_JvmType(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
-    
+
 	public void complete_UxModel(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
@@ -139,9 +129,6 @@
 	public void complete_UxViewCategory(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
-	public void complete_XImportDeclaration(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
-		// subclasses may override
-	}
 	public void complete_UxEPackageImport(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
diff --git a/org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/PartialUISemanticsGrammarContentAssistParser.java b/org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/PartialUISemanticsGrammarContentAssistParser.java
deleted file mode 100644
index 710bb6e..0000000
--- a/org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/PartialUISemanticsGrammarContentAssistParser.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf), Loetz GmbH&Co.KG (Heidelberg)
- * 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:
- *         Florian Pirchner - Initial implementation
- */
-
-package org.eclipse.osbp.ecview.uisemantics.ui.contentassist.antlr;
-
-import java.util.Collection;
-import java.util.Collections;
-
-import org.eclipse.xtext.AbstractRule;
-import org.eclipse.xtext.ui.codetemplates.ui.partialEditing.IPartialContentAssistParser;
-import org.eclipse.xtext.ui.editor.contentassist.antlr.FollowElement;
-import org.eclipse.xtext.ui.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
-import org.eclipse.xtext.util.PolymorphicDispatcher;
-
-/**
- * @author Sebastian Zarnekow - Initial contribution and API
- */
-@SuppressWarnings("restriction")
-public class PartialUISemanticsGrammarContentAssistParser extends UISemanticsGrammarParser implements IPartialContentAssistParser {
-
-	private AbstractRule rule;
-
-	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.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/UISemanticsGrammarParser.java b/org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/UISemanticsGrammarParser.java
deleted file mode 100644
index dcf5a05..0000000
--- a/org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/UISemanticsGrammarParser.java
+++ /dev/null
@@ -1,490 +0,0 @@
-/**
- * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf), Loetz GmbH&Co.KG (Heidelberg)
- * 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:
- *         Florian Pirchner - Initial implementation
- */
-
-package org.eclipse.osbp.ecview.uisemantics.ui.contentassist.antlr;
-
-import java.util.Collection;
-import java.util.Map;
-import java.util.HashMap;
-
-import org.antlr.runtime.RecognitionException;
-import org.eclipse.xtext.AbstractElement;
-import org.eclipse.xtext.ui.editor.contentassist.antlr.AbstractContentAssistParser;
-import org.eclipse.xtext.ui.editor.contentassist.antlr.FollowElement;
-import org.eclipse.xtext.ui.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
-
-import com.google.inject.Inject;
-
-import org.eclipse.osbp.ecview.uisemantics.services.UISemanticsGrammarGrammarAccess;
-
-public class UISemanticsGrammarParser extends AbstractContentAssistParser {
-	
-	@Inject
-	private UISemanticsGrammarGrammarAccess grammarAccess;
-	
-	private Map<AbstractElement, String> nameMappings;
-	
-	@Override
-	protected org.eclipse.osbp.ecview.uisemantics.ui.contentassist.antlr.internal.InternalUISemanticsGrammarParser createParser() {
-		org.eclipse.osbp.ecview.uisemantics.ui.contentassist.antlr.internal.InternalUISemanticsGrammarParser result = new org.eclipse.osbp.ecview.uisemantics.ui.contentassist.antlr.internal.InternalUISemanticsGrammarParser(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.getXImportDeclarationAccess().getAlternatives(), "rule__XImportDeclaration__Alternatives");
-					put(grammarAccess.getXImportDeclarationAccess().getAlternatives_0_1_1(), "rule__XImportDeclaration__Alternatives_0_1_1");
-					put(grammarAccess.getXImportDeclarationAccess().getAlternatives_0_1_1_0_3(), "rule__XImportDeclaration__Alternatives_0_1_1_0_3");
-					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.getUxModelAccess().getGroup(), "rule__UxModel__Group__0");
-					put(grammarAccess.getUxModelAccess().getGroup_2(), "rule__UxModel__Group_2__0");
-					put(grammarAccess.getUxModelAccess().getGroup_3(), "rule__UxModel__Group_3__0");
-					put(grammarAccess.getUxActionAccess().getGroup(), "rule__UxAction__Group__0");
-					put(grammarAccess.getUxActionAccess().getGroup_1(), "rule__UxAction__Group_1__0");
-					put(grammarAccess.getXImportDeclarationAccess().getGroup_0(), "rule__XImportDeclaration__Group_0__0");
-					put(grammarAccess.getXImportDeclarationAccess().getGroup_0_1(), "rule__XImportDeclaration__Group_0_1__0");
-					put(grammarAccess.getXImportDeclarationAccess().getGroup_0_1_1_0(), "rule__XImportDeclaration__Group_0_1_1_0__0");
-					put(grammarAccess.getXImportDeclarationAccess().getGroup_1(), "rule__XImportDeclaration__Group_1__0");
-					put(grammarAccess.getXImportDeclarationAccess().getGroup_1_0(), "rule__XImportDeclaration__Group_1_0__0");
-					put(grammarAccess.getUxEPackageImportAccess().getGroup(), "rule__UxEPackageImport__Group__0");
-					put(grammarAccess.getUxElementDefinitionAccess().getGroup(), "rule__UxElementDefinition__Group__0");
-					put(grammarAccess.getUxElementDefinitionAccess().getGroup_4(), "rule__UxElementDefinition__Group_4__0");
-					put(grammarAccess.getUxElementDefinitionAccess().getGroup_5(), "rule__UxElementDefinition__Group_5__0");
-					put(grammarAccess.getUxElementDefinitionAccess().getGroup_6(), "rule__UxElementDefinition__Group_6__0");
-					put(grammarAccess.getUxAvailableValidatorPropertiesAccess().getGroup(), "rule__UxAvailableValidatorProperties__Group__0");
-					put(grammarAccess.getUxValidatorPropertyAccess().getGroup(), "rule__UxValidatorProperty__Group__0");
-					put(grammarAccess.getUxElementURIAccess().getGroup(), "rule__UxElementURI__Group__0");
-					put(grammarAccess.getUxAvailableBindingsAccess().getGroup(), "rule__UxAvailableBindings__Group__0");
-					put(grammarAccess.getUxAvailableVisibilityOptionsAccess().getGroup(), "rule__UxAvailableVisibilityOptions__Group__0");
-					put(grammarAccess.getUxBindingableOptionAccess().getGroup(), "rule__UxBindingableOption__Group__0");
-					put(grammarAccess.getUxBindingableOptionAccess().getGroup_5(), "rule__UxBindingableOption__Group_5__0");
-					put(grammarAccess.getUxVisibleableOptionAccess().getGroup(), "rule__UxVisibleableOption__Group__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.getUxModelAccess().getImportSectionAssignment_1(), "rule__UxModel__ImportSectionAssignment_1");
-					put(grammarAccess.getUxModelAccess().getViewActionsAssignment_2_2(), "rule__UxModel__ViewActionsAssignment_2_2");
-					put(grammarAccess.getUxModelAccess().getCategoriesAssignment_3_2(), "rule__UxModel__CategoriesAssignment_3_2");
-					put(grammarAccess.getUxModelAccess().getElementDefinitionsAssignment_4(), "rule__UxModel__ElementDefinitionsAssignment_4");
-					put(grammarAccess.getUxActionAccess().getNameAssignment_0(), "rule__UxAction__NameAssignment_0");
-					put(grammarAccess.getUxActionAccess().getExternalCommandIdAssignment_1_1(), "rule__UxAction__ExternalCommandIdAssignment_1_1");
-					put(grammarAccess.getUxActionAccess().getInitialDisabledAssignment_2(), "rule__UxAction__InitialDisabledAssignment_2");
-					put(grammarAccess.getUxViewCategoryAccess().getNameAssignment(), "rule__UxViewCategory__NameAssignment");
-					put(grammarAccess.getXImportDeclarationAccess().getStaticAssignment_0_1_1_0_0(), "rule__XImportDeclaration__StaticAssignment_0_1_1_0_0");
-					put(grammarAccess.getXImportDeclarationAccess().getExtensionAssignment_0_1_1_0_1(), "rule__XImportDeclaration__ExtensionAssignment_0_1_1_0_1");
-					put(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_0_1_1_0_2(), "rule__XImportDeclaration__ImportedTypeAssignment_0_1_1_0_2");
-					put(grammarAccess.getXImportDeclarationAccess().getWildcardAssignment_0_1_1_0_3_0(), "rule__XImportDeclaration__WildcardAssignment_0_1_1_0_3_0");
-					put(grammarAccess.getXImportDeclarationAccess().getMemberNameAssignment_0_1_1_0_3_1(), "rule__XImportDeclaration__MemberNameAssignment_0_1_1_0_3_1");
-					put(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_0_1_1_1(), "rule__XImportDeclaration__ImportedTypeAssignment_0_1_1_1");
-					put(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceAssignment_0_1_1_2(), "rule__XImportDeclaration__ImportedNamespaceAssignment_0_1_1_2");
-					put(grammarAccess.getXImportDeclarationAccess().getImportedEPackageAssignment_1_0_1(), "rule__XImportDeclaration__ImportedEPackageAssignment_1_0_1");
-					put(grammarAccess.getUxEPackageImportAccess().getEPackageAssignment_0(), "rule__UxEPackageImport__EPackageAssignment_0");
-					put(grammarAccess.getUxEPackageImportAccess().getAliasAssignment_2(), "rule__UxEPackageImport__AliasAssignment_2");
-					put(grammarAccess.getUxElementDefinitionAccess().getNameAssignment_1(), "rule__UxElementDefinition__NameAssignment_1");
-					put(grammarAccess.getUxElementDefinitionAccess().getUriAssignment_3(), "rule__UxElementDefinition__UriAssignment_3");
-					put(grammarAccess.getUxElementDefinitionAccess().getBindingContainerAssignment_4_2(), "rule__UxElementDefinition__BindingContainerAssignment_4_2");
-					put(grammarAccess.getUxElementDefinitionAccess().getVisibilityContainerAssignment_5_2(), "rule__UxElementDefinition__VisibilityContainerAssignment_5_2");
-					put(grammarAccess.getUxElementDefinitionAccess().getValidatorContainerAssignment_6_2(), "rule__UxElementDefinition__ValidatorContainerAssignment_6_2");
-					put(grammarAccess.getUxAvailableValidatorPropertiesAccess().getPropertiesAssignment_1(), "rule__UxAvailableValidatorProperties__PropertiesAssignment_1");
-					put(grammarAccess.getUxValidatorPropertyAccess().getNameAssignment_1(), "rule__UxValidatorProperty__NameAssignment_1");
-					put(grammarAccess.getUxElementURIAccess().getEPackageAssignment_1(), "rule__UxElementURI__EPackageAssignment_1");
-					put(grammarAccess.getUxElementURIAccess().getEClassAssignment_3(), "rule__UxElementURI__EClassAssignment_3");
-					put(grammarAccess.getUxAvailableBindingsAccess().getBindingsAssignment_1(), "rule__UxAvailableBindings__BindingsAssignment_1");
-					put(grammarAccess.getUxAvailableVisibilityOptionsAccess().getBindingsAssignment_1(), "rule__UxAvailableVisibilityOptions__BindingsAssignment_1");
-					put(grammarAccess.getUxBindingableOptionAccess().getFinalAssignment_0(), "rule__UxBindingableOption__FinalAssignment_0");
-					put(grammarAccess.getUxBindingableOptionAccess().getListbindingAssignment_1(), "rule__UxBindingableOption__ListbindingAssignment_1");
-					put(grammarAccess.getUxBindingableOptionAccess().getNameAssignment_3(), "rule__UxBindingableOption__NameAssignment_3");
-					put(grammarAccess.getUxBindingableOptionAccess().getJvmTypeAssignment_4(), "rule__UxBindingableOption__JvmTypeAssignment_4");
-					put(grammarAccess.getUxBindingableOptionAccess().getTargetNameAssignment_5_1(), "rule__UxBindingableOption__TargetNameAssignment_5_1");
-					put(grammarAccess.getUxVisibleableOptionAccess().getNameAssignment_1(), "rule__UxVisibleableOption__NameAssignment_1");
-					put(grammarAccess.getUxVisibleableOptionAccess().getJvmTypeAssignment_2(), "rule__UxVisibleableOption__JvmTypeAssignment_2");
-					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");
-				}
-			};
-		}
-		return nameMappings.get(element);
-	}
-	
-	@Override
-	protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
-		try {
-			org.eclipse.osbp.ecview.uisemantics.ui.contentassist.antlr.internal.InternalUISemanticsGrammarParser typedParser = (org.eclipse.osbp.ecview.uisemantics.ui.contentassist.antlr.internal.InternalUISemanticsGrammarParser) parser;
-			typedParser.entryRuleUxModel();
-			return typedParser.getFollowElements();
-		} catch(RecognitionException ex) {
-			throw new RuntimeException(ex);
-		}		
-	}
-	
-	@Override
-	protected String[] getInitialHiddenTokens() {
-		return new String[] { "RULE_WS", "RULE_ML_COMMENT", "RULE_SL_COMMENT" };
-	}
-	
-	public UISemanticsGrammarGrammarAccess getGrammarAccess() {
-		return this.grammarAccess;
-	}
-	
-	public void setGrammarAccess(UISemanticsGrammarGrammarAccess grammarAccess) {
-		this.grammarAccess = grammarAccess;
-	}
-}
diff --git a/org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g b/org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g
deleted file mode 100644
index 91a12ab..0000000
--- a/org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g
+++ /dev/null
@@ -1,10012 +0,0 @@
-/**
- * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf), Loetz GmbH&Co.KG (Heidelberg)
- * 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:
- *         Florian Pirchner - Initial implementation
- */
-
-grammar InternalUISemanticsGrammar;
-
-options {
-	superClass=AbstractInternalContentAssistParser;
-	backtrack=true;
-	
-}
-
-@lexer::header {
-package org.eclipse.osbp.ecview.uisemantics.ui.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.ui.editor.contentassist.antlr.internal.Lexer;
-}
-
-@parser::header {
-package org.eclipse.osbp.ecview.uisemantics.ui.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.ui.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
-import org.eclipse.xtext.ui.editor.contentassist.antlr.internal.DFA;
-import org.eclipse.osbp.ecview.uisemantics.services.UISemanticsGrammarGrammarAccess;
-
-}
-
-@parser::members {
- 
- 	private UISemanticsGrammarGrammarAccess grammarAccess;
- 	
-    public void setGrammarAccess(UISemanticsGrammarGrammarAccess grammarAccess) {
-    	this.grammarAccess = grammarAccess;
-    }
-    
-    @Override
-    protected Grammar getGrammar() {
-    	return grammarAccess.getGrammar();
-    }
-    
-    @Override
-    protected String getValueForTokenName(String tokenName) {
-    	return tokenName;
-    }
-
-}
-
-
-
-
-// Entry rule entryRuleUxModel
-entryRuleUxModel 
-:
-{ before(grammarAccess.getUxModelRule()); }
-	 ruleUxModel
-{ after(grammarAccess.getUxModelRule()); } 
-	 EOF 
-;
-
-// Rule UxModel
-ruleUxModel
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUxModelAccess().getGroup()); }
-(rule__UxModel__Group__0)
-{ after(grammarAccess.getUxModelAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUxAction
-entryRuleUxAction 
-:
-{ before(grammarAccess.getUxActionRule()); }
-	 ruleUxAction
-{ after(grammarAccess.getUxActionRule()); } 
-	 EOF 
-;
-
-// Rule UxAction
-ruleUxAction
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUxActionAccess().getGroup()); }
-(rule__UxAction__Group__0)
-{ after(grammarAccess.getUxActionAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUxViewCategory
-entryRuleUxViewCategory 
-:
-{ before(grammarAccess.getUxViewCategoryRule()); }
-	 ruleUxViewCategory
-{ after(grammarAccess.getUxViewCategoryRule()); } 
-	 EOF 
-;
-
-// Rule UxViewCategory
-ruleUxViewCategory
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUxViewCategoryAccess().getNameAssignment()); }
-(rule__UxViewCategory__NameAssignment)
-{ after(grammarAccess.getUxViewCategoryAccess().getNameAssignment()); }
-)
-
-;
-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().getAlternatives()); }
-(rule__XImportDeclaration__Alternatives)
-{ after(grammarAccess.getXImportDeclarationAccess().getAlternatives()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUxEPackageImport
-entryRuleUxEPackageImport 
-:
-{ before(grammarAccess.getUxEPackageImportRule()); }
-	 ruleUxEPackageImport
-{ after(grammarAccess.getUxEPackageImportRule()); } 
-	 EOF 
-;
-
-// Rule UxEPackageImport
-ruleUxEPackageImport
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUxEPackageImportAccess().getGroup()); }
-(rule__UxEPackageImport__Group__0)
-{ after(grammarAccess.getUxEPackageImportAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUxElementDefinition
-entryRuleUxElementDefinition 
-:
-{ before(grammarAccess.getUxElementDefinitionRule()); }
-	 ruleUxElementDefinition
-{ after(grammarAccess.getUxElementDefinitionRule()); } 
-	 EOF 
-;
-
-// Rule UxElementDefinition
-ruleUxElementDefinition
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUxElementDefinitionAccess().getGroup()); }
-(rule__UxElementDefinition__Group__0)
-{ after(grammarAccess.getUxElementDefinitionAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUxAvailableValidatorProperties
-entryRuleUxAvailableValidatorProperties 
-:
-{ before(grammarAccess.getUxAvailableValidatorPropertiesRule()); }
-	 ruleUxAvailableValidatorProperties
-{ after(grammarAccess.getUxAvailableValidatorPropertiesRule()); } 
-	 EOF 
-;
-
-// Rule UxAvailableValidatorProperties
-ruleUxAvailableValidatorProperties
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUxAvailableValidatorPropertiesAccess().getGroup()); }
-(rule__UxAvailableValidatorProperties__Group__0)
-{ after(grammarAccess.getUxAvailableValidatorPropertiesAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUxValidatorProperty
-entryRuleUxValidatorProperty 
-:
-{ before(grammarAccess.getUxValidatorPropertyRule()); }
-	 ruleUxValidatorProperty
-{ after(grammarAccess.getUxValidatorPropertyRule()); } 
-	 EOF 
-;
-
-// Rule UxValidatorProperty
-ruleUxValidatorProperty
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUxValidatorPropertyAccess().getGroup()); }
-(rule__UxValidatorProperty__Group__0)
-{ after(grammarAccess.getUxValidatorPropertyAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUxElementURI
-entryRuleUxElementURI 
-:
-{ before(grammarAccess.getUxElementURIRule()); }
-	 ruleUxElementURI
-{ after(grammarAccess.getUxElementURIRule()); } 
-	 EOF 
-;
-
-// Rule UxElementURI
-ruleUxElementURI
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUxElementURIAccess().getGroup()); }
-(rule__UxElementURI__Group__0)
-{ after(grammarAccess.getUxElementURIAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUxAvailableBindings
-entryRuleUxAvailableBindings 
-:
-{ before(grammarAccess.getUxAvailableBindingsRule()); }
-	 ruleUxAvailableBindings
-{ after(grammarAccess.getUxAvailableBindingsRule()); } 
-	 EOF 
-;
-
-// Rule UxAvailableBindings
-ruleUxAvailableBindings
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUxAvailableBindingsAccess().getGroup()); }
-(rule__UxAvailableBindings__Group__0)
-{ after(grammarAccess.getUxAvailableBindingsAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUxAvailableVisibilityOptions
-entryRuleUxAvailableVisibilityOptions 
-:
-{ before(grammarAccess.getUxAvailableVisibilityOptionsRule()); }
-	 ruleUxAvailableVisibilityOptions
-{ after(grammarAccess.getUxAvailableVisibilityOptionsRule()); } 
-	 EOF 
-;
-
-// Rule UxAvailableVisibilityOptions
-ruleUxAvailableVisibilityOptions
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUxAvailableVisibilityOptionsAccess().getGroup()); }
-(rule__UxAvailableVisibilityOptions__Group__0)
-{ after(grammarAccess.getUxAvailableVisibilityOptionsAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUxBindingableOption
-entryRuleUxBindingableOption 
-:
-{ before(grammarAccess.getUxBindingableOptionRule()); }
-	 ruleUxBindingableOption
-{ after(grammarAccess.getUxBindingableOptionRule()); } 
-	 EOF 
-;
-
-// Rule UxBindingableOption
-ruleUxBindingableOption
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUxBindingableOptionAccess().getGroup()); }
-(rule__UxBindingableOption__Group__0)
-{ after(grammarAccess.getUxBindingableOptionAccess().getGroup()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-// Entry rule entryRuleUxVisibleableOption
-entryRuleUxVisibleableOption 
-:
-{ before(grammarAccess.getUxVisibleableOptionRule()); }
-	 ruleUxVisibleableOption
-{ after(grammarAccess.getUxVisibleableOptionRule()); } 
-	 EOF 
-;
-
-// Rule UxVisibleableOption
-ruleUxVisibleableOption
-    @init {
-		int stackSize = keepStackSize();
-    }
-	:
-(
-{ before(grammarAccess.getUxVisibleableOptionAccess().getGroup()); }
-(rule__UxVisibleableOption__Group__0)
-{ after(grammarAccess.getUxVisibleableOptionAccess().getGroup()); }
-)
-
-;
-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__XImportDeclaration__Alternatives
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXImportDeclarationAccess().getGroup_0()); }
-(rule__XImportDeclaration__Group_0__0)
-{ after(grammarAccess.getXImportDeclarationAccess().getGroup_0()); }
-)
-
-    |(
-{ before(grammarAccess.getXImportDeclarationAccess().getGroup_1()); }
-(rule__XImportDeclaration__Group_1__0)
-{ after(grammarAccess.getXImportDeclarationAccess().getGroup_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XImportDeclaration__Alternatives_0_1_1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXImportDeclarationAccess().getGroup_0_1_1_0()); }
-(rule__XImportDeclaration__Group_0_1_1_0__0)
-{ after(grammarAccess.getXImportDeclarationAccess().getGroup_0_1_1_0()); }
-)
-
-    |(
-{ before(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_0_1_1_1()); }
-(rule__XImportDeclaration__ImportedTypeAssignment_0_1_1_1)
-{ after(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_0_1_1_1()); }
-)
-
-    |(
-{ before(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceAssignment_0_1_1_2()); }
-(rule__XImportDeclaration__ImportedNamespaceAssignment_0_1_1_2)
-{ after(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceAssignment_0_1_1_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XImportDeclaration__Alternatives_0_1_1_0_3
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXImportDeclarationAccess().getWildcardAssignment_0_1_1_0_3_0()); }
-(rule__XImportDeclaration__WildcardAssignment_0_1_1_0_3_0)
-{ after(grammarAccess.getXImportDeclarationAccess().getWildcardAssignment_0_1_1_0_3_0()); }
-)
-
-    |(
-{ before(grammarAccess.getXImportDeclarationAccess().getMemberNameAssignment_0_1_1_0_3_1()); }
-(rule__XImportDeclaration__MemberNameAssignment_0_1_1_0_3_1)
-{ after(grammarAccess.getXImportDeclarationAccess().getMemberNameAssignment_0_1_1_0_3_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__UxModel__Group__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxModel__Group__0__Impl
-	rule__UxModel__Group__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxModel__Group__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxModelAccess().getUxModelAction_0()); }
-(
-
-)
-{ after(grammarAccess.getUxModelAccess().getUxModelAction_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxModel__Group__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxModel__Group__1__Impl
-	rule__UxModel__Group__2
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxModel__Group__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxModelAccess().getImportSectionAssignment_1()); }
-(rule__UxModel__ImportSectionAssignment_1)?
-{ after(grammarAccess.getUxModelAccess().getImportSectionAssignment_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxModel__Group__2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxModel__Group__2__Impl
-	rule__UxModel__Group__3
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxModel__Group__2__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxModelAccess().getGroup_2()); }
-(rule__UxModel__Group_2__0)?
-{ after(grammarAccess.getUxModelAccess().getGroup_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxModel__Group__3
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxModel__Group__3__Impl
-	rule__UxModel__Group__4
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxModel__Group__3__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxModelAccess().getGroup_3()); }
-(rule__UxModel__Group_3__0)?
-{ after(grammarAccess.getUxModelAccess().getGroup_3()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxModel__Group__4
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxModel__Group__4__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxModel__Group__4__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxModelAccess().getElementDefinitionsAssignment_4()); }
-(rule__UxModel__ElementDefinitionsAssignment_4)*
-{ after(grammarAccess.getUxModelAccess().getElementDefinitionsAssignment_4()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-
-
-
-
-
-
-rule__UxModel__Group_2__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxModel__Group_2__0__Impl
-	rule__UxModel__Group_2__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxModel__Group_2__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxModelAccess().getActionsKeyword_2_0()); }
-
-	'actions' 
-
-{ after(grammarAccess.getUxModelAccess().getActionsKeyword_2_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxModel__Group_2__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxModel__Group_2__1__Impl
-	rule__UxModel__Group_2__2
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxModel__Group_2__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxModelAccess().getLeftCurlyBracketKeyword_2_1()); }
-
-	'{' 
-
-{ after(grammarAccess.getUxModelAccess().getLeftCurlyBracketKeyword_2_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxModel__Group_2__2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxModel__Group_2__2__Impl
-	rule__UxModel__Group_2__3
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxModel__Group_2__2__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxModelAccess().getViewActionsAssignment_2_2()); }
-(rule__UxModel__ViewActionsAssignment_2_2)*
-{ after(grammarAccess.getUxModelAccess().getViewActionsAssignment_2_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxModel__Group_2__3
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxModel__Group_2__3__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxModel__Group_2__3__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxModelAccess().getRightCurlyBracketKeyword_2_3()); }
-
-	'}' 
-
-{ after(grammarAccess.getUxModelAccess().getRightCurlyBracketKeyword_2_3()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-
-
-
-
-rule__UxModel__Group_3__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxModel__Group_3__0__Impl
-	rule__UxModel__Group_3__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxModel__Group_3__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxModelAccess().getCategoriesKeyword_3_0()); }
-
-	'categories' 
-
-{ after(grammarAccess.getUxModelAccess().getCategoriesKeyword_3_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxModel__Group_3__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxModel__Group_3__1__Impl
-	rule__UxModel__Group_3__2
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxModel__Group_3__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxModelAccess().getLeftCurlyBracketKeyword_3_1()); }
-
-	'{' 
-
-{ after(grammarAccess.getUxModelAccess().getLeftCurlyBracketKeyword_3_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxModel__Group_3__2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxModel__Group_3__2__Impl
-	rule__UxModel__Group_3__3
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxModel__Group_3__2__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxModelAccess().getCategoriesAssignment_3_2()); }
-(rule__UxModel__CategoriesAssignment_3_2)*
-{ after(grammarAccess.getUxModelAccess().getCategoriesAssignment_3_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxModel__Group_3__3
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxModel__Group_3__3__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxModel__Group_3__3__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxModelAccess().getRightCurlyBracketKeyword_3_3()); }
-
-	'}' 
-
-{ after(grammarAccess.getUxModelAccess().getRightCurlyBracketKeyword_3_3()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-
-
-
-
-rule__UxAction__Group__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxAction__Group__0__Impl
-	rule__UxAction__Group__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxAction__Group__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxActionAccess().getNameAssignment_0()); }
-(rule__UxAction__NameAssignment_0)
-{ after(grammarAccess.getUxActionAccess().getNameAssignment_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxAction__Group__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxAction__Group__1__Impl
-	rule__UxAction__Group__2
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxAction__Group__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxActionAccess().getGroup_1()); }
-(rule__UxAction__Group_1__0)?
-{ after(grammarAccess.getUxActionAccess().getGroup_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxAction__Group__2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxAction__Group__2__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxAction__Group__2__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxActionAccess().getInitialDisabledAssignment_2()); }
-(rule__UxAction__InitialDisabledAssignment_2)?
-{ after(grammarAccess.getUxActionAccess().getInitialDisabledAssignment_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-
-
-rule__UxAction__Group_1__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxAction__Group_1__0__Impl
-	rule__UxAction__Group_1__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxAction__Group_1__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxActionAccess().getExternalCommandKeyword_1_0()); }
-
-	'externalCommand' 
-
-{ after(grammarAccess.getUxActionAccess().getExternalCommandKeyword_1_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxAction__Group_1__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxAction__Group_1__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxAction__Group_1__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxActionAccess().getExternalCommandIdAssignment_1_1()); }
-(rule__UxAction__ExternalCommandIdAssignment_1_1)
-{ after(grammarAccess.getUxActionAccess().getExternalCommandIdAssignment_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XImportDeclaration__Group_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XImportDeclaration__Group_0__0__Impl
-	rule__XImportDeclaration__Group_0__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XImportDeclaration__Group_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXImportDeclarationAccess().getUxImportSectionDeclarationAction_0_0()); }
-(
-
-)
-{ after(grammarAccess.getXImportDeclarationAccess().getUxImportSectionDeclarationAction_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XImportDeclaration__Group_0__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XImportDeclaration__Group_0__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XImportDeclaration__Group_0__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXImportDeclarationAccess().getGroup_0_1()); }
-(rule__XImportDeclaration__Group_0_1__0)
-{ after(grammarAccess.getXImportDeclarationAccess().getGroup_0_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XImportDeclaration__Group_0_1__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XImportDeclaration__Group_0_1__0__Impl
-	rule__XImportDeclaration__Group_0_1__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XImportDeclaration__Group_0_1__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXImportDeclarationAccess().getImportKeyword_0_1_0()); }
-
-	'import' 
-
-{ after(grammarAccess.getXImportDeclarationAccess().getImportKeyword_0_1_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XImportDeclaration__Group_0_1__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XImportDeclaration__Group_0_1__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XImportDeclaration__Group_0_1__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXImportDeclarationAccess().getAlternatives_0_1_1()); }
-(rule__XImportDeclaration__Alternatives_0_1_1)
-{ after(grammarAccess.getXImportDeclarationAccess().getAlternatives_0_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XImportDeclaration__Group_0_1_1_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XImportDeclaration__Group_0_1_1_0__0__Impl
-	rule__XImportDeclaration__Group_0_1_1_0__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XImportDeclaration__Group_0_1_1_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXImportDeclarationAccess().getStaticAssignment_0_1_1_0_0()); }
-(rule__XImportDeclaration__StaticAssignment_0_1_1_0_0)
-{ after(grammarAccess.getXImportDeclarationAccess().getStaticAssignment_0_1_1_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XImportDeclaration__Group_0_1_1_0__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XImportDeclaration__Group_0_1_1_0__1__Impl
-	rule__XImportDeclaration__Group_0_1_1_0__2
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XImportDeclaration__Group_0_1_1_0__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXImportDeclarationAccess().getExtensionAssignment_0_1_1_0_1()); }
-(rule__XImportDeclaration__ExtensionAssignment_0_1_1_0_1)?
-{ after(grammarAccess.getXImportDeclarationAccess().getExtensionAssignment_0_1_1_0_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XImportDeclaration__Group_0_1_1_0__2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XImportDeclaration__Group_0_1_1_0__2__Impl
-	rule__XImportDeclaration__Group_0_1_1_0__3
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XImportDeclaration__Group_0_1_1_0__2__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_0_1_1_0_2()); }
-(rule__XImportDeclaration__ImportedTypeAssignment_0_1_1_0_2)
-{ after(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_0_1_1_0_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XImportDeclaration__Group_0_1_1_0__3
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XImportDeclaration__Group_0_1_1_0__3__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XImportDeclaration__Group_0_1_1_0__3__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXImportDeclarationAccess().getAlternatives_0_1_1_0_3()); }
-(rule__XImportDeclaration__Alternatives_0_1_1_0_3)
-{ after(grammarAccess.getXImportDeclarationAccess().getAlternatives_0_1_1_0_3()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-
-
-
-
-rule__XImportDeclaration__Group_1__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XImportDeclaration__Group_1__0__Impl
-	rule__XImportDeclaration__Group_1__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XImportDeclaration__Group_1__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXImportDeclarationAccess().getGroup_1_0()); }
-(rule__XImportDeclaration__Group_1_0__0)
-{ after(grammarAccess.getXImportDeclarationAccess().getGroup_1_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XImportDeclaration__Group_1__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XImportDeclaration__Group_1__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XImportDeclaration__Group_1__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXImportDeclarationAccess().getSemicolonKeyword_1_1()); }
-(
-	';' 
-)?
-{ after(grammarAccess.getXImportDeclarationAccess().getSemicolonKeyword_1_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__XImportDeclaration__Group_1_0__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XImportDeclaration__Group_1_0__0__Impl
-	rule__XImportDeclaration__Group_1_0__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XImportDeclaration__Group_1_0__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXImportDeclarationAccess().getEPackageKeyword_1_0_0()); }
-
-	'ePackage' 
-
-{ after(grammarAccess.getXImportDeclarationAccess().getEPackageKeyword_1_0_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__XImportDeclaration__Group_1_0__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__XImportDeclaration__Group_1_0__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__XImportDeclaration__Group_1_0__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getXImportDeclarationAccess().getImportedEPackageAssignment_1_0_1()); }
-(rule__XImportDeclaration__ImportedEPackageAssignment_1_0_1)
-{ after(grammarAccess.getXImportDeclarationAccess().getImportedEPackageAssignment_1_0_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__UxEPackageImport__Group__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxEPackageImport__Group__0__Impl
-	rule__UxEPackageImport__Group__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxEPackageImport__Group__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxEPackageImportAccess().getEPackageAssignment_0()); }
-(rule__UxEPackageImport__EPackageAssignment_0)
-{ after(grammarAccess.getUxEPackageImportAccess().getEPackageAssignment_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxEPackageImport__Group__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxEPackageImport__Group__1__Impl
-	rule__UxEPackageImport__Group__2
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxEPackageImport__Group__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxEPackageImportAccess().getAsKeyword_1()); }
-
-	'as' 
-
-{ after(grammarAccess.getUxEPackageImportAccess().getAsKeyword_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxEPackageImport__Group__2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxEPackageImport__Group__2__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxEPackageImport__Group__2__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxEPackageImportAccess().getAliasAssignment_2()); }
-(rule__UxEPackageImport__AliasAssignment_2)
-{ after(grammarAccess.getUxEPackageImportAccess().getAliasAssignment_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-
-
-rule__UxElementDefinition__Group__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxElementDefinition__Group__0__Impl
-	rule__UxElementDefinition__Group__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxElementDefinition__Group__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxElementDefinitionAccess().getElementKeyword_0()); }
-
-	'element' 
-
-{ after(grammarAccess.getUxElementDefinitionAccess().getElementKeyword_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxElementDefinition__Group__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxElementDefinition__Group__1__Impl
-	rule__UxElementDefinition__Group__2
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxElementDefinition__Group__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxElementDefinitionAccess().getNameAssignment_1()); }
-(rule__UxElementDefinition__NameAssignment_1)
-{ after(grammarAccess.getUxElementDefinitionAccess().getNameAssignment_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxElementDefinition__Group__2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxElementDefinition__Group__2__Impl
-	rule__UxElementDefinition__Group__3
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxElementDefinition__Group__2__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxElementDefinitionAccess().getLeftCurlyBracketKeyword_2()); }
-
-	'{' 
-
-{ after(grammarAccess.getUxElementDefinitionAccess().getLeftCurlyBracketKeyword_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxElementDefinition__Group__3
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxElementDefinition__Group__3__Impl
-	rule__UxElementDefinition__Group__4
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxElementDefinition__Group__3__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxElementDefinitionAccess().getUriAssignment_3()); }
-(rule__UxElementDefinition__UriAssignment_3)?
-{ after(grammarAccess.getUxElementDefinitionAccess().getUriAssignment_3()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxElementDefinition__Group__4
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxElementDefinition__Group__4__Impl
-	rule__UxElementDefinition__Group__5
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxElementDefinition__Group__4__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxElementDefinitionAccess().getGroup_4()); }
-(rule__UxElementDefinition__Group_4__0)?
-{ after(grammarAccess.getUxElementDefinitionAccess().getGroup_4()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxElementDefinition__Group__5
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxElementDefinition__Group__5__Impl
-	rule__UxElementDefinition__Group__6
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxElementDefinition__Group__5__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxElementDefinitionAccess().getGroup_5()); }
-(rule__UxElementDefinition__Group_5__0)?
-{ after(grammarAccess.getUxElementDefinitionAccess().getGroup_5()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxElementDefinition__Group__6
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxElementDefinition__Group__6__Impl
-	rule__UxElementDefinition__Group__7
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxElementDefinition__Group__6__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxElementDefinitionAccess().getGroup_6()); }
-(rule__UxElementDefinition__Group_6__0)?
-{ after(grammarAccess.getUxElementDefinitionAccess().getGroup_6()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxElementDefinition__Group__7
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxElementDefinition__Group__7__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxElementDefinition__Group__7__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxElementDefinitionAccess().getRightCurlyBracketKeyword_7()); }
-
-	'}' 
-
-{ after(grammarAccess.getUxElementDefinitionAccess().getRightCurlyBracketKeyword_7()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-rule__UxElementDefinition__Group_4__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxElementDefinition__Group_4__0__Impl
-	rule__UxElementDefinition__Group_4__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxElementDefinition__Group_4__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxElementDefinitionAccess().getBindingsKeyword_4_0()); }
-
-	'bindings' 
-
-{ after(grammarAccess.getUxElementDefinitionAccess().getBindingsKeyword_4_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxElementDefinition__Group_4__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxElementDefinition__Group_4__1__Impl
-	rule__UxElementDefinition__Group_4__2
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxElementDefinition__Group_4__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxElementDefinitionAccess().getLeftCurlyBracketKeyword_4_1()); }
-
-	'{' 
-
-{ after(grammarAccess.getUxElementDefinitionAccess().getLeftCurlyBracketKeyword_4_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxElementDefinition__Group_4__2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxElementDefinition__Group_4__2__Impl
-	rule__UxElementDefinition__Group_4__3
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxElementDefinition__Group_4__2__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxElementDefinitionAccess().getBindingContainerAssignment_4_2()); }
-(rule__UxElementDefinition__BindingContainerAssignment_4_2)
-{ after(grammarAccess.getUxElementDefinitionAccess().getBindingContainerAssignment_4_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxElementDefinition__Group_4__3
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxElementDefinition__Group_4__3__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxElementDefinition__Group_4__3__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxElementDefinitionAccess().getRightCurlyBracketKeyword_4_3()); }
-
-	'}' 
-
-{ after(grammarAccess.getUxElementDefinitionAccess().getRightCurlyBracketKeyword_4_3()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-
-
-
-
-rule__UxElementDefinition__Group_5__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxElementDefinition__Group_5__0__Impl
-	rule__UxElementDefinition__Group_5__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxElementDefinition__Group_5__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxElementDefinitionAccess().getVisibilityKeyword_5_0()); }
-
-	'visibility' 
-
-{ after(grammarAccess.getUxElementDefinitionAccess().getVisibilityKeyword_5_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxElementDefinition__Group_5__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxElementDefinition__Group_5__1__Impl
-	rule__UxElementDefinition__Group_5__2
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxElementDefinition__Group_5__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxElementDefinitionAccess().getLeftCurlyBracketKeyword_5_1()); }
-
-	'{' 
-
-{ after(grammarAccess.getUxElementDefinitionAccess().getLeftCurlyBracketKeyword_5_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxElementDefinition__Group_5__2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxElementDefinition__Group_5__2__Impl
-	rule__UxElementDefinition__Group_5__3
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxElementDefinition__Group_5__2__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxElementDefinitionAccess().getVisibilityContainerAssignment_5_2()); }
-(rule__UxElementDefinition__VisibilityContainerAssignment_5_2)
-{ after(grammarAccess.getUxElementDefinitionAccess().getVisibilityContainerAssignment_5_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxElementDefinition__Group_5__3
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxElementDefinition__Group_5__3__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxElementDefinition__Group_5__3__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxElementDefinitionAccess().getRightCurlyBracketKeyword_5_3()); }
-
-	'}' 
-
-{ after(grammarAccess.getUxElementDefinitionAccess().getRightCurlyBracketKeyword_5_3()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-
-
-
-
-rule__UxElementDefinition__Group_6__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxElementDefinition__Group_6__0__Impl
-	rule__UxElementDefinition__Group_6__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxElementDefinition__Group_6__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxElementDefinitionAccess().getValidatorKeyword_6_0()); }
-
-	'validator' 
-
-{ after(grammarAccess.getUxElementDefinitionAccess().getValidatorKeyword_6_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxElementDefinition__Group_6__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxElementDefinition__Group_6__1__Impl
-	rule__UxElementDefinition__Group_6__2
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxElementDefinition__Group_6__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxElementDefinitionAccess().getLeftCurlyBracketKeyword_6_1()); }
-
-	'{' 
-
-{ after(grammarAccess.getUxElementDefinitionAccess().getLeftCurlyBracketKeyword_6_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxElementDefinition__Group_6__2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxElementDefinition__Group_6__2__Impl
-	rule__UxElementDefinition__Group_6__3
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxElementDefinition__Group_6__2__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxElementDefinitionAccess().getValidatorContainerAssignment_6_2()); }
-(rule__UxElementDefinition__ValidatorContainerAssignment_6_2)
-{ after(grammarAccess.getUxElementDefinitionAccess().getValidatorContainerAssignment_6_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxElementDefinition__Group_6__3
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxElementDefinition__Group_6__3__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxElementDefinition__Group_6__3__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxElementDefinitionAccess().getRightCurlyBracketKeyword_6_3()); }
-
-	'}' 
-
-{ after(grammarAccess.getUxElementDefinitionAccess().getRightCurlyBracketKeyword_6_3()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-
-
-
-
-rule__UxAvailableValidatorProperties__Group__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxAvailableValidatorProperties__Group__0__Impl
-	rule__UxAvailableValidatorProperties__Group__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxAvailableValidatorProperties__Group__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxAvailableValidatorPropertiesAccess().getUxAvailableValidatorPropertiesAction_0()); }
-(
-
-)
-{ after(grammarAccess.getUxAvailableValidatorPropertiesAccess().getUxAvailableValidatorPropertiesAction_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxAvailableValidatorProperties__Group__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxAvailableValidatorProperties__Group__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxAvailableValidatorProperties__Group__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxAvailableValidatorPropertiesAccess().getPropertiesAssignment_1()); }
-(rule__UxAvailableValidatorProperties__PropertiesAssignment_1)*
-{ after(grammarAccess.getUxAvailableValidatorPropertiesAccess().getPropertiesAssignment_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__UxValidatorProperty__Group__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxValidatorProperty__Group__0__Impl
-	rule__UxValidatorProperty__Group__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxValidatorProperty__Group__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxValidatorPropertyAccess().getPropertyKeyword_0()); }
-
-	'property' 
-
-{ after(grammarAccess.getUxValidatorPropertyAccess().getPropertyKeyword_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxValidatorProperty__Group__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxValidatorProperty__Group__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxValidatorProperty__Group__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxValidatorPropertyAccess().getNameAssignment_1()); }
-(rule__UxValidatorProperty__NameAssignment_1)
-{ after(grammarAccess.getUxValidatorPropertyAccess().getNameAssignment_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__UxElementURI__Group__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxElementURI__Group__0__Impl
-	rule__UxElementURI__Group__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxElementURI__Group__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxElementURIAccess().getUriKeyword_0()); }
-
-	'uri' 
-
-{ after(grammarAccess.getUxElementURIAccess().getUriKeyword_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxElementURI__Group__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxElementURI__Group__1__Impl
-	rule__UxElementURI__Group__2
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxElementURI__Group__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxElementURIAccess().getEPackageAssignment_1()); }
-(rule__UxElementURI__EPackageAssignment_1)
-{ after(grammarAccess.getUxElementURIAccess().getEPackageAssignment_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxElementURI__Group__2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxElementURI__Group__2__Impl
-	rule__UxElementURI__Group__3
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxElementURI__Group__2__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxElementURIAccess().getColonKeyword_2()); }
-
-	':' 
-
-{ after(grammarAccess.getUxElementURIAccess().getColonKeyword_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxElementURI__Group__3
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxElementURI__Group__3__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxElementURI__Group__3__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxElementURIAccess().getEClassAssignment_3()); }
-(rule__UxElementURI__EClassAssignment_3)
-{ after(grammarAccess.getUxElementURIAccess().getEClassAssignment_3()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-
-
-
-
-rule__UxAvailableBindings__Group__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxAvailableBindings__Group__0__Impl
-	rule__UxAvailableBindings__Group__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxAvailableBindings__Group__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxAvailableBindingsAccess().getUxAvailableBindingsAction_0()); }
-(
-
-)
-{ after(grammarAccess.getUxAvailableBindingsAccess().getUxAvailableBindingsAction_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxAvailableBindings__Group__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxAvailableBindings__Group__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxAvailableBindings__Group__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxAvailableBindingsAccess().getBindingsAssignment_1()); }
-(rule__UxAvailableBindings__BindingsAssignment_1)*
-{ after(grammarAccess.getUxAvailableBindingsAccess().getBindingsAssignment_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__UxAvailableVisibilityOptions__Group__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxAvailableVisibilityOptions__Group__0__Impl
-	rule__UxAvailableVisibilityOptions__Group__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxAvailableVisibilityOptions__Group__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxAvailableVisibilityOptionsAccess().getUxAvailableVisibilityOptionsAction_0()); }
-(
-
-)
-{ after(grammarAccess.getUxAvailableVisibilityOptionsAccess().getUxAvailableVisibilityOptionsAction_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxAvailableVisibilityOptions__Group__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxAvailableVisibilityOptions__Group__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxAvailableVisibilityOptions__Group__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxAvailableVisibilityOptionsAccess().getBindingsAssignment_1()); }
-(rule__UxAvailableVisibilityOptions__BindingsAssignment_1)*
-{ after(grammarAccess.getUxAvailableVisibilityOptionsAccess().getBindingsAssignment_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__UxBindingableOption__Group__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxBindingableOption__Group__0__Impl
-	rule__UxBindingableOption__Group__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxBindingableOption__Group__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxBindingableOptionAccess().getFinalAssignment_0()); }
-(rule__UxBindingableOption__FinalAssignment_0)?
-{ after(grammarAccess.getUxBindingableOptionAccess().getFinalAssignment_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxBindingableOption__Group__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxBindingableOption__Group__1__Impl
-	rule__UxBindingableOption__Group__2
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxBindingableOption__Group__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxBindingableOptionAccess().getListbindingAssignment_1()); }
-(rule__UxBindingableOption__ListbindingAssignment_1)?
-{ after(grammarAccess.getUxBindingableOptionAccess().getListbindingAssignment_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxBindingableOption__Group__2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxBindingableOption__Group__2__Impl
-	rule__UxBindingableOption__Group__3
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxBindingableOption__Group__2__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxBindingableOptionAccess().getEndpointKeyword_2()); }
-
-	'endpoint' 
-
-{ after(grammarAccess.getUxBindingableOptionAccess().getEndpointKeyword_2()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxBindingableOption__Group__3
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxBindingableOption__Group__3__Impl
-	rule__UxBindingableOption__Group__4
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxBindingableOption__Group__3__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxBindingableOptionAccess().getNameAssignment_3()); }
-(rule__UxBindingableOption__NameAssignment_3)
-{ after(grammarAccess.getUxBindingableOptionAccess().getNameAssignment_3()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxBindingableOption__Group__4
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxBindingableOption__Group__4__Impl
-	rule__UxBindingableOption__Group__5
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxBindingableOption__Group__4__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxBindingableOptionAccess().getJvmTypeAssignment_4()); }
-(rule__UxBindingableOption__JvmTypeAssignment_4)
-{ after(grammarAccess.getUxBindingableOptionAccess().getJvmTypeAssignment_4()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxBindingableOption__Group__5
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxBindingableOption__Group__5__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxBindingableOption__Group__5__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxBindingableOptionAccess().getGroup_5()); }
-(rule__UxBindingableOption__Group_5__0)?
-{ after(grammarAccess.getUxBindingableOptionAccess().getGroup_5()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-rule__UxBindingableOption__Group_5__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxBindingableOption__Group_5__0__Impl
-	rule__UxBindingableOption__Group_5__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxBindingableOption__Group_5__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxBindingableOptionAccess().getTargetKeyword_5_0()); }
-
-	'target' 
-
-{ after(grammarAccess.getUxBindingableOptionAccess().getTargetKeyword_5_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxBindingableOption__Group_5__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxBindingableOption__Group_5__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxBindingableOption__Group_5__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxBindingableOptionAccess().getTargetNameAssignment_5_1()); }
-(rule__UxBindingableOption__TargetNameAssignment_5_1)
-{ after(grammarAccess.getUxBindingableOptionAccess().getTargetNameAssignment_5_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-
-
-
-
-rule__UxVisibleableOption__Group__0
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxVisibleableOption__Group__0__Impl
-	rule__UxVisibleableOption__Group__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxVisibleableOption__Group__0__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxVisibleableOptionAccess().getEndpointKeyword_0()); }
-
-	'endpoint' 
-
-{ after(grammarAccess.getUxVisibleableOptionAccess().getEndpointKeyword_0()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxVisibleableOption__Group__1
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxVisibleableOption__Group__1__Impl
-	rule__UxVisibleableOption__Group__2
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxVisibleableOption__Group__1__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxVisibleableOptionAccess().getNameAssignment_1()); }
-(rule__UxVisibleableOption__NameAssignment_1)
-{ after(grammarAccess.getUxVisibleableOptionAccess().getNameAssignment_1()); }
-)
-
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__UxVisibleableOption__Group__2
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-	rule__UxVisibleableOption__Group__2__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__UxVisibleableOption__Group__2__Impl
-    @init {
-		int stackSize = keepStackSize();
-    }
-:
-(
-{ before(grammarAccess.getUxVisibleableOptionAccess().getJvmTypeAssignment_2()); }
-(rule__UxVisibleableOption__JvmTypeAssignment_2)
-{ after(grammarAccess.getUxVisibleableOptionAccess().getJvmTypeAssignment_2()); }
-)
-
-;
-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();
diff --git a/org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.tokens b/org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.tokens
deleted file mode 100644
index 009d78d..0000000
--- a/org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.tokens
+++ /dev/null
@@ -1,187 +0,0 @@
-'!'=40
-'!='=22
-'!=='=24
-'#'=71
-'%'=39
-'%='=20
-'&&'=15
-'&'=93
-'('=74
-')'=70
-'*'=36
-'**'=37
-'*='=18
-'+'=34
-'++'=41
-'+='=16
-','=69
-'-'=35
-'--'=42
-'-='=17
-'->'=28
-'.'=43
-'..'=30
-'..<'=29
-'/'=38
-'/='=19
-':'=65
-'::'=97
-';'=56
-'<'=27
-'<>'=32
-'='=13
-'=='=21
-'==='=23
-'=>'=31
-'>'=26
-'>='=25
-'?'=92
-'?.'=98
-'?:'=33
-'['=72
-']'=73
-'actions'=51
-'as'=58
-'bindings'=60
-'case'=79
-'catch'=91
-'categories'=54
-'default'=78
-'disabled'=94
-'do'=82
-'ePackage'=57
-'element'=59
-'else'=76
-'endpoint'=66
-'extends'=45
-'extension'=48
-'externalCommand'=55
-'false'=50
-'final'=95
-'finally'=89
-'for'=80
-'if'=75
-'import'=47
-'instanceof'=68
-'list'=96
-'new'=83
-'null'=84
-'property'=63
-'return'=87
-'static'=46
-'super'=49
-'switch'=77
-'synchronized'=90
-'target'=67
-'throw'=86
-'true'=101
-'try'=88
-'typeof'=85
-'uri'=64
-'val'=44
-'validator'=62
-'var'=100
-'visibility'=61
-'while'=81
-'{'=52
-'|'=99
-'||'=14
-'}'=53
-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__13=13
-T__14=14
-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.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammarLexer.java b/org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammarLexer.java
deleted file mode 100644
index eeeef11..0000000
--- a/org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammarLexer.java
+++ /dev/null
@@ -1,4032 +0,0 @@
-/**
- * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf), Loetz GmbH&Co.KG (Heidelberg)
- * 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:
- *         Florian Pirchner - Initial implementation
- */
-
-package org.eclipse.osbp.ecview.uisemantics.ui.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.ui.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 InternalUISemanticsGrammarLexer extends Lexer {
-    public static final int RULE_HEX=5;
-    public static final int T__50=50;
-    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__52=52;
-    public static final int T__53=53;
-    public static final int T__54=54;
-    public static final int T__60=60;
-    public static final int T__61=61;
-    public static final int RULE_ID=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;
-    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__63=63;
-    public static final int T__64=64;
-    public static final int T__65=65;
-    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__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__41=41;
-    public static final int T__42=42;
-    public static final int T__43=43;
-    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__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__70=70;
-    public static final int T__71=71;
-    public static final int T__72=72;
-    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__78=78;
-    public static final int T__79=79;
-    public static final int T__73=73;
-    public static final int EOF=-1;
-    public static final int T__74=74;
-    public static final int T__75=75;
-    public static final int T__76=76;
-    public static final int T__80=80;
-    public static final int T__81=81;
-    public static final int T__82=82;
-    public static final int T__83=83;
-    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__89=89;
-    public static final int T__84=84;
-    public static final int T__85=85;
-    public static final int T__86=86;
-    public static final int T__87=87;
-
-    // delegates
-    // delegators
-
-    public InternalUISemanticsGrammarLexer() {;} 
-    public InternalUISemanticsGrammarLexer(CharStream input) {
-        this(input, new RecognizerSharedState());
-    }
-    public InternalUISemanticsGrammarLexer(CharStream input, RecognizerSharedState state) {
-        super(input,state);
-
-    }
-    public String getGrammarFileName() { return "../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.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.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:11:7: ( '=' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:12:7: ( '||' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:13:7: ( '&&' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:14:7: ( '+=' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:14:9: '+='
-            {
-            match("+="); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:15:7: ( '-=' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:16:7: ( '*=' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:17:7: ( '/=' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:18:7: ( '%=' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:19:7: ( '==' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:20:7: ( '!=' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:21:7: ( '===' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22:7: ( '!==' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:23:7: ( '>=' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:24:7: ( '>' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:25:7: ( '<' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:26:7: ( '->' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:27:7: ( '..<' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:28:7: ( '..' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:29:7: ( '=>' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:30:7: ( '<>' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:31:7: ( '?:' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:32:7: ( '+' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:33:7: ( '-' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:34:7: ( '*' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:35:7: ( '**' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:36:7: ( '/' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:37:7: ( '%' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:38:7: ( '!' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:39:7: ( '++' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:40:7: ( '--' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:41:7: ( '.' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:42:7: ( 'val' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:42:9: 'val'
-            {
-            match("val"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:43:7: ( 'extends' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:43:9: 'extends'
-            {
-            match("extends"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:44:7: ( 'static' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:44:9: 'static'
-            {
-            match("static"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:45:7: ( 'import' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:45:9: 'import'
-            {
-            match("import"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:46:7: ( 'extension' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:46:9: 'extension'
-            {
-            match("extension"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:47:7: ( 'super' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:47:9: 'super'
-            {
-            match("super"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:48:7: ( 'false' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:48:9: 'false'
-            {
-            match("false"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:49:7: ( 'actions' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:49:9: 'actions'
-            {
-            match("actions"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:50:7: ( '{' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:50:9: '{'
-            {
-            match('{'); 
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:51:7: ( '}' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:51:9: '}'
-            {
-            match('}'); 
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:52:7: ( 'categories' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:52:9: 'categories'
-            {
-            match("categories"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:53:7: ( 'externalCommand' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:53:9: 'externalCommand'
-            {
-            match("externalCommand"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:54:7: ( ';' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:54:9: ';'
-            {
-            match(';'); 
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:55:7: ( 'ePackage' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:55:9: 'ePackage'
-            {
-            match("ePackage"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:56:7: ( 'as' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:56:9: 'as'
-            {
-            match("as"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:57:7: ( 'element' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:57:9: 'element'
-            {
-            match("element"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:58:7: ( 'bindings' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:58:9: 'bindings'
-            {
-            match("bindings"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:59:7: ( 'visibility' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:59:9: 'visibility'
-            {
-            match("visibility"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:60:7: ( 'validator' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:60:9: 'validator'
-            {
-            match("validator"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:61:7: ( 'property' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:61:9: 'property'
-            {
-            match("property"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:62:7: ( 'uri' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:62:9: 'uri'
-            {
-            match("uri"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:63:7: ( ':' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:63:9: ':'
-            {
-            match(':'); 
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:64:7: ( 'endpoint' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:64:9: 'endpoint'
-            {
-            match("endpoint"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:65:7: ( 'target' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:65:9: 'target'
-            {
-            match("target"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:66:7: ( 'instanceof' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:66:9: 'instanceof'
-            {
-            match("instanceof"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:67:7: ( ',' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:68:7: ( ')' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:69:7: ( '#' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:69:9: '#'
-            {
-            match('#'); 
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:70:7: ( '[' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:70:9: '['
-            {
-            match('['); 
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:71:7: ( ']' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:71:9: ']'
-            {
-            match(']'); 
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:72:7: ( '(' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:72:9: '('
-            {
-            match('('); 
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:73:7: ( 'if' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:73:9: 'if'
-            {
-            match("if"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:74:7: ( 'else' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:74:9: 'else'
-            {
-            match("else"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:75:7: ( 'switch' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:75:9: 'switch'
-            {
-            match("switch"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:76:7: ( 'default' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:76:9: 'default'
-            {
-            match("default"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:77:7: ( 'case' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:77:9: 'case'
-            {
-            match("case"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:78:7: ( 'for' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:78:9: 'for'
-            {
-            match("for"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:79:7: ( 'while' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:79:9: 'while'
-            {
-            match("while"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:80:7: ( 'do' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:80:9: 'do'
-            {
-            match("do"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:81:7: ( 'new' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:81:9: 'new'
-            {
-            match("new"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:82:7: ( 'null' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:82:9: 'null'
-            {
-            match("null"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:83:7: ( 'typeof' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:83:9: 'typeof'
-            {
-            match("typeof"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:84:7: ( 'throw' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:84:9: 'throw'
-            {
-            match("throw"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:85:7: ( 'return' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:85:9: 'return'
-            {
-            match("return"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:86:7: ( 'try' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:86:9: 'try'
-            {
-            match("try"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:87:7: ( 'finally' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:87:9: 'finally'
-            {
-            match("finally"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:88:7: ( 'synchronized' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:88:9: 'synchronized'
-            {
-            match("synchronized"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:89:7: ( 'catch' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:89:9: 'catch'
-            {
-            match("catch"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:90:7: ( '?' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:90:9: '?'
-            {
-            match('?'); 
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:91:7: ( '&' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:91:9: '&'
-            {
-            match('&'); 
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:92:7: ( 'disabled' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:92:9: 'disabled'
-            {
-            match("disabled"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:93:7: ( 'final' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:93:9: 'final'
-            {
-            match("final"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:94:7: ( 'list' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:94:9: 'list'
-            {
-            match("list"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:95:7: ( '::' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:95:9: '::'
-            {
-            match("::"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:96:7: ( '?.' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:96:9: '?.'
-            {
-            match("?."); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:97:7: ( '|' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:97:9: '|'
-            {
-            match('|'); 
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:98:8: ( 'var' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:98:10: 'var'
-            {
-            match("var"); 
-
-
-            }
-
-            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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:99:8: ( 'true' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:99:10: 'true'
-            {
-            match("true"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__101"
-
-    // $ANTLR start "RULE_HEX"
-    public final void mRULE_HEX() throws RecognitionException {
-        try {
-            int _type = RULE_HEX;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22277:10: ( ( '0x' | '0X' ) ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+ ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )? )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22277:12: ( '0x' | '0X' ) ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+ ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )?
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22277: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 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22277:13: '0x'
-                    {
-                    match("0x"); 
-
-
-                    }
-                    break;
-                case 2 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22277:18: '0X'
-                    {
-                    match("0X"); 
-
-
-                    }
-                    break;
-
-            }
-
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22277: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 :
-            	    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.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);
-
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22277: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 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22277:59: '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) )
-                    {
-                    match('#'); 
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22277: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 :
-                            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22277: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 :
-                            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22277: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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22279:10: ( '0' .. '9' ( '0' .. '9' | '_' )* )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22279:12: '0' .. '9' ( '0' .. '9' | '_' )*
-            {
-            matchRange('0','9'); 
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22279: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 :
-            	    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22281:14: ( RULE_INT ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )? ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )? )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22281:16: RULE_INT ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )? ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )?
-            {
-            mRULE_INT(); 
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22281: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 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22281: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;}
-
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22281:36: ( '+' | '-' )?
-                    int alt6=2;
-                    int LA6_0 = input.LA(1);
-
-                    if ( (LA6_0=='+'||LA6_0=='-') ) {
-                        alt6=1;
-                    }
-                    switch (alt6) {
-                        case 1 :
-                            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.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;
-
-            }
-
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22281: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 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22281: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 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22281: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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22283:9: ( ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )* )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22283:11: ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22283:11: ( '^' )?
-            int alt9=2;
-            int LA9_0 = input.LA(1);
-
-            if ( (LA9_0=='^') ) {
-                alt9=1;
-            }
-            switch (alt9) {
-                case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22283: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.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22283: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 :
-            	    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.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.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22285:13: ( ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22285:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22285: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 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22285:16: '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )?
-                    {
-                    match('\"'); 
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22285: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 :
-                    	    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22285:21: '\\\\' .
-                    	    {
-                    	    match('\\'); 
-                    	    matchAny(); 
-
-                    	    }
-                    	    break;
-                    	case 2 :
-                    	    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22285: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);
-
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22285:44: ( '\"' )?
-                    int alt12=2;
-                    int LA12_0 = input.LA(1);
-
-                    if ( (LA12_0=='\"') ) {
-                        alt12=1;
-                    }
-                    switch (alt12) {
-                        case 1 :
-                            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22285:44: '\"'
-                            {
-                            match('\"'); 
-
-                            }
-                            break;
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22285:49: '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )?
-                    {
-                    match('\''); 
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22285: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 :
-                    	    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22285:55: '\\\\' .
-                    	    {
-                    	    match('\\'); 
-                    	    matchAny(); 
-
-                    	    }
-                    	    break;
-                    	case 2 :
-                    	    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22285: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);
-
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22285:79: ( '\\'' )?
-                    int alt14=2;
-                    int LA14_0 = input.LA(1);
-
-                    if ( (LA14_0=='\'') ) {
-                        alt14=1;
-                    }
-                    switch (alt14) {
-                        case 1 :
-                            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22285: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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22287:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22287:19: '/*' ( options {greedy=false; } : . )* '*/'
-            {
-            match("/*"); 
-
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22287: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 :
-            	    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22287: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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22289:17: ( '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22289:19: '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
-            {
-            match("//"); 
-
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22289: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 :
-            	    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22289: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);
-
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22289: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 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22289:41: ( '\\r' )? '\\n'
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22289:41: ( '\\r' )?
-                    int alt18=2;
-                    int LA18_0 = input.LA(1);
-
-                    if ( (LA18_0=='\r') ) {
-                        alt18=1;
-                    }
-                    switch (alt18) {
-                        case 1 :
-                            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22289: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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22291:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22291:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22291: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 :
-            	    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.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;
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22293:16: ( . )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:22293:18: .
-            {
-            matchAny(); 
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "RULE_ANY_OTHER"
-
-    public void mTokens() throws RecognitionException {
-        // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.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 | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_ID | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER )
-        int alt21=98;
-        alt21 = dfa21.predict(input);
-        switch (alt21) {
-            case 1 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:10: T__13
-                {
-                mT__13(); 
-
-                }
-                break;
-            case 2 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:16: T__14
-                {
-                mT__14(); 
-
-                }
-                break;
-            case 3 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:22: T__15
-                {
-                mT__15(); 
-
-                }
-                break;
-            case 4 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:28: T__16
-                {
-                mT__16(); 
-
-                }
-                break;
-            case 5 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:34: T__17
-                {
-                mT__17(); 
-
-                }
-                break;
-            case 6 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:40: T__18
-                {
-                mT__18(); 
-
-                }
-                break;
-            case 7 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:46: T__19
-                {
-                mT__19(); 
-
-                }
-                break;
-            case 8 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:52: T__20
-                {
-                mT__20(); 
-
-                }
-                break;
-            case 9 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:58: T__21
-                {
-                mT__21(); 
-
-                }
-                break;
-            case 10 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:64: T__22
-                {
-                mT__22(); 
-
-                }
-                break;
-            case 11 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:70: T__23
-                {
-                mT__23(); 
-
-                }
-                break;
-            case 12 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:76: T__24
-                {
-                mT__24(); 
-
-                }
-                break;
-            case 13 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:82: T__25
-                {
-                mT__25(); 
-
-                }
-                break;
-            case 14 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:88: T__26
-                {
-                mT__26(); 
-
-                }
-                break;
-            case 15 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:94: T__27
-                {
-                mT__27(); 
-
-                }
-                break;
-            case 16 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:100: T__28
-                {
-                mT__28(); 
-
-                }
-                break;
-            case 17 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:106: T__29
-                {
-                mT__29(); 
-
-                }
-                break;
-            case 18 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:112: T__30
-                {
-                mT__30(); 
-
-                }
-                break;
-            case 19 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:118: T__31
-                {
-                mT__31(); 
-
-                }
-                break;
-            case 20 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:124: T__32
-                {
-                mT__32(); 
-
-                }
-                break;
-            case 21 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:130: T__33
-                {
-                mT__33(); 
-
-                }
-                break;
-            case 22 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:136: T__34
-                {
-                mT__34(); 
-
-                }
-                break;
-            case 23 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:142: T__35
-                {
-                mT__35(); 
-
-                }
-                break;
-            case 24 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:148: T__36
-                {
-                mT__36(); 
-
-                }
-                break;
-            case 25 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:154: T__37
-                {
-                mT__37(); 
-
-                }
-                break;
-            case 26 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:160: T__38
-                {
-                mT__38(); 
-
-                }
-                break;
-            case 27 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:166: T__39
-                {
-                mT__39(); 
-
-                }
-                break;
-            case 28 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:172: T__40
-                {
-                mT__40(); 
-
-                }
-                break;
-            case 29 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:178: T__41
-                {
-                mT__41(); 
-
-                }
-                break;
-            case 30 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:184: T__42
-                {
-                mT__42(); 
-
-                }
-                break;
-            case 31 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:190: T__43
-                {
-                mT__43(); 
-
-                }
-                break;
-            case 32 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:196: T__44
-                {
-                mT__44(); 
-
-                }
-                break;
-            case 33 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:202: T__45
-                {
-                mT__45(); 
-
-                }
-                break;
-            case 34 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:208: T__46
-                {
-                mT__46(); 
-
-                }
-                break;
-            case 35 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:214: T__47
-                {
-                mT__47(); 
-
-                }
-                break;
-            case 36 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:220: T__48
-                {
-                mT__48(); 
-
-                }
-                break;
-            case 37 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:226: T__49
-                {
-                mT__49(); 
-
-                }
-                break;
-            case 38 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:232: T__50
-                {
-                mT__50(); 
-
-                }
-                break;
-            case 39 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:238: T__51
-                {
-                mT__51(); 
-
-                }
-                break;
-            case 40 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:244: T__52
-                {
-                mT__52(); 
-
-                }
-                break;
-            case 41 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:250: T__53
-                {
-                mT__53(); 
-
-                }
-                break;
-            case 42 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:256: T__54
-                {
-                mT__54(); 
-
-                }
-                break;
-            case 43 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:262: T__55
-                {
-                mT__55(); 
-
-                }
-                break;
-            case 44 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:268: T__56
-                {
-                mT__56(); 
-
-                }
-                break;
-            case 45 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:274: T__57
-                {
-                mT__57(); 
-
-                }
-                break;
-            case 46 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:280: T__58
-                {
-                mT__58(); 
-
-                }
-                break;
-            case 47 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:286: T__59
-                {
-                mT__59(); 
-
-                }
-                break;
-            case 48 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:292: T__60
-                {
-                mT__60(); 
-
-                }
-                break;
-            case 49 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:298: T__61
-                {
-                mT__61(); 
-
-                }
-                break;
-            case 50 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:304: T__62
-                {
-                mT__62(); 
-
-                }
-                break;
-            case 51 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:310: T__63
-                {
-                mT__63(); 
-
-                }
-                break;
-            case 52 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:316: T__64
-                {
-                mT__64(); 
-
-                }
-                break;
-            case 53 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:322: T__65
-                {
-                mT__65(); 
-
-                }
-                break;
-            case 54 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:328: T__66
-                {
-                mT__66(); 
-
-                }
-                break;
-            case 55 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:334: T__67
-                {
-                mT__67(); 
-
-                }
-                break;
-            case 56 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:340: T__68
-                {
-                mT__68(); 
-
-                }
-                break;
-            case 57 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:346: T__69
-                {
-                mT__69(); 
-
-                }
-                break;
-            case 58 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:352: T__70
-                {
-                mT__70(); 
-
-                }
-                break;
-            case 59 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:358: T__71
-                {
-                mT__71(); 
-
-                }
-                break;
-            case 60 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:364: T__72
-                {
-                mT__72(); 
-
-                }
-                break;
-            case 61 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:370: T__73
-                {
-                mT__73(); 
-
-                }
-                break;
-            case 62 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:376: T__74
-                {
-                mT__74(); 
-
-                }
-                break;
-            case 63 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:382: T__75
-                {
-                mT__75(); 
-
-                }
-                break;
-            case 64 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:388: T__76
-                {
-                mT__76(); 
-
-                }
-                break;
-            case 65 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:394: T__77
-                {
-                mT__77(); 
-
-                }
-                break;
-            case 66 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:400: T__78
-                {
-                mT__78(); 
-
-                }
-                break;
-            case 67 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:406: T__79
-                {
-                mT__79(); 
-
-                }
-                break;
-            case 68 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:412: T__80
-                {
-                mT__80(); 
-
-                }
-                break;
-            case 69 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:418: T__81
-                {
-                mT__81(); 
-
-                }
-                break;
-            case 70 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:424: T__82
-                {
-                mT__82(); 
-
-                }
-                break;
-            case 71 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:430: T__83
-                {
-                mT__83(); 
-
-                }
-                break;
-            case 72 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:436: T__84
-                {
-                mT__84(); 
-
-                }
-                break;
-            case 73 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:442: T__85
-                {
-                mT__85(); 
-
-                }
-                break;
-            case 74 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:448: T__86
-                {
-                mT__86(); 
-
-                }
-                break;
-            case 75 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:454: T__87
-                {
-                mT__87(); 
-
-                }
-                break;
-            case 76 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:460: T__88
-                {
-                mT__88(); 
-
-                }
-                break;
-            case 77 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:466: T__89
-                {
-                mT__89(); 
-
-                }
-                break;
-            case 78 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:472: T__90
-                {
-                mT__90(); 
-
-                }
-                break;
-            case 79 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:478: T__91
-                {
-                mT__91(); 
-
-                }
-                break;
-            case 80 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:484: T__92
-                {
-                mT__92(); 
-
-                }
-                break;
-            case 81 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:490: T__93
-                {
-                mT__93(); 
-
-                }
-                break;
-            case 82 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:496: T__94
-                {
-                mT__94(); 
-
-                }
-                break;
-            case 83 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:502: T__95
-                {
-                mT__95(); 
-
-                }
-                break;
-            case 84 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:508: T__96
-                {
-                mT__96(); 
-
-                }
-                break;
-            case 85 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:514: T__97
-                {
-                mT__97(); 
-
-                }
-                break;
-            case 86 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:520: T__98
-                {
-                mT__98(); 
-
-                }
-                break;
-            case 87 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:526: T__99
-                {
-                mT__99(); 
-
-                }
-                break;
-            case 88 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:532: T__100
-                {
-                mT__100(); 
-
-                }
-                break;
-            case 89 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:539: T__101
-                {
-                mT__101(); 
-
-                }
-                break;
-            case 90 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:546: RULE_HEX
-                {
-                mRULE_HEX(); 
-
-                }
-                break;
-            case 91 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:555: RULE_INT
-                {
-                mRULE_INT(); 
-
-                }
-                break;
-            case 92 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:564: RULE_DECIMAL
-                {
-                mRULE_DECIMAL(); 
-
-                }
-                break;
-            case 93 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:577: RULE_ID
-                {
-                mRULE_ID(); 
-
-                }
-                break;
-            case 94 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:585: RULE_STRING
-                {
-                mRULE_STRING(); 
-
-                }
-                break;
-            case 95 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:597: RULE_ML_COMMENT
-                {
-                mRULE_ML_COMMENT(); 
-
-                }
-                break;
-            case 96 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:613: RULE_SL_COMMENT
-                {
-                mRULE_SL_COMMENT(); 
-
-                }
-                break;
-            case 97 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:629: RULE_WS
-                {
-                mRULE_WS(); 
-
-                }
-                break;
-            case 98 :
-                // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1:637: RULE_ANY_OTHER
-                {
-                mRULE_ANY_OTHER(); 
-
-                }
-                break;
-
-        }
-
-    }
-
-
-    protected DFA21 dfa21 = new DFA21(this);
-    static final String DFA21_eotS =
-        "\1\uffff\1\62\1\64\1\66\1\71\1\75\1\100\1\104\1\106\1\110\1\112\1\114\1\116\1\121\6\124\2\uffff\1\124\1\uffff\3\124\1\155\1\124\6\uffff\5\124\2\u0082\1\57\5\uffff\1\u0087\26\uffff\1\u0089\5\uffff\1\u008b\4\uffff\2\124\1\uffff\12\124\1\u009a\4\124\1\u009f\2\uffff\1\124\1\uffff\3\124\2\uffff\4\124\6\uffff\1\124\1\u00ab\6\124\1\uffff\1\u0082\12\uffff\1\u00b3\1\u00b4\14\124\1\uffff\1\124\1\u00c2\2\124\1\uffff\4\124\1\u00ca\3\124\1\u00ce\2\124\1\uffff\2\124\1\u00d3\4\124\2\uffff\4\124\1\u00dd\10\124\1\uffff\4\124\1\u00ea\2\124\1\uffff\3\124\1\uffff\1\u00f0\3\124\1\uffff\1\u00f4\1\124\1\u00f6\6\124\1\uffff\2\124\1\u0100\4\124\1\u0105\1\u0107\2\124\1\u010a\1\uffff\4\124\1\u010f\1\uffff\2\124\1\u0112\1\uffff\1\124\1\uffff\10\124\1\u011c\1\uffff\1\u011d\1\124\1\u011f\1\124\1\uffff\1\124\1\uffff\2\124\1\uffff\2\124\1\u0126\1\u0127\1\uffff\2\124\1\uffff\1\u012a\2\124\1\u012d\3\124\1\u0131\1\124\2\uffff\1\124\1\uffff\1\124\1\u0135\1\u0136\3\124\2\uffff\1\u013a\1\124\1\uffff\2\124\1\uffff\2\124\1\u0140\1\uffff\1\u0141\2\124\2\uffff\1\124\1\u0145\1\u0146\1\uffff\1\u0147\1\u0148\1\124\1\u014a\1\124\2\uffff\3\124\4\uffff\1\u014f\1\uffff\2\124\1\u0152\1\u0153\1\uffff\2\124\2\uffff\1\124\1\u0157\1\124\1\uffff\1\124\1\u015a\1\uffff";
-    static final String DFA21_eofS =
-        "\u015b\uffff";
-    static final String DFA21_minS =
-        "\1\0\1\75\1\174\1\46\1\53\1\55\2\52\3\75\1\76\2\56\1\141\1\120\1\164\1\146\1\141\1\143\2\uffff\1\141\1\uffff\1\151\2\162\1\72\1\141\6\uffff\1\145\1\150\2\145\1\151\2\60\1\44\5\uffff\1\75\26\uffff\1\75\5\uffff\1\74\4\uffff\1\154\1\163\1\uffff\1\164\1\141\1\145\1\144\1\141\1\160\1\151\1\156\1\160\1\163\1\44\1\154\1\162\1\156\1\164\1\44\2\uffff\1\163\1\uffff\1\156\1\157\1\151\2\uffff\1\162\1\160\1\162\1\165\6\uffff\1\146\1\44\1\163\1\151\1\167\1\154\1\164\1\163\1\uffff\1\60\12\uffff\2\44\1\151\1\145\1\143\1\155\1\145\1\160\1\164\1\145\1\164\1\143\1\157\1\164\1\uffff\1\163\1\44\1\141\1\151\1\uffff\1\143\1\145\1\144\1\160\1\44\1\147\1\145\1\157\1\44\1\145\1\141\1\uffff\1\141\1\154\1\44\1\154\1\165\1\164\1\144\2\uffff\1\142\1\156\1\153\1\145\1\44\1\157\1\151\1\162\1\143\1\150\1\162\1\141\1\145\1\uffff\1\154\1\157\1\147\1\150\1\44\1\151\1\145\1\uffff\1\145\1\157\1\167\1\uffff\1\44\1\165\1\142\1\145\1\uffff\1\44\1\162\1\44\1\141\1\151\1\144\1\156\1\141\1\156\1\uffff\1\151\1\143\1\44\1\150\1\162\1\164\1\156\2\44\1\156\1\157\1\44\1\uffff\1\156\1\162\1\164\1\146\1\44\1\uffff\2\154\1\44\1\uffff\1\156\1\uffff\1\164\1\154\1\163\1\151\1\141\1\147\1\164\1\156\1\44\1\uffff\1\44\1\157\1\44\1\143\1\uffff\1\171\1\uffff\1\163\1\162\1\uffff\1\147\1\164\2\44\1\uffff\1\164\1\145\1\uffff\1\44\1\157\1\151\1\44\1\157\1\154\1\145\1\44\1\164\2\uffff\1\156\1\uffff\1\145\2\44\1\151\1\163\1\171\2\uffff\1\44\1\144\1\uffff\1\162\1\164\1\uffff\1\156\1\103\1\44\1\uffff\1\44\1\151\1\157\2\uffff\1\145\2\44\1\uffff\2\44\1\171\1\44\1\157\2\uffff\1\172\1\146\1\163\4\uffff\1\44\1\uffff\1\155\1\145\2\44\1\uffff\1\155\1\144\2\uffff\1\141\1\44\1\156\1\uffff\1\144\1\44\1\uffff";
-    static final String DFA21_maxS =
-        "\1\uffff\1\76\1\174\1\46\1\75\1\76\5\75\1\76\1\56\1\72\1\151\1\170\1\171\1\156\1\157\1\163\2\uffff\1\141\1\uffff\1\151\2\162\1\72\1\171\6\uffff\1\157\1\150\1\165\1\145\1\151\1\170\1\154\1\172\5\uffff\1\75\26\uffff\1\75\5\uffff\1\74\4\uffff\1\162\1\163\1\uffff\1\164\1\141\1\163\1\144\1\141\1\160\1\151\1\156\1\160\1\163\1\172\1\154\1\162\1\156\1\164\1\172\2\uffff\1\164\1\uffff\1\156\1\157\1\151\2\uffff\1\162\1\160\1\162\1\171\6\uffff\1\146\1\172\1\163\1\151\1\167\1\154\1\164\1\163\1\uffff\1\154\12\uffff\2\172\1\151\1\145\1\143\1\155\1\145\1\160\1\164\1\145\1\164\1\143\1\157\1\164\1\uffff\1\163\1\172\1\141\1\151\1\uffff\2\145\1\144\1\160\1\172\1\147\1\145\1\157\1\172\1\145\1\141\1\uffff\1\141\1\154\1\172\1\154\1\165\1\164\1\144\2\uffff\1\142\1\162\1\153\1\145\1\172\1\157\1\151\1\162\1\143\1\150\1\162\1\141\1\145\1\uffff\1\154\1\157\1\147\1\150\1\172\1\151\1\145\1\uffff\1\145\1\157\1\167\1\uffff\1\172\1\165\1\142\1\145\1\uffff\1\172\1\162\1\172\1\141\1\151\1\163\1\156\1\141\1\156\1\uffff\1\151\1\143\1\172\1\150\1\162\1\164\1\156\2\172\1\156\1\157\1\172\1\uffff\1\156\1\162\1\164\1\146\1\172\1\uffff\2\154\1\172\1\uffff\1\156\1\uffff\1\164\1\154\1\163\1\151\1\141\1\147\1\164\1\156\1\172\1\uffff\1\172\1\157\1\172\1\143\1\uffff\1\171\1\uffff\1\163\1\162\1\uffff\1\147\1\164\2\172\1\uffff\1\164\1\145\1\uffff\1\172\1\157\1\151\1\172\1\157\1\154\1\145\1\172\1\164\2\uffff\1\156\1\uffff\1\145\2\172\1\151\1\163\1\171\2\uffff\1\172\1\144\1\uffff\1\162\1\164\1\uffff\1\156\1\103\1\172\1\uffff\1\172\1\151\1\157\2\uffff\1\145\2\172\1\uffff\2\172\1\171\1\172\1\157\2\uffff\1\172\1\146\1\163\4\uffff\1\172\1\uffff\1\155\1\145\2\172\1\uffff\1\155\1\144\2\uffff\1\141\1\172\1\156\1\uffff\1\144\1\172\1\uffff";
-    static final String DFA21_acceptS =
-        "\24\uffff\1\50\1\51\1\uffff\1\54\5\uffff\1\71\1\72\1\73\1\74\1\75\1\76\10\uffff\1\135\2\136\1\141\1\142\1\uffff\1\23\1\1\1\2\1\127\1\3\1\121\1\4\1\35\1\26\1\5\1\20\1\36\1\27\1\6\1\31\1\30\1\7\1\137\1\140\1\32\1\10\1\33\1\uffff\1\34\1\15\1\16\1\24\1\17\1\uffff\1\37\1\25\1\126\1\120\2\uffff\1\135\20\uffff\1\50\1\51\1\uffff\1\54\3\uffff\1\125\1\65\4\uffff\1\71\1\72\1\73\1\74\1\75\1\76\10\uffff\1\132\1\uffff\1\133\1\134\1\136\1\141\1\13\1\11\1\14\1\12\1\21\1\22\16\uffff\1\77\4\uffff\1\56\13\uffff\1\106\7\uffff\1\40\1\130\15\uffff\1\104\7\uffff\1\64\3\uffff\1\114\4\uffff\1\107\11\uffff\1\100\14\uffff\1\103\5\uffff\1\131\3\uffff\1\110\1\uffff\1\124\11\uffff\1\45\4\uffff\1\46\1\uffff\1\123\2\uffff\1\117\4\uffff\1\112\2\uffff\1\105\11\uffff\1\42\1\101\1\uffff\1\43\6\uffff\1\67\1\111\2\uffff\1\113\2\uffff\1\41\3\uffff\1\57\3\uffff\1\115\1\47\3\uffff\1\102\5\uffff\1\55\1\66\3\uffff\1\60\1\63\1\122\1\62\1\uffff\1\44\4\uffff\1\61\2\uffff\1\70\1\52\3\uffff\1\116\2\uffff\1\53";
-    static final String DFA21_specialS =
-        "\1\0\u015a\uffff}>";
-    static final String[] DFA21_transitionS = {
-            "\11\57\2\56\2\57\1\56\22\57\1\56\1\11\1\54\1\37\1\53\1\10\1\3\1\55\1\42\1\36\1\6\1\4\1\35\1\5\1\14\1\7\1\50\11\51\1\33\1\27\1\13\1\1\1\12\1\15\1\57\32\53\1\40\1\57\1\41\1\52\1\53\1\57\1\23\1\30\1\26\1\43\1\17\1\22\2\53\1\21\2\53\1\47\1\53\1\45\1\53\1\31\1\53\1\46\1\20\1\34\1\32\1\16\1\44\3\53\1\24\1\2\1\25\uff82\57",
-            "\1\60\1\61",
-            "\1\63",
-            "\1\65",
-            "\1\70\21\uffff\1\67",
-            "\1\74\17\uffff\1\72\1\73",
-            "\1\77\22\uffff\1\76",
-            "\1\102\4\uffff\1\103\15\uffff\1\101",
-            "\1\105",
-            "\1\107",
-            "\1\111",
-            "\1\113",
-            "\1\115",
-            "\1\120\13\uffff\1\117",
-            "\1\122\7\uffff\1\123",
-            "\1\126\33\uffff\1\127\1\uffff\1\130\11\uffff\1\125",
-            "\1\131\1\132\1\uffff\1\133\1\uffff\1\134",
-            "\1\137\6\uffff\1\135\1\136",
-            "\1\140\7\uffff\1\142\5\uffff\1\141",
-            "\1\143\17\uffff\1\144",
-            "",
-            "",
-            "\1\147",
-            "",
-            "\1\151",
-            "\1\152",
-            "\1\153",
-            "\1\154",
-            "\1\156\6\uffff\1\160\11\uffff\1\161\6\uffff\1\157",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "\1\170\3\uffff\1\172\5\uffff\1\171",
-            "\1\173",
-            "\1\174\17\uffff\1\175",
-            "\1\176",
-            "\1\177",
-            "\12\u0081\10\uffff\1\u0083\1\uffff\3\u0083\5\uffff\1\u0083\13\uffff\1\u0080\6\uffff\1\u0081\2\uffff\1\u0083\1\uffff\3\u0083\5\uffff\1\u0083\13\uffff\1\u0080",
-            "\12\u0081\10\uffff\1\u0083\1\uffff\3\u0083\5\uffff\1\u0083\22\uffff\1\u0081\2\uffff\1\u0083\1\uffff\3\u0083\5\uffff\1\u0083",
-            "\1\124\34\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "\1\u0086",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "\1\u0088",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "\1\u008a",
-            "",
-            "",
-            "",
-            "",
-            "\1\u008c\5\uffff\1\u008d",
-            "\1\u008e",
-            "",
-            "\1\u008f",
-            "\1\u0090",
-            "\1\u0091\15\uffff\1\u0092",
-            "\1\u0093",
-            "\1\u0094",
-            "\1\u0095",
-            "\1\u0096",
-            "\1\u0097",
-            "\1\u0098",
-            "\1\u0099",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "\1\u009b",
-            "\1\u009c",
-            "\1\u009d",
-            "\1\u009e",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "",
-            "",
-            "\1\u00a1\1\u00a0",
-            "",
-            "\1\u00a2",
-            "\1\u00a3",
-            "\1\u00a4",
-            "",
-            "",
-            "\1\u00a5",
-            "\1\u00a6",
-            "\1\u00a7",
-            "\1\u00a9\3\uffff\1\u00a8",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "\1\u00aa",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "\1\u00ac",
-            "\1\u00ad",
-            "\1\u00ae",
-            "\1\u00af",
-            "\1\u00b0",
-            "\1\u00b1",
-            "",
-            "\12\u0081\10\uffff\1\u0083\1\uffff\3\u0083\5\uffff\1\u0083\22\uffff\1\u0081\2\uffff\1\u0083\1\uffff\3\u0083\5\uffff\1\u0083",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\10\124\1\u00b2\21\124",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "\1\u00b5",
-            "\1\u00b6",
-            "\1\u00b7",
-            "\1\u00b8",
-            "\1\u00b9",
-            "\1\u00ba",
-            "\1\u00bb",
-            "\1\u00bc",
-            "\1\u00bd",
-            "\1\u00be",
-            "\1\u00bf",
-            "\1\u00c0",
-            "",
-            "\1\u00c1",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "\1\u00c3",
-            "\1\u00c4",
-            "",
-            "\1\u00c6\1\uffff\1\u00c5",
-            "\1\u00c7",
-            "\1\u00c8",
-            "\1\u00c9",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "\1\u00cb",
-            "\1\u00cc",
-            "\1\u00cd",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "\1\u00cf",
-            "\1\u00d0",
-            "",
-            "\1\u00d1",
-            "\1\u00d2",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "\1\u00d4",
-            "\1\u00d5",
-            "\1\u00d6",
-            "\1\u00d7",
-            "",
-            "",
-            "\1\u00d8",
-            "\1\u00d9\3\uffff\1\u00da",
-            "\1\u00db",
-            "\1\u00dc",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "\1\u00de",
-            "\1\u00df",
-            "\1\u00e0",
-            "\1\u00e1",
-            "\1\u00e2",
-            "\1\u00e3",
-            "\1\u00e4",
-            "\1\u00e5",
-            "",
-            "\1\u00e6",
-            "\1\u00e7",
-            "\1\u00e8",
-            "\1\u00e9",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "\1\u00eb",
-            "\1\u00ec",
-            "",
-            "\1\u00ed",
-            "\1\u00ee",
-            "\1\u00ef",
-            "",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "\1\u00f1",
-            "\1\u00f2",
-            "\1\u00f3",
-            "",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "\1\u00f5",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "\1\u00f7",
-            "\1\u00f8",
-            "\1\u00f9\16\uffff\1\u00fa",
-            "\1\u00fb",
-            "\1\u00fc",
-            "\1\u00fd",
-            "",
-            "\1\u00fe",
-            "\1\u00ff",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "\1\u0101",
-            "\1\u0102",
-            "\1\u0103",
-            "\1\u0104",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\13\124\1\u0106\16\124",
-            "\1\u0108",
-            "\1\u0109",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "",
-            "\1\u010b",
-            "\1\u010c",
-            "\1\u010d",
-            "\1\u010e",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "",
-            "\1\u0110",
-            "\1\u0111",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "",
-            "\1\u0113",
-            "",
-            "\1\u0114",
-            "\1\u0115",
-            "\1\u0116",
-            "\1\u0117",
-            "\1\u0118",
-            "\1\u0119",
-            "\1\u011a",
-            "\1\u011b",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "\1\u011e",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "\1\u0120",
-            "",
-            "\1\u0121",
-            "",
-            "\1\u0122",
-            "\1\u0123",
-            "",
-            "\1\u0124",
-            "\1\u0125",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "",
-            "\1\u0128",
-            "\1\u0129",
-            "",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "\1\u012b",
-            "\1\u012c",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "\1\u012e",
-            "\1\u012f",
-            "\1\u0130",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "\1\u0132",
-            "",
-            "",
-            "\1\u0133",
-            "",
-            "\1\u0134",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "\1\u0137",
-            "\1\u0138",
-            "\1\u0139",
-            "",
-            "",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "\1\u013b",
-            "",
-            "\1\u013c",
-            "\1\u013d",
-            "",
-            "\1\u013e",
-            "\1\u013f",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "\1\u0142",
-            "\1\u0143",
-            "",
-            "",
-            "\1\u0144",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "\1\u0149",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "\1\u014b",
-            "",
-            "",
-            "\1\u014c",
-            "\1\u014d",
-            "\1\u014e",
-            "",
-            "",
-            "",
-            "",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "",
-            "\1\u0150",
-            "\1\u0151",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "",
-            "\1\u0154",
-            "\1\u0155",
-            "",
-            "",
-            "\1\u0156",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            "\1\u0158",
-            "",
-            "\1\u0159",
-            "\1\124\13\uffff\12\124\7\uffff\32\124\4\uffff\1\124\1\uffff\32\124",
-            ""
-    };
-
-    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 | 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=='+') ) {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=='v') ) {s = 14;}
-
-                        else if ( (LA21_0=='e') ) {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=='a') ) {s = 19;}
-
-                        else if ( (LA21_0=='{') ) {s = 20;}
-
-                        else if ( (LA21_0=='}') ) {s = 21;}
-
-                        else if ( (LA21_0=='c') ) {s = 22;}
-
-                        else if ( (LA21_0==';') ) {s = 23;}
-
-                        else if ( (LA21_0=='b') ) {s = 24;}
-
-                        else if ( (LA21_0=='p') ) {s = 25;}
-
-                        else if ( (LA21_0=='u') ) {s = 26;}
-
-                        else if ( (LA21_0==':') ) {s = 27;}
-
-                        else if ( (LA21_0=='t') ) {s = 28;}
-
-                        else if ( (LA21_0==',') ) {s = 29;}
-
-                        else if ( (LA21_0==')') ) {s = 30;}
-
-                        else if ( (LA21_0=='#') ) {s = 31;}
-
-                        else if ( (LA21_0=='[') ) {s = 32;}
-
-                        else if ( (LA21_0==']') ) {s = 33;}
-
-                        else if ( (LA21_0=='(') ) {s = 34;}
-
-                        else if ( (LA21_0=='d') ) {s = 35;}
-
-                        else if ( (LA21_0=='w') ) {s = 36;}
-
-                        else if ( (LA21_0=='n') ) {s = 37;}
-
-                        else if ( (LA21_0=='r') ) {s = 38;}
-
-                        else if ( (LA21_0=='l') ) {s = 39;}
-
-                        else if ( (LA21_0=='0') ) {s = 40;}
-
-                        else if ( ((LA21_0>='1' && LA21_0<='9')) ) {s = 41;}
-
-                        else if ( (LA21_0=='^') ) {s = 42;}
-
-                        else if ( (LA21_0=='$'||(LA21_0>='A' && LA21_0<='Z')||LA21_0=='_'||(LA21_0>='g' && LA21_0<='h')||(LA21_0>='j' && LA21_0<='k')||LA21_0=='m'||LA21_0=='o'||LA21_0=='q'||(LA21_0>='x' && LA21_0<='z')) ) {s = 43;}
-
-                        else if ( (LA21_0=='\"') ) {s = 44;}
-
-                        else if ( (LA21_0=='\'') ) {s = 45;}
-
-                        else if ( ((LA21_0>='\t' && LA21_0<='\n')||LA21_0=='\r'||LA21_0==' ') ) {s = 46;}
-
-                        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>='~' && LA21_0<='\uFFFF')) ) {s = 47;}
-
-                        if ( s>=0 ) return s;
-                        break;
-            }
-            NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 21, _s, input);
-            error(nvae);
-            throw nvae;
-        }
-    }
- 
-
-}
diff --git a/org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammarParser.java b/org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammarParser.java
deleted file mode 100644
index f3089e2..0000000
--- a/org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammarParser.java
+++ /dev/null
@@ -1,10012 +0,0 @@
-/**
- * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf), Loetz GmbH&Co.KG (Heidelberg)
- * 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:
- *         Florian Pirchner - Initial implementation
- */
-
-package org.eclipse.osbp.ecview.uisemantics.ui.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.ui.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
-import org.eclipse.xtext.ui.editor.contentassist.antlr.internal.DFA;
-import org.eclipse.osbp.ecview.uisemantics.services.UISemanticsGrammarGrammarAccess;
-
-
-
-import org.antlr.runtime.*;
-import java.util.Stack;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Map;
-import java.util.HashMap;
-@SuppressWarnings("all")
-public class InternalUISemanticsGrammarParser 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", "'='", "'||'", "'&&'", "'+='", "'-='", "'*='", "'/='", "'%='", "'=='", "'!='", "'==='", "'!=='", "'>='", "'>'", "'<'", "'->'", "'..<'", "'..'", "'=>'", "'<>'", "'?:'", "'+'", "'-'", "'*'", "'**'", "'/'", "'%'", "'!'", "'++'", "'--'", "'.'", "'val'", "'extends'", "'static'", "'import'", "'extension'", "'super'", "'false'", "'actions'", "'{'", "'}'", "'categories'", "'externalCommand'", "';'", "'ePackage'", "'as'", "'element'", "'bindings'", "'visibility'", "'validator'", "'property'", "'uri'", "':'", "'endpoint'", "'target'", "'instanceof'", "','", "')'", "'#'", "'['", "']'", "'('", "'if'", "'else'", "'switch'", "'default'", "'case'", "'for'", "'while'", "'do'", "'new'", "'null'", "'typeof'", "'throw'", "'return'", "'try'", "'finally'", "'synchronized'", "'catch'", "'?'", "'&'", "'disabled'", "'final'", "'list'", "'::'", "'?.'", "'|'", "'var'", "'true'"
-    };
-    public static final int RULE_HEX=5;
-    public static final int T__50=50;
-    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__52=52;
-    public static final int T__53=53;
-    public static final int T__54=54;
-    public static final int T__60=60;
-    public static final int T__61=61;
-    public static final int RULE_ID=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;
-    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__63=63;
-    public static final int T__64=64;
-    public static final int T__65=65;
-    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__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__41=41;
-    public static final int T__42=42;
-    public static final int T__43=43;
-    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__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__70=70;
-    public static final int T__71=71;
-    public static final int T__72=72;
-    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__78=78;
-    public static final int T__79=79;
-    public static final int T__73=73;
-    public static final int EOF=-1;
-    public static final int T__74=74;
-    public static final int T__75=75;
-    public static final int T__76=76;
-    public static final int T__80=80;
-    public static final int T__81=81;
-    public static final int T__82=82;
-    public static final int T__83=83;
-    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__89=89;
-    public static final int T__84=84;
-    public static final int T__85=85;
-    public static final int T__86=86;
-    public static final int T__87=87;
-
-    // delegates
-    // delegators
-
-
-        public InternalUISemanticsGrammarParser(TokenStream input) {
-            this(input, new RecognizerSharedState());
-        }
-        public InternalUISemanticsGrammarParser(TokenStream input, RecognizerSharedState state) {
-            super(input, state);
-             
-        }
-        
-
-    public String[] getTokenNames() { return InternalUISemanticsGrammarParser.tokenNames; }
-    public String getGrammarFileName() { return "../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g"; }
-
-
-     
-     	private UISemanticsGrammarGrammarAccess grammarAccess;
-     	
-        public void setGrammarAccess(UISemanticsGrammarGrammarAccess grammarAccess) {
-        	this.grammarAccess = grammarAccess;
-        }
-        
-        @Override
-        protected Grammar getGrammar() {
-        	return grammarAccess.getGrammar();
-        }
-        
-        @Override
-        protected String getValueForTokenName(String tokenName) {
-        	return tokenName;
-        }
-
-
-
-
-    // $ANTLR start "entryRuleUxModel"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:61:1: entryRuleUxModel : ruleUxModel EOF ;
-    public final void entryRuleUxModel() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:62:1: ( ruleUxModel EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:63:1: ruleUxModel EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUxModelRule()); 
-            }
-            pushFollow(FOLLOW_ruleUxModel_in_entryRuleUxModel67);
-            ruleUxModel();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUxModelRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleUxModel74); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUxModel"
-
-
-    // $ANTLR start "ruleUxModel"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:70:1: ruleUxModel : ( ( rule__UxModel__Group__0 ) ) ;
-    public final void ruleUxModel() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:74:2: ( ( ( rule__UxModel__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:75:1: ( ( rule__UxModel__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:75:1: ( ( rule__UxModel__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:76:1: ( rule__UxModel__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUxModelAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:77:1: ( rule__UxModel__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:77:2: rule__UxModel__Group__0
-            {
-            pushFollow(FOLLOW_rule__UxModel__Group__0_in_ruleUxModel100);
-            rule__UxModel__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUxModelAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUxModel"
-
-
-    // $ANTLR start "entryRuleUxAction"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:89:1: entryRuleUxAction : ruleUxAction EOF ;
-    public final void entryRuleUxAction() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:90:1: ( ruleUxAction EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:91:1: ruleUxAction EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUxActionRule()); 
-            }
-            pushFollow(FOLLOW_ruleUxAction_in_entryRuleUxAction127);
-            ruleUxAction();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUxActionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleUxAction134); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUxAction"
-
-
-    // $ANTLR start "ruleUxAction"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:98:1: ruleUxAction : ( ( rule__UxAction__Group__0 ) ) ;
-    public final void ruleUxAction() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:102:2: ( ( ( rule__UxAction__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:103:1: ( ( rule__UxAction__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:103:1: ( ( rule__UxAction__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:104:1: ( rule__UxAction__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUxActionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:105:1: ( rule__UxAction__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:105:2: rule__UxAction__Group__0
-            {
-            pushFollow(FOLLOW_rule__UxAction__Group__0_in_ruleUxAction160);
-            rule__UxAction__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUxActionAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUxAction"
-
-
-    // $ANTLR start "entryRuleUxViewCategory"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:117:1: entryRuleUxViewCategory : ruleUxViewCategory EOF ;
-    public final void entryRuleUxViewCategory() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:118:1: ( ruleUxViewCategory EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:119:1: ruleUxViewCategory EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUxViewCategoryRule()); 
-            }
-            pushFollow(FOLLOW_ruleUxViewCategory_in_entryRuleUxViewCategory187);
-            ruleUxViewCategory();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUxViewCategoryRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleUxViewCategory194); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUxViewCategory"
-
-
-    // $ANTLR start "ruleUxViewCategory"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:126:1: ruleUxViewCategory : ( ( rule__UxViewCategory__NameAssignment ) ) ;
-    public final void ruleUxViewCategory() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:130:2: ( ( ( rule__UxViewCategory__NameAssignment ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:131:1: ( ( rule__UxViewCategory__NameAssignment ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:131:1: ( ( rule__UxViewCategory__NameAssignment ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:132:1: ( rule__UxViewCategory__NameAssignment )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUxViewCategoryAccess().getNameAssignment()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:133:1: ( rule__UxViewCategory__NameAssignment )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:133:2: rule__UxViewCategory__NameAssignment
-            {
-            pushFollow(FOLLOW_rule__UxViewCategory__NameAssignment_in_ruleUxViewCategory220);
-            rule__UxViewCategory__NameAssignment();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUxViewCategoryAccess().getNameAssignment()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUxViewCategory"
-
-
-    // $ANTLR start "entryRuleXImportDeclaration"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:145:1: entryRuleXImportDeclaration : ruleXImportDeclaration EOF ;
-    public final void entryRuleXImportDeclaration() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:146:1: ( ruleXImportDeclaration EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:147:1: ruleXImportDeclaration EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXImportDeclarationRule()); 
-            }
-            pushFollow(FOLLOW_ruleXImportDeclaration_in_entryRuleXImportDeclaration247);
-            ruleXImportDeclaration();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXImportDeclarationRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXImportDeclaration254); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXImportDeclaration"
-
-
-    // $ANTLR start "ruleXImportDeclaration"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:154:1: ruleXImportDeclaration : ( ( rule__XImportDeclaration__Alternatives ) ) ;
-    public final void ruleXImportDeclaration() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:158:2: ( ( ( rule__XImportDeclaration__Alternatives ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:159:1: ( ( rule__XImportDeclaration__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:159:1: ( ( rule__XImportDeclaration__Alternatives ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:160:1: ( rule__XImportDeclaration__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXImportDeclarationAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:161:1: ( rule__XImportDeclaration__Alternatives )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:161:2: rule__XImportDeclaration__Alternatives
-            {
-            pushFollow(FOLLOW_rule__XImportDeclaration__Alternatives_in_ruleXImportDeclaration280);
-            rule__XImportDeclaration__Alternatives();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXImportDeclarationAccess().getAlternatives()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleXImportDeclaration"
-
-
-    // $ANTLR start "entryRuleUxEPackageImport"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:173:1: entryRuleUxEPackageImport : ruleUxEPackageImport EOF ;
-    public final void entryRuleUxEPackageImport() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:174:1: ( ruleUxEPackageImport EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:175:1: ruleUxEPackageImport EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUxEPackageImportRule()); 
-            }
-            pushFollow(FOLLOW_ruleUxEPackageImport_in_entryRuleUxEPackageImport307);
-            ruleUxEPackageImport();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUxEPackageImportRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleUxEPackageImport314); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUxEPackageImport"
-
-
-    // $ANTLR start "ruleUxEPackageImport"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:182:1: ruleUxEPackageImport : ( ( rule__UxEPackageImport__Group__0 ) ) ;
-    public final void ruleUxEPackageImport() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:186:2: ( ( ( rule__UxEPackageImport__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:187:1: ( ( rule__UxEPackageImport__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:187:1: ( ( rule__UxEPackageImport__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:188:1: ( rule__UxEPackageImport__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUxEPackageImportAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:189:1: ( rule__UxEPackageImport__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:189:2: rule__UxEPackageImport__Group__0
-            {
-            pushFollow(FOLLOW_rule__UxEPackageImport__Group__0_in_ruleUxEPackageImport340);
-            rule__UxEPackageImport__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUxEPackageImportAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUxEPackageImport"
-
-
-    // $ANTLR start "entryRuleUxElementDefinition"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:201:1: entryRuleUxElementDefinition : ruleUxElementDefinition EOF ;
-    public final void entryRuleUxElementDefinition() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:202:1: ( ruleUxElementDefinition EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:203:1: ruleUxElementDefinition EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUxElementDefinitionRule()); 
-            }
-            pushFollow(FOLLOW_ruleUxElementDefinition_in_entryRuleUxElementDefinition367);
-            ruleUxElementDefinition();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUxElementDefinitionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleUxElementDefinition374); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUxElementDefinition"
-
-
-    // $ANTLR start "ruleUxElementDefinition"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:210:1: ruleUxElementDefinition : ( ( rule__UxElementDefinition__Group__0 ) ) ;
-    public final void ruleUxElementDefinition() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:214:2: ( ( ( rule__UxElementDefinition__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:215:1: ( ( rule__UxElementDefinition__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:215:1: ( ( rule__UxElementDefinition__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:216:1: ( rule__UxElementDefinition__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUxElementDefinitionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:217:1: ( rule__UxElementDefinition__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:217:2: rule__UxElementDefinition__Group__0
-            {
-            pushFollow(FOLLOW_rule__UxElementDefinition__Group__0_in_ruleUxElementDefinition400);
-            rule__UxElementDefinition__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUxElementDefinitionAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUxElementDefinition"
-
-
-    // $ANTLR start "entryRuleUxAvailableValidatorProperties"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:229:1: entryRuleUxAvailableValidatorProperties : ruleUxAvailableValidatorProperties EOF ;
-    public final void entryRuleUxAvailableValidatorProperties() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:230:1: ( ruleUxAvailableValidatorProperties EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:231:1: ruleUxAvailableValidatorProperties EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUxAvailableValidatorPropertiesRule()); 
-            }
-            pushFollow(FOLLOW_ruleUxAvailableValidatorProperties_in_entryRuleUxAvailableValidatorProperties427);
-            ruleUxAvailableValidatorProperties();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUxAvailableValidatorPropertiesRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleUxAvailableValidatorProperties434); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUxAvailableValidatorProperties"
-
-
-    // $ANTLR start "ruleUxAvailableValidatorProperties"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:238:1: ruleUxAvailableValidatorProperties : ( ( rule__UxAvailableValidatorProperties__Group__0 ) ) ;
-    public final void ruleUxAvailableValidatorProperties() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:242:2: ( ( ( rule__UxAvailableValidatorProperties__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:243:1: ( ( rule__UxAvailableValidatorProperties__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:243:1: ( ( rule__UxAvailableValidatorProperties__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:244:1: ( rule__UxAvailableValidatorProperties__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUxAvailableValidatorPropertiesAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:245:1: ( rule__UxAvailableValidatorProperties__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:245:2: rule__UxAvailableValidatorProperties__Group__0
-            {
-            pushFollow(FOLLOW_rule__UxAvailableValidatorProperties__Group__0_in_ruleUxAvailableValidatorProperties460);
-            rule__UxAvailableValidatorProperties__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUxAvailableValidatorPropertiesAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUxAvailableValidatorProperties"
-
-
-    // $ANTLR start "entryRuleUxValidatorProperty"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:257:1: entryRuleUxValidatorProperty : ruleUxValidatorProperty EOF ;
-    public final void entryRuleUxValidatorProperty() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:258:1: ( ruleUxValidatorProperty EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:259:1: ruleUxValidatorProperty EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUxValidatorPropertyRule()); 
-            }
-            pushFollow(FOLLOW_ruleUxValidatorProperty_in_entryRuleUxValidatorProperty487);
-            ruleUxValidatorProperty();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUxValidatorPropertyRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleUxValidatorProperty494); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUxValidatorProperty"
-
-
-    // $ANTLR start "ruleUxValidatorProperty"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:266:1: ruleUxValidatorProperty : ( ( rule__UxValidatorProperty__Group__0 ) ) ;
-    public final void ruleUxValidatorProperty() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:270:2: ( ( ( rule__UxValidatorProperty__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:271:1: ( ( rule__UxValidatorProperty__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:271:1: ( ( rule__UxValidatorProperty__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:272:1: ( rule__UxValidatorProperty__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUxValidatorPropertyAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:273:1: ( rule__UxValidatorProperty__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:273:2: rule__UxValidatorProperty__Group__0
-            {
-            pushFollow(FOLLOW_rule__UxValidatorProperty__Group__0_in_ruleUxValidatorProperty520);
-            rule__UxValidatorProperty__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUxValidatorPropertyAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUxValidatorProperty"
-
-
-    // $ANTLR start "entryRuleUxElementURI"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:285:1: entryRuleUxElementURI : ruleUxElementURI EOF ;
-    public final void entryRuleUxElementURI() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:286:1: ( ruleUxElementURI EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:287:1: ruleUxElementURI EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUxElementURIRule()); 
-            }
-            pushFollow(FOLLOW_ruleUxElementURI_in_entryRuleUxElementURI547);
-            ruleUxElementURI();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUxElementURIRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleUxElementURI554); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUxElementURI"
-
-
-    // $ANTLR start "ruleUxElementURI"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:294:1: ruleUxElementURI : ( ( rule__UxElementURI__Group__0 ) ) ;
-    public final void ruleUxElementURI() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:298:2: ( ( ( rule__UxElementURI__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:299:1: ( ( rule__UxElementURI__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:299:1: ( ( rule__UxElementURI__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:300:1: ( rule__UxElementURI__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUxElementURIAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:301:1: ( rule__UxElementURI__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:301:2: rule__UxElementURI__Group__0
-            {
-            pushFollow(FOLLOW_rule__UxElementURI__Group__0_in_ruleUxElementURI580);
-            rule__UxElementURI__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUxElementURIAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUxElementURI"
-
-
-    // $ANTLR start "entryRuleUxAvailableBindings"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:313:1: entryRuleUxAvailableBindings : ruleUxAvailableBindings EOF ;
-    public final void entryRuleUxAvailableBindings() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:314:1: ( ruleUxAvailableBindings EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:315:1: ruleUxAvailableBindings EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUxAvailableBindingsRule()); 
-            }
-            pushFollow(FOLLOW_ruleUxAvailableBindings_in_entryRuleUxAvailableBindings607);
-            ruleUxAvailableBindings();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUxAvailableBindingsRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleUxAvailableBindings614); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUxAvailableBindings"
-
-
-    // $ANTLR start "ruleUxAvailableBindings"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:322:1: ruleUxAvailableBindings : ( ( rule__UxAvailableBindings__Group__0 ) ) ;
-    public final void ruleUxAvailableBindings() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:326:2: ( ( ( rule__UxAvailableBindings__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:327:1: ( ( rule__UxAvailableBindings__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:327:1: ( ( rule__UxAvailableBindings__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:328:1: ( rule__UxAvailableBindings__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUxAvailableBindingsAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:329:1: ( rule__UxAvailableBindings__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:329:2: rule__UxAvailableBindings__Group__0
-            {
-            pushFollow(FOLLOW_rule__UxAvailableBindings__Group__0_in_ruleUxAvailableBindings640);
-            rule__UxAvailableBindings__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUxAvailableBindingsAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUxAvailableBindings"
-
-
-    // $ANTLR start "entryRuleUxAvailableVisibilityOptions"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:341:1: entryRuleUxAvailableVisibilityOptions : ruleUxAvailableVisibilityOptions EOF ;
-    public final void entryRuleUxAvailableVisibilityOptions() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:342:1: ( ruleUxAvailableVisibilityOptions EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:343:1: ruleUxAvailableVisibilityOptions EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUxAvailableVisibilityOptionsRule()); 
-            }
-            pushFollow(FOLLOW_ruleUxAvailableVisibilityOptions_in_entryRuleUxAvailableVisibilityOptions667);
-            ruleUxAvailableVisibilityOptions();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUxAvailableVisibilityOptionsRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleUxAvailableVisibilityOptions674); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUxAvailableVisibilityOptions"
-
-
-    // $ANTLR start "ruleUxAvailableVisibilityOptions"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:350:1: ruleUxAvailableVisibilityOptions : ( ( rule__UxAvailableVisibilityOptions__Group__0 ) ) ;
-    public final void ruleUxAvailableVisibilityOptions() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:354:2: ( ( ( rule__UxAvailableVisibilityOptions__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:355:1: ( ( rule__UxAvailableVisibilityOptions__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:355:1: ( ( rule__UxAvailableVisibilityOptions__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:356:1: ( rule__UxAvailableVisibilityOptions__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUxAvailableVisibilityOptionsAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:357:1: ( rule__UxAvailableVisibilityOptions__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:357:2: rule__UxAvailableVisibilityOptions__Group__0
-            {
-            pushFollow(FOLLOW_rule__UxAvailableVisibilityOptions__Group__0_in_ruleUxAvailableVisibilityOptions700);
-            rule__UxAvailableVisibilityOptions__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUxAvailableVisibilityOptionsAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUxAvailableVisibilityOptions"
-
-
-    // $ANTLR start "entryRuleUxBindingableOption"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:369:1: entryRuleUxBindingableOption : ruleUxBindingableOption EOF ;
-    public final void entryRuleUxBindingableOption() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:370:1: ( ruleUxBindingableOption EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:371:1: ruleUxBindingableOption EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUxBindingableOptionRule()); 
-            }
-            pushFollow(FOLLOW_ruleUxBindingableOption_in_entryRuleUxBindingableOption727);
-            ruleUxBindingableOption();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUxBindingableOptionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleUxBindingableOption734); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUxBindingableOption"
-
-
-    // $ANTLR start "ruleUxBindingableOption"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:378:1: ruleUxBindingableOption : ( ( rule__UxBindingableOption__Group__0 ) ) ;
-    public final void ruleUxBindingableOption() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:382:2: ( ( ( rule__UxBindingableOption__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:383:1: ( ( rule__UxBindingableOption__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:383:1: ( ( rule__UxBindingableOption__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:384:1: ( rule__UxBindingableOption__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUxBindingableOptionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:385:1: ( rule__UxBindingableOption__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:385:2: rule__UxBindingableOption__Group__0
-            {
-            pushFollow(FOLLOW_rule__UxBindingableOption__Group__0_in_ruleUxBindingableOption760);
-            rule__UxBindingableOption__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUxBindingableOptionAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUxBindingableOption"
-
-
-    // $ANTLR start "entryRuleUxVisibleableOption"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:397:1: entryRuleUxVisibleableOption : ruleUxVisibleableOption EOF ;
-    public final void entryRuleUxVisibleableOption() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:398:1: ( ruleUxVisibleableOption EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:399:1: ruleUxVisibleableOption EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUxVisibleableOptionRule()); 
-            }
-            pushFollow(FOLLOW_ruleUxVisibleableOption_in_entryRuleUxVisibleableOption787);
-            ruleUxVisibleableOption();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUxVisibleableOptionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleUxVisibleableOption794); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleUxVisibleableOption"
-
-
-    // $ANTLR start "ruleUxVisibleableOption"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:406:1: ruleUxVisibleableOption : ( ( rule__UxVisibleableOption__Group__0 ) ) ;
-    public final void ruleUxVisibleableOption() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:410:2: ( ( ( rule__UxVisibleableOption__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:411:1: ( ( rule__UxVisibleableOption__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:411:1: ( ( rule__UxVisibleableOption__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:412:1: ( rule__UxVisibleableOption__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getUxVisibleableOptionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:413:1: ( rule__UxVisibleableOption__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:413:2: rule__UxVisibleableOption__Group__0
-            {
-            pushFollow(FOLLOW_rule__UxVisibleableOption__Group__0_in_ruleUxVisibleableOption820);
-            rule__UxVisibleableOption__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getUxVisibleableOptionAccess().getGroup()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "ruleUxVisibleableOption"
-
-
-    // $ANTLR start "entryRuleXExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:425:1: entryRuleXExpression : ruleXExpression EOF ;
-    public final void entryRuleXExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:426:1: ( ruleXExpression EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:427:1: ruleXExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXExpression_in_entryRuleXExpression847);
-            ruleXExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXExpression854); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXExpression"
-
-
-    // $ANTLR start "ruleXExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:434:1: ruleXExpression : ( ruleXAssignment ) ;
-    public final void ruleXExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:438:2: ( ( ruleXAssignment ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:439:1: ( ruleXAssignment )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:439:1: ( ruleXAssignment )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:440:1: ruleXAssignment
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXExpressionAccess().getXAssignmentParserRuleCall()); 
-            }
-            pushFollow(FOLLOW_ruleXAssignment_in_ruleXExpression880);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:453:1: entryRuleXAssignment : ruleXAssignment EOF ;
-    public final void entryRuleXAssignment() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:454:1: ( ruleXAssignment EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:455:1: ruleXAssignment EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXAssignmentRule()); 
-            }
-            pushFollow(FOLLOW_ruleXAssignment_in_entryRuleXAssignment906);
-            ruleXAssignment();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXAssignmentRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXAssignment913); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXAssignment"
-
-
-    // $ANTLR start "ruleXAssignment"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:462:1: ruleXAssignment : ( ( rule__XAssignment__Alternatives ) ) ;
-    public final void ruleXAssignment() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:466:2: ( ( ( rule__XAssignment__Alternatives ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:467:1: ( ( rule__XAssignment__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:467:1: ( ( rule__XAssignment__Alternatives ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:468:1: ( rule__XAssignment__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXAssignmentAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:469:1: ( rule__XAssignment__Alternatives )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:469:2: rule__XAssignment__Alternatives
-            {
-            pushFollow(FOLLOW_rule__XAssignment__Alternatives_in_ruleXAssignment939);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:481:1: entryRuleOpSingleAssign : ruleOpSingleAssign EOF ;
-    public final void entryRuleOpSingleAssign() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:482:1: ( ruleOpSingleAssign EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:483:1: ruleOpSingleAssign EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpSingleAssignRule()); 
-            }
-            pushFollow(FOLLOW_ruleOpSingleAssign_in_entryRuleOpSingleAssign966);
-            ruleOpSingleAssign();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getOpSingleAssignRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleOpSingleAssign973); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleOpSingleAssign"
-
-
-    // $ANTLR start "ruleOpSingleAssign"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:490:1: ruleOpSingleAssign : ( '=' ) ;
-    public final void ruleOpSingleAssign() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:494:2: ( ( '=' ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:495:1: ( '=' )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:495:1: ( '=' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:496:1: '='
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpSingleAssignAccess().getEqualsSignKeyword()); 
-            }
-            match(input,13,FOLLOW_13_in_ruleOpSingleAssign1000); 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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:511:1: entryRuleOpMultiAssign : ruleOpMultiAssign EOF ;
-    public final void entryRuleOpMultiAssign() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:512:1: ( ruleOpMultiAssign EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:513:1: ruleOpMultiAssign EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpMultiAssignRule()); 
-            }
-            pushFollow(FOLLOW_ruleOpMultiAssign_in_entryRuleOpMultiAssign1028);
-            ruleOpMultiAssign();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getOpMultiAssignRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleOpMultiAssign1035); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleOpMultiAssign"
-
-
-    // $ANTLR start "ruleOpMultiAssign"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:520:1: ruleOpMultiAssign : ( ( rule__OpMultiAssign__Alternatives ) ) ;
-    public final void ruleOpMultiAssign() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:524:2: ( ( ( rule__OpMultiAssign__Alternatives ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:525:1: ( ( rule__OpMultiAssign__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:525:1: ( ( rule__OpMultiAssign__Alternatives ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:526:1: ( rule__OpMultiAssign__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpMultiAssignAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:527:1: ( rule__OpMultiAssign__Alternatives )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:527:2: rule__OpMultiAssign__Alternatives
-            {
-            pushFollow(FOLLOW_rule__OpMultiAssign__Alternatives_in_ruleOpMultiAssign1061);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:539:1: entryRuleXOrExpression : ruleXOrExpression EOF ;
-    public final void entryRuleXOrExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:540:1: ( ruleXOrExpression EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:541:1: ruleXOrExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXOrExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXOrExpression_in_entryRuleXOrExpression1088);
-            ruleXOrExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXOrExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXOrExpression1095); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXOrExpression"
-
-
-    // $ANTLR start "ruleXOrExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:548:1: ruleXOrExpression : ( ( rule__XOrExpression__Group__0 ) ) ;
-    public final void ruleXOrExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:552:2: ( ( ( rule__XOrExpression__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:553:1: ( ( rule__XOrExpression__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:553:1: ( ( rule__XOrExpression__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:554:1: ( rule__XOrExpression__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXOrExpressionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:555:1: ( rule__XOrExpression__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:555:2: rule__XOrExpression__Group__0
-            {
-            pushFollow(FOLLOW_rule__XOrExpression__Group__0_in_ruleXOrExpression1121);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:567:1: entryRuleOpOr : ruleOpOr EOF ;
-    public final void entryRuleOpOr() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:568:1: ( ruleOpOr EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:569:1: ruleOpOr EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpOrRule()); 
-            }
-            pushFollow(FOLLOW_ruleOpOr_in_entryRuleOpOr1148);
-            ruleOpOr();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getOpOrRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleOpOr1155); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleOpOr"
-
-
-    // $ANTLR start "ruleOpOr"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:576:1: ruleOpOr : ( '||' ) ;
-    public final void ruleOpOr() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:580:2: ( ( '||' ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:581:1: ( '||' )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:581:1: ( '||' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:582:1: '||'
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpOrAccess().getVerticalLineVerticalLineKeyword()); 
-            }
-            match(input,14,FOLLOW_14_in_ruleOpOr1182); 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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:597:1: entryRuleXAndExpression : ruleXAndExpression EOF ;
-    public final void entryRuleXAndExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:598:1: ( ruleXAndExpression EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:599:1: ruleXAndExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXAndExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXAndExpression_in_entryRuleXAndExpression1210);
-            ruleXAndExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXAndExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXAndExpression1217); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXAndExpression"
-
-
-    // $ANTLR start "ruleXAndExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:606:1: ruleXAndExpression : ( ( rule__XAndExpression__Group__0 ) ) ;
-    public final void ruleXAndExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:610:2: ( ( ( rule__XAndExpression__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:611:1: ( ( rule__XAndExpression__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:611:1: ( ( rule__XAndExpression__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:612:1: ( rule__XAndExpression__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXAndExpressionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:613:1: ( rule__XAndExpression__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:613:2: rule__XAndExpression__Group__0
-            {
-            pushFollow(FOLLOW_rule__XAndExpression__Group__0_in_ruleXAndExpression1243);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:625:1: entryRuleOpAnd : ruleOpAnd EOF ;
-    public final void entryRuleOpAnd() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:626:1: ( ruleOpAnd EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:627:1: ruleOpAnd EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpAndRule()); 
-            }
-            pushFollow(FOLLOW_ruleOpAnd_in_entryRuleOpAnd1270);
-            ruleOpAnd();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getOpAndRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleOpAnd1277); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleOpAnd"
-
-
-    // $ANTLR start "ruleOpAnd"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:634:1: ruleOpAnd : ( '&&' ) ;
-    public final void ruleOpAnd() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:638:2: ( ( '&&' ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:639:1: ( '&&' )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:639:1: ( '&&' )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:640:1: '&&'
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpAndAccess().getAmpersandAmpersandKeyword()); 
-            }
-            match(input,15,FOLLOW_15_in_ruleOpAnd1304); 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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:655:1: entryRuleXEqualityExpression : ruleXEqualityExpression EOF ;
-    public final void entryRuleXEqualityExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:656:1: ( ruleXEqualityExpression EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:657:1: ruleXEqualityExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXEqualityExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXEqualityExpression_in_entryRuleXEqualityExpression1332);
-            ruleXEqualityExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXEqualityExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXEqualityExpression1339); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXEqualityExpression"
-
-
-    // $ANTLR start "ruleXEqualityExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:664:1: ruleXEqualityExpression : ( ( rule__XEqualityExpression__Group__0 ) ) ;
-    public final void ruleXEqualityExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:668:2: ( ( ( rule__XEqualityExpression__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:669:1: ( ( rule__XEqualityExpression__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:669:1: ( ( rule__XEqualityExpression__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:670:1: ( rule__XEqualityExpression__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXEqualityExpressionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:671:1: ( rule__XEqualityExpression__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:671:2: rule__XEqualityExpression__Group__0
-            {
-            pushFollow(FOLLOW_rule__XEqualityExpression__Group__0_in_ruleXEqualityExpression1365);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:683:1: entryRuleOpEquality : ruleOpEquality EOF ;
-    public final void entryRuleOpEquality() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:684:1: ( ruleOpEquality EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:685:1: ruleOpEquality EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpEqualityRule()); 
-            }
-            pushFollow(FOLLOW_ruleOpEquality_in_entryRuleOpEquality1392);
-            ruleOpEquality();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getOpEqualityRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleOpEquality1399); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleOpEquality"
-
-
-    // $ANTLR start "ruleOpEquality"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:692:1: ruleOpEquality : ( ( rule__OpEquality__Alternatives ) ) ;
-    public final void ruleOpEquality() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:696:2: ( ( ( rule__OpEquality__Alternatives ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:697:1: ( ( rule__OpEquality__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:697:1: ( ( rule__OpEquality__Alternatives ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:698:1: ( rule__OpEquality__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpEqualityAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:699:1: ( rule__OpEquality__Alternatives )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:699:2: rule__OpEquality__Alternatives
-            {
-            pushFollow(FOLLOW_rule__OpEquality__Alternatives_in_ruleOpEquality1425);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:711:1: entryRuleXRelationalExpression : ruleXRelationalExpression EOF ;
-    public final void entryRuleXRelationalExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:712:1: ( ruleXRelationalExpression EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:713:1: ruleXRelationalExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXRelationalExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXRelationalExpression_in_entryRuleXRelationalExpression1452);
-            ruleXRelationalExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXRelationalExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXRelationalExpression1459); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXRelationalExpression"
-
-
-    // $ANTLR start "ruleXRelationalExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:720:1: ruleXRelationalExpression : ( ( rule__XRelationalExpression__Group__0 ) ) ;
-    public final void ruleXRelationalExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:724:2: ( ( ( rule__XRelationalExpression__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:725:1: ( ( rule__XRelationalExpression__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:725:1: ( ( rule__XRelationalExpression__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:726:1: ( rule__XRelationalExpression__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXRelationalExpressionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:727:1: ( rule__XRelationalExpression__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:727:2: rule__XRelationalExpression__Group__0
-            {
-            pushFollow(FOLLOW_rule__XRelationalExpression__Group__0_in_ruleXRelationalExpression1485);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:739:1: entryRuleOpCompare : ruleOpCompare EOF ;
-    public final void entryRuleOpCompare() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:740:1: ( ruleOpCompare EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:741:1: ruleOpCompare EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpCompareRule()); 
-            }
-            pushFollow(FOLLOW_ruleOpCompare_in_entryRuleOpCompare1512);
-            ruleOpCompare();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getOpCompareRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleOpCompare1519); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleOpCompare"
-
-
-    // $ANTLR start "ruleOpCompare"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:748:1: ruleOpCompare : ( ( rule__OpCompare__Alternatives ) ) ;
-    public final void ruleOpCompare() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:752:2: ( ( ( rule__OpCompare__Alternatives ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:753:1: ( ( rule__OpCompare__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:753:1: ( ( rule__OpCompare__Alternatives ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:754:1: ( rule__OpCompare__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpCompareAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:755:1: ( rule__OpCompare__Alternatives )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:755:2: rule__OpCompare__Alternatives
-            {
-            pushFollow(FOLLOW_rule__OpCompare__Alternatives_in_ruleOpCompare1545);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:767:1: entryRuleXOtherOperatorExpression : ruleXOtherOperatorExpression EOF ;
-    public final void entryRuleXOtherOperatorExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:768:1: ( ruleXOtherOperatorExpression EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:769:1: ruleXOtherOperatorExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXOtherOperatorExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXOtherOperatorExpression_in_entryRuleXOtherOperatorExpression1572);
-            ruleXOtherOperatorExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXOtherOperatorExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXOtherOperatorExpression1579); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXOtherOperatorExpression"
-
-
-    // $ANTLR start "ruleXOtherOperatorExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:776:1: ruleXOtherOperatorExpression : ( ( rule__XOtherOperatorExpression__Group__0 ) ) ;
-    public final void ruleXOtherOperatorExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:780:2: ( ( ( rule__XOtherOperatorExpression__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:781:1: ( ( rule__XOtherOperatorExpression__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:781:1: ( ( rule__XOtherOperatorExpression__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:782:1: ( rule__XOtherOperatorExpression__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXOtherOperatorExpressionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:783:1: ( rule__XOtherOperatorExpression__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:783:2: rule__XOtherOperatorExpression__Group__0
-            {
-            pushFollow(FOLLOW_rule__XOtherOperatorExpression__Group__0_in_ruleXOtherOperatorExpression1605);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:795:1: entryRuleOpOther : ruleOpOther EOF ;
-    public final void entryRuleOpOther() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:796:1: ( ruleOpOther EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:797:1: ruleOpOther EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpOtherRule()); 
-            }
-            pushFollow(FOLLOW_ruleOpOther_in_entryRuleOpOther1632);
-            ruleOpOther();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getOpOtherRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleOpOther1639); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleOpOther"
-
-
-    // $ANTLR start "ruleOpOther"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:804:1: ruleOpOther : ( ( rule__OpOther__Alternatives ) ) ;
-    public final void ruleOpOther() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:808:2: ( ( ( rule__OpOther__Alternatives ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:809:1: ( ( rule__OpOther__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:809:1: ( ( rule__OpOther__Alternatives ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:810:1: ( rule__OpOther__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpOtherAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:811:1: ( rule__OpOther__Alternatives )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:811:2: rule__OpOther__Alternatives
-            {
-            pushFollow(FOLLOW_rule__OpOther__Alternatives_in_ruleOpOther1665);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:823:1: entryRuleXAdditiveExpression : ruleXAdditiveExpression EOF ;
-    public final void entryRuleXAdditiveExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:824:1: ( ruleXAdditiveExpression EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:825:1: ruleXAdditiveExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXAdditiveExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXAdditiveExpression_in_entryRuleXAdditiveExpression1692);
-            ruleXAdditiveExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXAdditiveExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXAdditiveExpression1699); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXAdditiveExpression"
-
-
-    // $ANTLR start "ruleXAdditiveExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:832:1: ruleXAdditiveExpression : ( ( rule__XAdditiveExpression__Group__0 ) ) ;
-    public final void ruleXAdditiveExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:836:2: ( ( ( rule__XAdditiveExpression__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:837:1: ( ( rule__XAdditiveExpression__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:837:1: ( ( rule__XAdditiveExpression__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:838:1: ( rule__XAdditiveExpression__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXAdditiveExpressionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:839:1: ( rule__XAdditiveExpression__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:839:2: rule__XAdditiveExpression__Group__0
-            {
-            pushFollow(FOLLOW_rule__XAdditiveExpression__Group__0_in_ruleXAdditiveExpression1725);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:851:1: entryRuleOpAdd : ruleOpAdd EOF ;
-    public final void entryRuleOpAdd() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:852:1: ( ruleOpAdd EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:853:1: ruleOpAdd EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpAddRule()); 
-            }
-            pushFollow(FOLLOW_ruleOpAdd_in_entryRuleOpAdd1752);
-            ruleOpAdd();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getOpAddRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleOpAdd1759); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleOpAdd"
-
-
-    // $ANTLR start "ruleOpAdd"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:860:1: ruleOpAdd : ( ( rule__OpAdd__Alternatives ) ) ;
-    public final void ruleOpAdd() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:864:2: ( ( ( rule__OpAdd__Alternatives ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:865:1: ( ( rule__OpAdd__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:865:1: ( ( rule__OpAdd__Alternatives ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:866:1: ( rule__OpAdd__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpAddAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:867:1: ( rule__OpAdd__Alternatives )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:867:2: rule__OpAdd__Alternatives
-            {
-            pushFollow(FOLLOW_rule__OpAdd__Alternatives_in_ruleOpAdd1785);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:879:1: entryRuleXMultiplicativeExpression : ruleXMultiplicativeExpression EOF ;
-    public final void entryRuleXMultiplicativeExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:880:1: ( ruleXMultiplicativeExpression EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:881:1: ruleXMultiplicativeExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXMultiplicativeExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXMultiplicativeExpression_in_entryRuleXMultiplicativeExpression1812);
-            ruleXMultiplicativeExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXMultiplicativeExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXMultiplicativeExpression1819); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXMultiplicativeExpression"
-
-
-    // $ANTLR start "ruleXMultiplicativeExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:888:1: ruleXMultiplicativeExpression : ( ( rule__XMultiplicativeExpression__Group__0 ) ) ;
-    public final void ruleXMultiplicativeExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:892:2: ( ( ( rule__XMultiplicativeExpression__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:893:1: ( ( rule__XMultiplicativeExpression__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:893:1: ( ( rule__XMultiplicativeExpression__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:894:1: ( rule__XMultiplicativeExpression__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXMultiplicativeExpressionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:895:1: ( rule__XMultiplicativeExpression__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:895:2: rule__XMultiplicativeExpression__Group__0
-            {
-            pushFollow(FOLLOW_rule__XMultiplicativeExpression__Group__0_in_ruleXMultiplicativeExpression1845);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:907:1: entryRuleOpMulti : ruleOpMulti EOF ;
-    public final void entryRuleOpMulti() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:908:1: ( ruleOpMulti EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:909:1: ruleOpMulti EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpMultiRule()); 
-            }
-            pushFollow(FOLLOW_ruleOpMulti_in_entryRuleOpMulti1872);
-            ruleOpMulti();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getOpMultiRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleOpMulti1879); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleOpMulti"
-
-
-    // $ANTLR start "ruleOpMulti"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:916:1: ruleOpMulti : ( ( rule__OpMulti__Alternatives ) ) ;
-    public final void ruleOpMulti() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:920:2: ( ( ( rule__OpMulti__Alternatives ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:921:1: ( ( rule__OpMulti__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:921:1: ( ( rule__OpMulti__Alternatives ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:922:1: ( rule__OpMulti__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpMultiAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:923:1: ( rule__OpMulti__Alternatives )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:923:2: rule__OpMulti__Alternatives
-            {
-            pushFollow(FOLLOW_rule__OpMulti__Alternatives_in_ruleOpMulti1905);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:935:1: entryRuleXUnaryOperation : ruleXUnaryOperation EOF ;
-    public final void entryRuleXUnaryOperation() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:936:1: ( ruleXUnaryOperation EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:937:1: ruleXUnaryOperation EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXUnaryOperationRule()); 
-            }
-            pushFollow(FOLLOW_ruleXUnaryOperation_in_entryRuleXUnaryOperation1932);
-            ruleXUnaryOperation();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXUnaryOperationRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXUnaryOperation1939); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXUnaryOperation"
-
-
-    // $ANTLR start "ruleXUnaryOperation"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:944:1: ruleXUnaryOperation : ( ( rule__XUnaryOperation__Alternatives ) ) ;
-    public final void ruleXUnaryOperation() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:948:2: ( ( ( rule__XUnaryOperation__Alternatives ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:949:1: ( ( rule__XUnaryOperation__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:949:1: ( ( rule__XUnaryOperation__Alternatives ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:950:1: ( rule__XUnaryOperation__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXUnaryOperationAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:951:1: ( rule__XUnaryOperation__Alternatives )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:951:2: rule__XUnaryOperation__Alternatives
-            {
-            pushFollow(FOLLOW_rule__XUnaryOperation__Alternatives_in_ruleXUnaryOperation1965);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:963:1: entryRuleOpUnary : ruleOpUnary EOF ;
-    public final void entryRuleOpUnary() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:964:1: ( ruleOpUnary EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:965:1: ruleOpUnary EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpUnaryRule()); 
-            }
-            pushFollow(FOLLOW_ruleOpUnary_in_entryRuleOpUnary1992);
-            ruleOpUnary();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getOpUnaryRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleOpUnary1999); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleOpUnary"
-
-
-    // $ANTLR start "ruleOpUnary"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:972:1: ruleOpUnary : ( ( rule__OpUnary__Alternatives ) ) ;
-    public final void ruleOpUnary() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:976:2: ( ( ( rule__OpUnary__Alternatives ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:977:1: ( ( rule__OpUnary__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:977:1: ( ( rule__OpUnary__Alternatives ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:978:1: ( rule__OpUnary__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpUnaryAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:979:1: ( rule__OpUnary__Alternatives )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:979:2: rule__OpUnary__Alternatives
-            {
-            pushFollow(FOLLOW_rule__OpUnary__Alternatives_in_ruleOpUnary2025);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:991:1: entryRuleXCastedExpression : ruleXCastedExpression EOF ;
-    public final void entryRuleXCastedExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:992:1: ( ruleXCastedExpression EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:993:1: ruleXCastedExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXCastedExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXCastedExpression_in_entryRuleXCastedExpression2052);
-            ruleXCastedExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXCastedExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXCastedExpression2059); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXCastedExpression"
-
-
-    // $ANTLR start "ruleXCastedExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1000:1: ruleXCastedExpression : ( ( rule__XCastedExpression__Group__0 ) ) ;
-    public final void ruleXCastedExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1004:2: ( ( ( rule__XCastedExpression__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1005:1: ( ( rule__XCastedExpression__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1005:1: ( ( rule__XCastedExpression__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1006:1: ( rule__XCastedExpression__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXCastedExpressionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1007:1: ( rule__XCastedExpression__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1007:2: rule__XCastedExpression__Group__0
-            {
-            pushFollow(FOLLOW_rule__XCastedExpression__Group__0_in_ruleXCastedExpression2085);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1019:1: entryRuleXPostfixOperation : ruleXPostfixOperation EOF ;
-    public final void entryRuleXPostfixOperation() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1020:1: ( ruleXPostfixOperation EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1021:1: ruleXPostfixOperation EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXPostfixOperationRule()); 
-            }
-            pushFollow(FOLLOW_ruleXPostfixOperation_in_entryRuleXPostfixOperation2112);
-            ruleXPostfixOperation();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXPostfixOperationRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXPostfixOperation2119); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXPostfixOperation"
-
-
-    // $ANTLR start "ruleXPostfixOperation"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1028:1: ruleXPostfixOperation : ( ( rule__XPostfixOperation__Group__0 ) ) ;
-    public final void ruleXPostfixOperation() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1032:2: ( ( ( rule__XPostfixOperation__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1033:1: ( ( rule__XPostfixOperation__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1033:1: ( ( rule__XPostfixOperation__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1034:1: ( rule__XPostfixOperation__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXPostfixOperationAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1035:1: ( rule__XPostfixOperation__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1035:2: rule__XPostfixOperation__Group__0
-            {
-            pushFollow(FOLLOW_rule__XPostfixOperation__Group__0_in_ruleXPostfixOperation2145);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1047:1: entryRuleOpPostfix : ruleOpPostfix EOF ;
-    public final void entryRuleOpPostfix() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1048:1: ( ruleOpPostfix EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1049:1: ruleOpPostfix EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpPostfixRule()); 
-            }
-            pushFollow(FOLLOW_ruleOpPostfix_in_entryRuleOpPostfix2172);
-            ruleOpPostfix();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getOpPostfixRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleOpPostfix2179); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleOpPostfix"
-
-
-    // $ANTLR start "ruleOpPostfix"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1056:1: ruleOpPostfix : ( ( rule__OpPostfix__Alternatives ) ) ;
-    public final void ruleOpPostfix() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1060:2: ( ( ( rule__OpPostfix__Alternatives ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1061:1: ( ( rule__OpPostfix__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1061:1: ( ( rule__OpPostfix__Alternatives ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1062:1: ( rule__OpPostfix__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getOpPostfixAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1063:1: ( rule__OpPostfix__Alternatives )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1063:2: rule__OpPostfix__Alternatives
-            {
-            pushFollow(FOLLOW_rule__OpPostfix__Alternatives_in_ruleOpPostfix2205);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1075:1: entryRuleXMemberFeatureCall : ruleXMemberFeatureCall EOF ;
-    public final void entryRuleXMemberFeatureCall() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1076:1: ( ruleXMemberFeatureCall EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1077:1: ruleXMemberFeatureCall EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXMemberFeatureCallRule()); 
-            }
-            pushFollow(FOLLOW_ruleXMemberFeatureCall_in_entryRuleXMemberFeatureCall2232);
-            ruleXMemberFeatureCall();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXMemberFeatureCallRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXMemberFeatureCall2239); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXMemberFeatureCall"
-
-
-    // $ANTLR start "ruleXMemberFeatureCall"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1084:1: ruleXMemberFeatureCall : ( ( rule__XMemberFeatureCall__Group__0 ) ) ;
-    public final void ruleXMemberFeatureCall() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1088:2: ( ( ( rule__XMemberFeatureCall__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1089:1: ( ( rule__XMemberFeatureCall__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1089:1: ( ( rule__XMemberFeatureCall__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1090:1: ( rule__XMemberFeatureCall__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXMemberFeatureCallAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1091:1: ( rule__XMemberFeatureCall__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1091:2: rule__XMemberFeatureCall__Group__0
-            {
-            pushFollow(FOLLOW_rule__XMemberFeatureCall__Group__0_in_ruleXMemberFeatureCall2265);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1103:1: entryRuleXPrimaryExpression : ruleXPrimaryExpression EOF ;
-    public final void entryRuleXPrimaryExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1104:1: ( ruleXPrimaryExpression EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1105:1: ruleXPrimaryExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXPrimaryExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXPrimaryExpression_in_entryRuleXPrimaryExpression2292);
-            ruleXPrimaryExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXPrimaryExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXPrimaryExpression2299); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXPrimaryExpression"
-
-
-    // $ANTLR start "ruleXPrimaryExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1112:1: ruleXPrimaryExpression : ( ( rule__XPrimaryExpression__Alternatives ) ) ;
-    public final void ruleXPrimaryExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1116:2: ( ( ( rule__XPrimaryExpression__Alternatives ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1117:1: ( ( rule__XPrimaryExpression__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1117:1: ( ( rule__XPrimaryExpression__Alternatives ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1118:1: ( rule__XPrimaryExpression__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXPrimaryExpressionAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1119:1: ( rule__XPrimaryExpression__Alternatives )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1119:2: rule__XPrimaryExpression__Alternatives
-            {
-            pushFollow(FOLLOW_rule__XPrimaryExpression__Alternatives_in_ruleXPrimaryExpression2325);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1131:1: entryRuleXLiteral : ruleXLiteral EOF ;
-    public final void entryRuleXLiteral() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1132:1: ( ruleXLiteral EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1133:1: ruleXLiteral EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXLiteralRule()); 
-            }
-            pushFollow(FOLLOW_ruleXLiteral_in_entryRuleXLiteral2352);
-            ruleXLiteral();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXLiteralRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXLiteral2359); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXLiteral"
-
-
-    // $ANTLR start "ruleXLiteral"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1140:1: ruleXLiteral : ( ( rule__XLiteral__Alternatives ) ) ;
-    public final void ruleXLiteral() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1144:2: ( ( ( rule__XLiteral__Alternatives ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1145:1: ( ( rule__XLiteral__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1145:1: ( ( rule__XLiteral__Alternatives ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1146:1: ( rule__XLiteral__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXLiteralAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1147:1: ( rule__XLiteral__Alternatives )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1147:2: rule__XLiteral__Alternatives
-            {
-            pushFollow(FOLLOW_rule__XLiteral__Alternatives_in_ruleXLiteral2385);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1159:1: entryRuleXCollectionLiteral : ruleXCollectionLiteral EOF ;
-    public final void entryRuleXCollectionLiteral() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1160:1: ( ruleXCollectionLiteral EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1161:1: ruleXCollectionLiteral EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXCollectionLiteralRule()); 
-            }
-            pushFollow(FOLLOW_ruleXCollectionLiteral_in_entryRuleXCollectionLiteral2412);
-            ruleXCollectionLiteral();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXCollectionLiteralRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXCollectionLiteral2419); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXCollectionLiteral"
-
-
-    // $ANTLR start "ruleXCollectionLiteral"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1168:1: ruleXCollectionLiteral : ( ( rule__XCollectionLiteral__Alternatives ) ) ;
-    public final void ruleXCollectionLiteral() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1172:2: ( ( ( rule__XCollectionLiteral__Alternatives ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1173:1: ( ( rule__XCollectionLiteral__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1173:1: ( ( rule__XCollectionLiteral__Alternatives ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1174:1: ( rule__XCollectionLiteral__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXCollectionLiteralAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1175:1: ( rule__XCollectionLiteral__Alternatives )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1175:2: rule__XCollectionLiteral__Alternatives
-            {
-            pushFollow(FOLLOW_rule__XCollectionLiteral__Alternatives_in_ruleXCollectionLiteral2445);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1187:1: entryRuleXSetLiteral : ruleXSetLiteral EOF ;
-    public final void entryRuleXSetLiteral() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1188:1: ( ruleXSetLiteral EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1189:1: ruleXSetLiteral EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXSetLiteralRule()); 
-            }
-            pushFollow(FOLLOW_ruleXSetLiteral_in_entryRuleXSetLiteral2472);
-            ruleXSetLiteral();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXSetLiteralRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXSetLiteral2479); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXSetLiteral"
-
-
-    // $ANTLR start "ruleXSetLiteral"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1196:1: ruleXSetLiteral : ( ( rule__XSetLiteral__Group__0 ) ) ;
-    public final void ruleXSetLiteral() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1200:2: ( ( ( rule__XSetLiteral__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1201:1: ( ( rule__XSetLiteral__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1201:1: ( ( rule__XSetLiteral__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1202:1: ( rule__XSetLiteral__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXSetLiteralAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1203:1: ( rule__XSetLiteral__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1203:2: rule__XSetLiteral__Group__0
-            {
-            pushFollow(FOLLOW_rule__XSetLiteral__Group__0_in_ruleXSetLiteral2505);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1215:1: entryRuleXListLiteral : ruleXListLiteral EOF ;
-    public final void entryRuleXListLiteral() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1216:1: ( ruleXListLiteral EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1217:1: ruleXListLiteral EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXListLiteralRule()); 
-            }
-            pushFollow(FOLLOW_ruleXListLiteral_in_entryRuleXListLiteral2532);
-            ruleXListLiteral();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXListLiteralRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXListLiteral2539); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXListLiteral"
-
-
-    // $ANTLR start "ruleXListLiteral"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1224:1: ruleXListLiteral : ( ( rule__XListLiteral__Group__0 ) ) ;
-    public final void ruleXListLiteral() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1228:2: ( ( ( rule__XListLiteral__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1229:1: ( ( rule__XListLiteral__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1229:1: ( ( rule__XListLiteral__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1230:1: ( rule__XListLiteral__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXListLiteralAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1231:1: ( rule__XListLiteral__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1231:2: rule__XListLiteral__Group__0
-            {
-            pushFollow(FOLLOW_rule__XListLiteral__Group__0_in_ruleXListLiteral2565);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1243:1: entryRuleXClosure : ruleXClosure EOF ;
-    public final void entryRuleXClosure() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1244:1: ( ruleXClosure EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1245:1: ruleXClosure EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXClosureRule()); 
-            }
-            pushFollow(FOLLOW_ruleXClosure_in_entryRuleXClosure2592);
-            ruleXClosure();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXClosureRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXClosure2599); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXClosure"
-
-
-    // $ANTLR start "ruleXClosure"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1252:1: ruleXClosure : ( ( rule__XClosure__Group__0 ) ) ;
-    public final void ruleXClosure() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1256:2: ( ( ( rule__XClosure__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1257:1: ( ( rule__XClosure__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1257:1: ( ( rule__XClosure__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1258:1: ( rule__XClosure__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXClosureAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1259:1: ( rule__XClosure__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1259:2: rule__XClosure__Group__0
-            {
-            pushFollow(FOLLOW_rule__XClosure__Group__0_in_ruleXClosure2625);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1271:1: entryRuleXExpressionInClosure : ruleXExpressionInClosure EOF ;
-    public final void entryRuleXExpressionInClosure() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1272:1: ( ruleXExpressionInClosure EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1273:1: ruleXExpressionInClosure EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXExpressionInClosureRule()); 
-            }
-            pushFollow(FOLLOW_ruleXExpressionInClosure_in_entryRuleXExpressionInClosure2652);
-            ruleXExpressionInClosure();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXExpressionInClosureRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXExpressionInClosure2659); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXExpressionInClosure"
-
-
-    // $ANTLR start "ruleXExpressionInClosure"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1280:1: ruleXExpressionInClosure : ( ( rule__XExpressionInClosure__Group__0 ) ) ;
-    public final void ruleXExpressionInClosure() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1284:2: ( ( ( rule__XExpressionInClosure__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1285:1: ( ( rule__XExpressionInClosure__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1285:1: ( ( rule__XExpressionInClosure__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1286:1: ( rule__XExpressionInClosure__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXExpressionInClosureAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1287:1: ( rule__XExpressionInClosure__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1287:2: rule__XExpressionInClosure__Group__0
-            {
-            pushFollow(FOLLOW_rule__XExpressionInClosure__Group__0_in_ruleXExpressionInClosure2685);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1299:1: entryRuleXShortClosure : ruleXShortClosure EOF ;
-    public final void entryRuleXShortClosure() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1300:1: ( ruleXShortClosure EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1301:1: ruleXShortClosure EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXShortClosureRule()); 
-            }
-            pushFollow(FOLLOW_ruleXShortClosure_in_entryRuleXShortClosure2712);
-            ruleXShortClosure();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXShortClosureRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXShortClosure2719); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXShortClosure"
-
-
-    // $ANTLR start "ruleXShortClosure"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1308:1: ruleXShortClosure : ( ( rule__XShortClosure__Group__0 ) ) ;
-    public final void ruleXShortClosure() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1312:2: ( ( ( rule__XShortClosure__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1313:1: ( ( rule__XShortClosure__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1313:1: ( ( rule__XShortClosure__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1314:1: ( rule__XShortClosure__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXShortClosureAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1315:1: ( rule__XShortClosure__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1315:2: rule__XShortClosure__Group__0
-            {
-            pushFollow(FOLLOW_rule__XShortClosure__Group__0_in_ruleXShortClosure2745);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1327:1: entryRuleXParenthesizedExpression : ruleXParenthesizedExpression EOF ;
-    public final void entryRuleXParenthesizedExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1328:1: ( ruleXParenthesizedExpression EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1329:1: ruleXParenthesizedExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXParenthesizedExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXParenthesizedExpression_in_entryRuleXParenthesizedExpression2772);
-            ruleXParenthesizedExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXParenthesizedExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXParenthesizedExpression2779); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXParenthesizedExpression"
-
-
-    // $ANTLR start "ruleXParenthesizedExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1336:1: ruleXParenthesizedExpression : ( ( rule__XParenthesizedExpression__Group__0 ) ) ;
-    public final void ruleXParenthesizedExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1340:2: ( ( ( rule__XParenthesizedExpression__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1341:1: ( ( rule__XParenthesizedExpression__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1341:1: ( ( rule__XParenthesizedExpression__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1342:1: ( rule__XParenthesizedExpression__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXParenthesizedExpressionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1343:1: ( rule__XParenthesizedExpression__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1343:2: rule__XParenthesizedExpression__Group__0
-            {
-            pushFollow(FOLLOW_rule__XParenthesizedExpression__Group__0_in_ruleXParenthesizedExpression2805);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1355:1: entryRuleXIfExpression : ruleXIfExpression EOF ;
-    public final void entryRuleXIfExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1356:1: ( ruleXIfExpression EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1357:1: ruleXIfExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXIfExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXIfExpression_in_entryRuleXIfExpression2832);
-            ruleXIfExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXIfExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXIfExpression2839); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXIfExpression"
-
-
-    // $ANTLR start "ruleXIfExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1364:1: ruleXIfExpression : ( ( rule__XIfExpression__Group__0 ) ) ;
-    public final void ruleXIfExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1368:2: ( ( ( rule__XIfExpression__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1369:1: ( ( rule__XIfExpression__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1369:1: ( ( rule__XIfExpression__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1370:1: ( rule__XIfExpression__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXIfExpressionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1371:1: ( rule__XIfExpression__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1371:2: rule__XIfExpression__Group__0
-            {
-            pushFollow(FOLLOW_rule__XIfExpression__Group__0_in_ruleXIfExpression2865);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1383:1: entryRuleXSwitchExpression : ruleXSwitchExpression EOF ;
-    public final void entryRuleXSwitchExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1384:1: ( ruleXSwitchExpression EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1385:1: ruleXSwitchExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXSwitchExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXSwitchExpression_in_entryRuleXSwitchExpression2892);
-            ruleXSwitchExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXSwitchExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXSwitchExpression2899); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXSwitchExpression"
-
-
-    // $ANTLR start "ruleXSwitchExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1392:1: ruleXSwitchExpression : ( ( rule__XSwitchExpression__Group__0 ) ) ;
-    public final void ruleXSwitchExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1396:2: ( ( ( rule__XSwitchExpression__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1397:1: ( ( rule__XSwitchExpression__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1397:1: ( ( rule__XSwitchExpression__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1398:1: ( rule__XSwitchExpression__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXSwitchExpressionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1399:1: ( rule__XSwitchExpression__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1399:2: rule__XSwitchExpression__Group__0
-            {
-            pushFollow(FOLLOW_rule__XSwitchExpression__Group__0_in_ruleXSwitchExpression2925);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1411:1: entryRuleXCasePart : ruleXCasePart EOF ;
-    public final void entryRuleXCasePart() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1412:1: ( ruleXCasePart EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1413:1: ruleXCasePart EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXCasePartRule()); 
-            }
-            pushFollow(FOLLOW_ruleXCasePart_in_entryRuleXCasePart2952);
-            ruleXCasePart();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXCasePartRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXCasePart2959); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXCasePart"
-
-
-    // $ANTLR start "ruleXCasePart"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1420:1: ruleXCasePart : ( ( rule__XCasePart__Group__0 ) ) ;
-    public final void ruleXCasePart() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1424:2: ( ( ( rule__XCasePart__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1425:1: ( ( rule__XCasePart__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1425:1: ( ( rule__XCasePart__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1426:1: ( rule__XCasePart__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXCasePartAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1427:1: ( rule__XCasePart__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1427:2: rule__XCasePart__Group__0
-            {
-            pushFollow(FOLLOW_rule__XCasePart__Group__0_in_ruleXCasePart2985);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1439:1: entryRuleXForLoopExpression : ruleXForLoopExpression EOF ;
-    public final void entryRuleXForLoopExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1440:1: ( ruleXForLoopExpression EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1441:1: ruleXForLoopExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXForLoopExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXForLoopExpression_in_entryRuleXForLoopExpression3012);
-            ruleXForLoopExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXForLoopExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXForLoopExpression3019); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXForLoopExpression"
-
-
-    // $ANTLR start "ruleXForLoopExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1448:1: ruleXForLoopExpression : ( ( rule__XForLoopExpression__Group__0 ) ) ;
-    public final void ruleXForLoopExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1452:2: ( ( ( rule__XForLoopExpression__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1453:1: ( ( rule__XForLoopExpression__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1453:1: ( ( rule__XForLoopExpression__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1454:1: ( rule__XForLoopExpression__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXForLoopExpressionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1455:1: ( rule__XForLoopExpression__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1455:2: rule__XForLoopExpression__Group__0
-            {
-            pushFollow(FOLLOW_rule__XForLoopExpression__Group__0_in_ruleXForLoopExpression3045);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1467:1: entryRuleXBasicForLoopExpression : ruleXBasicForLoopExpression EOF ;
-    public final void entryRuleXBasicForLoopExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1468:1: ( ruleXBasicForLoopExpression EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1469:1: ruleXBasicForLoopExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXBasicForLoopExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXBasicForLoopExpression_in_entryRuleXBasicForLoopExpression3072);
-            ruleXBasicForLoopExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXBasicForLoopExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXBasicForLoopExpression3079); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXBasicForLoopExpression"
-
-
-    // $ANTLR start "ruleXBasicForLoopExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1476:1: ruleXBasicForLoopExpression : ( ( rule__XBasicForLoopExpression__Group__0 ) ) ;
-    public final void ruleXBasicForLoopExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1480:2: ( ( ( rule__XBasicForLoopExpression__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1481:1: ( ( rule__XBasicForLoopExpression__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1481:1: ( ( rule__XBasicForLoopExpression__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1482:1: ( rule__XBasicForLoopExpression__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXBasicForLoopExpressionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1483:1: ( rule__XBasicForLoopExpression__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1483:2: rule__XBasicForLoopExpression__Group__0
-            {
-            pushFollow(FOLLOW_rule__XBasicForLoopExpression__Group__0_in_ruleXBasicForLoopExpression3105);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1495:1: entryRuleXWhileExpression : ruleXWhileExpression EOF ;
-    public final void entryRuleXWhileExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1496:1: ( ruleXWhileExpression EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1497:1: ruleXWhileExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXWhileExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXWhileExpression_in_entryRuleXWhileExpression3132);
-            ruleXWhileExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXWhileExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXWhileExpression3139); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXWhileExpression"
-
-
-    // $ANTLR start "ruleXWhileExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1504:1: ruleXWhileExpression : ( ( rule__XWhileExpression__Group__0 ) ) ;
-    public final void ruleXWhileExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1508:2: ( ( ( rule__XWhileExpression__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1509:1: ( ( rule__XWhileExpression__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1509:1: ( ( rule__XWhileExpression__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1510:1: ( rule__XWhileExpression__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXWhileExpressionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1511:1: ( rule__XWhileExpression__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1511:2: rule__XWhileExpression__Group__0
-            {
-            pushFollow(FOLLOW_rule__XWhileExpression__Group__0_in_ruleXWhileExpression3165);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1523:1: entryRuleXDoWhileExpression : ruleXDoWhileExpression EOF ;
-    public final void entryRuleXDoWhileExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1524:1: ( ruleXDoWhileExpression EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1525:1: ruleXDoWhileExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXDoWhileExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXDoWhileExpression_in_entryRuleXDoWhileExpression3192);
-            ruleXDoWhileExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXDoWhileExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXDoWhileExpression3199); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXDoWhileExpression"
-
-
-    // $ANTLR start "ruleXDoWhileExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1532:1: ruleXDoWhileExpression : ( ( rule__XDoWhileExpression__Group__0 ) ) ;
-    public final void ruleXDoWhileExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1536:2: ( ( ( rule__XDoWhileExpression__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1537:1: ( ( rule__XDoWhileExpression__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1537:1: ( ( rule__XDoWhileExpression__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1538:1: ( rule__XDoWhileExpression__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXDoWhileExpressionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1539:1: ( rule__XDoWhileExpression__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1539:2: rule__XDoWhileExpression__Group__0
-            {
-            pushFollow(FOLLOW_rule__XDoWhileExpression__Group__0_in_ruleXDoWhileExpression3225);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1551:1: entryRuleXBlockExpression : ruleXBlockExpression EOF ;
-    public final void entryRuleXBlockExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1552:1: ( ruleXBlockExpression EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1553:1: ruleXBlockExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXBlockExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXBlockExpression_in_entryRuleXBlockExpression3252);
-            ruleXBlockExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXBlockExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXBlockExpression3259); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXBlockExpression"
-
-
-    // $ANTLR start "ruleXBlockExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1560:1: ruleXBlockExpression : ( ( rule__XBlockExpression__Group__0 ) ) ;
-    public final void ruleXBlockExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1564:2: ( ( ( rule__XBlockExpression__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1565:1: ( ( rule__XBlockExpression__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1565:1: ( ( rule__XBlockExpression__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1566:1: ( rule__XBlockExpression__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXBlockExpressionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1567:1: ( rule__XBlockExpression__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1567:2: rule__XBlockExpression__Group__0
-            {
-            pushFollow(FOLLOW_rule__XBlockExpression__Group__0_in_ruleXBlockExpression3285);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1579:1: entryRuleXExpressionOrVarDeclaration : ruleXExpressionOrVarDeclaration EOF ;
-    public final void entryRuleXExpressionOrVarDeclaration() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1580:1: ( ruleXExpressionOrVarDeclaration EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1581:1: ruleXExpressionOrVarDeclaration EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXExpressionOrVarDeclarationRule()); 
-            }
-            pushFollow(FOLLOW_ruleXExpressionOrVarDeclaration_in_entryRuleXExpressionOrVarDeclaration3312);
-            ruleXExpressionOrVarDeclaration();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXExpressionOrVarDeclarationRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXExpressionOrVarDeclaration3319); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXExpressionOrVarDeclaration"
-
-
-    // $ANTLR start "ruleXExpressionOrVarDeclaration"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1588:1: ruleXExpressionOrVarDeclaration : ( ( rule__XExpressionOrVarDeclaration__Alternatives ) ) ;
-    public final void ruleXExpressionOrVarDeclaration() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1592:2: ( ( ( rule__XExpressionOrVarDeclaration__Alternatives ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1593:1: ( ( rule__XExpressionOrVarDeclaration__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1593:1: ( ( rule__XExpressionOrVarDeclaration__Alternatives ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1594:1: ( rule__XExpressionOrVarDeclaration__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXExpressionOrVarDeclarationAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1595:1: ( rule__XExpressionOrVarDeclaration__Alternatives )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1595:2: rule__XExpressionOrVarDeclaration__Alternatives
-            {
-            pushFollow(FOLLOW_rule__XExpressionOrVarDeclaration__Alternatives_in_ruleXExpressionOrVarDeclaration3345);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1607:1: entryRuleXVariableDeclaration : ruleXVariableDeclaration EOF ;
-    public final void entryRuleXVariableDeclaration() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1608:1: ( ruleXVariableDeclaration EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1609:1: ruleXVariableDeclaration EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXVariableDeclarationRule()); 
-            }
-            pushFollow(FOLLOW_ruleXVariableDeclaration_in_entryRuleXVariableDeclaration3372);
-            ruleXVariableDeclaration();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXVariableDeclarationRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXVariableDeclaration3379); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXVariableDeclaration"
-
-
-    // $ANTLR start "ruleXVariableDeclaration"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1616:1: ruleXVariableDeclaration : ( ( rule__XVariableDeclaration__Group__0 ) ) ;
-    public final void ruleXVariableDeclaration() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1620:2: ( ( ( rule__XVariableDeclaration__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1621:1: ( ( rule__XVariableDeclaration__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1621:1: ( ( rule__XVariableDeclaration__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1622:1: ( rule__XVariableDeclaration__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXVariableDeclarationAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1623:1: ( rule__XVariableDeclaration__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1623:2: rule__XVariableDeclaration__Group__0
-            {
-            pushFollow(FOLLOW_rule__XVariableDeclaration__Group__0_in_ruleXVariableDeclaration3405);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1635:1: entryRuleJvmFormalParameter : ruleJvmFormalParameter EOF ;
-    public final void entryRuleJvmFormalParameter() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1636:1: ( ruleJvmFormalParameter EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1637:1: ruleJvmFormalParameter EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getJvmFormalParameterRule()); 
-            }
-            pushFollow(FOLLOW_ruleJvmFormalParameter_in_entryRuleJvmFormalParameter3432);
-            ruleJvmFormalParameter();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getJvmFormalParameterRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmFormalParameter3439); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleJvmFormalParameter"
-
-
-    // $ANTLR start "ruleJvmFormalParameter"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1644:1: ruleJvmFormalParameter : ( ( rule__JvmFormalParameter__Group__0 ) ) ;
-    public final void ruleJvmFormalParameter() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1648:2: ( ( ( rule__JvmFormalParameter__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1649:1: ( ( rule__JvmFormalParameter__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1649:1: ( ( rule__JvmFormalParameter__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1650:1: ( rule__JvmFormalParameter__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getJvmFormalParameterAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1651:1: ( rule__JvmFormalParameter__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1651:2: rule__JvmFormalParameter__Group__0
-            {
-            pushFollow(FOLLOW_rule__JvmFormalParameter__Group__0_in_ruleJvmFormalParameter3465);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1663:1: entryRuleFullJvmFormalParameter : ruleFullJvmFormalParameter EOF ;
-    public final void entryRuleFullJvmFormalParameter() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1664:1: ( ruleFullJvmFormalParameter EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1665:1: ruleFullJvmFormalParameter EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getFullJvmFormalParameterRule()); 
-            }
-            pushFollow(FOLLOW_ruleFullJvmFormalParameter_in_entryRuleFullJvmFormalParameter3492);
-            ruleFullJvmFormalParameter();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getFullJvmFormalParameterRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleFullJvmFormalParameter3499); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleFullJvmFormalParameter"
-
-
-    // $ANTLR start "ruleFullJvmFormalParameter"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1672:1: ruleFullJvmFormalParameter : ( ( rule__FullJvmFormalParameter__Group__0 ) ) ;
-    public final void ruleFullJvmFormalParameter() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1676:2: ( ( ( rule__FullJvmFormalParameter__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1677:1: ( ( rule__FullJvmFormalParameter__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1677:1: ( ( rule__FullJvmFormalParameter__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1678:1: ( rule__FullJvmFormalParameter__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getFullJvmFormalParameterAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1679:1: ( rule__FullJvmFormalParameter__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1679:2: rule__FullJvmFormalParameter__Group__0
-            {
-            pushFollow(FOLLOW_rule__FullJvmFormalParameter__Group__0_in_ruleFullJvmFormalParameter3525);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1691:1: entryRuleXFeatureCall : ruleXFeatureCall EOF ;
-    public final void entryRuleXFeatureCall() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1692:1: ( ruleXFeatureCall EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1693:1: ruleXFeatureCall EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXFeatureCallRule()); 
-            }
-            pushFollow(FOLLOW_ruleXFeatureCall_in_entryRuleXFeatureCall3552);
-            ruleXFeatureCall();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXFeatureCallRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXFeatureCall3559); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXFeatureCall"
-
-
-    // $ANTLR start "ruleXFeatureCall"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1700:1: ruleXFeatureCall : ( ( rule__XFeatureCall__Group__0 ) ) ;
-    public final void ruleXFeatureCall() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1704:2: ( ( ( rule__XFeatureCall__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1705:1: ( ( rule__XFeatureCall__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1705:1: ( ( rule__XFeatureCall__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1706:1: ( rule__XFeatureCall__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXFeatureCallAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1707:1: ( rule__XFeatureCall__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1707:2: rule__XFeatureCall__Group__0
-            {
-            pushFollow(FOLLOW_rule__XFeatureCall__Group__0_in_ruleXFeatureCall3585);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1719:1: entryRuleFeatureCallID : ruleFeatureCallID EOF ;
-    public final void entryRuleFeatureCallID() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1720:1: ( ruleFeatureCallID EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1721:1: ruleFeatureCallID EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getFeatureCallIDRule()); 
-            }
-            pushFollow(FOLLOW_ruleFeatureCallID_in_entryRuleFeatureCallID3612);
-            ruleFeatureCallID();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getFeatureCallIDRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleFeatureCallID3619); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleFeatureCallID"
-
-
-    // $ANTLR start "ruleFeatureCallID"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1728:1: ruleFeatureCallID : ( ( rule__FeatureCallID__Alternatives ) ) ;
-    public final void ruleFeatureCallID() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1732:2: ( ( ( rule__FeatureCallID__Alternatives ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1733:1: ( ( rule__FeatureCallID__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1733:1: ( ( rule__FeatureCallID__Alternatives ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1734:1: ( rule__FeatureCallID__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getFeatureCallIDAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1735:1: ( rule__FeatureCallID__Alternatives )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1735:2: rule__FeatureCallID__Alternatives
-            {
-            pushFollow(FOLLOW_rule__FeatureCallID__Alternatives_in_ruleFeatureCallID3645);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1747:1: entryRuleIdOrSuper : ruleIdOrSuper EOF ;
-    public final void entryRuleIdOrSuper() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1748:1: ( ruleIdOrSuper EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1749:1: ruleIdOrSuper EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getIdOrSuperRule()); 
-            }
-            pushFollow(FOLLOW_ruleIdOrSuper_in_entryRuleIdOrSuper3672);
-            ruleIdOrSuper();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getIdOrSuperRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleIdOrSuper3679); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleIdOrSuper"
-
-
-    // $ANTLR start "ruleIdOrSuper"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1756:1: ruleIdOrSuper : ( ( rule__IdOrSuper__Alternatives ) ) ;
-    public final void ruleIdOrSuper() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1760:2: ( ( ( rule__IdOrSuper__Alternatives ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1761:1: ( ( rule__IdOrSuper__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1761:1: ( ( rule__IdOrSuper__Alternatives ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1762:1: ( rule__IdOrSuper__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getIdOrSuperAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1763:1: ( rule__IdOrSuper__Alternatives )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1763:2: rule__IdOrSuper__Alternatives
-            {
-            pushFollow(FOLLOW_rule__IdOrSuper__Alternatives_in_ruleIdOrSuper3705);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1775:1: entryRuleXConstructorCall : ruleXConstructorCall EOF ;
-    public final void entryRuleXConstructorCall() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1776:1: ( ruleXConstructorCall EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1777:1: ruleXConstructorCall EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXConstructorCallRule()); 
-            }
-            pushFollow(FOLLOW_ruleXConstructorCall_in_entryRuleXConstructorCall3732);
-            ruleXConstructorCall();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXConstructorCallRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXConstructorCall3739); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXConstructorCall"
-
-
-    // $ANTLR start "ruleXConstructorCall"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1784:1: ruleXConstructorCall : ( ( rule__XConstructorCall__Group__0 ) ) ;
-    public final void ruleXConstructorCall() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1788:2: ( ( ( rule__XConstructorCall__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1789:1: ( ( rule__XConstructorCall__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1789:1: ( ( rule__XConstructorCall__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1790:1: ( rule__XConstructorCall__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXConstructorCallAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1791:1: ( rule__XConstructorCall__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1791:2: rule__XConstructorCall__Group__0
-            {
-            pushFollow(FOLLOW_rule__XConstructorCall__Group__0_in_ruleXConstructorCall3765);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1803:1: entryRuleXBooleanLiteral : ruleXBooleanLiteral EOF ;
-    public final void entryRuleXBooleanLiteral() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1804:1: ( ruleXBooleanLiteral EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1805:1: ruleXBooleanLiteral EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXBooleanLiteralRule()); 
-            }
-            pushFollow(FOLLOW_ruleXBooleanLiteral_in_entryRuleXBooleanLiteral3792);
-            ruleXBooleanLiteral();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXBooleanLiteralRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXBooleanLiteral3799); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXBooleanLiteral"
-
-
-    // $ANTLR start "ruleXBooleanLiteral"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1812:1: ruleXBooleanLiteral : ( ( rule__XBooleanLiteral__Group__0 ) ) ;
-    public final void ruleXBooleanLiteral() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1816:2: ( ( ( rule__XBooleanLiteral__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1817:1: ( ( rule__XBooleanLiteral__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1817:1: ( ( rule__XBooleanLiteral__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1818:1: ( rule__XBooleanLiteral__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXBooleanLiteralAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1819:1: ( rule__XBooleanLiteral__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1819:2: rule__XBooleanLiteral__Group__0
-            {
-            pushFollow(FOLLOW_rule__XBooleanLiteral__Group__0_in_ruleXBooleanLiteral3825);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1831:1: entryRuleXNullLiteral : ruleXNullLiteral EOF ;
-    public final void entryRuleXNullLiteral() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1832:1: ( ruleXNullLiteral EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1833:1: ruleXNullLiteral EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXNullLiteralRule()); 
-            }
-            pushFollow(FOLLOW_ruleXNullLiteral_in_entryRuleXNullLiteral3852);
-            ruleXNullLiteral();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXNullLiteralRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXNullLiteral3859); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXNullLiteral"
-
-
-    // $ANTLR start "ruleXNullLiteral"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1840:1: ruleXNullLiteral : ( ( rule__XNullLiteral__Group__0 ) ) ;
-    public final void ruleXNullLiteral() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1844:2: ( ( ( rule__XNullLiteral__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1845:1: ( ( rule__XNullLiteral__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1845:1: ( ( rule__XNullLiteral__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1846:1: ( rule__XNullLiteral__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXNullLiteralAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1847:1: ( rule__XNullLiteral__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1847:2: rule__XNullLiteral__Group__0
-            {
-            pushFollow(FOLLOW_rule__XNullLiteral__Group__0_in_ruleXNullLiteral3885);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1859:1: entryRuleXNumberLiteral : ruleXNumberLiteral EOF ;
-    public final void entryRuleXNumberLiteral() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1860:1: ( ruleXNumberLiteral EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1861:1: ruleXNumberLiteral EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXNumberLiteralRule()); 
-            }
-            pushFollow(FOLLOW_ruleXNumberLiteral_in_entryRuleXNumberLiteral3912);
-            ruleXNumberLiteral();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXNumberLiteralRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXNumberLiteral3919); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXNumberLiteral"
-
-
-    // $ANTLR start "ruleXNumberLiteral"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1868:1: ruleXNumberLiteral : ( ( rule__XNumberLiteral__Group__0 ) ) ;
-    public final void ruleXNumberLiteral() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1872:2: ( ( ( rule__XNumberLiteral__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1873:1: ( ( rule__XNumberLiteral__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1873:1: ( ( rule__XNumberLiteral__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1874:1: ( rule__XNumberLiteral__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXNumberLiteralAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1875:1: ( rule__XNumberLiteral__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1875:2: rule__XNumberLiteral__Group__0
-            {
-            pushFollow(FOLLOW_rule__XNumberLiteral__Group__0_in_ruleXNumberLiteral3945);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1887:1: entryRuleXStringLiteral : ruleXStringLiteral EOF ;
-    public final void entryRuleXStringLiteral() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1888:1: ( ruleXStringLiteral EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1889:1: ruleXStringLiteral EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXStringLiteralRule()); 
-            }
-            pushFollow(FOLLOW_ruleXStringLiteral_in_entryRuleXStringLiteral3972);
-            ruleXStringLiteral();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXStringLiteralRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXStringLiteral3979); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXStringLiteral"
-
-
-    // $ANTLR start "ruleXStringLiteral"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1896:1: ruleXStringLiteral : ( ( rule__XStringLiteral__Group__0 ) ) ;
-    public final void ruleXStringLiteral() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1900:2: ( ( ( rule__XStringLiteral__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1901:1: ( ( rule__XStringLiteral__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1901:1: ( ( rule__XStringLiteral__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1902:1: ( rule__XStringLiteral__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXStringLiteralAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1903:1: ( rule__XStringLiteral__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1903:2: rule__XStringLiteral__Group__0
-            {
-            pushFollow(FOLLOW_rule__XStringLiteral__Group__0_in_ruleXStringLiteral4005);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1915:1: entryRuleXTypeLiteral : ruleXTypeLiteral EOF ;
-    public final void entryRuleXTypeLiteral() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1916:1: ( ruleXTypeLiteral EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1917:1: ruleXTypeLiteral EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXTypeLiteralRule()); 
-            }
-            pushFollow(FOLLOW_ruleXTypeLiteral_in_entryRuleXTypeLiteral4032);
-            ruleXTypeLiteral();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXTypeLiteralRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXTypeLiteral4039); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXTypeLiteral"
-
-
-    // $ANTLR start "ruleXTypeLiteral"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1924:1: ruleXTypeLiteral : ( ( rule__XTypeLiteral__Group__0 ) ) ;
-    public final void ruleXTypeLiteral() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1928:2: ( ( ( rule__XTypeLiteral__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1929:1: ( ( rule__XTypeLiteral__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1929:1: ( ( rule__XTypeLiteral__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1930:1: ( rule__XTypeLiteral__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXTypeLiteralAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1931:1: ( rule__XTypeLiteral__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1931:2: rule__XTypeLiteral__Group__0
-            {
-            pushFollow(FOLLOW_rule__XTypeLiteral__Group__0_in_ruleXTypeLiteral4065);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1943:1: entryRuleXThrowExpression : ruleXThrowExpression EOF ;
-    public final void entryRuleXThrowExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1944:1: ( ruleXThrowExpression EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1945:1: ruleXThrowExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXThrowExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXThrowExpression_in_entryRuleXThrowExpression4092);
-            ruleXThrowExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXThrowExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXThrowExpression4099); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXThrowExpression"
-
-
-    // $ANTLR start "ruleXThrowExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1952:1: ruleXThrowExpression : ( ( rule__XThrowExpression__Group__0 ) ) ;
-    public final void ruleXThrowExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1956:2: ( ( ( rule__XThrowExpression__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1957:1: ( ( rule__XThrowExpression__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1957:1: ( ( rule__XThrowExpression__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1958:1: ( rule__XThrowExpression__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXThrowExpressionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1959:1: ( rule__XThrowExpression__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1959:2: rule__XThrowExpression__Group__0
-            {
-            pushFollow(FOLLOW_rule__XThrowExpression__Group__0_in_ruleXThrowExpression4125);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1971:1: entryRuleXReturnExpression : ruleXReturnExpression EOF ;
-    public final void entryRuleXReturnExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1972:1: ( ruleXReturnExpression EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1973:1: ruleXReturnExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXReturnExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXReturnExpression_in_entryRuleXReturnExpression4152);
-            ruleXReturnExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXReturnExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXReturnExpression4159); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXReturnExpression"
-
-
-    // $ANTLR start "ruleXReturnExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1980:1: ruleXReturnExpression : ( ( rule__XReturnExpression__Group__0 ) ) ;
-    public final void ruleXReturnExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1984:2: ( ( ( rule__XReturnExpression__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1985:1: ( ( rule__XReturnExpression__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1985:1: ( ( rule__XReturnExpression__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1986:1: ( rule__XReturnExpression__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXReturnExpressionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1987:1: ( rule__XReturnExpression__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1987:2: rule__XReturnExpression__Group__0
-            {
-            pushFollow(FOLLOW_rule__XReturnExpression__Group__0_in_ruleXReturnExpression4185);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:1999:1: entryRuleXTryCatchFinallyExpression : ruleXTryCatchFinallyExpression EOF ;
-    public final void entryRuleXTryCatchFinallyExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2000:1: ( ruleXTryCatchFinallyExpression EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2001:1: ruleXTryCatchFinallyExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXTryCatchFinallyExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXTryCatchFinallyExpression_in_entryRuleXTryCatchFinallyExpression4212);
-            ruleXTryCatchFinallyExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXTryCatchFinallyExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXTryCatchFinallyExpression4219); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXTryCatchFinallyExpression"
-
-
-    // $ANTLR start "ruleXTryCatchFinallyExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2008:1: ruleXTryCatchFinallyExpression : ( ( rule__XTryCatchFinallyExpression__Group__0 ) ) ;
-    public final void ruleXTryCatchFinallyExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2012:2: ( ( ( rule__XTryCatchFinallyExpression__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2013:1: ( ( rule__XTryCatchFinallyExpression__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2013:1: ( ( rule__XTryCatchFinallyExpression__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2014:1: ( rule__XTryCatchFinallyExpression__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2015:1: ( rule__XTryCatchFinallyExpression__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2015:2: rule__XTryCatchFinallyExpression__Group__0
-            {
-            pushFollow(FOLLOW_rule__XTryCatchFinallyExpression__Group__0_in_ruleXTryCatchFinallyExpression4245);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2027:1: entryRuleXSynchronizedExpression : ruleXSynchronizedExpression EOF ;
-    public final void entryRuleXSynchronizedExpression() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2028:1: ( ruleXSynchronizedExpression EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2029:1: ruleXSynchronizedExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXSynchronizedExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXSynchronizedExpression_in_entryRuleXSynchronizedExpression4272);
-            ruleXSynchronizedExpression();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXSynchronizedExpressionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXSynchronizedExpression4279); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXSynchronizedExpression"
-
-
-    // $ANTLR start "ruleXSynchronizedExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2036:1: ruleXSynchronizedExpression : ( ( rule__XSynchronizedExpression__Group__0 ) ) ;
-    public final void ruleXSynchronizedExpression() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2040:2: ( ( ( rule__XSynchronizedExpression__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2041:1: ( ( rule__XSynchronizedExpression__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2041:1: ( ( rule__XSynchronizedExpression__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2042:1: ( rule__XSynchronizedExpression__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXSynchronizedExpressionAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2043:1: ( rule__XSynchronizedExpression__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2043:2: rule__XSynchronizedExpression__Group__0
-            {
-            pushFollow(FOLLOW_rule__XSynchronizedExpression__Group__0_in_ruleXSynchronizedExpression4305);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2055:1: entryRuleXCatchClause : ruleXCatchClause EOF ;
-    public final void entryRuleXCatchClause() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2056:1: ( ruleXCatchClause EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2057:1: ruleXCatchClause EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXCatchClauseRule()); 
-            }
-            pushFollow(FOLLOW_ruleXCatchClause_in_entryRuleXCatchClause4332);
-            ruleXCatchClause();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXCatchClauseRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXCatchClause4339); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXCatchClause"
-
-
-    // $ANTLR start "ruleXCatchClause"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2064:1: ruleXCatchClause : ( ( rule__XCatchClause__Group__0 ) ) ;
-    public final void ruleXCatchClause() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2068:2: ( ( ( rule__XCatchClause__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2069:1: ( ( rule__XCatchClause__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2069:1: ( ( rule__XCatchClause__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2070:1: ( rule__XCatchClause__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXCatchClauseAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2071:1: ( rule__XCatchClause__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2071:2: rule__XCatchClause__Group__0
-            {
-            pushFollow(FOLLOW_rule__XCatchClause__Group__0_in_ruleXCatchClause4365);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2083:1: entryRuleQualifiedName : ruleQualifiedName EOF ;
-    public final void entryRuleQualifiedName() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2084:1: ( ruleQualifiedName EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2085:1: ruleQualifiedName EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getQualifiedNameRule()); 
-            }
-            pushFollow(FOLLOW_ruleQualifiedName_in_entryRuleQualifiedName4392);
-            ruleQualifiedName();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getQualifiedNameRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleQualifiedName4399); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleQualifiedName"
-
-
-    // $ANTLR start "ruleQualifiedName"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2092:1: ruleQualifiedName : ( ( rule__QualifiedName__Group__0 ) ) ;
-    public final void ruleQualifiedName() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2096:2: ( ( ( rule__QualifiedName__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2097:1: ( ( rule__QualifiedName__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2097:1: ( ( rule__QualifiedName__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2098:1: ( rule__QualifiedName__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getQualifiedNameAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2099:1: ( rule__QualifiedName__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2099:2: rule__QualifiedName__Group__0
-            {
-            pushFollow(FOLLOW_rule__QualifiedName__Group__0_in_ruleQualifiedName4425);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2111:1: entryRuleNumber : ruleNumber EOF ;
-    public final void entryRuleNumber() throws RecognitionException {
-
-        	HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
-
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2115:1: ( ruleNumber EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2116:1: ruleNumber EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getNumberRule()); 
-            }
-            pushFollow(FOLLOW_ruleNumber_in_entryRuleNumber4457);
-            ruleNumber();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getNumberRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleNumber4464); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	myHiddenTokenState.restore();
-
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleNumber"
-
-
-    // $ANTLR start "ruleNumber"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2126:1: ruleNumber : ( ( rule__Number__Alternatives ) ) ;
-    public final void ruleNumber() throws RecognitionException {
-
-        		HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2131:2: ( ( ( rule__Number__Alternatives ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2132:1: ( ( rule__Number__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2132:1: ( ( rule__Number__Alternatives ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2133:1: ( rule__Number__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getNumberAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2134:1: ( rule__Number__Alternatives )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2134:2: rule__Number__Alternatives
-            {
-            pushFollow(FOLLOW_rule__Number__Alternatives_in_ruleNumber4494);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2149:1: entryRuleJvmTypeReference : ruleJvmTypeReference EOF ;
-    public final void entryRuleJvmTypeReference() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2150:1: ( ruleJvmTypeReference EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2151:1: ruleJvmTypeReference EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getJvmTypeReferenceRule()); 
-            }
-            pushFollow(FOLLOW_ruleJvmTypeReference_in_entryRuleJvmTypeReference4523);
-            ruleJvmTypeReference();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getJvmTypeReferenceRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmTypeReference4530); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleJvmTypeReference"
-
-
-    // $ANTLR start "ruleJvmTypeReference"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2158:1: ruleJvmTypeReference : ( ( rule__JvmTypeReference__Alternatives ) ) ;
-    public final void ruleJvmTypeReference() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2162:2: ( ( ( rule__JvmTypeReference__Alternatives ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2163:1: ( ( rule__JvmTypeReference__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2163:1: ( ( rule__JvmTypeReference__Alternatives ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2164:1: ( rule__JvmTypeReference__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getJvmTypeReferenceAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2165:1: ( rule__JvmTypeReference__Alternatives )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2165:2: rule__JvmTypeReference__Alternatives
-            {
-            pushFollow(FOLLOW_rule__JvmTypeReference__Alternatives_in_ruleJvmTypeReference4556);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2177:1: entryRuleArrayBrackets : ruleArrayBrackets EOF ;
-    public final void entryRuleArrayBrackets() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2178:1: ( ruleArrayBrackets EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2179:1: ruleArrayBrackets EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getArrayBracketsRule()); 
-            }
-            pushFollow(FOLLOW_ruleArrayBrackets_in_entryRuleArrayBrackets4583);
-            ruleArrayBrackets();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getArrayBracketsRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleArrayBrackets4590); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleArrayBrackets"
-
-
-    // $ANTLR start "ruleArrayBrackets"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2186:1: ruleArrayBrackets : ( ( rule__ArrayBrackets__Group__0 ) ) ;
-    public final void ruleArrayBrackets() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2190:2: ( ( ( rule__ArrayBrackets__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2191:1: ( ( rule__ArrayBrackets__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2191:1: ( ( rule__ArrayBrackets__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2192:1: ( rule__ArrayBrackets__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getArrayBracketsAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2193:1: ( rule__ArrayBrackets__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2193:2: rule__ArrayBrackets__Group__0
-            {
-            pushFollow(FOLLOW_rule__ArrayBrackets__Group__0_in_ruleArrayBrackets4616);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2205:1: entryRuleXFunctionTypeRef : ruleXFunctionTypeRef EOF ;
-    public final void entryRuleXFunctionTypeRef() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2206:1: ( ruleXFunctionTypeRef EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2207:1: ruleXFunctionTypeRef EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXFunctionTypeRefRule()); 
-            }
-            pushFollow(FOLLOW_ruleXFunctionTypeRef_in_entryRuleXFunctionTypeRef4643);
-            ruleXFunctionTypeRef();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXFunctionTypeRefRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXFunctionTypeRef4650); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXFunctionTypeRef"
-
-
-    // $ANTLR start "ruleXFunctionTypeRef"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2214:1: ruleXFunctionTypeRef : ( ( rule__XFunctionTypeRef__Group__0 ) ) ;
-    public final void ruleXFunctionTypeRef() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2218:2: ( ( ( rule__XFunctionTypeRef__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2219:1: ( ( rule__XFunctionTypeRef__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2219:1: ( ( rule__XFunctionTypeRef__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2220:1: ( rule__XFunctionTypeRef__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXFunctionTypeRefAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2221:1: ( rule__XFunctionTypeRef__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2221:2: rule__XFunctionTypeRef__Group__0
-            {
-            pushFollow(FOLLOW_rule__XFunctionTypeRef__Group__0_in_ruleXFunctionTypeRef4676);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2233:1: entryRuleJvmParameterizedTypeReference : ruleJvmParameterizedTypeReference EOF ;
-    public final void entryRuleJvmParameterizedTypeReference() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2234:1: ( ruleJvmParameterizedTypeReference EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2235:1: ruleJvmParameterizedTypeReference EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getJvmParameterizedTypeReferenceRule()); 
-            }
-            pushFollow(FOLLOW_ruleJvmParameterizedTypeReference_in_entryRuleJvmParameterizedTypeReference4703);
-            ruleJvmParameterizedTypeReference();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getJvmParameterizedTypeReferenceRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmParameterizedTypeReference4710); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleJvmParameterizedTypeReference"
-
-
-    // $ANTLR start "ruleJvmParameterizedTypeReference"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2242:1: ruleJvmParameterizedTypeReference : ( ( rule__JvmParameterizedTypeReference__Group__0 ) ) ;
-    public final void ruleJvmParameterizedTypeReference() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2246:2: ( ( ( rule__JvmParameterizedTypeReference__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2247:1: ( ( rule__JvmParameterizedTypeReference__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2247:1: ( ( rule__JvmParameterizedTypeReference__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2248:1: ( rule__JvmParameterizedTypeReference__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2249:1: ( rule__JvmParameterizedTypeReference__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2249:2: rule__JvmParameterizedTypeReference__Group__0
-            {
-            pushFollow(FOLLOW_rule__JvmParameterizedTypeReference__Group__0_in_ruleJvmParameterizedTypeReference4736);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2261:1: entryRuleJvmArgumentTypeReference : ruleJvmArgumentTypeReference EOF ;
-    public final void entryRuleJvmArgumentTypeReference() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2262:1: ( ruleJvmArgumentTypeReference EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2263:1: ruleJvmArgumentTypeReference EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getJvmArgumentTypeReferenceRule()); 
-            }
-            pushFollow(FOLLOW_ruleJvmArgumentTypeReference_in_entryRuleJvmArgumentTypeReference4763);
-            ruleJvmArgumentTypeReference();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getJvmArgumentTypeReferenceRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmArgumentTypeReference4770); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleJvmArgumentTypeReference"
-
-
-    // $ANTLR start "ruleJvmArgumentTypeReference"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2270:1: ruleJvmArgumentTypeReference : ( ( rule__JvmArgumentTypeReference__Alternatives ) ) ;
-    public final void ruleJvmArgumentTypeReference() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2274:2: ( ( ( rule__JvmArgumentTypeReference__Alternatives ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2275:1: ( ( rule__JvmArgumentTypeReference__Alternatives ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2275:1: ( ( rule__JvmArgumentTypeReference__Alternatives ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2276:1: ( rule__JvmArgumentTypeReference__Alternatives )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getJvmArgumentTypeReferenceAccess().getAlternatives()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2277:1: ( rule__JvmArgumentTypeReference__Alternatives )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2277:2: rule__JvmArgumentTypeReference__Alternatives
-            {
-            pushFollow(FOLLOW_rule__JvmArgumentTypeReference__Alternatives_in_ruleJvmArgumentTypeReference4796);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2289:1: entryRuleJvmWildcardTypeReference : ruleJvmWildcardTypeReference EOF ;
-    public final void entryRuleJvmWildcardTypeReference() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2290:1: ( ruleJvmWildcardTypeReference EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2291:1: ruleJvmWildcardTypeReference EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getJvmWildcardTypeReferenceRule()); 
-            }
-            pushFollow(FOLLOW_ruleJvmWildcardTypeReference_in_entryRuleJvmWildcardTypeReference4823);
-            ruleJvmWildcardTypeReference();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getJvmWildcardTypeReferenceRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmWildcardTypeReference4830); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleJvmWildcardTypeReference"
-
-
-    // $ANTLR start "ruleJvmWildcardTypeReference"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2298:1: ruleJvmWildcardTypeReference : ( ( rule__JvmWildcardTypeReference__Group__0 ) ) ;
-    public final void ruleJvmWildcardTypeReference() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2302:2: ( ( ( rule__JvmWildcardTypeReference__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2303:1: ( ( rule__JvmWildcardTypeReference__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2303:1: ( ( rule__JvmWildcardTypeReference__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2304:1: ( rule__JvmWildcardTypeReference__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2305:1: ( rule__JvmWildcardTypeReference__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2305:2: rule__JvmWildcardTypeReference__Group__0
-            {
-            pushFollow(FOLLOW_rule__JvmWildcardTypeReference__Group__0_in_ruleJvmWildcardTypeReference4856);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2317:1: entryRuleJvmUpperBound : ruleJvmUpperBound EOF ;
-    public final void entryRuleJvmUpperBound() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2318:1: ( ruleJvmUpperBound EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2319:1: ruleJvmUpperBound EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getJvmUpperBoundRule()); 
-            }
-            pushFollow(FOLLOW_ruleJvmUpperBound_in_entryRuleJvmUpperBound4883);
-            ruleJvmUpperBound();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getJvmUpperBoundRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmUpperBound4890); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleJvmUpperBound"
-
-
-    // $ANTLR start "ruleJvmUpperBound"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2326:1: ruleJvmUpperBound : ( ( rule__JvmUpperBound__Group__0 ) ) ;
-    public final void ruleJvmUpperBound() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2330:2: ( ( ( rule__JvmUpperBound__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2331:1: ( ( rule__JvmUpperBound__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2331:1: ( ( rule__JvmUpperBound__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2332:1: ( rule__JvmUpperBound__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getJvmUpperBoundAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2333:1: ( rule__JvmUpperBound__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2333:2: rule__JvmUpperBound__Group__0
-            {
-            pushFollow(FOLLOW_rule__JvmUpperBound__Group__0_in_ruleJvmUpperBound4916);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2345:1: entryRuleJvmUpperBoundAnded : ruleJvmUpperBoundAnded EOF ;
-    public final void entryRuleJvmUpperBoundAnded() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2346:1: ( ruleJvmUpperBoundAnded EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2347:1: ruleJvmUpperBoundAnded EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getJvmUpperBoundAndedRule()); 
-            }
-            pushFollow(FOLLOW_ruleJvmUpperBoundAnded_in_entryRuleJvmUpperBoundAnded4943);
-            ruleJvmUpperBoundAnded();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getJvmUpperBoundAndedRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmUpperBoundAnded4950); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleJvmUpperBoundAnded"
-
-
-    // $ANTLR start "ruleJvmUpperBoundAnded"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2354:1: ruleJvmUpperBoundAnded : ( ( rule__JvmUpperBoundAnded__Group__0 ) ) ;
-    public final void ruleJvmUpperBoundAnded() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2358:2: ( ( ( rule__JvmUpperBoundAnded__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2359:1: ( ( rule__JvmUpperBoundAnded__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2359:1: ( ( rule__JvmUpperBoundAnded__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2360:1: ( rule__JvmUpperBoundAnded__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getJvmUpperBoundAndedAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2361:1: ( rule__JvmUpperBoundAnded__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2361:2: rule__JvmUpperBoundAnded__Group__0
-            {
-            pushFollow(FOLLOW_rule__JvmUpperBoundAnded__Group__0_in_ruleJvmUpperBoundAnded4976);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2373:1: entryRuleJvmLowerBound : ruleJvmLowerBound EOF ;
-    public final void entryRuleJvmLowerBound() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2374:1: ( ruleJvmLowerBound EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2375:1: ruleJvmLowerBound EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getJvmLowerBoundRule()); 
-            }
-            pushFollow(FOLLOW_ruleJvmLowerBound_in_entryRuleJvmLowerBound5003);
-            ruleJvmLowerBound();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getJvmLowerBoundRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmLowerBound5010); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleJvmLowerBound"
-
-
-    // $ANTLR start "ruleJvmLowerBound"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2382:1: ruleJvmLowerBound : ( ( rule__JvmLowerBound__Group__0 ) ) ;
-    public final void ruleJvmLowerBound() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2386:2: ( ( ( rule__JvmLowerBound__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2387:1: ( ( rule__JvmLowerBound__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2387:1: ( ( rule__JvmLowerBound__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2388:1: ( rule__JvmLowerBound__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getJvmLowerBoundAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2389:1: ( rule__JvmLowerBound__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2389:2: rule__JvmLowerBound__Group__0
-            {
-            pushFollow(FOLLOW_rule__JvmLowerBound__Group__0_in_ruleJvmLowerBound5036);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2401:1: entryRuleJvmLowerBoundAnded : ruleJvmLowerBoundAnded EOF ;
-    public final void entryRuleJvmLowerBoundAnded() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2402:1: ( ruleJvmLowerBoundAnded EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2403:1: ruleJvmLowerBoundAnded EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getJvmLowerBoundAndedRule()); 
-            }
-            pushFollow(FOLLOW_ruleJvmLowerBoundAnded_in_entryRuleJvmLowerBoundAnded5063);
-            ruleJvmLowerBoundAnded();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getJvmLowerBoundAndedRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmLowerBoundAnded5070); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleJvmLowerBoundAnded"
-
-
-    // $ANTLR start "ruleJvmLowerBoundAnded"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2410:1: ruleJvmLowerBoundAnded : ( ( rule__JvmLowerBoundAnded__Group__0 ) ) ;
-    public final void ruleJvmLowerBoundAnded() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2414:2: ( ( ( rule__JvmLowerBoundAnded__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2415:1: ( ( rule__JvmLowerBoundAnded__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2415:1: ( ( rule__JvmLowerBoundAnded__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2416:1: ( rule__JvmLowerBoundAnded__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getJvmLowerBoundAndedAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2417:1: ( rule__JvmLowerBoundAnded__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2417:2: rule__JvmLowerBoundAnded__Group__0
-            {
-            pushFollow(FOLLOW_rule__JvmLowerBoundAnded__Group__0_in_ruleJvmLowerBoundAnded5096);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2431:1: entryRuleQualifiedNameWithWildcard : ruleQualifiedNameWithWildcard EOF ;
-    public final void entryRuleQualifiedNameWithWildcard() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2432:1: ( ruleQualifiedNameWithWildcard EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2433:1: ruleQualifiedNameWithWildcard EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getQualifiedNameWithWildcardRule()); 
-            }
-            pushFollow(FOLLOW_ruleQualifiedNameWithWildcard_in_entryRuleQualifiedNameWithWildcard5125);
-            ruleQualifiedNameWithWildcard();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getQualifiedNameWithWildcardRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleQualifiedNameWithWildcard5132); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleQualifiedNameWithWildcard"
-
-
-    // $ANTLR start "ruleQualifiedNameWithWildcard"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2440:1: ruleQualifiedNameWithWildcard : ( ( rule__QualifiedNameWithWildcard__Group__0 ) ) ;
-    public final void ruleQualifiedNameWithWildcard() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2444:2: ( ( ( rule__QualifiedNameWithWildcard__Group__0 ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2445:1: ( ( rule__QualifiedNameWithWildcard__Group__0 ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2445:1: ( ( rule__QualifiedNameWithWildcard__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2446:1: ( rule__QualifiedNameWithWildcard__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getQualifiedNameWithWildcardAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2447:1: ( rule__QualifiedNameWithWildcard__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2447:2: rule__QualifiedNameWithWildcard__Group__0
-            {
-            pushFollow(FOLLOW_rule__QualifiedNameWithWildcard__Group__0_in_ruleQualifiedNameWithWildcard5158);
-            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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2459:1: entryRuleValidID : ruleValidID EOF ;
-    public final void entryRuleValidID() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2460:1: ( ruleValidID EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2461:1: ruleValidID EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getValidIDRule()); 
-            }
-            pushFollow(FOLLOW_ruleValidID_in_entryRuleValidID5185);
-            ruleValidID();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getValidIDRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleValidID5192); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleValidID"
-
-
-    // $ANTLR start "ruleValidID"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2468:1: ruleValidID : ( RULE_ID ) ;
-    public final void ruleValidID() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2472:2: ( ( RULE_ID ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2473:1: ( RULE_ID )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2473:1: ( RULE_ID )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2474:1: RULE_ID
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getValidIDAccess().getIDTerminalRuleCall()); 
-            }
-            match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleValidID5218); 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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2487:1: entryRuleXImportSection : ruleXImportSection EOF ;
-    public final void entryRuleXImportSection() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2488:1: ( ruleXImportSection EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2489:1: ruleXImportSection EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXImportSectionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXImportSection_in_entryRuleXImportSection5244);
-            ruleXImportSection();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXImportSectionRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXImportSection5251); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleXImportSection"
-
-
-    // $ANTLR start "ruleXImportSection"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2496:1: ruleXImportSection : ( ( ( rule__XImportSection__ImportDeclarationsAssignment ) ) ( ( rule__XImportSection__ImportDeclarationsAssignment )* ) ) ;
-    public final void ruleXImportSection() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2500:2: ( ( ( ( rule__XImportSection__ImportDeclarationsAssignment ) ) ( ( rule__XImportSection__ImportDeclarationsAssignment )* ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2501:1: ( ( ( rule__XImportSection__ImportDeclarationsAssignment ) ) ( ( rule__XImportSection__ImportDeclarationsAssignment )* ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2501:1: ( ( ( rule__XImportSection__ImportDeclarationsAssignment ) ) ( ( rule__XImportSection__ImportDeclarationsAssignment )* ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2502:1: ( ( rule__XImportSection__ImportDeclarationsAssignment ) ) ( ( rule__XImportSection__ImportDeclarationsAssignment )* )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2502:1: ( ( rule__XImportSection__ImportDeclarationsAssignment ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2503:1: ( rule__XImportSection__ImportDeclarationsAssignment )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXImportSectionAccess().getImportDeclarationsAssignment()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2504:1: ( rule__XImportSection__ImportDeclarationsAssignment )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2504:2: rule__XImportSection__ImportDeclarationsAssignment
-            {
-            pushFollow(FOLLOW_rule__XImportSection__ImportDeclarationsAssignment_in_ruleXImportSection5279);
-            rule__XImportSection__ImportDeclarationsAssignment();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getXImportSectionAccess().getImportDeclarationsAssignment()); 
-            }
-
-            }
-
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2507:1: ( ( rule__XImportSection__ImportDeclarationsAssignment )* )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2508:1: ( rule__XImportSection__ImportDeclarationsAssignment )*
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getXImportSectionAccess().getImportDeclarationsAssignment()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2509:1: ( rule__XImportSection__ImportDeclarationsAssignment )*
-            loop1:
-            do {
-                int alt1=2;
-                int LA1_0 = input.LA(1);
-
-                if ( (LA1_0==47||LA1_0==57) ) {
-                    alt1=1;
-                }
-
-
-                switch (alt1) {
-            	case 1 :
-            	    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2509:2: rule__XImportSection__ImportDeclarationsAssignment
-            	    {
-            	    pushFollow(FOLLOW_rule__XImportSection__ImportDeclarationsAssignment_in_ruleXImportSection5291);
-            	    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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2522:1: entryRuleQualifiedNameInStaticImport : ruleQualifiedNameInStaticImport EOF ;
-    public final void entryRuleQualifiedNameInStaticImport() throws RecognitionException {
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2523:1: ( ruleQualifiedNameInStaticImport EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2524:1: ruleQualifiedNameInStaticImport EOF
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getQualifiedNameInStaticImportRule()); 
-            }
-            pushFollow(FOLLOW_ruleQualifiedNameInStaticImport_in_entryRuleQualifiedNameInStaticImport5321);
-            ruleQualifiedNameInStaticImport();
-
-            state._fsp--;
-            if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getQualifiedNameInStaticImportRule()); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleQualifiedNameInStaticImport5328); if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end "entryRuleQualifiedNameInStaticImport"
-
-
-    // $ANTLR start "ruleQualifiedNameInStaticImport"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2531:1: ruleQualifiedNameInStaticImport : ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) ) ;
-    public final void ruleQualifiedNameInStaticImport() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2535:2: ( ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2536:1: ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2536:1: ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2537:1: ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2537:1: ( ( rule__QualifiedNameInStaticImport__Group__0 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2538:1: ( rule__QualifiedNameInStaticImport__Group__0 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2539:1: ( rule__QualifiedNameInStaticImport__Group__0 )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2539:2: rule__QualifiedNameInStaticImport__Group__0
-            {
-            pushFollow(FOLLOW_rule__QualifiedNameInStaticImport__Group__0_in_ruleQualifiedNameInStaticImport5356);
-            rule__QualifiedNameInStaticImport__Group__0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); 
-            }
-
-            }
-
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2542:1: ( ( rule__QualifiedNameInStaticImport__Group__0 )* )
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2543:1: ( rule__QualifiedNameInStaticImport__Group__0 )*
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); 
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2544:1: ( 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==43) ) {
-                        alt2=1;
-                    }
-
-
-                }
-
-
-                switch (alt2) {
-            	case 1 :
-            	    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2544:2: rule__QualifiedNameInStaticImport__Group__0
-            	    {
-            	    pushFollow(FOLLOW_rule__QualifiedNameInStaticImport__Group__0_in_ruleQualifiedNameInStaticImport5368);
-            	    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 "rule__XImportDeclaration__Alternatives"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2557:1: rule__XImportDeclaration__Alternatives : ( ( ( rule__XImportDeclaration__Group_0__0 ) ) | ( ( rule__XImportDeclaration__Group_1__0 ) ) );
-    public final void rule__XImportDeclaration__Alternatives() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2561:1: ( ( ( rule__XImportDeclaration__Group_0__0 ) ) | ( ( rule__XImportDeclaration__Group_1__0 ) ) )
-            int alt3=2;
-            int LA3_0 = input.LA(1);
-
-            if ( (LA3_0==47) ) {
-                alt3=1;
-            }
-            else if ( (LA3_0==57) ) {
-                alt3=2;
-            }
-            else {
-                if (state.backtracking>0) {state.failed=true; return ;}
-                NoViableAltException nvae =
-                    new NoViableAltException("", 3, 0, input);
-
-                throw nvae;
-            }
-            switch (alt3) {
-                case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2562:1: ( ( rule__XImportDeclaration__Group_0__0 ) )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2562:1: ( ( rule__XImportDeclaration__Group_0__0 ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2563:1: ( rule__XImportDeclaration__Group_0__0 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getXImportDeclarationAccess().getGroup_0()); 
-                    }
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2564:1: ( rule__XImportDeclaration__Group_0__0 )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2564:2: rule__XImportDeclaration__Group_0__0
-                    {
-                    pushFollow(FOLLOW_rule__XImportDeclaration__Group_0__0_in_rule__XImportDeclaration__Alternatives5407);
-                    rule__XImportDeclaration__Group_0__0();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getXImportDeclarationAccess().getGroup_0()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2568:6: ( ( rule__XImportDeclaration__Group_1__0 ) )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2568:6: ( ( rule__XImportDeclaration__Group_1__0 ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2569:1: ( rule__XImportDeclaration__Group_1__0 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getXImportDeclarationAccess().getGroup_1()); 
-                    }
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2570:1: ( rule__XImportDeclaration__Group_1__0 )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2570:2: rule__XImportDeclaration__Group_1__0
-                    {
-                    pushFollow(FOLLOW_rule__XImportDeclaration__Group_1__0_in_rule__XImportDeclaration__Alternatives5425);
-                    rule__XImportDeclaration__Group_1__0();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getXImportDeclarationAccess().getGroup_1()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__XImportDeclaration__Alternatives"
-
-
-    // $ANTLR start "rule__XImportDeclaration__Alternatives_0_1_1"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2579:1: rule__XImportDeclaration__Alternatives_0_1_1 : ( ( ( rule__XImportDeclaration__Group_0_1_1_0__0 ) ) | ( ( rule__XImportDeclaration__ImportedTypeAssignment_0_1_1_1 ) ) | ( ( rule__XImportDeclaration__ImportedNamespaceAssignment_0_1_1_2 ) ) );
-    public final void rule__XImportDeclaration__Alternatives_0_1_1() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2583:1: ( ( ( rule__XImportDeclaration__Group_0_1_1_0__0 ) ) | ( ( rule__XImportDeclaration__ImportedTypeAssignment_0_1_1_1 ) ) | ( ( rule__XImportDeclaration__ImportedNamespaceAssignment_0_1_1_2 ) ) )
-            int alt4=3;
-            alt4 = dfa4.predict(input);
-            switch (alt4) {
-                case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2584:1: ( ( rule__XImportDeclaration__Group_0_1_1_0__0 ) )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2584:1: ( ( rule__XImportDeclaration__Group_0_1_1_0__0 ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2585:1: ( rule__XImportDeclaration__Group_0_1_1_0__0 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getXImportDeclarationAccess().getGroup_0_1_1_0()); 
-                    }
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2586:1: ( rule__XImportDeclaration__Group_0_1_1_0__0 )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2586:2: rule__XImportDeclaration__Group_0_1_1_0__0
-                    {
-                    pushFollow(FOLLOW_rule__XImportDeclaration__Group_0_1_1_0__0_in_rule__XImportDeclaration__Alternatives_0_1_15458);
-                    rule__XImportDeclaration__Group_0_1_1_0__0();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getXImportDeclarationAccess().getGroup_0_1_1_0()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2590:6: ( ( rule__XImportDeclaration__ImportedTypeAssignment_0_1_1_1 ) )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2590:6: ( ( rule__XImportDeclaration__ImportedTypeAssignment_0_1_1_1 ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2591:1: ( rule__XImportDeclaration__ImportedTypeAssignment_0_1_1_1 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_0_1_1_1()); 
-                    }
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2592:1: ( rule__XImportDeclaration__ImportedTypeAssignment_0_1_1_1 )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2592:2: rule__XImportDeclaration__ImportedTypeAssignment_0_1_1_1
-                    {
-                    pushFollow(FOLLOW_rule__XImportDeclaration__ImportedTypeAssignment_0_1_1_1_in_rule__XImportDeclaration__Alternatives_0_1_15476);
-                    rule__XImportDeclaration__ImportedTypeAssignment_0_1_1_1();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_0_1_1_1()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 3 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2596:6: ( ( rule__XImportDeclaration__ImportedNamespaceAssignment_0_1_1_2 ) )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2596:6: ( ( rule__XImportDeclaration__ImportedNamespaceAssignment_0_1_1_2 ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2597:1: ( rule__XImportDeclaration__ImportedNamespaceAssignment_0_1_1_2 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceAssignment_0_1_1_2()); 
-                    }
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2598:1: ( rule__XImportDeclaration__ImportedNamespaceAssignment_0_1_1_2 )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2598:2: rule__XImportDeclaration__ImportedNamespaceAssignment_0_1_1_2
-                    {
-                    pushFollow(FOLLOW_rule__XImportDeclaration__ImportedNamespaceAssignment_0_1_1_2_in_rule__XImportDeclaration__Alternatives_0_1_15494);
-                    rule__XImportDeclaration__ImportedNamespaceAssignment_0_1_1_2();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceAssignment_0_1_1_2()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__XImportDeclaration__Alternatives_0_1_1"
-
-
-    // $ANTLR start "rule__XImportDeclaration__Alternatives_0_1_1_0_3"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2607:1: rule__XImportDeclaration__Alternatives_0_1_1_0_3 : ( ( ( rule__XImportDeclaration__WildcardAssignment_0_1_1_0_3_0 ) ) | ( ( rule__XImportDeclaration__MemberNameAssignment_0_1_1_0_3_1 ) ) );
-    public final void rule__XImportDeclaration__Alternatives_0_1_1_0_3() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2611:1: ( ( ( rule__XImportDeclaration__WildcardAssignment_0_1_1_0_3_0 ) ) | ( ( rule__XImportDeclaration__MemberNameAssignment_0_1_1_0_3_1 ) ) )
-            int alt5=2;
-            int LA5_0 = input.LA(1);
-
-            if ( (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 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2612:1: ( ( rule__XImportDeclaration__WildcardAssignment_0_1_1_0_3_0 ) )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2612:1: ( ( rule__XImportDeclaration__WildcardAssignment_0_1_1_0_3_0 ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2613:1: ( rule__XImportDeclaration__WildcardAssignment_0_1_1_0_3_0 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getXImportDeclarationAccess().getWildcardAssignment_0_1_1_0_3_0()); 
-                    }
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2614:1: ( rule__XImportDeclaration__WildcardAssignment_0_1_1_0_3_0 )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2614:2: rule__XImportDeclaration__WildcardAssignment_0_1_1_0_3_0
-                    {
-                    pushFollow(FOLLOW_rule__XImportDeclaration__WildcardAssignment_0_1_1_0_3_0_in_rule__XImportDeclaration__Alternatives_0_1_1_0_35527);
-                    rule__XImportDeclaration__WildcardAssignment_0_1_1_0_3_0();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getXImportDeclarationAccess().getWildcardAssignment_0_1_1_0_3_0()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2618:6: ( ( rule__XImportDeclaration__MemberNameAssignment_0_1_1_0_3_1 ) )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2618:6: ( ( rule__XImportDeclaration__MemberNameAssignment_0_1_1_0_3_1 ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2619:1: ( rule__XImportDeclaration__MemberNameAssignment_0_1_1_0_3_1 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getXImportDeclarationAccess().getMemberNameAssignment_0_1_1_0_3_1()); 
-                    }
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2620:1: ( rule__XImportDeclaration__MemberNameAssignment_0_1_1_0_3_1 )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2620:2: rule__XImportDeclaration__MemberNameAssignment_0_1_1_0_3_1
-                    {
-                    pushFollow(FOLLOW_rule__XImportDeclaration__MemberNameAssignment_0_1_1_0_3_1_in_rule__XImportDeclaration__Alternatives_0_1_1_0_35545);
-                    rule__XImportDeclaration__MemberNameAssignment_0_1_1_0_3_1();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getXImportDeclarationAccess().getMemberNameAssignment_0_1_1_0_3_1()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__XImportDeclaration__Alternatives_0_1_1_0_3"
-
-
-    // $ANTLR start "rule__XAssignment__Alternatives"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2629: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 {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2633:1: ( ( ( rule__XAssignment__Group_0__0 ) ) | ( ( rule__XAssignment__Group_1__0 ) ) )
-            int alt6=2;
-            switch ( input.LA(1) ) {
-            case RULE_ID:
-                {
-                int LA6_1 = input.LA(2);
-
-                if ( (LA6_1==13) ) {
-                    alt6=1;
-                }
-                else if ( (LA6_1==EOF||(LA6_1>=RULE_ID && LA6_1<=RULE_STRING)||(LA6_1>=14 && LA6_1<=50)||(LA6_1>=52 && LA6_1<=53)||LA6_1==56||LA6_1==58||LA6_1==65||(LA6_1>=68 && LA6_1<=91)||(LA6_1>=97 && LA6_1<=98)||(LA6_1>=100 && LA6_1<=101)) ) {
-                    alt6=2;
-                }
-                else {
-                    if (state.backtracking>0) {state.failed=true; return ;}
-                    NoViableAltException nvae =
-                        new NoViableAltException("", 6, 1, input);
-
-                    throw nvae;
-                }
-                }
-                break;
-            case 45:
-                {
-                int LA6_2 = input.LA(2);
-
-                if ( (LA6_2==13) ) {
-                    alt6=1;
-                }
-                else if ( (LA6_2==EOF||(LA6_2>=RULE_ID && LA6_2<=RULE_STRING)||(LA6_2>=14 && LA6_2<=50)||(LA6_2>=52 && LA6_2<=53)||LA6_2==56||LA6_2==58||LA6_2==65||(LA6_2>=68 && LA6_2<=91)||(LA6_2>=97 && LA6_2<=98)||(LA6_2>=100 && LA6_2<=101)) ) {
-                    alt6=2;
-                }
-                else {
-                    if (state.backtracking>0) {state.failed=true; return ;}
-                    NoViableAltException nvae =
-                        new NoViableAltException("", 6, 2, input);
-
-                    throw nvae;
-                }
-                }
-                break;
-            case 46:
-                {
-                int LA6_3 = input.LA(2);
-
-                if ( (LA6_3==13) ) {
-                    alt6=1;
-                }
-                else if ( (LA6_3==EOF||(LA6_3>=RULE_ID && LA6_3<=RULE_STRING)||(LA6_3>=14 && LA6_3<=50)||(LA6_3>=52 && LA6_3<=53)||LA6_3==56||LA6_3==58||LA6_3==65||(LA6_3>=68 && LA6_3<=91)||(LA6_3>=97 && LA6_3<=98)||(LA6_3>=100 && LA6_3<=101)) ) {
-                    alt6=2;
-                }
-                else {
-                    if (state.backtracking>0) {state.failed=true; return ;}
-                    NoViableAltException nvae =
-                        new NoViableAltException("", 6, 3, input);
-
-                    throw nvae;
-                }
-                }
-                break;
-            case 47:
-                {
-                int LA6_4 = input.LA(2);
-
-                if ( (LA6_4==13) ) {
-                    alt6=1;
-                }
-                else if ( (LA6_4==EOF||(LA6_4>=RULE_ID && LA6_4<=RULE_STRING)||(LA6_4>=14 && LA6_4<=50)||(LA6_4>=52 && LA6_4<=53)||LA6_4==56||LA6_4==58||LA6_4==65||(LA6_4>=68 && LA6_4<=91)||(LA6_4>=97 && LA6_4<=98)||(LA6_4>=100 && LA6_4<=101)) ) {
-                    alt6=2;
-                }
-                else {
-                    if (state.backtracking>0) {state.failed=true; return ;}
-                    NoViableAltException nvae =
-                        new NoViableAltException("", 6, 4, input);
-
-                    throw nvae;
-                }
-                }
-                break;
-            case 48:
-                {
-                int LA6_5 = input.LA(2);
-
-                if ( (LA6_5==13) ) {
-                    alt6=1;
-                }
-                else if ( (LA6_5==EOF||(LA6_5>=RULE_ID && LA6_5<=RULE_STRING)||(LA6_5>=14 && LA6_5<=50)||(LA6_5>=52 && LA6_5<=53)||LA6_5==56||LA6_5==58||LA6_5==65||(LA6_5>=68 && LA6_5<=91)||(LA6_5>=97 && LA6_5<=98)||(LA6_5>=100 && LA6_5<=101)) ) {
-                    alt6=2;
-                }
-                else {
-                    if (state.backtracking>0) {state.failed=true; return ;}
-                    NoViableAltException nvae =
-                        new NoViableAltException("", 6, 5, input);
-
-                    throw nvae;
-                }
-                }
-                break;
-            case RULE_HEX:
-            case RULE_INT:
-            case RULE_DECIMAL:
-            case RULE_STRING:
-            case 27:
-            case 34:
-            case 35:
-            case 40:
-            case 49:
-            case 50:
-            case 52:
-            case 71:
-            case 72:
-            case 74:
-            case 75:
-            case 77:
-            case 80:
-            case 81:
-            case 82:
-            case 83:
-            case 84:
-            case 85:
-            case 86:
-            case 87:
-            case 88:
-            case 90:
-            case 101:
-                {
-                alt6=2;
-                }
-                break;
-            default:
-                if (state.backtracking>0) {state.failed=true; return ;}
-                NoViableAltException nvae =
-                    new NoViableAltException("", 6, 0, input);
-
-                throw nvae;
-            }
-
-            switch (alt6) {
-                case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2634:1: ( ( rule__XAssignment__Group_0__0 ) )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2634:1: ( ( rule__XAssignment__Group_0__0 ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2635:1: ( rule__XAssignment__Group_0__0 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getXAssignmentAccess().getGroup_0()); 
-                    }
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2636:1: ( rule__XAssignment__Group_0__0 )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2636:2: rule__XAssignment__Group_0__0
-                    {
-                    pushFollow(FOLLOW_rule__XAssignment__Group_0__0_in_rule__XAssignment__Alternatives5578);
-                    rule__XAssignment__Group_0__0();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getXAssignmentAccess().getGroup_0()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2640:6: ( ( rule__XAssignment__Group_1__0 ) )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2640:6: ( ( rule__XAssignment__Group_1__0 ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2641:1: ( rule__XAssignment__Group_1__0 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getXAssignmentAccess().getGroup_1()); 
-                    }
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2642:1: ( rule__XAssignment__Group_1__0 )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2642:2: rule__XAssignment__Group_1__0
-                    {
-                    pushFollow(FOLLOW_rule__XAssignment__Group_1__0_in_rule__XAssignment__Alternatives5596);
-                    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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2651: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 {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2655:1: ( ( '+=' ) | ( '-=' ) | ( '*=' ) | ( '/=' ) | ( '%=' ) | ( ( rule__OpMultiAssign__Group_5__0 ) ) | ( ( rule__OpMultiAssign__Group_6__0 ) ) )
-            int alt7=7;
-            switch ( input.LA(1) ) {
-            case 16:
-                {
-                alt7=1;
-                }
-                break;
-            case 17:
-                {
-                alt7=2;
-                }
-                break;
-            case 18:
-                {
-                alt7=3;
-                }
-                break;
-            case 19:
-                {
-                alt7=4;
-                }
-                break;
-            case 20:
-                {
-                alt7=5;
-                }
-                break;
-            case 27:
-                {
-                alt7=6;
-                }
-                break;
-            case 26:
-                {
-                alt7=7;
-                }
-                break;
-            default:
-                if (state.backtracking>0) {state.failed=true; return ;}
-                NoViableAltException nvae =
-                    new NoViableAltException("", 7, 0, input);
-
-                throw nvae;
-            }
-
-            switch (alt7) {
-                case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2656:1: ( '+=' )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2656:1: ( '+=' )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2657:1: '+='
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0()); 
-                    }
-                    match(input,16,FOLLOW_16_in_rule__OpMultiAssign__Alternatives5630); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2664:6: ( '-=' )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2664:6: ( '-=' )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2665:1: '-='
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpMultiAssignAccess().getHyphenMinusEqualsSignKeyword_1()); 
-                    }
-                    match(input,17,FOLLOW_17_in_rule__OpMultiAssign__Alternatives5650); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpMultiAssignAccess().getHyphenMinusEqualsSignKeyword_1()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 3 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2672:6: ( '*=' )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2672:6: ( '*=' )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2673:1: '*='
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpMultiAssignAccess().getAsteriskEqualsSignKeyword_2()); 
-                    }
-                    match(input,18,FOLLOW_18_in_rule__OpMultiAssign__Alternatives5670); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpMultiAssignAccess().getAsteriskEqualsSignKeyword_2()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 4 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2680:6: ( '/=' )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2680:6: ( '/=' )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2681:1: '/='
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpMultiAssignAccess().getSolidusEqualsSignKeyword_3()); 
-                    }
-                    match(input,19,FOLLOW_19_in_rule__OpMultiAssign__Alternatives5690); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpMultiAssignAccess().getSolidusEqualsSignKeyword_3()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 5 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2688:6: ( '%=' )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2688:6: ( '%=' )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2689:1: '%='
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpMultiAssignAccess().getPercentSignEqualsSignKeyword_4()); 
-                    }
-                    match(input,20,FOLLOW_20_in_rule__OpMultiAssign__Alternatives5710); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpMultiAssignAccess().getPercentSignEqualsSignKeyword_4()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 6 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2696:6: ( ( rule__OpMultiAssign__Group_5__0 ) )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2696:6: ( ( rule__OpMultiAssign__Group_5__0 ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2697:1: ( rule__OpMultiAssign__Group_5__0 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpMultiAssignAccess().getGroup_5()); 
-                    }
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2698:1: ( rule__OpMultiAssign__Group_5__0 )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2698:2: rule__OpMultiAssign__Group_5__0
-                    {
-                    pushFollow(FOLLOW_rule__OpMultiAssign__Group_5__0_in_rule__OpMultiAssign__Alternatives5729);
-                    rule__OpMultiAssign__Group_5__0();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpMultiAssignAccess().getGroup_5()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 7 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2702:6: ( ( rule__OpMultiAssign__Group_6__0 ) )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2702:6: ( ( rule__OpMultiAssign__Group_6__0 ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2703:1: ( rule__OpMultiAssign__Group_6__0 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpMultiAssignAccess().getGroup_6()); 
-                    }
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2704:1: ( rule__OpMultiAssign__Group_6__0 )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2704:2: rule__OpMultiAssign__Group_6__0
-                    {
-                    pushFollow(FOLLOW_rule__OpMultiAssign__Group_6__0_in_rule__OpMultiAssign__Alternatives5747);
-                    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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2713:1: rule__OpEquality__Alternatives : ( ( '==' ) | ( '!=' ) | ( '===' ) | ( '!==' ) );
-    public final void rule__OpEquality__Alternatives() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2717:1: ( ( '==' ) | ( '!=' ) | ( '===' ) | ( '!==' ) )
-            int alt8=4;
-            switch ( input.LA(1) ) {
-            case 21:
-                {
-                alt8=1;
-                }
-                break;
-            case 22:
-                {
-                alt8=2;
-                }
-                break;
-            case 23:
-                {
-                alt8=3;
-                }
-                break;
-            case 24:
-                {
-                alt8=4;
-                }
-                break;
-            default:
-                if (state.backtracking>0) {state.failed=true; return ;}
-                NoViableAltException nvae =
-                    new NoViableAltException("", 8, 0, input);
-
-                throw nvae;
-            }
-
-            switch (alt8) {
-                case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2718:1: ( '==' )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2718:1: ( '==' )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2719:1: '=='
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignKeyword_0()); 
-                    }
-                    match(input,21,FOLLOW_21_in_rule__OpEquality__Alternatives5781); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignKeyword_0()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2726:6: ( '!=' )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2726:6: ( '!=' )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2727:1: '!='
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignKeyword_1()); 
-                    }
-                    match(input,22,FOLLOW_22_in_rule__OpEquality__Alternatives5801); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignKeyword_1()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 3 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2734:6: ( '===' )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2734:6: ( '===' )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2735:1: '==='
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignEqualsSignKeyword_2()); 
-                    }
-                    match(input,23,FOLLOW_23_in_rule__OpEquality__Alternatives5821); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignEqualsSignKeyword_2()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 4 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2742:6: ( '!==' )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2742:6: ( '!==' )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2743:1: '!=='
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignEqualsSignKeyword_3()); 
-                    }
-                    match(input,24,FOLLOW_24_in_rule__OpEquality__Alternatives5841); 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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2755: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 {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2759:1: ( ( ( rule__XRelationalExpression__Group_1_0__0 ) ) | ( ( rule__XRelationalExpression__Group_1_1__0 ) ) )
-            int alt9=2;
-            int LA9_0 = input.LA(1);
-
-            if ( (LA9_0==68) ) {
-                alt9=1;
-            }
-            else if ( ((LA9_0>=25 && LA9_0<=27)) ) {
-                alt9=2;
-            }
-            else {
-                if (state.backtracking>0) {state.failed=true; return ;}
-                NoViableAltException nvae =
-                    new NoViableAltException("", 9, 0, input);
-
-                throw nvae;
-            }
-            switch (alt9) {
-                case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2760:1: ( ( rule__XRelationalExpression__Group_1_0__0 ) )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2760:1: ( ( rule__XRelationalExpression__Group_1_0__0 ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2761:1: ( rule__XRelationalExpression__Group_1_0__0 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0()); 
-                    }
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2762:1: ( rule__XRelationalExpression__Group_1_0__0 )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2762:2: rule__XRelationalExpression__Group_1_0__0
-                    {
-                    pushFollow(FOLLOW_rule__XRelationalExpression__Group_1_0__0_in_rule__XRelationalExpression__Alternatives_15875);
-                    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 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2766:6: ( ( rule__XRelationalExpression__Group_1_1__0 ) )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2766:6: ( ( rule__XRelationalExpression__Group_1_1__0 ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2767:1: ( rule__XRelationalExpression__Group_1_1__0 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1()); 
-                    }
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2768:1: ( rule__XRelationalExpression__Group_1_1__0 )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2768:2: rule__XRelationalExpression__Group_1_1__0
-                    {
-                    pushFollow(FOLLOW_rule__XRelationalExpression__Group_1_1__0_in_rule__XRelationalExpression__Alternatives_15893);
-                    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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2777:1: rule__OpCompare__Alternatives : ( ( '>=' ) | ( ( rule__OpCompare__Group_1__0 ) ) | ( '>' ) | ( '<' ) );
-    public final void rule__OpCompare__Alternatives() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2781:1: ( ( '>=' ) | ( ( rule__OpCompare__Group_1__0 ) ) | ( '>' ) | ( '<' ) )
-            int alt10=4;
-            switch ( input.LA(1) ) {
-            case 25:
-                {
-                alt10=1;
-                }
-                break;
-            case 27:
-                {
-                int LA10_2 = input.LA(2);
-
-                if ( (LA10_2==13) ) {
-                    alt10=2;
-                }
-                else if ( (LA10_2==EOF||(LA10_2>=RULE_ID && LA10_2<=RULE_STRING)||LA10_2==27||(LA10_2>=34 && LA10_2<=35)||LA10_2==40||(LA10_2>=45 && LA10_2<=50)||LA10_2==52||(LA10_2>=71 && LA10_2<=72)||(LA10_2>=74 && LA10_2<=75)||LA10_2==77||(LA10_2>=80 && LA10_2<=88)||LA10_2==90||LA10_2==101) ) {
-                    alt10=4;
-                }
-                else {
-                    if (state.backtracking>0) {state.failed=true; return ;}
-                    NoViableAltException nvae =
-                        new NoViableAltException("", 10, 2, input);
-
-                    throw nvae;
-                }
-                }
-                break;
-            case 26:
-                {
-                alt10=3;
-                }
-                break;
-            default:
-                if (state.backtracking>0) {state.failed=true; return ;}
-                NoViableAltException nvae =
-                    new NoViableAltException("", 10, 0, input);
-
-                throw nvae;
-            }
-
-            switch (alt10) {
-                case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2782:1: ( '>=' )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2782:1: ( '>=' )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2783:1: '>='
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpCompareAccess().getGreaterThanSignEqualsSignKeyword_0()); 
-                    }
-                    match(input,25,FOLLOW_25_in_rule__OpCompare__Alternatives5927); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpCompareAccess().getGreaterThanSignEqualsSignKeyword_0()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2790:6: ( ( rule__OpCompare__Group_1__0 ) )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2790:6: ( ( rule__OpCompare__Group_1__0 ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2791:1: ( rule__OpCompare__Group_1__0 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpCompareAccess().getGroup_1()); 
-                    }
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2792:1: ( rule__OpCompare__Group_1__0 )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2792:2: rule__OpCompare__Group_1__0
-                    {
-                    pushFollow(FOLLOW_rule__OpCompare__Group_1__0_in_rule__OpCompare__Alternatives5946);
-                    rule__OpCompare__Group_1__0();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpCompareAccess().getGroup_1()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 3 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2796:6: ( '>' )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2796:6: ( '>' )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2797:1: '>'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpCompareAccess().getGreaterThanSignKeyword_2()); 
-                    }
-                    match(input,26,FOLLOW_26_in_rule__OpCompare__Alternatives5965); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpCompareAccess().getGreaterThanSignKeyword_2()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 4 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2804:6: ( '<' )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2804:6: ( '<' )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2805:1: '<'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpCompareAccess().getLessThanSignKeyword_3()); 
-                    }
-                    match(input,27,FOLLOW_27_in_rule__OpCompare__Alternatives5985); 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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2817: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 {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2821:1: ( ( '->' ) | ( '..<' ) | ( ( rule__OpOther__Group_2__0 ) ) | ( '..' ) | ( '=>' ) | ( ( rule__OpOther__Group_5__0 ) ) | ( ( rule__OpOther__Group_6__0 ) ) | ( '<>' ) | ( '?:' ) )
-            int alt11=9;
-            alt11 = dfa11.predict(input);
-            switch (alt11) {
-                case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2822:1: ( '->' )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2822:1: ( '->' )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2823:1: '->'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpOtherAccess().getHyphenMinusGreaterThanSignKeyword_0()); 
-                    }
-                    match(input,28,FOLLOW_28_in_rule__OpOther__Alternatives6020); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpOtherAccess().getHyphenMinusGreaterThanSignKeyword_0()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2830:6: ( '..<' )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2830:6: ( '..<' )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2831:1: '..<'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpOtherAccess().getFullStopFullStopLessThanSignKeyword_1()); 
-                    }
-                    match(input,29,FOLLOW_29_in_rule__OpOther__Alternatives6040); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpOtherAccess().getFullStopFullStopLessThanSignKeyword_1()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 3 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2838:6: ( ( rule__OpOther__Group_2__0 ) )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2838:6: ( ( rule__OpOther__Group_2__0 ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2839:1: ( rule__OpOther__Group_2__0 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpOtherAccess().getGroup_2()); 
-                    }
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2840:1: ( rule__OpOther__Group_2__0 )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2840:2: rule__OpOther__Group_2__0
-                    {
-                    pushFollow(FOLLOW_rule__OpOther__Group_2__0_in_rule__OpOther__Alternatives6059);
-                    rule__OpOther__Group_2__0();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpOtherAccess().getGroup_2()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 4 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2844:6: ( '..' )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2844:6: ( '..' )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2845:1: '..'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_3()); 
-                    }
-                    match(input,30,FOLLOW_30_in_rule__OpOther__Alternatives6078); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_3()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 5 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2852:6: ( '=>' )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2852:6: ( '=>' )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2853:1: '=>'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_4()); 
-                    }
-                    match(input,31,FOLLOW_31_in_rule__OpOther__Alternatives6098); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_4()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 6 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2860:6: ( ( rule__OpOther__Group_5__0 ) )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2860:6: ( ( rule__OpOther__Group_5__0 ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2861:1: ( rule__OpOther__Group_5__0 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpOtherAccess().getGroup_5()); 
-                    }
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2862:1: ( rule__OpOther__Group_5__0 )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2862:2: rule__OpOther__Group_5__0
-                    {
-                    pushFollow(FOLLOW_rule__OpOther__Group_5__0_in_rule__OpOther__Alternatives6117);
-                    rule__OpOther__Group_5__0();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpOtherAccess().getGroup_5()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 7 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2866:6: ( ( rule__OpOther__Group_6__0 ) )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2866:6: ( ( rule__OpOther__Group_6__0 ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2867:1: ( rule__OpOther__Group_6__0 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpOtherAccess().getGroup_6()); 
-                    }
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2868:1: ( rule__OpOther__Group_6__0 )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2868:2: rule__OpOther__Group_6__0
-                    {
-                    pushFollow(FOLLOW_rule__OpOther__Group_6__0_in_rule__OpOther__Alternatives6135);
-                    rule__OpOther__Group_6__0();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpOtherAccess().getGroup_6()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 8 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2872:6: ( '<>' )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2872:6: ( '<>' )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2873:1: '<>'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpOtherAccess().getLessThanSignGreaterThanSignKeyword_7()); 
-                    }
-                    match(input,32,FOLLOW_32_in_rule__OpOther__Alternatives6154); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpOtherAccess().getLessThanSignGreaterThanSignKeyword_7()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 9 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2880:6: ( '?:' )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2880:6: ( '?:' )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2881:1: '?:'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpOtherAccess().getQuestionMarkColonKeyword_8()); 
-                    }
-                    match(input,33,FOLLOW_33_in_rule__OpOther__Alternatives6174); 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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2893: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 {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2897:1: ( ( ( rule__OpOther__Group_5_1_0__0 ) ) | ( '>' ) )
-            int alt12=2;
-            int LA12_0 = input.LA(1);
-
-            if ( (LA12_0==26) ) {
-                int LA12_1 = input.LA(2);
-
-                if ( (LA12_1==26) ) {
-                    alt12=1;
-                }
-                else if ( (LA12_1==EOF||(LA12_1>=RULE_ID && LA12_1<=RULE_STRING)||LA12_1==27||(LA12_1>=34 && LA12_1<=35)||LA12_1==40||(LA12_1>=45 && LA12_1<=50)||LA12_1==52||(LA12_1>=71 && LA12_1<=72)||(LA12_1>=74 && LA12_1<=75)||LA12_1==77||(LA12_1>=80 && LA12_1<=88)||LA12_1==90||LA12_1==101) ) {
-                    alt12=2;
-                }
-                else {
-                    if (state.backtracking>0) {state.failed=true; return ;}
-                    NoViableAltException nvae =
-                        new NoViableAltException("", 12, 1, input);
-
-                    throw nvae;
-                }
-            }
-            else {
-                if (state.backtracking>0) {state.failed=true; return ;}
-                NoViableAltException nvae =
-                    new NoViableAltException("", 12, 0, input);
-
-                throw nvae;
-            }
-            switch (alt12) {
-                case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2898:1: ( ( rule__OpOther__Group_5_1_0__0 ) )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2898:1: ( ( rule__OpOther__Group_5_1_0__0 ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2899:1: ( rule__OpOther__Group_5_1_0__0 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpOtherAccess().getGroup_5_1_0()); 
-                    }
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2900:1: ( rule__OpOther__Group_5_1_0__0 )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2900:2: rule__OpOther__Group_5_1_0__0
-                    {
-                    pushFollow(FOLLOW_rule__OpOther__Group_5_1_0__0_in_rule__OpOther__Alternatives_5_16208);
-                    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 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2904:6: ( '>' )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2904:6: ( '>' )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2905:1: '>'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_1()); 
-                    }
-                    match(input,26,FOLLOW_26_in_rule__OpOther__Alternatives_5_16227); 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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2917: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 {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2921:1: ( ( ( rule__OpOther__Group_6_1_0__0 ) ) | ( '<' ) | ( '=>' ) )
-            int alt13=3;
-            int LA13_0 = input.LA(1);
-
-            if ( (LA13_0==27) ) {
-                int LA13_1 = input.LA(2);
-
-                if ( (synpred30_InternalUISemanticsGrammar()) ) {
-                    alt13=1;
-                }
-                else if ( (synpred31_InternalUISemanticsGrammar()) ) {
-                    alt13=2;
-                }
-                else {
-                    if (state.backtracking>0) {state.failed=true; return ;}
-                    NoViableAltException nvae =
-                        new NoViableAltException("", 13, 1, input);
-
-                    throw nvae;
-                }
-            }
-            else if ( (LA13_0==31) ) {
-                alt13=3;
-            }
-            else {
-                if (state.backtracking>0) {state.failed=true; return ;}
-                NoViableAltException nvae =
-                    new NoViableAltException("", 13, 0, input);
-
-                throw nvae;
-            }
-            switch (alt13) {
-                case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2922:1: ( ( rule__OpOther__Group_6_1_0__0 ) )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2922:1: ( ( rule__OpOther__Group_6_1_0__0 ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2923:1: ( rule__OpOther__Group_6_1_0__0 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpOtherAccess().getGroup_6_1_0()); 
-                    }
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2924:1: ( rule__OpOther__Group_6_1_0__0 )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2924:2: rule__OpOther__Group_6_1_0__0
-                    {
-                    pushFollow(FOLLOW_rule__OpOther__Group_6_1_0__0_in_rule__OpOther__Alternatives_6_16261);
-                    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 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2928:6: ( '<' )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2928:6: ( '<' )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2929:1: '<'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_1()); 
-                    }
-                    match(input,27,FOLLOW_27_in_rule__OpOther__Alternatives_6_16280); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_1()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 3 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2936:6: ( '=>' )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2936:6: ( '=>' )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2937:1: '=>'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_6_1_2()); 
-                    }
-                    match(input,31,FOLLOW_31_in_rule__OpOther__Alternatives_6_16300); 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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2949:1: rule__OpAdd__Alternatives : ( ( '+' ) | ( '-' ) );
-    public final void rule__OpAdd__Alternatives() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2953:1: ( ( '+' ) | ( '-' ) )
-            int alt14=2;
-            int LA14_0 = input.LA(1);
-
-            if ( (LA14_0==34) ) {
-                alt14=1;
-            }
-            else if ( (LA14_0==35) ) {
-                alt14=2;
-            }
-            else {
-                if (state.backtracking>0) {state.failed=true; return ;}
-                NoViableAltException nvae =
-                    new NoViableAltException("", 14, 0, input);
-
-                throw nvae;
-            }
-            switch (alt14) {
-                case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2954:1: ( '+' )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2954:1: ( '+' )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2955:1: '+'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpAddAccess().getPlusSignKeyword_0()); 
-                    }
-                    match(input,34,FOLLOW_34_in_rule__OpAdd__Alternatives6335); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpAddAccess().getPlusSignKeyword_0()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2962:6: ( '-' )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2962:6: ( '-' )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2963:1: '-'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpAddAccess().getHyphenMinusKeyword_1()); 
-                    }
-                    match(input,35,FOLLOW_35_in_rule__OpAdd__Alternatives6355); 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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2975:1: rule__OpMulti__Alternatives : ( ( '*' ) | ( '**' ) | ( '/' ) | ( '%' ) );
-    public final void rule__OpMulti__Alternatives() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2979:1: ( ( '*' ) | ( '**' ) | ( '/' ) | ( '%' ) )
-            int alt15=4;
-            switch ( input.LA(1) ) {
-            case 36:
-                {
-                alt15=1;
-                }
-                break;
-            case 37:
-                {
-                alt15=2;
-                }
-                break;
-            case 38:
-                {
-                alt15=3;
-                }
-                break;
-            case 39:
-                {
-                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 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2980:1: ( '*' )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2980:1: ( '*' )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2981:1: '*'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpMultiAccess().getAsteriskKeyword_0()); 
-                    }
-                    match(input,36,FOLLOW_36_in_rule__OpMulti__Alternatives6390); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpMultiAccess().getAsteriskKeyword_0()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2988:6: ( '**' )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2988:6: ( '**' )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2989:1: '**'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpMultiAccess().getAsteriskAsteriskKeyword_1()); 
-                    }
-                    match(input,37,FOLLOW_37_in_rule__OpMulti__Alternatives6410); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpMultiAccess().getAsteriskAsteriskKeyword_1()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 3 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2996:6: ( '/' )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2996:6: ( '/' )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:2997:1: '/'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpMultiAccess().getSolidusKeyword_2()); 
-                    }
-                    match(input,38,FOLLOW_38_in_rule__OpMulti__Alternatives6430); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpMultiAccess().getSolidusKeyword_2()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 4 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3004:6: ( '%' )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3004:6: ( '%' )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3005:1: '%'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpMultiAccess().getPercentSignKeyword_3()); 
-                    }
-                    match(input,39,FOLLOW_39_in_rule__OpMulti__Alternatives6450); 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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3017:1: rule__XUnaryOperation__Alternatives : ( ( ( rule__XUnaryOperation__Group_0__0 ) ) | ( ruleXCastedExpression ) );
-    public final void rule__XUnaryOperation__Alternatives() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3021:1: ( ( ( rule__XUnaryOperation__Group_0__0 ) ) | ( ruleXCastedExpression ) )
-            int alt16=2;
-            int LA16_0 = input.LA(1);
-
-            if ( ((LA16_0>=34 && LA16_0<=35)||LA16_0==40) ) {
-                alt16=1;
-            }
-            else if ( ((LA16_0>=RULE_ID && LA16_0<=RULE_STRING)||LA16_0==27||(LA16_0>=45 && LA16_0<=50)||LA16_0==52||(LA16_0>=71 && LA16_0<=72)||(LA16_0>=74 && LA16_0<=75)||LA16_0==77||(LA16_0>=80 && LA16_0<=88)||LA16_0==90||LA16_0==101) ) {
-                alt16=2;
-            }
-            else {
-                if (state.backtracking>0) {state.failed=true; return ;}
-                NoViableAltException nvae =
-                    new NoViableAltException("", 16, 0, input);
-
-                throw nvae;
-            }
-            switch (alt16) {
-                case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3022:1: ( ( rule__XUnaryOperation__Group_0__0 ) )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3022:1: ( ( rule__XUnaryOperation__Group_0__0 ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3023:1: ( rule__XUnaryOperation__Group_0__0 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getXUnaryOperationAccess().getGroup_0()); 
-                    }
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3024:1: ( rule__XUnaryOperation__Group_0__0 )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3024:2: rule__XUnaryOperation__Group_0__0
-                    {
-                    pushFollow(FOLLOW_rule__XUnaryOperation__Group_0__0_in_rule__XUnaryOperation__Alternatives6484);
-                    rule__XUnaryOperation__Group_0__0();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getXUnaryOperationAccess().getGroup_0()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3028:6: ( ruleXCastedExpression )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3028:6: ( ruleXCastedExpression )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3029:1: ruleXCastedExpression
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getXUnaryOperationAccess().getXCastedExpressionParserRuleCall_1()); 
-                    }
-                    pushFollow(FOLLOW_ruleXCastedExpression_in_rule__XUnaryOperation__Alternatives6502);
-                    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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3039:1: rule__OpUnary__Alternatives : ( ( '!' ) | ( '-' ) | ( '+' ) );
-    public final void rule__OpUnary__Alternatives() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3043:1: ( ( '!' ) | ( '-' ) | ( '+' ) )
-            int alt17=3;
-            switch ( input.LA(1) ) {
-            case 40:
-                {
-                alt17=1;
-                }
-                break;
-            case 35:
-                {
-                alt17=2;
-                }
-                break;
-            case 34:
-                {
-                alt17=3;
-                }
-                break;
-            default:
-                if (state.backtracking>0) {state.failed=true; return ;}
-                NoViableAltException nvae =
-                    new NoViableAltException("", 17, 0, input);
-
-                throw nvae;
-            }
-
-            switch (alt17) {
-                case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3044:1: ( '!' )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3044:1: ( '!' )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3045:1: '!'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpUnaryAccess().getExclamationMarkKeyword_0()); 
-                    }
-                    match(input,40,FOLLOW_40_in_rule__OpUnary__Alternatives6535); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpUnaryAccess().getExclamationMarkKeyword_0()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3052:6: ( '-' )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3052:6: ( '-' )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3053:1: '-'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpUnaryAccess().getHyphenMinusKeyword_1()); 
-                    }
-                    match(input,35,FOLLOW_35_in_rule__OpUnary__Alternatives6555); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpUnaryAccess().getHyphenMinusKeyword_1()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 3 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3060:6: ( '+' )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3060:6: ( '+' )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3061:1: '+'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpUnaryAccess().getPlusSignKeyword_2()); 
-                    }
-                    match(input,34,FOLLOW_34_in_rule__OpUnary__Alternatives6575); 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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3073:1: rule__OpPostfix__Alternatives : ( ( '++' ) | ( '--' ) );
-    public final void rule__OpPostfix__Alternatives() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3077:1: ( ( '++' ) | ( '--' ) )
-            int alt18=2;
-            int LA18_0 = input.LA(1);
-
-            if ( (LA18_0==41) ) {
-                alt18=1;
-            }
-            else if ( (LA18_0==42) ) {
-                alt18=2;
-            }
-            else {
-                if (state.backtracking>0) {state.failed=true; return ;}
-                NoViableAltException nvae =
-                    new NoViableAltException("", 18, 0, input);
-
-                throw nvae;
-            }
-            switch (alt18) {
-                case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3078:1: ( '++' )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3078:1: ( '++' )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3079:1: '++'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpPostfixAccess().getPlusSignPlusSignKeyword_0()); 
-                    }
-                    match(input,41,FOLLOW_41_in_rule__OpPostfix__Alternatives6610); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getOpPostfixAccess().getPlusSignPlusSignKeyword_0()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3086:6: ( '--' )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3086:6: ( '--' )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3087:1: '--'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getOpPostfixAccess().getHyphenMinusHyphenMinusKeyword_1()); 
-                    }
-                    match(input,42,FOLLOW_42_in_rule__OpPostfix__Alternatives6630); 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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3099: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 {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3103:1: ( ( ( rule__XMemberFeatureCall__Group_1_0__0 ) ) | ( ( rule__XMemberFeatureCall__Group_1_1__0 ) ) )
-            int alt19=2;
-            alt19 = dfa19.predict(input);
-            switch (alt19) {
-                case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3104:1: ( ( rule__XMemberFeatureCall__Group_1_0__0 ) )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3104:1: ( ( rule__XMemberFeatureCall__Group_1_0__0 ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3105:1: ( rule__XMemberFeatureCall__Group_1_0__0 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0()); 
-                    }
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3106:1: ( rule__XMemberFeatureCall__Group_1_0__0 )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3106:2: rule__XMemberFeatureCall__Group_1_0__0
-                    {
-                    pushFollow(FOLLOW_rule__XMemberFeatureCall__Group_1_0__0_in_rule__XMemberFeatureCall__Alternatives_16664);
-                    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 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3110:6: ( ( rule__XMemberFeatureCall__Group_1_1__0 ) )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3110:6: ( ( rule__XMemberFeatureCall__Group_1_1__0 ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3111:1: ( rule__XMemberFeatureCall__Group_1_1__0 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1()); 
-                    }
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3112:1: ( rule__XMemberFeatureCall__Group_1_1__0 )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3112:2: rule__XMemberFeatureCall__Group_1_1__0
-                    {
-                    pushFollow(FOLLOW_rule__XMemberFeatureCall__Group_1_1__0_in_rule__XMemberFeatureCall__Alternatives_16682);
-                    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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3121: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 {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3125:1: ( ( '.' ) | ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1 ) ) )
-            int alt20=2;
-            int LA20_0 = input.LA(1);
-
-            if ( (LA20_0==43) ) {
-                alt20=1;
-            }
-            else if ( (LA20_0==97) ) {
-                alt20=2;
-            }
-            else {
-                if (state.backtracking>0) {state.failed=true; return ;}
-                NoViableAltException nvae =
-                    new NoViableAltException("", 20, 0, input);
-
-                throw nvae;
-            }
-            switch (alt20) {
-                case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3126:1: ( '.' )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3126:1: ( '.' )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3127:1: '.'
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_0_0_0_1_0()); 
-                    }
-                    match(input,43,FOLLOW_43_in_rule__XMemberFeatureCall__Alternatives_1_0_0_0_16716); if (state.failed) return ;
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_0_0_0_1_0()); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3134:6: ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1 ) )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3134:6: ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1 ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3135:1: ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticAssignment_1_0_0_0_1_1()); 
-                    }
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3136:1: ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1 )
-                    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3136:2: rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1
-                    {
-                    pushFollow(FOLLOW_rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1_in_rule__XMemberFeatureCall__Alternatives_1_0_0_0_16735);
-                    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"
-    // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3145: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 {
-            // ../org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/contentassist/antlr/internal/InternalUISemanticsGrammar.g:3149:1: ( ( '.' ) | ( ( rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1 ) ) | ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2 ) ) )
-            int alt21=3;
-            switch ( input.LA(1) ) {
-            case 43:
-                {
-                alt21=1;
-                }
-                break;
-            case 98:
-                {
-                alt21=2;
-                }
-                break;
-            case 97:
-                {
-                alt21=3;
-                }
-                break;
-            default:
-                if (state.backtracking>0) {state.failed=true; return ;}
-                NoViableAltException nvae =
-                    new NoViableAltException("", 21, 0, input);
-
diff --git a/org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/internal/UISemanticsGrammarActivator.java b/org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/internal/UISemanticsGrammarActivator.java
deleted file mode 100644
index a7ee0c8..0000000
--- a/org.eclipse.osbp.ecview.uisemantics.ui/src-gen/org/eclipse/osbp/ecview/uisemantics/ui/internal/UISemanticsGrammarActivator.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/**
- * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf), Loetz GmbH&Co.KG (Heidelberg)
- * 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:
- *         Florian Pirchner - Initial implementation
- */
-
-package org.eclipse.osbp.ecview.uisemantics.ui.internal;
-
-import java.util.Collections;
-import java.util.Map;
-
-import org.apache.log4j.Logger;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.eclipse.xtext.ui.shared.SharedStateModule;
-import org.eclipse.xtext.util.Modules2;
-import org.osgi.framework.BundleContext;
-
-import com.google.common.collect.Maps;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-import com.google.inject.Module;
-
-/**
- * This class was generated. Customizations should only happen in a newly
- * introduced subclass. 
- */
-public class UISemanticsGrammarActivator extends AbstractUIPlugin {
-	
-	public static final String ORG_ECLIPSE_OSBP_ECVIEW_UISEMANTICS_UISEMANTICSGRAMMAR = "org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar";
-	
-	private static final Logger logger = Logger.getLogger(UISemanticsGrammarActivator.class);
-	
-	private static UISemanticsGrammarActivator 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 UISemanticsGrammarActivator 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_ECVIEW_UISEMANTICS_UISEMANTICSGRAMMAR.equals(grammar)) {
-			return new org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammarRuntimeModule();
-		}
-		
-		throw new IllegalArgumentException(grammar);
-	}
-	
-	protected Module getUiModule(String grammar) {
-		if (ORG_ECLIPSE_OSBP_ECVIEW_UISEMANTICS_UISEMANTICSGRAMMAR.equals(grammar)) {
-			return new org.eclipse.osbp.ecview.uisemantics.ui.UISemanticsGrammarUiModule(this);
-		}
-		
-		throw new IllegalArgumentException(grammar);
-	}
-	
-	protected Module getSharedStateModule() {
-		return new SharedStateModule();
-	}
-	
-}
diff --git a/org.eclipse.osbp.ecview.uisemantics.ui/xtend-gen/org/eclipse/osbp/ecview/uisemantics/ui/hover/UiSemanticGrammarHoverDocumentationProvider.java b/org.eclipse.osbp.ecview.uisemantics.ui/xtend-gen/org/eclipse/osbp/ecview/uisemantics/ui/hover/UiSemanticGrammarHoverDocumentationProvider.java
index 50fd665..e949f31 100644
--- a/org.eclipse.osbp.ecview.uisemantics.ui/xtend-gen/org/eclipse/osbp/ecview/uisemantics/ui/hover/UiSemanticGrammarHoverDocumentationProvider.java
+++ b/org.eclipse.osbp.ecview.uisemantics.ui/xtend-gen/org/eclipse/osbp/ecview/uisemantics/ui/hover/UiSemanticGrammarHoverDocumentationProvider.java
@@ -12,7 +12,6 @@
 
 import com.google.inject.Inject;
 import java.util.Arrays;
-import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.osbp.ecview.semantic.uisemantics.UxBindingableOption;
@@ -30,6 +29,7 @@
   @Inject
   protected IEObjectDocumentationProvider documentationProvider;
   
+  @Override
   public String computeDocumentation(final EObject object) {
     return this.getCustomDocumentation(object);
   }
@@ -47,8 +47,7 @@
   public String computeLinkToElement(final EObject jvmElement) {
     final String imageURL = this.hoverSignatureProvider.getImageTag(jvmElement);
     final String signature = this.hoverSignatureProvider.getDerivedOrSourceSignature(jvmElement);
-    URI _uRI = EcoreUtil.getURI(jvmElement);
-    String _createLinkWithLabel = HoverLinkHelper.createLinkWithLabel(XtextElementLinks.XTEXTDOC_SCHEME, _uRI, signature);
+    String _createLinkWithLabel = HoverLinkHelper.createLinkWithLabel(XtextElementLinks.XTEXTDOC_SCHEME, EcoreUtil.getURI(jvmElement), signature);
     return (imageURL + _createLinkWithLabel);
   }
   
diff --git a/org.eclipse.osbp.ecview.uisemantics.ui/xtend-gen/org/eclipse/osbp/ecview/uisemantics/ui/labeling/UISemanticsGrammarDescriptionLabelProvider.java b/org.eclipse.osbp.ecview.uisemantics.ui/xtend-gen/org/eclipse/osbp/ecview/uisemantics/ui/labeling/UISemanticsGrammarDescriptionLabelProvider.java
index f60b40a..508ec18 100644
--- a/org.eclipse.osbp.ecview.uisemantics.ui/xtend-gen/org/eclipse/osbp/ecview/uisemantics/ui/labeling/UISemanticsGrammarDescriptionLabelProvider.java
+++ b/org.eclipse.osbp.ecview.uisemantics.ui/xtend-gen/org/eclipse/osbp/ecview/uisemantics/ui/labeling/UISemanticsGrammarDescriptionLabelProvider.java
@@ -10,7 +10,6 @@
  */
 package org.eclipse.osbp.ecview.uisemantics.ui.labeling;
 
-import org.eclipse.xtext.naming.QualifiedName;
 import org.eclipse.xtext.resource.IEObjectDescription;
 import org.eclipse.xtext.xbase.ui.labeling.XbaseDescriptionLabelProvider;
 
@@ -21,8 +20,8 @@
  */
 @SuppressWarnings("all")
 public class UISemanticsGrammarDescriptionLabelProvider extends XbaseDescriptionLabelProvider {
+  @Override
   public Object text(final IEObjectDescription ele) {
-    QualifiedName _name = ele.getName();
-    return _name.toString();
+    return ele.getName().toString();
   }
 }
diff --git a/org.eclipse.osbp.ecview.uisemantics/META-INF/MANIFEST.MF b/org.eclipse.osbp.ecview.uisemantics/META-INF/MANIFEST.MF
index b94057a..563ca86 100644
--- a/org.eclipse.osbp.ecview.uisemantics/META-INF/MANIFEST.MF
+++ b/org.eclipse.osbp.ecview.uisemantics/META-INF/MANIFEST.MF
@@ -1,30 +1,37 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: org.eclipse.osbp.ecview.uisemantics
-Bundle-Vendor: Eclipse OSBP
+Bundle-Vendor: Loetz GmbH&Co.KG (69115 Heidelberg,
+ Germany)
 Bundle-Localization: plugin
 Bundle-Version: 0.9.0.qualifier
-Bundle-ClassPath: .
+Bundle-ClassPath: .,
+ model/,
+ src/,
+ src-gen/,
+ xtend-gen/
 Bundle-SymbolicName: org.eclipse.osbp.ecview.uisemantics;singleton:=true
 Bundle-ActivationPolicy: lazy
-Require-Bundle: org.eclipse.xtext;bundle-version="[2.7.3,2.8.0)";visibility:=reexport,
- org.eclipse.xtext.xbase;bundle-version="[2.7.3,2.8.0)";resolution:=optional;visibility:=reexport,
- org.eclipse.xtext.generator;bundle-version="[2.7.3,2.8.0)";resolution:=optional,
+Require-Bundle: org.eclipse.xtext;bundle-version="[2.11.0,2.12.0)";visibility:=reexport,
+ org.eclipse.xtext.xbase;bundle-version="[2.11.0,2.12.0)";resolution:=optional;visibility:=reexport,
+ org.eclipse.xtext.generator;bundle-version="[2.11.0,2.12.0)";resolution:=optional,
  org.apache.commons.logging;bundle-version="1.0.4";resolution:=optional,
  org.eclipse.emf.mwe.utils;bundle-version="1.3.5";resolution:=optional,
- org.eclipse.emf.mwe2.launch;bundle-version="[2.7.0,2.8.0)";resolution:=optional,
- org.eclipse.xtext.util;bundle-version="[2.7.3,2.8.0)",
+ org.eclipse.emf.mwe2.launch;bundle-version="[2.9.0,2.10.0)";resolution:=optional,
+ org.eclipse.xtext.util;bundle-version="[2.11.0,2.12.0)",
+ org.eclipse.xtext.ecore;bundle-version="[2.11.0,2.12.0)",
  org.eclipse.core.runtime,
  org.eclipse.emf.ecore;bundle-version="2.10.0";visibility:=reexport,
  org.eclipse.emf.common;bundle-version="2.10.0",
  org.antlr.runtime,
- org.eclipse.xtext.common.types;bundle-version="[2.7.3,2.8.0)";visibility:=reexport,
+ org.eclipse.xtext.common.types;bundle-version="[2.11.0,2.12.0)";visibility:=reexport,
  org.objectweb.asm;bundle-version="[5.0.1,6.0.0)";resolution:=optional,
- org.eclipse.xtext.xbase.lib;bundle-version="[2.7.3,2.8.0)",
+ org.eclipse.xtext.xbase.lib;bundle-version="[2.11.0,2.12.0)",
  org.eclipse.osbp.xtext.builder.xbase.setups;bundle-version="[0.9.0,0.10.0)";resolution:=optional,
  org.eclipse.osbp.xtext.builder.types.bundles;bundle-version="[0.9.0,0.10.0)";resolution:=optional,
  org.eclipse.osbp.xtext.builder.types.loader.runtime;bundle-version="[0.9.0,0.10.0)";resolution:=optional,
- org.eclipse.osbp.xtext.builder.types.loader.api;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.xtend.lib
 Import-Package: org.apache.log4j
 Bundle-RequiredExecutionEnvironment: JavaSE-1.7
 Export-Package: org.eclipse.osbp.ecview.semantic.uisemantics,
diff --git a/org.eclipse.osbp.ecview.uisemantics/build.properties b/org.eclipse.osbp.ecview.uisemantics/build.properties
index ddbf9c8..ac18397 100644
--- a/org.eclipse.osbp.ecview.uisemantics/build.properties
+++ b/org.eclipse.osbp.ecview.uisemantics/build.properties
@@ -1,12 +1,20 @@
 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/,\
                .,\
                plugin.properties,\
                LICENSE.txt,\
                license.html,\
-	       plugin.xml
+               plugin.xml,\
+               model/,\
+               src/,\
+               src-gen/,\
+               xtend-gen/
 output.. = target/classes
 src.includes = about.properties,  about.mappings,  about.ini,  about.html,  license.html,\
                LICENSE.txt
diff --git a/org.eclipse.osbp.ecview.uisemantics/model/UISemanticsGrammar.ecore b/org.eclipse.osbp.ecview.uisemantics/model/UISemanticsGrammar.ecore
index d94f00e..bf82c9d 100644
--- a/org.eclipse.osbp.ecview.uisemantics/model/UISemanticsGrammar.ecore
+++ b/org.eclipse.osbp.ecview.uisemantics/model/UISemanticsGrammar.ecore
@@ -37,6 +37,7 @@
     <eStructuralFeatures xsi:type="ecore:EReference" name="eClass" eType="ecore:EClass ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EClass"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="UxAvailableBindings">
+    <eStructuralFeatures xsi:type="ecore:EReference" name="superElement" eType="#//UxElementDefinition"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="bindings" upperBound="-1"
         eType="#//UxBindingableOption" containment="true"/>
   </eClassifiers>
diff --git a/org.eclipse.osbp.ecview.uisemantics/model/UISemanticsGrammar.genmodel b/org.eclipse.osbp.ecview.uisemantics/model/UISemanticsGrammar.genmodel
index 6d49319..4db24b0 100644
--- a/org.eclipse.osbp.ecview.uisemantics/model/UISemanticsGrammar.genmodel
+++ b/org.eclipse.osbp.ecview.uisemantics/model/UISemanticsGrammar.genmodel
@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <genmodel:GenModel xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" modelDirectory="/org.eclipse.osbp.ecview.uisemantics/src" creationIcons="false"
+    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" copyrightText=" * Copyright (c) 2011, 2017 - Lunifera GmbH (Gross Enzersdorf, Austria), Loetz GmbH&amp;Co.KG (69115 Heidelberg, Germany)&#xA; * All rights reserved. This program and the accompanying materials&#xA; * are made available under the terms of the Eclipse Public License v1.0&#xA; * which accompanies this distribution, and is available at&#xA; * http://www.eclipse.org/legal/epl-v10.html&#xA; *&#xA; * Contributors:&#xA; *         Florian Pirchner - Initial implementation&#xA;"
+    modelDirectory="/org.eclipse.osbp.ecview.uisemantics/src" creationIcons="false"
     editDirectory="/org.eclipse.osbp.ecview.uisemantics.edit/src" editorDirectory="/org.eclipse.osbp.ecview.uisemantics.editor/src"
     modelPluginID="org.eclipse.osbp.ecview.uisemantics" modelName="uisemantics" editPluginClass="org.eclipse.osbp.ecview.uisemantics.provider.uisemanticsEditPlugin"
     editorPluginClass="org.eclipse.osbp.ecview.uisemantics.presentation.uisemanticsEditorPlugin"
@@ -37,6 +38,7 @@
       <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference UISemanticsGrammar.ecore#//UxElementURI/eClass"/>
     </genClasses>
     <genClasses ecoreClass="UISemanticsGrammar.ecore#//UxAvailableBindings">
+      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference UISemanticsGrammar.ecore#//UxAvailableBindings/superElement"/>
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference UISemanticsGrammar.ecore#//UxAvailableBindings/bindings"/>
     </genClasses>
     <genClasses ecoreClass="UISemanticsGrammar.ecore#//UxAvailableVisibilityOptions">
diff --git a/org.eclipse.osbp.ecview.uisemantics/plugin.xml b/org.eclipse.osbp.ecview.uisemantics/plugin.xml
index dac9e94..70473af 100644
--- a/org.eclipse.osbp.ecview.uisemantics/plugin.xml
+++ b/org.eclipse.osbp.ecview.uisemantics/plugin.xml
@@ -5,8 +5,6 @@
 -->
 
 <plugin>
-
-
    <extension point="org.eclipse.emf.ecore.generated_package">
       <!-- @generated UISemanticsGrammar -->
       <package
diff --git a/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/AbstractUISemanticsGrammarRuntimeModule.java b/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/AbstractUISemanticsGrammarRuntimeModule.java
index 7a9330d..ac68bce 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/AbstractUISemanticsGrammarRuntimeModule.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/AbstractUISemanticsGrammarRuntimeModule.java
@@ -7,23 +7,76 @@
  *
  * Contributors:
  *         Florian Pirchner - Initial implementation
+ *
+ * generated by Xtext 2.11.0
+ *
  */
 
 package org.eclipse.osbp.ecview.uisemantics;
 
-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.ecview.uisemantics.jvmmodel.UISemanticsGrammarJvmModelInferrer;
+import org.eclipse.osbp.ecview.uisemantics.parser.antlr.UISemanticsGrammarAntlrTokenFileProvider;
+import org.eclipse.osbp.ecview.uisemantics.parser.antlr.UISemanticsGrammarParser;
+import org.eclipse.osbp.ecview.uisemantics.parser.antlr.internal.InternalUISemanticsGrammarLexer;
+import org.eclipse.osbp.ecview.uisemantics.scoping.UISemanticsGrammarScopeProvider;
+import org.eclipse.osbp.ecview.uisemantics.serializer.UISemanticsGrammarSemanticSequencer;
+import org.eclipse.osbp.ecview.uisemantics.serializer.UISemanticsGrammarSyntacticSequencer;
+import org.eclipse.osbp.ecview.uisemantics.services.UISemanticsGrammarGrammarAccess;
+import org.eclipse.osbp.ecview.uisemantics.validation.UISemanticsGrammarValidator;
+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.Lexer;
+import org.eclipse.xtext.parser.antlr.LexerBindings;
+import org.eclipse.xtext.parser.antlr.LexerProvider;
+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.DefaultXbaseRuntimeModule;
+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.ecview.uisemantics.UISemanticsGrammarRuntimeModule}
+ * Manual modifications go to {@link UISemanticsGrammarRuntimeModule}.
  */
- @SuppressWarnings("all")
-public abstract class AbstractUISemanticsGrammarRuntimeModule extends DefaultRuntimeModule {
+@SuppressWarnings("all")
+public abstract class AbstractUISemanticsGrammarRuntimeModule extends DefaultXbaseRuntimeModule {
 
 	protected Properties properties = null;
 
@@ -42,304 +95,147 @@
 			binder.bind(String.class).annotatedWith(Names.named(Constants.FILE_EXTENSIONS)).toInstance("uisemantic");
 	}
 	
-	// contributed by org.eclipse.xtext.generator.grammarAccess.GrammarAccessFragment
-	public Class<? extends org.eclipse.xtext.IGrammarAccess> bindIGrammarAccess() {
-		return org.eclipse.osbp.ecview.uisemantics.services.UISemanticsGrammarGrammarAccess.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.serializer.SerializerFragment
-	public Class<? extends org.eclipse.xtext.serializer.sequencer.ISemanticSequencer> bindISemanticSequencer() {
-		return org.eclipse.osbp.ecview.uisemantics.serializer.UISemanticsGrammarSemanticSequencer.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.serializer.SerializerFragment
-	public Class<? extends org.eclipse.xtext.serializer.sequencer.ISyntacticSequencer> bindISyntacticSequencer() {
-		return org.eclipse.osbp.ecview.uisemantics.serializer.UISemanticsGrammarSyntacticSequencer.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.ecview.uisemantics.parser.antlr.UISemanticsGrammarParser.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.ecview.uisemantics.parser.antlr.UISemanticsGrammarAntlrTokenFileProvider.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment
-	public Class<? extends org.eclipse.xtext.parser.antlr.Lexer> bindLexer() {
-		return org.eclipse.osbp.ecview.uisemantics.parser.antlr.internal.InternalUISemanticsGrammarLexer.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment
-	public com.google.inject.Provider<org.eclipse.osbp.ecview.uisemantics.parser.antlr.internal.InternalUISemanticsGrammarLexer> provideInternalUISemanticsGrammarLexer() {
-		return org.eclipse.xtext.parser.antlr.LexerProvider.create(org.eclipse.osbp.ecview.uisemantics.parser.antlr.internal.InternalUISemanticsGrammarLexer.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.ecview.uisemantics.parser.antlr.internal.InternalUISemanticsGrammarLexer.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.ecview.uisemantics.validation.UISemanticsGrammarValidator> bindUISemanticsGrammarValidator() {
-		return org.eclipse.osbp.ecview.uisemantics.validation.UISemanticsGrammarValidator.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.ecview.uisemantics.formatting.UISemanticsGrammarFormatter.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.types.TypesGeneratorFragment
-	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.types.TypesGeneratorFragment
-	public org.eclipse.xtext.common.types.TypesFactory bindTypesFactoryToInstance() {
-		return org.eclipse.xtext.common.types.TypesFactory.eINSTANCE;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.grammarAccess.GrammarAccessFragment2
+	public Class<? extends IGrammarAccess> bindIGrammarAccess() {
+		return UISemanticsGrammarGrammarAccess.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.ClasspathTypeProviderFactory.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.serializer.SerializerFragment2
+	public Class<? extends ISemanticSequencer> bindISemanticSequencer() {
+		return UISemanticsGrammarSemanticSequencer.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.xtext.generator.serializer.SerializerFragment2
+	public Class<? extends ISyntacticSequencer> bindISyntacticSequencer() {
+		return UISemanticsGrammarSyntacticSequencer.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.xtext.generator.serializer.SerializerFragment2
+	public Class<? extends ISerializer> bindISerializer() {
+		return Serializer.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.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends IParser> bindIParser() {
+		return UISemanticsGrammarParser.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.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends ITokenToStringConverter> bindITokenToStringConverter() {
+		return AntlrTokenToStringConverter.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.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends IAntlrTokenFileProvider> bindIAntlrTokenFileProvider() {
+		return UISemanticsGrammarAntlrTokenFileProvider.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.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends Lexer> bindLexer() {
+		return InternalUISemanticsGrammarLexer.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.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends ITokenDefProvider> bindITokenDefProvider() {
+		return AntlrTokenDefProvider.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.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Provider<? extends InternalUISemanticsGrammarLexer> provideInternalUISemanticsGrammarLexer() {
+		return LexerProvider.create(InternalUISemanticsGrammarLexer.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.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public void configureRuntimeLexer(Binder binder) {
+		binder.bind(Lexer.class)
+			.annotatedWith(Names.named(LexerBindings.RUNTIME))
+			.to(InternalUISemanticsGrammarLexer.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.XImportSectionNamespaceScopeProvider.class);
+	
+	// contributed by org.eclipse.xtext.xtext.generator.validation.ValidatorFragment2
+	@SingletonBinding(eager=true)
+	public Class<? extends UISemanticsGrammarValidator> bindUISemanticsGrammarValidator() {
+		return UISemanticsGrammarValidator.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.xtext.generator.scoping.ImportNamespacesScopingFragment2
+	public Class<? extends IBatchScopeProvider> bindIBatchScopeProvider() {
+		return UISemanticsGrammarScopeProvider.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.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.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.xtext.generator.scoping.ImportNamespacesScopingFragment2
+	public void configureIgnoreCaseLinking(Binder binder) {
+		binder.bindConstant().annotatedWith(IgnoreCaseLinking.class).to(false);
 	}
-
-	// 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.xtext.generator.builder.BuilderIntegrationFragment2
+	public Class<? extends IContainer.Manager> bindIContainer$Manager() {
+		return StateBasedContainerManager.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.xtext.generator.builder.BuilderIntegrationFragment2
+	public Class<? extends IAllContainersState.Provider> bindIAllContainersState$Provider() {
+		return ResourceSetBasedAllContainersStateProvider.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.xtext.generator.builder.BuilderIntegrationFragment2
+	public void configureIResourceDescriptions(Binder binder) {
+		binder.bind(IResourceDescriptions.class).to(ResourceSetBasedResourceDescriptions.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.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.generator.xbase.XbaseGeneratorFragment
-	public org.eclipse.xtext.xtype.XtypeFactory bindXtypeFactoryToInstance() {
-		return org.eclipse.xtext.xtype.XtypeFactory.eINSTANCE;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.xbase.XbaseGeneratorFragment2
+	public Class<? extends IQualifiedNameProvider> bindIQualifiedNameProvider() {
+		return XbaseQualifiedNameProvider.class;
 	}
-
-	// 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.xtext.generator.xbase.XbaseGeneratorFragment2
+	public Class<? extends ILocationInFileProvider> bindILocationInFileProvider() {
+		return JvmLocationInFileProvider.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.xtext.generator.xbase.XbaseGeneratorFragment2
+	public Class<? extends IGlobalScopeProvider> bindIGlobalScopeProvider() {
+		return TypesAwareDefaultGlobalScopeProvider.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.xtext.generator.xbase.XbaseGeneratorFragment2
+	public Class<? extends FeatureNameValidator> bindFeatureNameValidator() {
+		return LogicalContainerAwareFeatureNameValidator.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.xtext.generator.xbase.XbaseGeneratorFragment2
+	public Class<? extends DefaultBatchTypeResolver> bindDefaultBatchTypeResolver() {
+		return LogicalContainerAwareBatchTypeResolver.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.xtext.generator.xbase.XbaseGeneratorFragment2
+	public Class<? extends DefaultReentrantTypeResolver> bindDefaultReentrantTypeResolver() {
+		return LogicalContainerAwareReentrantTypeResolver.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.xtext.generator.xbase.XbaseGeneratorFragment2
+	public Class<? extends IResourceValidator> bindIResourceValidator() {
+		return DerivedStateAwareResourceValidator.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.xtext.generator.xbase.XbaseGeneratorFragment2
+	public Class<? extends IJvmModelInferrer> bindIJvmModelInferrer() {
+		return UISemanticsGrammarJvmModelInferrer.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.ecview.uisemantics.jvmmodel.UISemanticsGrammarJvmModelInferrer.class;
-	}
-
+	
 }
diff --git a/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/UISemanticsGrammarStandaloneSetupGenerated.java b/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/UISemanticsGrammarStandaloneSetupGenerated.java
index d2707a2..68d5f9b 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/UISemanticsGrammarStandaloneSetupGenerated.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/UISemanticsGrammarStandaloneSetupGenerated.java
@@ -7,25 +7,27 @@
  *
  * Contributors:
  *         Florian Pirchner - Initial implementation
+ *
+ * generated by Xtext 2.11.0
+ *
  */
 
 package org.eclipse.osbp.ecview.uisemantics;
 
-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.xtext.ISetup;
+import org.eclipse.xtext.resource.IResourceFactory;
+import org.eclipse.xtext.resource.IResourceServiceProvider;
+import org.eclipse.xtext.xbase.XbaseStandaloneSetup;
 
-/**
- * Generated from StandaloneSetup.xpt!
- */
 @SuppressWarnings("all")
 public class UISemanticsGrammarStandaloneSetupGenerated implements ISetup {
 
+	@Override
 	public Injector createInjectorAndDoEMFRegistration() {
-		org.eclipse.xtext.xbase.XbaseStandaloneSetup.doSetup();
+		XbaseStandaloneSetup.doSetup();
 
 		Injector injector = createInjector();
 		register(injector);
@@ -33,18 +35,14 @@
 	}
 	
 	public Injector createInjector() {
-		return Guice.createInjector(new org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammarRuntimeModule());
+		return Guice.createInjector(new UISemanticsGrammarRuntimeModule());
 	}
 	
 	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("uisemantic", resourceFactory);
-		org.eclipse.xtext.resource.IResourceServiceProvider.Registry.INSTANCE.getExtensionToFactoryMap().put("uisemantic", serviceProvider);
+		IResourceFactory resourceFactory = injector.getInstance(IResourceFactory.class);
+		IResourceServiceProvider serviceProvider = injector.getInstance(IResourceServiceProvider.class);
 		
-
-
-
+		Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("uisemantic", resourceFactory);
+		IResourceServiceProvider.Registry.INSTANCE.getExtensionToFactoryMap().put("uisemantic", serviceProvider);
 	}
 }
diff --git a/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/UISemanticsGrammarAntlrTokenFileProvider.java b/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/UISemanticsGrammarAntlrTokenFileProvider.java
index 5763fbc..4c8f59e 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/UISemanticsGrammarAntlrTokenFileProvider.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/UISemanticsGrammarAntlrTokenFileProvider.java
@@ -7,6 +7,9 @@
  *
  * Contributors:
  *         Florian Pirchner - Initial implementation
+ *
+ * generated by Xtext 2.11.0
+ *
  */
 
 package org.eclipse.osbp.ecview.uisemantics.parser.antlr;
@@ -15,9 +18,10 @@
 import org.eclipse.xtext.parser.antlr.IAntlrTokenFileProvider;
 
 public class UISemanticsGrammarAntlrTokenFileProvider implements IAntlrTokenFileProvider {
-	
+
+	@Override
 	public InputStream getAntlrTokenFile() {
 		ClassLoader classLoader = getClass().getClassLoader();
-    	return classLoader.getResourceAsStream("org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.tokens");
+		return classLoader.getResourceAsStream("org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.tokens");
 	}
 }
diff --git a/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/UISemanticsGrammarParser.java b/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/UISemanticsGrammarParser.java
index 551e5e3..1e657d4 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/UISemanticsGrammarParser.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/UISemanticsGrammarParser.java
@@ -7,41 +7,45 @@
  *
  * Contributors:
  *         Florian Pirchner - Initial implementation
+ *
+ * generated by Xtext 2.11.0
+ *
  */
 
 package org.eclipse.osbp.ecview.uisemantics.parser.antlr;
 
 import com.google.inject.Inject;
-
-import org.eclipse.xtext.parser.antlr.XtextTokenStream;
+import org.eclipse.osbp.ecview.uisemantics.parser.antlr.internal.InternalUISemanticsGrammarParser;
 import org.eclipse.osbp.ecview.uisemantics.services.UISemanticsGrammarGrammarAccess;
+import org.eclipse.xtext.parser.antlr.AbstractAntlrParser;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream;
 
-public class UISemanticsGrammarParser extends org.eclipse.xtext.parser.antlr.AbstractAntlrParser {
-	
+public class UISemanticsGrammarParser extends AbstractAntlrParser {
+
 	@Inject
 	private UISemanticsGrammarGrammarAccess grammarAccess;
-	
+
 	@Override
 	protected void setInitialHiddenTokens(XtextTokenStream tokenStream) {
 		tokenStream.setInitialHiddenTokens("RULE_WS", "RULE_ML_COMMENT", "RULE_SL_COMMENT");
 	}
 	
+
 	@Override
-	protected org.eclipse.osbp.ecview.uisemantics.parser.antlr.internal.InternalUISemanticsGrammarParser createParser(XtextTokenStream stream) {
-		return new org.eclipse.osbp.ecview.uisemantics.parser.antlr.internal.InternalUISemanticsGrammarParser(stream, getGrammarAccess());
+	protected InternalUISemanticsGrammarParser createParser(XtextTokenStream stream) {
+		return new InternalUISemanticsGrammarParser(stream, getGrammarAccess());
 	}
-	
+
 	@Override 
 	protected String getDefaultRuleName() {
 		return "UxModel";
 	}
-	
+
 	public UISemanticsGrammarGrammarAccess getGrammarAccess() {
 		return this.grammarAccess;
 	}
-	
+
 	public void setGrammarAccess(UISemanticsGrammarGrammarAccess grammarAccess) {
 		this.grammarAccess = grammarAccess;
 	}
-	
 }
diff --git a/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g b/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g
index 5750a3a..b94d67d 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g
+++ b/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g
@@ -7,13 +7,15 @@
  *
  * Contributors:
  *         Florian Pirchner - Initial implementation
+ *
+ * generated by Xtext 2.11.0
+ *
  */
 
 grammar InternalUISemanticsGrammar;
 
 options {
 	superClass=AbstractInternalAntlrParser;
-	
 }
 
 @lexer::header {
@@ -25,7 +27,7 @@
 }
 
 @parser::header {
-package org.eclipse.osbp.ecview.uisemantics.parser.antlr.internal; 
+package org.eclipse.osbp.ecview.uisemantics.parser.antlr.internal;
 
 import org.eclipse.xtext.*;
 import org.eclipse.xtext.parser.*;
@@ -43,6915 +45,7271 @@
 @parser::members {
 
  	private UISemanticsGrammarGrammarAccess grammarAccess;
- 	
+
     public InternalUISemanticsGrammarParser(TokenStream input, UISemanticsGrammarGrammarAccess grammarAccess) {
         this(input);
         this.grammarAccess = grammarAccess;
         registerRules(grammarAccess.getGrammar());
     }
-    
+
     @Override
     protected String getFirstRuleName() {
-    	return "UxModel";	
+    	return "UxModel";
    	}
-   	
+
    	@Override
    	protected UISemanticsGrammarGrammarAccess getGrammarAccess() {
    		return grammarAccess;
    	}
+
 }
 
-@rulecatch { 
-    catch (RecognitionException re) { 
-        recover(input,re); 
+@rulecatch {
+    catch (RecognitionException re) {
+        recover(input,re);
         appendSkippedTokens();
-    } 
+    }
 }
 
-
-
-
 // Entry rule entryRuleUxModel
-entryRuleUxModel returns [EObject current=null] 
-	:
+entryRuleUxModel returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUxModelRule()); }
-	 iv_ruleUxModel=ruleUxModel 
-	 { $current=$iv_ruleUxModel.current; } 
-	 EOF 
-;
+	iv_ruleUxModel=ruleUxModel
+	{ $current=$iv_ruleUxModel.current; }
+	EOF;
 
 // Rule UxModel
-ruleUxModel returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUxModelAccess().getUxModelAction_0(),
-            $current);
-    }
-)(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUxModelAccess().getImportSectionXImportSectionParserRuleCall_1_0()); 
-	    }
-		lv_importSection_1_0=ruleXImportSection		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUxModelRule());
-	        }
-       		set(
-       			$current, 
-       			"importSection",
-        		lv_importSection_1_0, 
-        		"XImportSection");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)?(	otherlv_2='actions' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getUxModelAccess().getActionsKeyword_2_0());
-    }
-	otherlv_3='{' 
-    {
-    	newLeafNode(otherlv_3, grammarAccess.getUxModelAccess().getLeftCurlyBracketKeyword_2_1());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUxModelAccess().getViewActionsUxActionParserRuleCall_2_2_0()); 
-	    }
-		lv_viewActions_4_0=ruleUxAction		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUxModelRule());
-	        }
-       		add(
-       			$current, 
-       			"viewActions",
-        		lv_viewActions_4_0, 
-        		"UxAction");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_5='}' 
-    {
-    	newLeafNode(otherlv_5, grammarAccess.getUxModelAccess().getRightCurlyBracketKeyword_2_3());
-    }
-)?(	otherlv_6='categories' 
-    {
-    	newLeafNode(otherlv_6, grammarAccess.getUxModelAccess().getCategoriesKeyword_3_0());
-    }
-	otherlv_7='{' 
-    {
-    	newLeafNode(otherlv_7, grammarAccess.getUxModelAccess().getLeftCurlyBracketKeyword_3_1());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUxModelAccess().getCategoriesUxViewCategoryParserRuleCall_3_2_0()); 
-	    }
-		lv_categories_8_0=ruleUxViewCategory		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUxModelRule());
-	        }
-       		add(
-       			$current, 
-       			"categories",
-        		lv_categories_8_0, 
-        		"UxViewCategory");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_9='}' 
-    {
-    	newLeafNode(otherlv_9, grammarAccess.getUxModelAccess().getRightCurlyBracketKeyword_3_3());
-    }
-)?(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUxModelAccess().getElementDefinitionsUxElementDefinitionParserRuleCall_4_0()); 
-	    }
-		lv_elementDefinitions_10_0=ruleUxElementDefinition		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUxModelRule());
-	        }
-       		add(
-       			$current, 
-       			"elementDefinitions",
-        		lv_elementDefinitions_10_0, 
-        		"UxElementDefinition");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*)
+ruleUxModel returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUxModelAccess().getUxModelAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUxModelAccess().getImportSectionXImportSectionParserRuleCall_1_0());
+				}
+				lv_importSection_1_0=ruleXImportSection
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUxModelRule());
+					}
+					set(
+						$current,
+						"importSection",
+						lv_importSection_1_0,
+						"org.eclipse.xtext.xbase.Xtype.XImportSection");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			otherlv_2='actions'
+			{
+				newLeafNode(otherlv_2, grammarAccess.getUxModelAccess().getActionsKeyword_2_0());
+			}
+			otherlv_3='{'
+			{
+				newLeafNode(otherlv_3, grammarAccess.getUxModelAccess().getLeftCurlyBracketKeyword_2_1());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUxModelAccess().getViewActionsUxActionParserRuleCall_2_2_0());
+					}
+					lv_viewActions_4_0=ruleUxAction
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUxModelRule());
+						}
+						add(
+							$current,
+							"viewActions",
+							lv_viewActions_4_0,
+							"org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.UxAction");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)*
+			otherlv_5='}'
+			{
+				newLeafNode(otherlv_5, grammarAccess.getUxModelAccess().getRightCurlyBracketKeyword_2_3());
+			}
+		)?
+		(
+			otherlv_6='categories'
+			{
+				newLeafNode(otherlv_6, grammarAccess.getUxModelAccess().getCategoriesKeyword_3_0());
+			}
+			otherlv_7='{'
+			{
+				newLeafNode(otherlv_7, grammarAccess.getUxModelAccess().getLeftCurlyBracketKeyword_3_1());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUxModelAccess().getCategoriesUxViewCategoryParserRuleCall_3_2_0());
+					}
+					lv_categories_8_0=ruleUxViewCategory
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUxModelRule());
+						}
+						add(
+							$current,
+							"categories",
+							lv_categories_8_0,
+							"org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.UxViewCategory");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)*
+			otherlv_9='}'
+			{
+				newLeafNode(otherlv_9, grammarAccess.getUxModelAccess().getRightCurlyBracketKeyword_3_3());
+			}
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUxModelAccess().getElementDefinitionsUxElementDefinitionParserRuleCall_4_0());
+				}
+				lv_elementDefinitions_10_0=ruleUxElementDefinition
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUxModelRule());
+					}
+					add(
+						$current,
+						"elementDefinitions",
+						lv_elementDefinitions_10_0,
+						"org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.UxElementDefinition");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUxAction
-entryRuleUxAction returns [EObject current=null] 
-	:
+entryRuleUxAction returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUxActionRule()); }
-	 iv_ruleUxAction=ruleUxAction 
-	 { $current=$iv_ruleUxAction.current; } 
-	 EOF 
-;
+	iv_ruleUxAction=ruleUxAction
+	{ $current=$iv_ruleUxAction.current; }
+	EOF;
 
 // Rule UxAction
-ruleUxAction returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUxActionAccess().getNameQualifiedNameParserRuleCall_0_0()); 
-	    }
-		lv_name_0_0=ruleQualifiedName		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUxActionRule());
-	        }
-       		set(
-       			$current, 
-       			"name",
-        		lv_name_0_0, 
-        		"QualifiedName");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_1='externalCommand' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUxActionAccess().getExternalCommandKeyword_1_0());
-    }
-(
-(
-		lv_externalCommandId_2_0=RULE_STRING
-		{
-			newLeafNode(lv_externalCommandId_2_0, grammarAccess.getUxActionAccess().getExternalCommandIdSTRINGTerminalRuleCall_1_1_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUxActionRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"externalCommandId",
-        		lv_externalCommandId_2_0, 
-        		"STRING");
-	    }
-
-)
-))?(
-(
-		lv_initialDisabled_3_0=	'disabled' 
-    {
-        newLeafNode(lv_initialDisabled_3_0, grammarAccess.getUxActionAccess().getInitialDisabledDisabledKeyword_2_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUxActionRule());
-	        }
-       		setWithLastConsumed($current, "initialDisabled", true, "disabled");
-	    }
-
-)
-)?)
+ruleUxAction returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUxActionAccess().getNameQualifiedNameParserRuleCall_0_0());
+				}
+				lv_name_0_0=ruleQualifiedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUxActionRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_0_0,
+						"org.eclipse.xtext.xbase.Xbase.QualifiedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_1='externalCommand'
+			{
+				newLeafNode(otherlv_1, grammarAccess.getUxActionAccess().getExternalCommandKeyword_1_0());
+			}
+			(
+				(
+					lv_externalCommandId_2_0=RULE_STRING
+					{
+						newLeafNode(lv_externalCommandId_2_0, grammarAccess.getUxActionAccess().getExternalCommandIdSTRINGTerminalRuleCall_1_1_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getUxActionRule());
+						}
+						setWithLastConsumed(
+							$current,
+							"externalCommandId",
+							lv_externalCommandId_2_0,
+							"org.eclipse.xtext.xbase.Xtype.STRING");
+					}
+				)
+			)
+		)?
+		(
+			(
+				lv_initialDisabled_3_0='disabled'
+				{
+					newLeafNode(lv_initialDisabled_3_0, grammarAccess.getUxActionAccess().getInitialDisabledDisabledKeyword_2_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUxActionRule());
+					}
+					setWithLastConsumed($current, "initialDisabled", true, "disabled");
+				}
+			)
+		)?
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUxViewCategory
-entryRuleUxViewCategory returns [EObject current=null] 
-	:
+entryRuleUxViewCategory returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUxViewCategoryRule()); }
-	 iv_ruleUxViewCategory=ruleUxViewCategory 
-	 { $current=$iv_ruleUxViewCategory.current; } 
-	 EOF 
-;
+	iv_ruleUxViewCategory=ruleUxViewCategory
+	{ $current=$iv_ruleUxViewCategory.current; }
+	EOF;
 
 // Rule UxViewCategory
-ruleUxViewCategory returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUxViewCategoryAccess().getNameQualifiedNameParserRuleCall_0()); 
-	    }
-		lv_name_0_0=ruleQualifiedName		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUxViewCategoryRule());
-	        }
-       		set(
-       			$current, 
-       			"name",
-        		lv_name_0_0, 
-        		"QualifiedName");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
+ruleUxViewCategory returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				newCompositeNode(grammarAccess.getUxViewCategoryAccess().getNameQualifiedNameParserRuleCall_0());
+			}
+			lv_name_0_0=ruleQualifiedName
+			{
+				if ($current==null) {
+					$current = createModelElementForParent(grammarAccess.getUxViewCategoryRule());
+				}
+				set(
+					$current,
+					"name",
+					lv_name_0_0,
+					"org.eclipse.xtext.xbase.Xbase.QualifiedName");
+				afterParserOrEnumRuleCall();
+			}
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleXImportDeclaration
-entryRuleXImportDeclaration returns [EObject current=null] 
-	:
+entryRuleXImportDeclaration returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getXImportDeclarationRule()); }
-	 iv_ruleXImportDeclaration=ruleXImportDeclaration 
-	 { $current=$iv_ruleXImportDeclaration.current; } 
-	 EOF 
-;
+	iv_ruleXImportDeclaration=ruleXImportDeclaration
+	{ $current=$iv_ruleXImportDeclaration.current; }
+	EOF;
 
 // Rule XImportDeclaration
-ruleXImportDeclaration returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getXImportDeclarationAccess().getUxImportSectionDeclarationAction_0_0(),
-            $current);
-    }
-)(	otherlv_1='import' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getXImportDeclarationAccess().getImportKeyword_0_1_0());
-    }
-(((
-(
-		lv_static_2_0=	'static' 
-    {
-        newLeafNode(lv_static_2_0, grammarAccess.getXImportDeclarationAccess().getStaticStaticKeyword_0_1_1_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_0_1_1_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_0_1_1_0_2_0()); 
-	    }
-		ruleQualifiedNameInStaticImport		{ 
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)((
-(
-		lv_wildcard_5_0=	'*' 
-    {
-        newLeafNode(lv_wildcard_5_0, grammarAccess.getXImportDeclarationAccess().getWildcardAsteriskKeyword_0_1_1_0_3_0_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getXImportDeclarationRule());
-	        }
-       		setWithLastConsumed($current, "wildcard", true, "*");
-	    }
-
-)
-)
-    |(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXImportDeclarationAccess().getMemberNameValidIDParserRuleCall_0_1_1_0_3_1_0()); 
-	    }
-		lv_memberName_6_0=ruleValidID		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXImportDeclarationRule());
-	        }
-       		set(
-       			$current, 
-       			"memberName",
-        		lv_memberName_6_0, 
-        		"ValidID");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)))
-    |(
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getXImportDeclarationRule());
-	        }
-        }
-		{ 
-	        newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_0_1_1_1_0()); 
-	    }
-		ruleQualifiedName		{ 
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
-    |(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceQualifiedNameWithWildcardParserRuleCall_0_1_1_2_0()); 
-	    }
-		lv_importedNamespace_8_0=ruleQualifiedNameWithWildcard		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXImportDeclarationRule());
-	        }
-       		set(
-       			$current, 
-       			"importedNamespace",
-        		lv_importedNamespace_8_0, 
-        		"QualifiedNameWithWildcard");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))))
-    |((	otherlv_9='ePackage' 
-    {
-    	newLeafNode(otherlv_9, grammarAccess.getXImportDeclarationAccess().getEPackageKeyword_1_0_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedEPackageUxEPackageImportParserRuleCall_1_0_1_0()); 
-	    }
-		lv_importedEPackage_10_0=ruleUxEPackageImport		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXImportDeclarationRule());
-	        }
-       		set(
-       			$current, 
-       			"importedEPackage",
-        		lv_importedEPackage_10_0, 
-        		"UxEPackageImport");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))(	otherlv_11=';' 
-    {
-    	newLeafNode(otherlv_11, grammarAccess.getXImportDeclarationAccess().getSemicolonKeyword_1_1());
-    }
-)?))
+ruleXImportDeclaration returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					$current = forceCreateModelElement(
+						grammarAccess.getXImportDeclarationAccess().getUxImportSectionDeclarationAction_0_0(),
+						$current);
+				}
+			)
+			(
+				otherlv_1='import'
+				{
+					newLeafNode(otherlv_1, grammarAccess.getXImportDeclarationAccess().getImportKeyword_0_1_0());
+				}
+				(
+					(
+						(
+							(
+								lv_static_2_0='static'
+								{
+									newLeafNode(lv_static_2_0, grammarAccess.getXImportDeclarationAccess().getStaticStaticKeyword_0_1_1_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_0_1_1_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_0_1_1_0_2_0());
+								}
+								ruleQualifiedNameInStaticImport
+								{
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+						(
+							(
+								(
+									lv_wildcard_5_0='*'
+									{
+										newLeafNode(lv_wildcard_5_0, grammarAccess.getXImportDeclarationAccess().getWildcardAsteriskKeyword_0_1_1_0_3_0_0());
+									}
+									{
+										if ($current==null) {
+											$current = createModelElement(grammarAccess.getXImportDeclarationRule());
+										}
+										setWithLastConsumed($current, "wildcard", true, "*");
+									}
+								)
+							)
+							    |
+							(
+								(
+									{
+										newCompositeNode(grammarAccess.getXImportDeclarationAccess().getMemberNameValidIDParserRuleCall_0_1_1_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_0_1_1_1_0());
+							}
+							ruleQualifiedName
+							{
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceQualifiedNameWithWildcardParserRuleCall_0_1_1_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();
+							}
+						)
+					)
+				)
+			)
+		)
+		    |
+		(
+			(
+				otherlv_9='ePackage'
+				{
+					newLeafNode(otherlv_9, grammarAccess.getXImportDeclarationAccess().getEPackageKeyword_1_0_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedEPackageUxEPackageImportParserRuleCall_1_0_1_0());
+						}
+						lv_importedEPackage_10_0=ruleUxEPackageImport
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getXImportDeclarationRule());
+							}
+							set(
+								$current,
+								"importedEPackage",
+								lv_importedEPackage_10_0,
+								"org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.UxEPackageImport");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)
+			(
+				otherlv_11=';'
+				{
+					newLeafNode(otherlv_11, grammarAccess.getXImportDeclarationAccess().getSemicolonKeyword_1_1());
+				}
+			)?
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUxEPackageImport
-entryRuleUxEPackageImport returns [EObject current=null] 
-	:
+entryRuleUxEPackageImport returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUxEPackageImportRule()); }
-	 iv_ruleUxEPackageImport=ruleUxEPackageImport 
-	 { $current=$iv_ruleUxEPackageImport.current; } 
-	 EOF 
-;
+	iv_ruleUxEPackageImport=ruleUxEPackageImport
+	{ $current=$iv_ruleUxEPackageImport.current; }
+	EOF;
 
 // Rule UxEPackageImport
-ruleUxEPackageImport returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-(
+ruleUxEPackageImport returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUxEPackageImportRule());
+					}
+				}
+				otherlv_0=RULE_STRING
+				{
+					newLeafNode(otherlv_0, grammarAccess.getUxEPackageImportAccess().getEPackageEPackageCrossReference_0_0());
+				}
+			)
+		)
+		otherlv_1='as'
 		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUxEPackageImportRule());
-	        }
-        }
-	otherlv_0=RULE_STRING
-	{
-		newLeafNode(otherlv_0, grammarAccess.getUxEPackageImportAccess().getEPackageEPackageCrossReference_0_0()); 
-	}
-
-)
-)	otherlv_1='as' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getUxEPackageImportAccess().getAsKeyword_1());
-    }
-(
-(
-		lv_alias_2_0=RULE_ID
-		{
-			newLeafNode(lv_alias_2_0, grammarAccess.getUxEPackageImportAccess().getAliasIDTerminalRuleCall_2_0()); 
+			newLeafNode(otherlv_1, grammarAccess.getUxEPackageImportAccess().getAsKeyword_1());
 		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUxEPackageImportRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"alias",
-        		lv_alias_2_0, 
-        		"ID");
-	    }
-
-)
-))
+		(
+			(
+				lv_alias_2_0=RULE_ID
+				{
+					newLeafNode(lv_alias_2_0, grammarAccess.getUxEPackageImportAccess().getAliasIDTerminalRuleCall_2_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUxEPackageImportRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"alias",
+						lv_alias_2_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUxElementDefinition
-entryRuleUxElementDefinition returns [EObject current=null] 
-	:
+entryRuleUxElementDefinition returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUxElementDefinitionRule()); }
-	 iv_ruleUxElementDefinition=ruleUxElementDefinition 
-	 { $current=$iv_ruleUxElementDefinition.current; } 
-	 EOF 
-;
+	iv_ruleUxElementDefinition=ruleUxElementDefinition
+	{ $current=$iv_ruleUxElementDefinition.current; }
+	EOF;
 
 // Rule UxElementDefinition
-ruleUxElementDefinition returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='element' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getUxElementDefinitionAccess().getElementKeyword_0());
-    }
-(
-(
-		lv_name_1_0=RULE_ID
+ruleUxElementDefinition returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='element'
 		{
-			newLeafNode(lv_name_1_0, grammarAccess.getUxElementDefinitionAccess().getNameIDTerminalRuleCall_1_0()); 
+			newLeafNode(otherlv_0, grammarAccess.getUxElementDefinitionAccess().getElementKeyword_0());
 		}
+		(
+			(
+				lv_name_1_0=RULE_ID
+				{
+					newLeafNode(lv_name_1_0, grammarAccess.getUxElementDefinitionAccess().getNameIDTerminalRuleCall_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUxElementDefinitionRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_1_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)
+		otherlv_2='{'
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUxElementDefinitionRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"name",
-        		lv_name_1_0, 
-        		"ID");
-	    }
-
-)
-)	otherlv_2='{' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getUxElementDefinitionAccess().getLeftCurlyBracketKeyword_2());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUxElementDefinitionAccess().getUriUxElementURIParserRuleCall_3_0()); 
-	    }
-		lv_uri_3_0=ruleUxElementURI		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUxElementDefinitionRule());
-	        }
-       		set(
-       			$current, 
-       			"uri",
-        		lv_uri_3_0, 
-        		"UxElementURI");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)?(	otherlv_4='bindings' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getUxElementDefinitionAccess().getBindingsKeyword_4_0());
-    }
-	otherlv_5='{' 
-    {
-    	newLeafNode(otherlv_5, grammarAccess.getUxElementDefinitionAccess().getLeftCurlyBracketKeyword_4_1());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUxElementDefinitionAccess().getBindingContainerUxAvailableBindingsParserRuleCall_4_2_0()); 
-	    }
-		lv_bindingContainer_6_0=ruleUxAvailableBindings		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUxElementDefinitionRule());
-	        }
-       		set(
-       			$current, 
-       			"bindingContainer",
-        		lv_bindingContainer_6_0, 
-        		"UxAvailableBindings");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_7='}' 
-    {
-    	newLeafNode(otherlv_7, grammarAccess.getUxElementDefinitionAccess().getRightCurlyBracketKeyword_4_3());
-    }
-)?(	otherlv_8='visibility' 
-    {
-    	newLeafNode(otherlv_8, grammarAccess.getUxElementDefinitionAccess().getVisibilityKeyword_5_0());
-    }
-	otherlv_9='{' 
-    {
-    	newLeafNode(otherlv_9, grammarAccess.getUxElementDefinitionAccess().getLeftCurlyBracketKeyword_5_1());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUxElementDefinitionAccess().getVisibilityContainerUxAvailableVisibilityOptionsParserRuleCall_5_2_0()); 
-	    }
-		lv_visibilityContainer_10_0=ruleUxAvailableVisibilityOptions		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUxElementDefinitionRule());
-	        }
-       		set(
-       			$current, 
-       			"visibilityContainer",
-        		lv_visibilityContainer_10_0, 
-        		"UxAvailableVisibilityOptions");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_11='}' 
-    {
-    	newLeafNode(otherlv_11, grammarAccess.getUxElementDefinitionAccess().getRightCurlyBracketKeyword_5_3());
-    }
-)?(	otherlv_12='validator' 
-    {
-    	newLeafNode(otherlv_12, grammarAccess.getUxElementDefinitionAccess().getValidatorKeyword_6_0());
-    }
-	otherlv_13='{' 
-    {
-    	newLeafNode(otherlv_13, grammarAccess.getUxElementDefinitionAccess().getLeftCurlyBracketKeyword_6_1());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUxElementDefinitionAccess().getValidatorContainerUxAvailableValidatorPropertiesParserRuleCall_6_2_0()); 
-	    }
-		lv_validatorContainer_14_0=ruleUxAvailableValidatorProperties		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUxElementDefinitionRule());
-	        }
-       		set(
-       			$current, 
-       			"validatorContainer",
-        		lv_validatorContainer_14_0, 
-        		"UxAvailableValidatorProperties");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_15='}' 
-    {
-    	newLeafNode(otherlv_15, grammarAccess.getUxElementDefinitionAccess().getRightCurlyBracketKeyword_6_3());
-    }
-)?	otherlv_16='}' 
-    {
-    	newLeafNode(otherlv_16, grammarAccess.getUxElementDefinitionAccess().getRightCurlyBracketKeyword_7());
-    }
-)
+			newLeafNode(otherlv_2, grammarAccess.getUxElementDefinitionAccess().getLeftCurlyBracketKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUxElementDefinitionAccess().getUriUxElementURIParserRuleCall_3_0());
+				}
+				lv_uri_3_0=ruleUxElementURI
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUxElementDefinitionRule());
+					}
+					set(
+						$current,
+						"uri",
+						lv_uri_3_0,
+						"org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.UxElementURI");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			otherlv_4='bindings'
+			{
+				newLeafNode(otherlv_4, grammarAccess.getUxElementDefinitionAccess().getBindingsKeyword_4_0());
+			}
+			otherlv_5='{'
+			{
+				newLeafNode(otherlv_5, grammarAccess.getUxElementDefinitionAccess().getLeftCurlyBracketKeyword_4_1());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUxElementDefinitionAccess().getBindingContainerUxAvailableBindingsParserRuleCall_4_2_0());
+					}
+					lv_bindingContainer_6_0=ruleUxAvailableBindings
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUxElementDefinitionRule());
+						}
+						set(
+							$current,
+							"bindingContainer",
+							lv_bindingContainer_6_0,
+							"org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.UxAvailableBindings");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			otherlv_7='}'
+			{
+				newLeafNode(otherlv_7, grammarAccess.getUxElementDefinitionAccess().getRightCurlyBracketKeyword_4_3());
+			}
+		)?
+		(
+			otherlv_8='visibility'
+			{
+				newLeafNode(otherlv_8, grammarAccess.getUxElementDefinitionAccess().getVisibilityKeyword_5_0());
+			}
+			otherlv_9='{'
+			{
+				newLeafNode(otherlv_9, grammarAccess.getUxElementDefinitionAccess().getLeftCurlyBracketKeyword_5_1());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUxElementDefinitionAccess().getVisibilityContainerUxAvailableVisibilityOptionsParserRuleCall_5_2_0());
+					}
+					lv_visibilityContainer_10_0=ruleUxAvailableVisibilityOptions
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUxElementDefinitionRule());
+						}
+						set(
+							$current,
+							"visibilityContainer",
+							lv_visibilityContainer_10_0,
+							"org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.UxAvailableVisibilityOptions");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			otherlv_11='}'
+			{
+				newLeafNode(otherlv_11, grammarAccess.getUxElementDefinitionAccess().getRightCurlyBracketKeyword_5_3());
+			}
+		)?
+		(
+			otherlv_12='validator'
+			{
+				newLeafNode(otherlv_12, grammarAccess.getUxElementDefinitionAccess().getValidatorKeyword_6_0());
+			}
+			otherlv_13='{'
+			{
+				newLeafNode(otherlv_13, grammarAccess.getUxElementDefinitionAccess().getLeftCurlyBracketKeyword_6_1());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getUxElementDefinitionAccess().getValidatorContainerUxAvailableValidatorPropertiesParserRuleCall_6_2_0());
+					}
+					lv_validatorContainer_14_0=ruleUxAvailableValidatorProperties
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getUxElementDefinitionRule());
+						}
+						set(
+							$current,
+							"validatorContainer",
+							lv_validatorContainer_14_0,
+							"org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.UxAvailableValidatorProperties");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			otherlv_15='}'
+			{
+				newLeafNode(otherlv_15, grammarAccess.getUxElementDefinitionAccess().getRightCurlyBracketKeyword_6_3());
+			}
+		)?
+		otherlv_16='}'
+		{
+			newLeafNode(otherlv_16, grammarAccess.getUxElementDefinitionAccess().getRightCurlyBracketKeyword_7());
+		}
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUxAvailableValidatorProperties
-entryRuleUxAvailableValidatorProperties returns [EObject current=null] 
-	:
+entryRuleUxAvailableValidatorProperties returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUxAvailableValidatorPropertiesRule()); }
-	 iv_ruleUxAvailableValidatorProperties=ruleUxAvailableValidatorProperties 
-	 { $current=$iv_ruleUxAvailableValidatorProperties.current; } 
-	 EOF 
-;
+	iv_ruleUxAvailableValidatorProperties=ruleUxAvailableValidatorProperties
+	{ $current=$iv_ruleUxAvailableValidatorProperties.current; }
+	EOF;
 
 // Rule UxAvailableValidatorProperties
-ruleUxAvailableValidatorProperties returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUxAvailableValidatorPropertiesAccess().getUxAvailableValidatorPropertiesAction_0(),
-            $current);
-    }
-)(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUxAvailableValidatorPropertiesAccess().getPropertiesUxValidatorPropertyParserRuleCall_1_0()); 
-	    }
-		lv_properties_1_0=ruleUxValidatorProperty		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUxAvailableValidatorPropertiesRule());
-	        }
-       		add(
-       			$current, 
-       			"properties",
-        		lv_properties_1_0, 
-        		"UxValidatorProperty");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*)
+ruleUxAvailableValidatorProperties returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUxAvailableValidatorPropertiesAccess().getUxAvailableValidatorPropertiesAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUxAvailableValidatorPropertiesAccess().getPropertiesUxValidatorPropertyParserRuleCall_1_0());
+				}
+				lv_properties_1_0=ruleUxValidatorProperty
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUxAvailableValidatorPropertiesRule());
+					}
+					add(
+						$current,
+						"properties",
+						lv_properties_1_0,
+						"org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.UxValidatorProperty");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUxValidatorProperty
-entryRuleUxValidatorProperty returns [EObject current=null] 
-	:
+entryRuleUxValidatorProperty returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUxValidatorPropertyRule()); }
-	 iv_ruleUxValidatorProperty=ruleUxValidatorProperty 
-	 { $current=$iv_ruleUxValidatorProperty.current; } 
-	 EOF 
-;
+	iv_ruleUxValidatorProperty=ruleUxValidatorProperty
+	{ $current=$iv_ruleUxValidatorProperty.current; }
+	EOF;
 
 // Rule UxValidatorProperty
-ruleUxValidatorProperty returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='property' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getUxValidatorPropertyAccess().getPropertyKeyword_0());
-    }
-(
-(
-		lv_name_1_0=RULE_ID
+ruleUxValidatorProperty returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='property'
 		{
-			newLeafNode(lv_name_1_0, grammarAccess.getUxValidatorPropertyAccess().getNameIDTerminalRuleCall_1_0()); 
+			newLeafNode(otherlv_0, grammarAccess.getUxValidatorPropertyAccess().getPropertyKeyword_0());
 		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUxValidatorPropertyRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"name",
-        		lv_name_1_0, 
-        		"ID");
-	    }
-
-)
-))
+		(
+			(
+				lv_name_1_0=RULE_ID
+				{
+					newLeafNode(lv_name_1_0, grammarAccess.getUxValidatorPropertyAccess().getNameIDTerminalRuleCall_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUxValidatorPropertyRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_1_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUxElementURI
-entryRuleUxElementURI returns [EObject current=null] 
-	:
+entryRuleUxElementURI returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUxElementURIRule()); }
-	 iv_ruleUxElementURI=ruleUxElementURI 
-	 { $current=$iv_ruleUxElementURI.current; } 
-	 EOF 
-;
+	iv_ruleUxElementURI=ruleUxElementURI
+	{ $current=$iv_ruleUxElementURI.current; }
+	EOF;
 
 // Rule UxElementURI
-ruleUxElementURI returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='uri' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getUxElementURIAccess().getUriKeyword_0());
-    }
-(
-(
+ruleUxElementURI returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='uri'
 		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUxElementURIRule());
-	        }
-        }
-	otherlv_1=RULE_ID
-	{
-		newLeafNode(otherlv_1, grammarAccess.getUxElementURIAccess().getEPackageUxEPackageImportCrossReference_1_0()); 
-	}
-
-)
-)	otherlv_2=':' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getUxElementURIAccess().getColonKeyword_2());
-    }
-(
-(
+			newLeafNode(otherlv_0, grammarAccess.getUxElementURIAccess().getUriKeyword_0());
+		}
+		(
+			(
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUxElementURIRule());
+					}
+				}
+				otherlv_1=RULE_ID
+				{
+					newLeafNode(otherlv_1, grammarAccess.getUxElementURIAccess().getEPackageUxEPackageImportCrossReference_1_0());
+				}
+			)
+		)
+		otherlv_2=':'
 		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUxElementURIRule());
-	        }
-        }
-	otherlv_3=RULE_ID
-	{
-		newLeafNode(otherlv_3, grammarAccess.getUxElementURIAccess().getEClassEClassCrossReference_3_0()); 
-	}
-
-)
-))
+			newLeafNode(otherlv_2, grammarAccess.getUxElementURIAccess().getColonKeyword_2());
+		}
+		(
+			(
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUxElementURIRule());
+					}
+				}
+				otherlv_3=RULE_ID
+				{
+					newLeafNode(otherlv_3, grammarAccess.getUxElementURIAccess().getEClassEClassCrossReference_3_0());
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUxAvailableBindings
-entryRuleUxAvailableBindings returns [EObject current=null] 
-	:
+entryRuleUxAvailableBindings returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUxAvailableBindingsRule()); }
-	 iv_ruleUxAvailableBindings=ruleUxAvailableBindings 
-	 { $current=$iv_ruleUxAvailableBindings.current; } 
-	 EOF 
-;
+	iv_ruleUxAvailableBindings=ruleUxAvailableBindings
+	{ $current=$iv_ruleUxAvailableBindings.current; }
+	EOF;
 
 // Rule UxAvailableBindings
-ruleUxAvailableBindings returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUxAvailableBindingsAccess().getUxAvailableBindingsAction_0(),
-            $current);
-    }
-)(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUxAvailableBindingsAccess().getBindingsUxBindingableOptionParserRuleCall_1_0()); 
-	    }
-		lv_bindings_1_0=ruleUxBindingableOption		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUxAvailableBindingsRule());
-	        }
-       		add(
-       			$current, 
-       			"bindings",
-        		lv_bindings_1_0, 
-        		"UxBindingableOption");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*)
+ruleUxAvailableBindings returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUxAvailableBindingsAccess().getUxAvailableBindingsAction_0(),
+					$current);
+			}
+		)
+		(
+			otherlv_1='extends'
+			{
+				newLeafNode(otherlv_1, grammarAccess.getUxAvailableBindingsAccess().getExtendsKeyword_1_0());
+			}
+			(
+				(
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getUxAvailableBindingsRule());
+						}
+					}
+					otherlv_2=RULE_ID
+					{
+						newLeafNode(otherlv_2, grammarAccess.getUxAvailableBindingsAccess().getSuperElementUxElementDefinitionCrossReference_1_1_0());
+					}
+				)
+			)
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUxAvailableBindingsAccess().getBindingsUxBindingableOptionParserRuleCall_2_0());
+				}
+				lv_bindings_3_0=ruleUxBindingableOption
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUxAvailableBindingsRule());
+					}
+					add(
+						$current,
+						"bindings",
+						lv_bindings_3_0,
+						"org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.UxBindingableOption");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUxAvailableVisibilityOptions
-entryRuleUxAvailableVisibilityOptions returns [EObject current=null] 
-	:
+entryRuleUxAvailableVisibilityOptions returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUxAvailableVisibilityOptionsRule()); }
-	 iv_ruleUxAvailableVisibilityOptions=ruleUxAvailableVisibilityOptions 
-	 { $current=$iv_ruleUxAvailableVisibilityOptions.current; } 
-	 EOF 
-;
+	iv_ruleUxAvailableVisibilityOptions=ruleUxAvailableVisibilityOptions
+	{ $current=$iv_ruleUxAvailableVisibilityOptions.current; }
+	EOF;
 
 // Rule UxAvailableVisibilityOptions
-ruleUxAvailableVisibilityOptions returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getUxAvailableVisibilityOptionsAccess().getUxAvailableVisibilityOptionsAction_0(),
-            $current);
-    }
-)(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUxAvailableVisibilityOptionsAccess().getBindingsUxVisibleableOptionParserRuleCall_1_0()); 
-	    }
-		lv_bindings_1_0=ruleUxVisibleableOption		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUxAvailableVisibilityOptionsRule());
-	        }
-       		add(
-       			$current, 
-       			"bindings",
-        		lv_bindings_1_0, 
-        		"UxVisibleableOption");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*)
+ruleUxAvailableVisibilityOptions returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUxAvailableVisibilityOptionsAccess().getUxAvailableVisibilityOptionsAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUxAvailableVisibilityOptionsAccess().getBindingsUxVisibleableOptionParserRuleCall_1_0());
+				}
+				lv_bindings_1_0=ruleUxVisibleableOption
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUxAvailableVisibilityOptionsRule());
+					}
+					add(
+						$current,
+						"bindings",
+						lv_bindings_1_0,
+						"org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.UxVisibleableOption");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUxBindingableOption
-entryRuleUxBindingableOption returns [EObject current=null] 
-	:
+entryRuleUxBindingableOption returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUxBindingableOptionRule()); }
-	 iv_ruleUxBindingableOption=ruleUxBindingableOption 
-	 { $current=$iv_ruleUxBindingableOption.current; } 
-	 EOF 
-;
+	iv_ruleUxBindingableOption=ruleUxBindingableOption
+	{ $current=$iv_ruleUxBindingableOption.current; }
+	EOF;
 
 // Rule UxBindingableOption
-ruleUxBindingableOption returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-(
-		lv_final_0_0=	'final' 
-    {
-        newLeafNode(lv_final_0_0, grammarAccess.getUxBindingableOptionAccess().getFinalFinalKeyword_0_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUxBindingableOptionRule());
-	        }
-       		setWithLastConsumed($current, "final", true, "final");
-	    }
-
-)
-)?(
-(
-		lv_listbinding_1_0=	'list' 
-    {
-        newLeafNode(lv_listbinding_1_0, grammarAccess.getUxBindingableOptionAccess().getListbindingListKeyword_1_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUxBindingableOptionRule());
-	        }
-       		setWithLastConsumed($current, "listbinding", true, "list");
-	    }
-
-)
-)?	otherlv_2='endpoint' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getUxBindingableOptionAccess().getEndpointKeyword_2());
-    }
-(
-(
-		lv_name_3_0=RULE_ID
+ruleUxBindingableOption returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				lv_final_0_0='final'
+				{
+					newLeafNode(lv_final_0_0, grammarAccess.getUxBindingableOptionAccess().getFinalFinalKeyword_0_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUxBindingableOptionRule());
+					}
+					setWithLastConsumed($current, "final", true, "final");
+				}
+			)
+		)?
+		(
+			(
+				lv_listbinding_1_0='list'
+				{
+					newLeafNode(lv_listbinding_1_0, grammarAccess.getUxBindingableOptionAccess().getListbindingListKeyword_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUxBindingableOptionRule());
+					}
+					setWithLastConsumed($current, "listbinding", true, "list");
+				}
+			)
+		)?
+		otherlv_2='endpoint'
 		{
-			newLeafNode(lv_name_3_0, grammarAccess.getUxBindingableOptionAccess().getNameIDTerminalRuleCall_3_0()); 
+			newLeafNode(otherlv_2, grammarAccess.getUxBindingableOptionAccess().getEndpointKeyword_2());
 		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUxBindingableOptionRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"name",
-        		lv_name_3_0, 
-        		"ID");
-	    }
-
-)
-)(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUxBindingableOptionAccess().getJvmTypeJvmTypeReferenceParserRuleCall_4_0()); 
-	    }
-		lv_jvmType_4_0=ruleJvmTypeReference		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUxBindingableOptionRule());
-	        }
-       		set(
-       			$current, 
-       			"jvmType",
-        		lv_jvmType_4_0, 
-        		"JvmTypeReference");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_5='target' 
-    {
-    	newLeafNode(otherlv_5, grammarAccess.getUxBindingableOptionAccess().getTargetKeyword_5_0());
-    }
-(
-(
-		lv_targetName_6_0=RULE_ID
-		{
-			newLeafNode(lv_targetName_6_0, grammarAccess.getUxBindingableOptionAccess().getTargetNameIDTerminalRuleCall_5_1_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUxBindingableOptionRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"targetName",
-        		lv_targetName_6_0, 
-        		"ID");
-	    }
-
-)
-))?)
+		(
+			(
+				lv_name_3_0=RULE_ID
+				{
+					newLeafNode(lv_name_3_0, grammarAccess.getUxBindingableOptionAccess().getNameIDTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUxBindingableOptionRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_3_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUxBindingableOptionAccess().getJvmTypeJvmTypeReferenceParserRuleCall_4_0());
+				}
+				lv_jvmType_4_0=ruleJvmTypeReference
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUxBindingableOptionRule());
+					}
+					set(
+						$current,
+						"jvmType",
+						lv_jvmType_4_0,
+						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_5='target'
+			{
+				newLeafNode(otherlv_5, grammarAccess.getUxBindingableOptionAccess().getTargetKeyword_5_0());
+			}
+			(
+				(
+					lv_targetName_6_0=RULE_ID
+					{
+						newLeafNode(lv_targetName_6_0, grammarAccess.getUxBindingableOptionAccess().getTargetNameIDTerminalRuleCall_5_1_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getUxBindingableOptionRule());
+						}
+						setWithLastConsumed(
+							$current,
+							"targetName",
+							lv_targetName_6_0,
+							"org.eclipse.xtext.xbase.Xtype.ID");
+					}
+				)
+			)
+		)?
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleUxVisibleableOption
-entryRuleUxVisibleableOption returns [EObject current=null] 
-	:
+entryRuleUxVisibleableOption returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getUxVisibleableOptionRule()); }
-	 iv_ruleUxVisibleableOption=ruleUxVisibleableOption 
-	 { $current=$iv_ruleUxVisibleableOption.current; } 
-	 EOF 
-;
+	iv_ruleUxVisibleableOption=ruleUxVisibleableOption
+	{ $current=$iv_ruleUxVisibleableOption.current; }
+	EOF;
 
 // Rule UxVisibleableOption
-ruleUxVisibleableOption returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='endpoint' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getUxVisibleableOptionAccess().getEndpointKeyword_0());
-    }
-(
-(
-		lv_name_1_0=RULE_ID
+ruleUxVisibleableOption returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='endpoint'
 		{
-			newLeafNode(lv_name_1_0, grammarAccess.getUxVisibleableOptionAccess().getNameIDTerminalRuleCall_1_0()); 
+			newLeafNode(otherlv_0, grammarAccess.getUxVisibleableOptionAccess().getEndpointKeyword_0());
 		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getUxVisibleableOptionRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"name",
-        		lv_name_1_0, 
-        		"ID");
-	    }
-
-)
-)(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getUxVisibleableOptionAccess().getJvmTypeJvmTypeReferenceParserRuleCall_2_0()); 
-	    }
-		lv_jvmType_2_0=ruleJvmTypeReference		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getUxVisibleableOptionRule());
-	        }
-       		set(
-       			$current, 
-       			"jvmType",
-        		lv_jvmType_2_0, 
-        		"JvmTypeReference");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
+		(
+			(
+				lv_name_1_0=RULE_ID
+				{
+					newLeafNode(lv_name_1_0, grammarAccess.getUxVisibleableOptionAccess().getNameIDTerminalRuleCall_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUxVisibleableOptionRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_1_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUxVisibleableOptionAccess().getJvmTypeJvmTypeReferenceParserRuleCall_2_0());
+				}
+				lv_jvmType_2_0=ruleJvmTypeReference
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUxVisibleableOptionRule());
+					}
+					set(
+						$current,
+						"jvmType",
+						lv_jvmType_2_0,
+						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleXExpression
-entryRuleXExpression returns [EObject current=null] 
-	:
+entryRuleXExpression returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getXExpressionRule()); }
-	 iv_ruleXExpression=ruleXExpression 
-	 { $current=$iv_ruleXExpression.current; } 
-	 EOF 
-;
+	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();
-    }
-
+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] 
-	:
+entryRuleXAssignment returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getXAssignmentRule()); }
-	 iv_ruleXAssignment=ruleXAssignment 
-	 { $current=$iv_ruleXAssignment.current; } 
-	 EOF 
-;
+	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();
-	    }
-
-)
-))?))
+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 
-;
+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()); 
-    }
-
-    ;
-
-
-
-
+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 
-;
+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()); 
-    }
-))
-    ;
-
-
-
-
+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] 
-	:
+entryRuleXOrExpression returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getXOrExpressionRule()); }
-	 iv_ruleXOrExpression=ruleXOrExpression 
-	 { $current=$iv_ruleXOrExpression.current; } 
-	 EOF 
-;
+	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);
-    }
-)(
-(
+ruleXOrExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
 		{
-			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();
-	    }
-
-)
-))*)
+			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 
-;
+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()); 
-    }
-
-    ;
-
-
-
-
+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] 
-	:
+entryRuleXAndExpression returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getXAndExpressionRule()); }
-	 iv_ruleXAndExpression=ruleXAndExpression 
-	 { $current=$iv_ruleXAndExpression.current; } 
-	 EOF 
-;
+	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);
-    }
-)(
-(
+ruleXAndExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
 		{
-			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();
-	    }
-
-)
-))*)
+			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 
-;
+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()); 
-    }
-
-    ;
-
-
-
-
+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] 
-	:
+entryRuleXEqualityExpression returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getXEqualityExpressionRule()); }
-	 iv_ruleXEqualityExpression=ruleXEqualityExpression 
-	 { $current=$iv_ruleXEqualityExpression.current; } 
-	 EOF 
-;
+	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);
-    }
-)(
-(
+ruleXEqualityExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
 		{
-			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();
-	    }
-
-)
-))*)
+			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 
-;
+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()); 
-    }
-)
-    ;
-
-
-
-
+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] 
-	:
+entryRuleXRelationalExpression returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getXRelationalExpressionRule()); }
-	 iv_ruleXRelationalExpression=ruleXRelationalExpression 
-	 { $current=$iv_ruleXRelationalExpression.current; } 
-	 EOF 
-;
+	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);
-    }
-)(
-(
+ruleXRelationalExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
 		{
-			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();
-	    }
-
-)
-)))*)
+			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 
-;
+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()); 
-    }
-)
-    ;
-
-
-
-
+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] 
-	:
+entryRuleXOtherOperatorExpression returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getXOtherOperatorExpressionRule()); }
-	 iv_ruleXOtherOperatorExpression=ruleXOtherOperatorExpression 
-	 { $current=$iv_ruleXOtherOperatorExpression.current; } 
-	 EOF 
-;
+	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);
-    }
-)(
-(
+ruleXOtherOperatorExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
 		{
-			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();
-	    }
-
-)
-))*)
+			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 
-;
+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()); 
-    }
-)
-    ;
-
-
-
-
+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] 
-	:
+entryRuleXAdditiveExpression returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getXAdditiveExpressionRule()); }
-	 iv_ruleXAdditiveExpression=ruleXAdditiveExpression 
-	 { $current=$iv_ruleXAdditiveExpression.current; } 
-	 EOF 
-;
+	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);
-    }
-)(
-(
+ruleXAdditiveExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
 		{
-			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();
-	    }
-
-)
-))*)
+			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 
-;
+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()); 
-    }
-)
-    ;
-
-
-
-
+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] 
-	:
+entryRuleXMultiplicativeExpression returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getXMultiplicativeExpressionRule()); }
-	 iv_ruleXMultiplicativeExpression=ruleXMultiplicativeExpression 
-	 { $current=$iv_ruleXMultiplicativeExpression.current; } 
-	 EOF 
-;
+	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);
-    }
-)(
-(
+ruleXMultiplicativeExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
 		{
-			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();
-	    }
-
-)
-))*)
+			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 
-;
+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()); 
-    }
-)
-    ;
-
-
-
-
+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] 
-	:
+entryRuleXUnaryOperation returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getXUnaryOperationRule()); }
-	 iv_ruleXUnaryOperation=ruleXUnaryOperation 
-	 { $current=$iv_ruleXUnaryOperation.current; } 
-	 EOF 
-;
+	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);
-    }
-)(
-(
+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();
+					}
+				)
+			)
+		)
+		    |
 		{
-			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();
-    }
-)
+			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 
-;
+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()); 
-    }
-)
-    ;
-
-
-
-
+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] 
-	:
+entryRuleXCastedExpression returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getXCastedExpressionRule()); }
-	 iv_ruleXCastedExpression=ruleXCastedExpression 
-	 { $current=$iv_ruleXCastedExpression.current; } 
-	 EOF 
-;
+	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();
-	    }
-
-)
-))*)
+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] 
-	:
+entryRuleXPostfixOperation returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getXPostfixOperationRule()); }
-	 iv_ruleXPostfixOperation=ruleXPostfixOperation 
-	 { $current=$iv_ruleXPostfixOperation.current; } 
-	 EOF 
-;
+	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);
-    }
-)(
-(
+ruleXPostfixOperation returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
 		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getXPostfixOperationRule());
-	        }
-        }
-		{ 
-	        newCompositeNode(grammarAccess.getXPostfixOperationAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_1_0()); 
-	    }
-		ruleOpPostfix		{ 
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)))?)
+			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 
-;
+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()); 
-    }
-)
-    ;
-
-
-
-
+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] 
-	:
+entryRuleXMemberFeatureCall returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getXMemberFeatureCallRule()); }
-	 iv_ruleXMemberFeatureCall=ruleXMemberFeatureCall 
-	 { $current=$iv_ruleXMemberFeatureCall.current; } 
-	 EOF 
-;
+	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, "::");
-	    }
-
-)
-))(
-(
+ruleXMemberFeatureCall returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
 		{
-			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());
-    }
-)?(
-(
+			newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getXPrimaryExpressionParserRuleCall_0());
+		}
+		this_XPrimaryExpression_0=ruleXPrimaryExpression
 		{
-			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();
-	    }
-
-)
-)?))*)
+			$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] 
-	:
+entryRuleXPrimaryExpression returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getXPrimaryExpressionRule()); }
-	 iv_ruleXPrimaryExpression=ruleXPrimaryExpression 
-	 { $current=$iv_ruleXPrimaryExpression.current; } 
-	 EOF 
-;
+	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();
-    }
-)
+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] 
-	:
+entryRuleXLiteral returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getXLiteralRule()); }
-	 iv_ruleXLiteral=ruleXLiteral 
-	 { $current=$iv_ruleXLiteral.current; } 
-	 EOF 
-;
+	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();
-    }
-)
+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] 
-	:
+entryRuleXCollectionLiteral returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getXCollectionLiteralRule()); }
-	 iv_ruleXCollectionLiteral=ruleXCollectionLiteral 
-	 { $current=$iv_ruleXCollectionLiteral.current; } 
-	 EOF 
-;
+	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();
-    }
-)
+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] 
-	:
+entryRuleXSetLiteral returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getXSetLiteralRule()); }
-	 iv_ruleXSetLiteral=ruleXSetLiteral 
-	 { $current=$iv_ruleXSetLiteral.current; } 
-	 EOF 
-;
+	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());
-    }
-)
+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] 
-	:
+entryRuleXListLiteral returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getXListLiteralRule()); }
-	 iv_ruleXListLiteral=ruleXListLiteral 
-	 { $current=$iv_ruleXListLiteral.current; } 
-	 EOF 
-;
+	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());
-    }
-)
+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] 
-	:
+entryRuleXClosure returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getXClosureRule()); }
-	 iv_ruleXClosure=ruleXClosure 
-	 { $current=$iv_ruleXClosure.current; } 
-	 EOF 
-;
+	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());
-    }
-)
+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] 
-	:
+entryRuleXExpressionInClosure returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getXExpressionInClosureRule()); }
-	 iv_ruleXExpressionInClosure=ruleXExpressionInClosure 
-	 { $current=$iv_ruleXExpressionInClosure.current; } 
-	 EOF 
-;
+	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());
-    }
-)?)*)
+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] 
-	:
+entryRuleXShortClosure returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getXShortClosureRule()); }
-	 iv_ruleXShortClosure=ruleXShortClosure 
-	 { $current=$iv_ruleXShortClosure.current; } 
-	 EOF 
-;
+	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();
-	    }
-
-)
-))
+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] 
-	:
+entryRuleXParenthesizedExpression returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getXParenthesizedExpressionRule()); }
-	 iv_ruleXParenthesizedExpression=ruleXParenthesizedExpression 
-	 { $current=$iv_ruleXParenthesizedExpression.current; } 
-	 EOF 
-;
+	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());
-    }
-)?(
-(
+ruleXParenthesizedExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='('
 		{
-			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()); 
+			newLeafNode(otherlv_0, grammarAccess.getXParenthesizedExpressionAccess().getLeftParenthesisKeyword_0());
 		}
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getXStringLiteralRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"value",
-        		lv_value_1_0, 
-        		"STRING");
-	    }
-
-)
-))
+			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();
-	    }
-
-)
-)	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();
-	    }
-
-)
-))
+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();
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleXCatchClause
-entryRuleXCatchClause returns [EObject current=null] 
-	:
+entryRuleXCatchClause returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getXCatchClauseRule()); }
-	 iv_ruleXCatchClause=ruleXCatchClause 
-	 { $current=$iv_ruleXCatchClause.current; } 
-	 EOF 
-;
+	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, 
-        		"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, 
-        		"XExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
+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 
-;
+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();
-    }
-)*)
-    ;
-
-
-
-
+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 
-;
+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()); 
-    }
-))?))
-    ;
+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] 
-	:
+entryRuleJvmTypeReference returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getJvmTypeReferenceRule()); }
-	 iv_ruleJvmTypeReference=ruleJvmTypeReference 
-	 { $current=$iv_ruleJvmTypeReference.current; } 
-	 EOF 
-;
+	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();
-    }
-)
+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 
-;
+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()); 
-    }
-)
-    ;
-
-
-
-
+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] 
-	:
+entryRuleXFunctionTypeRef returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getXFunctionTypeRefRule()); }
-	 iv_ruleXFunctionTypeRef=ruleXFunctionTypeRef 
-	 { $current=$iv_ruleXFunctionTypeRef.current; } 
-	 EOF 
-;
+	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, 
-        		"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, 
-        		"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, 
-        		"JvmTypeReference");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
+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] 
-	:
+entryRuleJvmParameterizedTypeReference returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceRule()); }
-	 iv_ruleJvmParameterizedTypeReference=ruleJvmParameterizedTypeReference 
-	 { $current=$iv_ruleJvmParameterizedTypeReference.current; } 
-	 EOF 
-;
+	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, 
-        		"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, 
-        		"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, 
-        		"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, 
-        		"JvmArgumentTypeReference");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))*	otherlv_13='>' 
-    {
-    	newLeafNode(otherlv_13, grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_4_2_3());
-    }
-)?)*)?)
+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] 
-	:
+entryRuleJvmArgumentTypeReference returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getJvmArgumentTypeReferenceRule()); }
-	 iv_ruleJvmArgumentTypeReference=ruleJvmArgumentTypeReference 
-	 { $current=$iv_ruleJvmArgumentTypeReference.current; } 
-	 EOF 
-;
+	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();
-    }
-)
+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] 
-	:
+entryRuleJvmWildcardTypeReference returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceRule()); }
-	 iv_ruleJvmWildcardTypeReference=ruleJvmWildcardTypeReference 
-	 { $current=$iv_ruleJvmWildcardTypeReference.current; } 
-	 EOF 
-;
+	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, 
-        		"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, 
-        		"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, 
-        		"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, 
-        		"JvmLowerBoundAnded");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*))?)
+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] 
-	:
+entryRuleJvmUpperBound returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getJvmUpperBoundRule()); }
-	 iv_ruleJvmUpperBound=ruleJvmUpperBound 
-	 { $current=$iv_ruleJvmUpperBound.current; } 
-	 EOF 
-;
+	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, 
-        		"JvmTypeReference");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
+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] 
-	:
+entryRuleJvmUpperBoundAnded returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getJvmUpperBoundAndedRule()); }
-	 iv_ruleJvmUpperBoundAnded=ruleJvmUpperBoundAnded 
-	 { $current=$iv_ruleJvmUpperBoundAnded.current; } 
-	 EOF 
-;
+	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, 
-        		"JvmTypeReference");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
+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] 
-	:
+entryRuleJvmLowerBound returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getJvmLowerBoundRule()); }
-	 iv_ruleJvmLowerBound=ruleJvmLowerBound 
-	 { $current=$iv_ruleJvmLowerBound.current; } 
-	 EOF 
-;
+	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, 
-        		"JvmTypeReference");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
+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] 
-	:
+entryRuleJvmLowerBoundAnded returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getJvmLowerBoundAndedRule()); }
-	 iv_ruleJvmLowerBoundAnded=ruleJvmLowerBoundAnded 
-	 { $current=$iv_ruleJvmLowerBoundAnded.current; } 
-	 EOF 
-;
+	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, 
-        		"JvmTypeReference");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
+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 
-;
+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()); 
-    }
-)
-    ;
-
-
-
-
+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 
-;
+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    {
+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()); 
-    }
-
-    ;
-
-
-
-
+	}
+	{
+		newLeafNode(this_ID_0, grammarAccess.getValidIDAccess().getIDTerminalRuleCall());
+	}
+;
 
 // Entry rule entryRuleXImportSection
-entryRuleXImportSection returns [EObject current=null] 
-	:
+entryRuleXImportSection returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getXImportSectionRule()); }
-	 iv_ruleXImportSection=ruleXImportSection 
-	 { $current=$iv_ruleXImportSection.current; } 
-	 EOF 
-;
+	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, 
-        		"XImportDeclaration");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)+
+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.ecview.uisemantics.UISemanticsGrammar.XImportDeclaration");
+				afterParserOrEnumRuleCall();
+			}
+		)
+	)+
 ;
 
-
-
-
-
 // Entry rule entryRuleQualifiedNameInStaticImport
-entryRuleQualifiedNameInStaticImport returns [String current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getQualifiedNameInStaticImportRule()); } 
-	 iv_ruleQualifiedNameInStaticImport=ruleQualifiedNameInStaticImport 
-	 { $current=$iv_ruleQualifiedNameInStaticImport.current.getText(); }  
-	 EOF 
-;
+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()); 
-    }
-)+
-    ;
-
-
-
-
+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_HEX : ('0x'|'0X') ('0'..'9'|'a'..'f'|'A'..'F'|'_')+ ('#' (('b'|'B') ('i'|'I')|('l'|'L')))?;
 
@@ -6970,5 +7328,3 @@
 RULE_WS : (' '|'\t'|'\r'|'\n')+;
 
 RULE_ANY_OTHER : .;
-
-
diff --git a/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.tokens b/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.tokens
index 85dbbac..fa15b92 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.tokens
+++ b/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.tokens
@@ -1,91 +1,91 @@
-'!'=64
-'!='=49
-'!=='=51
-'#'=73
-'%'=63
-'%='=42
-'&&'=47
+'!'=65
+'!='=50
+'!=='=52
+'#'=74
+'%'=64
+'%='=43
+'&&'=48
 '&'=101
-'('=71
-')'=72
+'('=72
+')'=73
 '*'=22
-'**'=61
-'*='=40
-'+'=59
-'++'=65
-'+='=38
-','=70
-'-'=60
-'--'=66
-'-='=39
-'->'=53
-'.'=67
-'..'=55
-'..<'=54
-'/'=62
-'/='=41
+'**'=62
+'*='=41
+'+'=60
+'++'=66
+'+='=39
+','=71
+'-'=61
+'--'=67
+'-='=40
+'->'=54
+'.'=68
+'..'=56
+'..<'=55
+'/'=63
+'/='=42
 ':'=32
-'::'=68
+'::'=69
 ';'=24
-'<'=43
-'<>'=57
-'='=37
-'=='=48
-'==='=50
-'=>'=56
-'>'=44
-'>='=45
+'<'=44
+'<>'=58
+'='=38
+'=='=49
+'==='=51
+'=>'=57
+'>'=45
+'>='=46
 '?'=100
-'?.'=69
-'?:'=58
-'['=74
-']'=75
+'?.'=70
+'?:'=59
+'['=75
+']'=76
 'actions'=13
 'as'=25
 'bindings'=27
-'case'=81
+'case'=82
 'catch'=99
 'categories'=16
-'default'=80
+'default'=81
 'disabled'=18
-'do'=84
+'do'=85
 'ePackage'=23
 'element'=26
-'else'=78
-'endpoint'=35
-'extends'=87
+'else'=79
+'endpoint'=36
+'extends'=33
 'extension'=21
 'externalCommand'=17
 'false'=90
-'final'=33
+'final'=34
 'finally'=97
-'for'=82
-'if'=77
+'for'=83
+'if'=78
 'import'=19
-'instanceof'=52
-'list'=34
+'instanceof'=53
+'list'=35
 'new'=89
 'null'=92
 'property'=30
 'return'=95
 'static'=20
 'super'=88
-'switch'=79
+'switch'=80
 'synchronized'=98
-'target'=36
+'target'=37
 'throw'=94
 'true'=91
 'try'=96
 'typeof'=93
 'uri'=31
-'val'=86
+'val'=87
 'validator'=29
-'var'=85
+'var'=86
 'visibility'=28
-'while'=83
+'while'=84
 '{'=14
-'|'=76
-'||'=46
+'|'=77
+'||'=47
 '}'=15
 RULE_ANY_OTHER=12
 RULE_DECIMAL=8
diff --git a/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammarLexer.java b/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammarLexer.java
index 3a5fef3..597e611 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammarLexer.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammarLexer.java
@@ -134,15 +134,15 @@
         super(input,state);
 
     }
-    public String getGrammarFileName() { return "../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g"; }
+    public String getGrammarFileName() { return "InternalUISemanticsGrammar.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.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:11:7: ( 'actions' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:11:9: 'actions'
+            // InternalUISemanticsGrammar.g:11:7: ( 'actions' )
+            // InternalUISemanticsGrammar.g:11:9: 'actions'
             {
             match("actions"); 
 
@@ -162,8 +162,8 @@
         try {
             int _type = T__14;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:12:7: ( '{' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:12:9: '{'
+            // InternalUISemanticsGrammar.g:12:7: ( '{' )
+            // InternalUISemanticsGrammar.g:12:9: '{'
             {
             match('{'); 
 
@@ -182,8 +182,8 @@
         try {
             int _type = T__15;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:13:7: ( '}' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:13:9: '}'
+            // InternalUISemanticsGrammar.g:13:7: ( '}' )
+            // InternalUISemanticsGrammar.g:13:9: '}'
             {
             match('}'); 
 
@@ -202,8 +202,8 @@
         try {
             int _type = T__16;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:14:7: ( 'categories' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:14:9: 'categories'
+            // InternalUISemanticsGrammar.g:14:7: ( 'categories' )
+            // InternalUISemanticsGrammar.g:14:9: 'categories'
             {
             match("categories"); 
 
@@ -223,8 +223,8 @@
         try {
             int _type = T__17;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:15:7: ( 'externalCommand' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:15:9: 'externalCommand'
+            // InternalUISemanticsGrammar.g:15:7: ( 'externalCommand' )
+            // InternalUISemanticsGrammar.g:15:9: 'externalCommand'
             {
             match("externalCommand"); 
 
@@ -244,8 +244,8 @@
         try {
             int _type = T__18;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:16:7: ( 'disabled' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:16:9: 'disabled'
+            // InternalUISemanticsGrammar.g:16:7: ( 'disabled' )
+            // InternalUISemanticsGrammar.g:16:9: 'disabled'
             {
             match("disabled"); 
 
@@ -265,8 +265,8 @@
         try {
             int _type = T__19;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:17:7: ( 'import' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:17:9: 'import'
+            // InternalUISemanticsGrammar.g:17:7: ( 'import' )
+            // InternalUISemanticsGrammar.g:17:9: 'import'
             {
             match("import"); 
 
@@ -286,8 +286,8 @@
         try {
             int _type = T__20;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:18:7: ( 'static' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:18:9: 'static'
+            // InternalUISemanticsGrammar.g:18:7: ( 'static' )
+            // InternalUISemanticsGrammar.g:18:9: 'static'
             {
             match("static"); 
 
@@ -307,8 +307,8 @@
         try {
             int _type = T__21;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:19:7: ( 'extension' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:19:9: 'extension'
+            // InternalUISemanticsGrammar.g:19:7: ( 'extension' )
+            // InternalUISemanticsGrammar.g:19:9: 'extension'
             {
             match("extension"); 
 
@@ -328,8 +328,8 @@
         try {
             int _type = T__22;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:20:7: ( '*' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:20:9: '*'
+            // InternalUISemanticsGrammar.g:20:7: ( '*' )
+            // InternalUISemanticsGrammar.g:20:9: '*'
             {
             match('*'); 
 
@@ -348,8 +348,8 @@
         try {
             int _type = T__23;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:21:7: ( 'ePackage' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:21:9: 'ePackage'
+            // InternalUISemanticsGrammar.g:21:7: ( 'ePackage' )
+            // InternalUISemanticsGrammar.g:21:9: 'ePackage'
             {
             match("ePackage"); 
 
@@ -369,8 +369,8 @@
         try {
             int _type = T__24;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:22:7: ( ';' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:22:9: ';'
+            // InternalUISemanticsGrammar.g:22:7: ( ';' )
+            // InternalUISemanticsGrammar.g:22:9: ';'
             {
             match(';'); 
 
@@ -389,8 +389,8 @@
         try {
             int _type = T__25;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:23:7: ( 'as' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:23:9: 'as'
+            // InternalUISemanticsGrammar.g:23:7: ( 'as' )
+            // InternalUISemanticsGrammar.g:23:9: 'as'
             {
             match("as"); 
 
@@ -410,8 +410,8 @@
         try {
             int _type = T__26;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:24:7: ( 'element' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:24:9: 'element'
+            // InternalUISemanticsGrammar.g:24:7: ( 'element' )
+            // InternalUISemanticsGrammar.g:24:9: 'element'
             {
             match("element"); 
 
@@ -431,8 +431,8 @@
         try {
             int _type = T__27;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:25:7: ( 'bindings' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:25:9: 'bindings'
+            // InternalUISemanticsGrammar.g:25:7: ( 'bindings' )
+            // InternalUISemanticsGrammar.g:25:9: 'bindings'
             {
             match("bindings"); 
 
@@ -452,8 +452,8 @@
         try {
             int _type = T__28;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:26:7: ( 'visibility' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:26:9: 'visibility'
+            // InternalUISemanticsGrammar.g:26:7: ( 'visibility' )
+            // InternalUISemanticsGrammar.g:26:9: 'visibility'
             {
             match("visibility"); 
 
@@ -473,8 +473,8 @@
         try {
             int _type = T__29;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:27:7: ( 'validator' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:27:9: 'validator'
+            // InternalUISemanticsGrammar.g:27:7: ( 'validator' )
+            // InternalUISemanticsGrammar.g:27:9: 'validator'
             {
             match("validator"); 
 
@@ -494,8 +494,8 @@
         try {
             int _type = T__30;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:28:7: ( 'property' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:28:9: 'property'
+            // InternalUISemanticsGrammar.g:28:7: ( 'property' )
+            // InternalUISemanticsGrammar.g:28:9: 'property'
             {
             match("property"); 
 
@@ -515,8 +515,8 @@
         try {
             int _type = T__31;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:29:7: ( 'uri' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:29:9: 'uri'
+            // InternalUISemanticsGrammar.g:29:7: ( 'uri' )
+            // InternalUISemanticsGrammar.g:29:9: 'uri'
             {
             match("uri"); 
 
@@ -536,8 +536,8 @@
         try {
             int _type = T__32;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:30:7: ( ':' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:30:9: ':'
+            // InternalUISemanticsGrammar.g:30:7: ( ':' )
+            // InternalUISemanticsGrammar.g:30:9: ':'
             {
             match(':'); 
 
@@ -556,10 +556,10 @@
         try {
             int _type = T__33;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:31:7: ( 'final' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:31:9: 'final'
+            // InternalUISemanticsGrammar.g:31:7: ( 'extends' )
+            // InternalUISemanticsGrammar.g:31:9: 'extends'
             {
-            match("final"); 
+            match("extends"); 
 
 
             }
@@ -577,10 +577,10 @@
         try {
             int _type = T__34;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:32:7: ( 'list' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:32:9: 'list'
+            // InternalUISemanticsGrammar.g:32:7: ( 'final' )
+            // InternalUISemanticsGrammar.g:32:9: 'final'
             {
-            match("list"); 
+            match("final"); 
 
 
             }
@@ -598,10 +598,10 @@
         try {
             int _type = T__35;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:33:7: ( 'endpoint' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:33:9: 'endpoint'
+            // InternalUISemanticsGrammar.g:33:7: ( 'list' )
+            // InternalUISemanticsGrammar.g:33:9: 'list'
             {
-            match("endpoint"); 
+            match("list"); 
 
 
             }
@@ -619,10 +619,10 @@
         try {
             int _type = T__36;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:34:7: ( 'target' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:34:9: 'target'
+            // InternalUISemanticsGrammar.g:34:7: ( 'endpoint' )
+            // InternalUISemanticsGrammar.g:34:9: 'endpoint'
             {
-            match("target"); 
+            match("endpoint"); 
 
 
             }
@@ -640,10 +640,11 @@
         try {
             int _type = T__37;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:35:7: ( '=' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:35:9: '='
+            // InternalUISemanticsGrammar.g:35:7: ( 'target' )
+            // InternalUISemanticsGrammar.g:35:9: 'target'
             {
-            match('='); 
+            match("target"); 
+
 
             }
 
@@ -660,11 +661,10 @@
         try {
             int _type = T__38;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:36:7: ( '+=' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:36:9: '+='
+            // InternalUISemanticsGrammar.g:36:7: ( '=' )
+            // InternalUISemanticsGrammar.g:36:9: '='
             {
-            match("+="); 
-
+            match('='); 
 
             }
 
@@ -681,10 +681,10 @@
         try {
             int _type = T__39;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:37:7: ( '-=' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:37:9: '-='
+            // InternalUISemanticsGrammar.g:37:7: ( '+=' )
+            // InternalUISemanticsGrammar.g:37:9: '+='
             {
-            match("-="); 
+            match("+="); 
 
 
             }
@@ -702,10 +702,10 @@
         try {
             int _type = T__40;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:38:7: ( '*=' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:38:9: '*='
+            // InternalUISemanticsGrammar.g:38:7: ( '-=' )
+            // InternalUISemanticsGrammar.g:38:9: '-='
             {
-            match("*="); 
+            match("-="); 
 
 
             }
@@ -723,10 +723,10 @@
         try {
             int _type = T__41;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:39:7: ( '/=' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:39:9: '/='
+            // InternalUISemanticsGrammar.g:39:7: ( '*=' )
+            // InternalUISemanticsGrammar.g:39:9: '*='
             {
-            match("/="); 
+            match("*="); 
 
 
             }
@@ -744,10 +744,10 @@
         try {
             int _type = T__42;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:40:7: ( '%=' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:40:9: '%='
+            // InternalUISemanticsGrammar.g:40:7: ( '/=' )
+            // InternalUISemanticsGrammar.g:40:9: '/='
             {
-            match("%="); 
+            match("/="); 
 
 
             }
@@ -765,10 +765,11 @@
         try {
             int _type = T__43;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:41:7: ( '<' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:41:9: '<'
+            // InternalUISemanticsGrammar.g:41:7: ( '%=' )
+            // InternalUISemanticsGrammar.g:41:9: '%='
             {
-            match('<'); 
+            match("%="); 
+
 
             }
 
@@ -785,10 +786,10 @@
         try {
             int _type = T__44;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:42:7: ( '>' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:42:9: '>'
+            // InternalUISemanticsGrammar.g:42:7: ( '<' )
+            // InternalUISemanticsGrammar.g:42:9: '<'
             {
-            match('>'); 
+            match('<'); 
 
             }
 
@@ -805,11 +806,10 @@
         try {
             int _type = T__45;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:43:7: ( '>=' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:43:9: '>='
+            // InternalUISemanticsGrammar.g:43:7: ( '>' )
+            // InternalUISemanticsGrammar.g:43:9: '>'
             {
-            match(">="); 
-
+            match('>'); 
 
             }
 
@@ -826,10 +826,10 @@
         try {
             int _type = T__46;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:44:7: ( '||' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:44:9: '||'
+            // InternalUISemanticsGrammar.g:44:7: ( '>=' )
+            // InternalUISemanticsGrammar.g:44:9: '>='
             {
-            match("||"); 
+            match(">="); 
 
 
             }
@@ -847,10 +847,10 @@
         try {
             int _type = T__47;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:45:7: ( '&&' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:45:9: '&&'
+            // InternalUISemanticsGrammar.g:45:7: ( '||' )
+            // InternalUISemanticsGrammar.g:45:9: '||'
             {
-            match("&&"); 
+            match("||"); 
 
 
             }
@@ -868,10 +868,10 @@
         try {
             int _type = T__48;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:46:7: ( '==' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:46:9: '=='
+            // InternalUISemanticsGrammar.g:46:7: ( '&&' )
+            // InternalUISemanticsGrammar.g:46:9: '&&'
             {
-            match("=="); 
+            match("&&"); 
 
 
             }
@@ -889,10 +889,10 @@
         try {
             int _type = T__49;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:47:7: ( '!=' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:47:9: '!='
+            // InternalUISemanticsGrammar.g:47:7: ( '==' )
+            // InternalUISemanticsGrammar.g:47:9: '=='
             {
-            match("!="); 
+            match("=="); 
 
 
             }
@@ -910,10 +910,10 @@
         try {
             int _type = T__50;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:48:7: ( '===' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:48:9: '==='
+            // InternalUISemanticsGrammar.g:48:7: ( '!=' )
+            // InternalUISemanticsGrammar.g:48:9: '!='
             {
-            match("==="); 
+            match("!="); 
 
 
             }
@@ -931,10 +931,10 @@
         try {
             int _type = T__51;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:49:7: ( '!==' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:49:9: '!=='
+            // InternalUISemanticsGrammar.g:49:7: ( '===' )
+            // InternalUISemanticsGrammar.g:49:9: '==='
             {
-            match("!=="); 
+            match("==="); 
 
 
             }
@@ -952,10 +952,10 @@
         try {
             int _type = T__52;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:50:7: ( 'instanceof' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:50:9: 'instanceof'
+            // InternalUISemanticsGrammar.g:50:7: ( '!==' )
+            // InternalUISemanticsGrammar.g:50:9: '!=='
             {
-            match("instanceof"); 
+            match("!=="); 
 
 
             }
@@ -973,10 +973,10 @@
         try {
             int _type = T__53;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:51:7: ( '->' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:51:9: '->'
+            // InternalUISemanticsGrammar.g:51:7: ( 'instanceof' )
+            // InternalUISemanticsGrammar.g:51:9: 'instanceof'
             {
-            match("->"); 
+            match("instanceof"); 
 
 
             }
@@ -994,10 +994,10 @@
         try {
             int _type = T__54;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:52:7: ( '..<' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:52:9: '..<'
+            // InternalUISemanticsGrammar.g:52:7: ( '->' )
+            // InternalUISemanticsGrammar.g:52:9: '->'
             {
-            match("..<"); 
+            match("->"); 
 
 
             }
@@ -1015,10 +1015,10 @@
         try {
             int _type = T__55;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:53:7: ( '..' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:53:9: '..'
+            // InternalUISemanticsGrammar.g:53:7: ( '..<' )
+            // InternalUISemanticsGrammar.g:53:9: '..<'
             {
-            match(".."); 
+            match("..<"); 
 
 
             }
@@ -1036,10 +1036,10 @@
         try {
             int _type = T__56;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:54:7: ( '=>' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:54:9: '=>'
+            // InternalUISemanticsGrammar.g:54:7: ( '..' )
+            // InternalUISemanticsGrammar.g:54:9: '..'
             {
-            match("=>"); 
+            match(".."); 
 
 
             }
@@ -1057,10 +1057,10 @@
         try {
             int _type = T__57;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:55:7: ( '<>' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:55:9: '<>'
+            // InternalUISemanticsGrammar.g:55:7: ( '=>' )
+            // InternalUISemanticsGrammar.g:55:9: '=>'
             {
-            match("<>"); 
+            match("=>"); 
 
 
             }
@@ -1078,10 +1078,10 @@
         try {
             int _type = T__58;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:56:7: ( '?:' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:56:9: '?:'
+            // InternalUISemanticsGrammar.g:56:7: ( '<>' )
+            // InternalUISemanticsGrammar.g:56:9: '<>'
             {
-            match("?:"); 
+            match("<>"); 
 
 
             }
@@ -1099,10 +1099,11 @@
         try {
             int _type = T__59;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:57:7: ( '+' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:57:9: '+'
+            // InternalUISemanticsGrammar.g:57:7: ( '?:' )
+            // InternalUISemanticsGrammar.g:57:9: '?:'
             {
-            match('+'); 
+            match("?:"); 
+
 
             }
 
@@ -1119,10 +1120,10 @@
         try {
             int _type = T__60;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:58:7: ( '-' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:58:9: '-'
+            // InternalUISemanticsGrammar.g:58:7: ( '+' )
+            // InternalUISemanticsGrammar.g:58:9: '+'
             {
-            match('-'); 
+            match('+'); 
 
             }
 
@@ -1139,11 +1140,10 @@
         try {
             int _type = T__61;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:59:7: ( '**' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:59:9: '**'
+            // InternalUISemanticsGrammar.g:59:7: ( '-' )
+            // InternalUISemanticsGrammar.g:59:9: '-'
             {
-            match("**"); 
-
+            match('-'); 
 
             }
 
@@ -1160,10 +1160,11 @@
         try {
             int _type = T__62;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:60:7: ( '/' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:60:9: '/'
+            // InternalUISemanticsGrammar.g:60:7: ( '**' )
+            // InternalUISemanticsGrammar.g:60:9: '**'
             {
-            match('/'); 
+            match("**"); 
+
 
             }
 
@@ -1180,10 +1181,10 @@
         try {
             int _type = T__63;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:61:7: ( '%' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:61:9: '%'
+            // InternalUISemanticsGrammar.g:61:7: ( '/' )
+            // InternalUISemanticsGrammar.g:61:9: '/'
             {
-            match('%'); 
+            match('/'); 
 
             }
 
@@ -1200,10 +1201,10 @@
         try {
             int _type = T__64;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:62:7: ( '!' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:62:9: '!'
+            // InternalUISemanticsGrammar.g:62:7: ( '%' )
+            // InternalUISemanticsGrammar.g:62:9: '%'
             {
-            match('!'); 
+            match('%'); 
 
             }
 
@@ -1220,11 +1221,10 @@
         try {
             int _type = T__65;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:63:7: ( '++' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:63:9: '++'
+            // InternalUISemanticsGrammar.g:63:7: ( '!' )
+            // InternalUISemanticsGrammar.g:63:9: '!'
             {
-            match("++"); 
-
+            match('!'); 
 
             }
 
@@ -1241,10 +1241,10 @@
         try {
             int _type = T__66;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:64:7: ( '--' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:64:9: '--'
+            // InternalUISemanticsGrammar.g:64:7: ( '++' )
+            // InternalUISemanticsGrammar.g:64:9: '++'
             {
-            match("--"); 
+            match("++"); 
 
 
             }
@@ -1262,10 +1262,11 @@
         try {
             int _type = T__67;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:65:7: ( '.' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:65:9: '.'
+            // InternalUISemanticsGrammar.g:65:7: ( '--' )
+            // InternalUISemanticsGrammar.g:65:9: '--'
             {
-            match('.'); 
+            match("--"); 
+
 
             }
 
@@ -1282,11 +1283,10 @@
         try {
             int _type = T__68;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:66:7: ( '::' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:66:9: '::'
+            // InternalUISemanticsGrammar.g:66:7: ( '.' )
+            // InternalUISemanticsGrammar.g:66:9: '.'
             {
-            match("::"); 
-
+            match('.'); 
 
             }
 
@@ -1303,10 +1303,10 @@
         try {
             int _type = T__69;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:67:7: ( '?.' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:67:9: '?.'
+            // InternalUISemanticsGrammar.g:67:7: ( '::' )
+            // InternalUISemanticsGrammar.g:67:9: '::'
             {
-            match("?."); 
+            match("::"); 
 
 
             }
@@ -1324,10 +1324,11 @@
         try {
             int _type = T__70;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:68:7: ( ',' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:68:9: ','
+            // InternalUISemanticsGrammar.g:68:7: ( '?.' )
+            // InternalUISemanticsGrammar.g:68:9: '?.'
             {
-            match(','); 
+            match("?."); 
+
 
             }
 
@@ -1344,10 +1345,10 @@
         try {
             int _type = T__71;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:69:7: ( '(' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:69:9: '('
+            // InternalUISemanticsGrammar.g:69:7: ( ',' )
+            // InternalUISemanticsGrammar.g:69:9: ','
             {
-            match('('); 
+            match(','); 
 
             }
 
@@ -1364,10 +1365,10 @@
         try {
             int _type = T__72;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:70:7: ( ')' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:70:9: ')'
+            // InternalUISemanticsGrammar.g:70:7: ( '(' )
+            // InternalUISemanticsGrammar.g:70:9: '('
             {
-            match(')'); 
+            match('('); 
 
             }
 
@@ -1384,10 +1385,10 @@
         try {
             int _type = T__73;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:71:7: ( '#' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:71:9: '#'
+            // InternalUISemanticsGrammar.g:71:7: ( ')' )
+            // InternalUISemanticsGrammar.g:71:9: ')'
             {
-            match('#'); 
+            match(')'); 
 
             }
 
@@ -1404,10 +1405,10 @@
         try {
             int _type = T__74;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:72:7: ( '[' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:72:9: '['
+            // InternalUISemanticsGrammar.g:72:7: ( '#' )
+            // InternalUISemanticsGrammar.g:72:9: '#'
             {
-            match('['); 
+            match('#'); 
 
             }
 
@@ -1424,10 +1425,10 @@
         try {
             int _type = T__75;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:73:7: ( ']' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:73:9: ']'
+            // InternalUISemanticsGrammar.g:73:7: ( '[' )
+            // InternalUISemanticsGrammar.g:73:9: '['
             {
-            match(']'); 
+            match('['); 
 
             }
 
@@ -1444,10 +1445,10 @@
         try {
             int _type = T__76;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:74:7: ( '|' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:74:9: '|'
+            // InternalUISemanticsGrammar.g:74:7: ( ']' )
+            // InternalUISemanticsGrammar.g:74:9: ']'
             {
-            match('|'); 
+            match(']'); 
 
             }
 
@@ -1464,11 +1465,10 @@
         try {
             int _type = T__77;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:75:7: ( 'if' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:75:9: 'if'
+            // InternalUISemanticsGrammar.g:75:7: ( '|' )
+            // InternalUISemanticsGrammar.g:75:9: '|'
             {
-            match("if"); 
-
+            match('|'); 
 
             }
 
@@ -1485,10 +1485,10 @@
         try {
             int _type = T__78;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:76:7: ( 'else' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:76:9: 'else'
+            // InternalUISemanticsGrammar.g:76:7: ( 'if' )
+            // InternalUISemanticsGrammar.g:76:9: 'if'
             {
-            match("else"); 
+            match("if"); 
 
 
             }
@@ -1506,10 +1506,10 @@
         try {
             int _type = T__79;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:77:7: ( 'switch' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:77:9: 'switch'
+            // InternalUISemanticsGrammar.g:77:7: ( 'else' )
+            // InternalUISemanticsGrammar.g:77:9: 'else'
             {
-            match("switch"); 
+            match("else"); 
 
 
             }
@@ -1527,10 +1527,10 @@
         try {
             int _type = T__80;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:78:7: ( 'default' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:78:9: 'default'
+            // InternalUISemanticsGrammar.g:78:7: ( 'switch' )
+            // InternalUISemanticsGrammar.g:78:9: 'switch'
             {
-            match("default"); 
+            match("switch"); 
 
 
             }
@@ -1548,10 +1548,10 @@
         try {
             int _type = T__81;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:79:7: ( 'case' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:79:9: 'case'
+            // InternalUISemanticsGrammar.g:79:7: ( 'default' )
+            // InternalUISemanticsGrammar.g:79:9: 'default'
             {
-            match("case"); 
+            match("default"); 
 
 
             }
@@ -1569,10 +1569,10 @@
         try {
             int _type = T__82;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:80:7: ( 'for' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:80:9: 'for'
+            // InternalUISemanticsGrammar.g:80:7: ( 'case' )
+            // InternalUISemanticsGrammar.g:80:9: 'case'
             {
-            match("for"); 
+            match("case"); 
 
 
             }
@@ -1590,10 +1590,10 @@
         try {
             int _type = T__83;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:81:7: ( 'while' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:81:9: 'while'
+            // InternalUISemanticsGrammar.g:81:7: ( 'for' )
+            // InternalUISemanticsGrammar.g:81:9: 'for'
             {
-            match("while"); 
+            match("for"); 
 
 
             }
@@ -1611,10 +1611,10 @@
         try {
             int _type = T__84;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:82:7: ( 'do' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:82:9: 'do'
+            // InternalUISemanticsGrammar.g:82:7: ( 'while' )
+            // InternalUISemanticsGrammar.g:82:9: 'while'
             {
-            match("do"); 
+            match("while"); 
 
 
             }
@@ -1632,10 +1632,10 @@
         try {
             int _type = T__85;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:83:7: ( 'var' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:83:9: 'var'
+            // InternalUISemanticsGrammar.g:83:7: ( 'do' )
+            // InternalUISemanticsGrammar.g:83:9: 'do'
             {
-            match("var"); 
+            match("do"); 
 
 
             }
@@ -1653,10 +1653,10 @@
         try {
             int _type = T__86;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:84:7: ( 'val' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:84:9: 'val'
+            // InternalUISemanticsGrammar.g:84:7: ( 'var' )
+            // InternalUISemanticsGrammar.g:84:9: 'var'
             {
-            match("val"); 
+            match("var"); 
 
 
             }
@@ -1674,10 +1674,10 @@
         try {
             int _type = T__87;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:85:7: ( 'extends' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:85:9: 'extends'
+            // InternalUISemanticsGrammar.g:85:7: ( 'val' )
+            // InternalUISemanticsGrammar.g:85:9: 'val'
             {
-            match("extends"); 
+            match("val"); 
 
 
             }
@@ -1695,8 +1695,8 @@
         try {
             int _type = T__88;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:86:7: ( 'super' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:86:9: 'super'
+            // InternalUISemanticsGrammar.g:86:7: ( 'super' )
+            // InternalUISemanticsGrammar.g:86:9: 'super'
             {
             match("super"); 
 
@@ -1716,8 +1716,8 @@
         try {
             int _type = T__89;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:87:7: ( 'new' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:87:9: 'new'
+            // InternalUISemanticsGrammar.g:87:7: ( 'new' )
+            // InternalUISemanticsGrammar.g:87:9: 'new'
             {
             match("new"); 
 
@@ -1737,8 +1737,8 @@
         try {
             int _type = T__90;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:88:7: ( 'false' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:88:9: 'false'
+            // InternalUISemanticsGrammar.g:88:7: ( 'false' )
+            // InternalUISemanticsGrammar.g:88:9: 'false'
             {
             match("false"); 
 
@@ -1758,8 +1758,8 @@
         try {
             int _type = T__91;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:89:7: ( 'true' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:89:9: 'true'
+            // InternalUISemanticsGrammar.g:89:7: ( 'true' )
+            // InternalUISemanticsGrammar.g:89:9: 'true'
             {
             match("true"); 
 
@@ -1779,8 +1779,8 @@
         try {
             int _type = T__92;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:90:7: ( 'null' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:90:9: 'null'
+            // InternalUISemanticsGrammar.g:90:7: ( 'null' )
+            // InternalUISemanticsGrammar.g:90:9: 'null'
             {
             match("null"); 
 
@@ -1800,8 +1800,8 @@
         try {
             int _type = T__93;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:91:7: ( 'typeof' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:91:9: 'typeof'
+            // InternalUISemanticsGrammar.g:91:7: ( 'typeof' )
+            // InternalUISemanticsGrammar.g:91:9: 'typeof'
             {
             match("typeof"); 
 
@@ -1821,8 +1821,8 @@
         try {
             int _type = T__94;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:92:7: ( 'throw' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:92:9: 'throw'
+            // InternalUISemanticsGrammar.g:92:7: ( 'throw' )
+            // InternalUISemanticsGrammar.g:92:9: 'throw'
             {
             match("throw"); 
 
@@ -1842,8 +1842,8 @@
         try {
             int _type = T__95;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:93:7: ( 'return' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:93:9: 'return'
+            // InternalUISemanticsGrammar.g:93:7: ( 'return' )
+            // InternalUISemanticsGrammar.g:93:9: 'return'
             {
             match("return"); 
 
@@ -1863,8 +1863,8 @@
         try {
             int _type = T__96;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:94:7: ( 'try' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:94:9: 'try'
+            // InternalUISemanticsGrammar.g:94:7: ( 'try' )
+            // InternalUISemanticsGrammar.g:94:9: 'try'
             {
             match("try"); 
 
@@ -1884,8 +1884,8 @@
         try {
             int _type = T__97;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:95:7: ( 'finally' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:95:9: 'finally'
+            // InternalUISemanticsGrammar.g:95:7: ( 'finally' )
+            // InternalUISemanticsGrammar.g:95:9: 'finally'
             {
             match("finally"); 
 
@@ -1905,8 +1905,8 @@
         try {
             int _type = T__98;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:96:7: ( 'synchronized' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:96:9: 'synchronized'
+            // InternalUISemanticsGrammar.g:96:7: ( 'synchronized' )
+            // InternalUISemanticsGrammar.g:96:9: 'synchronized'
             {
             match("synchronized"); 
 
@@ -1926,8 +1926,8 @@
         try {
             int _type = T__99;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:97:7: ( 'catch' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:97:9: 'catch'
+            // InternalUISemanticsGrammar.g:97:7: ( 'catch' )
+            // InternalUISemanticsGrammar.g:97:9: 'catch'
             {
             match("catch"); 
 
@@ -1947,8 +1947,8 @@
         try {
             int _type = T__100;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:98:8: ( '?' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:98:10: '?'
+            // InternalUISemanticsGrammar.g:98:8: ( '?' )
+            // InternalUISemanticsGrammar.g:98:10: '?'
             {
             match('?'); 
 
@@ -1967,8 +1967,8 @@
         try {
             int _type = T__101;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:99:8: ( '&' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:99:10: '&'
+            // InternalUISemanticsGrammar.g:99:8: ( '&' )
+            // InternalUISemanticsGrammar.g:99:10: '&'
             {
             match('&'); 
 
@@ -1987,10 +1987,10 @@
         try {
             int _type = RULE_HEX;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6948:10: ( ( '0x' | '0X' ) ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+ ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )? )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6948:12: ( '0x' | '0X' ) ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+ ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )?
+            // InternalUISemanticsGrammar.g:7314:10: ( ( '0x' | '0X' ) ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+ ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )? )
+            // InternalUISemanticsGrammar.g:7314:12: ( '0x' | '0X' ) ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+ ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )?
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6948:12: ( '0x' | '0X' )
+            // InternalUISemanticsGrammar.g:7314:12: ( '0x' | '0X' )
             int alt1=2;
             int LA1_0 = input.LA(1);
 
@@ -2018,7 +2018,7 @@
             }
             switch (alt1) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6948:13: '0x'
+                    // InternalUISemanticsGrammar.g:7314:13: '0x'
                     {
                     match("0x"); 
 
@@ -2026,7 +2026,7 @@
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6948:18: '0X'
+                    // InternalUISemanticsGrammar.g:7314:18: '0X'
                     {
                     match("0X"); 
 
@@ -2036,7 +2036,7 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6948:24: ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+
+            // InternalUISemanticsGrammar.g:7314:24: ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+
             int cnt2=0;
             loop2:
             do {
@@ -2050,7 +2050,7 @@
 
                 switch (alt2) {
             	case 1 :
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:
+            	    // InternalUISemanticsGrammar.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();
@@ -2074,7 +2074,7 @@
                 cnt2++;
             } while (true);
 
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6948:58: ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )?
+            // InternalUISemanticsGrammar.g:7314:58: ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )?
             int alt4=2;
             int LA4_0 = input.LA(1);
 
@@ -2083,10 +2083,10 @@
             }
             switch (alt4) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6948:59: '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) )
+                    // InternalUISemanticsGrammar.g:7314:59: '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) )
                     {
                     match('#'); 
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6948:63: ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) )
+                    // InternalUISemanticsGrammar.g:7314:63: ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) )
                     int alt3=2;
                     int LA3_0 = input.LA(1);
 
@@ -2104,7 +2104,7 @@
                     }
                     switch (alt3) {
                         case 1 :
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6948:64: ( 'b' | 'B' ) ( 'i' | 'I' )
+                            // InternalUISemanticsGrammar.g:7314:64: ( 'b' | 'B' ) ( 'i' | 'I' )
                             {
                             if ( input.LA(1)=='B'||input.LA(1)=='b' ) {
                                 input.consume();
@@ -2128,7 +2128,7 @@
                             }
                             break;
                         case 2 :
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6948:84: ( 'l' | 'L' )
+                            // InternalUISemanticsGrammar.g:7314:84: ( 'l' | 'L' )
                             {
                             if ( input.LA(1)=='L'||input.LA(1)=='l' ) {
                                 input.consume();
@@ -2167,11 +2167,11 @@
         try {
             int _type = RULE_INT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6950:10: ( '0' .. '9' ( '0' .. '9' | '_' )* )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6950:12: '0' .. '9' ( '0' .. '9' | '_' )*
+            // InternalUISemanticsGrammar.g:7316:10: ( '0' .. '9' ( '0' .. '9' | '_' )* )
+            // InternalUISemanticsGrammar.g:7316:12: '0' .. '9' ( '0' .. '9' | '_' )*
             {
             matchRange('0','9'); 
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6950:21: ( '0' .. '9' | '_' )*
+            // InternalUISemanticsGrammar.g:7316:21: ( '0' .. '9' | '_' )*
             loop5:
             do {
                 int alt5=2;
@@ -2184,7 +2184,7 @@
 
                 switch (alt5) {
             	case 1 :
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:
+            	    // InternalUISemanticsGrammar.g:
             	    {
             	    if ( (input.LA(1)>='0' && input.LA(1)<='9')||input.LA(1)=='_' ) {
             	        input.consume();
@@ -2220,11 +2220,11 @@
         try {
             int _type = RULE_DECIMAL;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6952:14: ( RULE_INT ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )? ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )? )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6952:16: RULE_INT ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )? ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )?
+            // InternalUISemanticsGrammar.g:7318:14: ( RULE_INT ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )? ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )? )
+            // InternalUISemanticsGrammar.g:7318:16: RULE_INT ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )? ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )?
             {
             mRULE_INT(); 
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6952:25: ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )?
+            // InternalUISemanticsGrammar.g:7318:25: ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )?
             int alt7=2;
             int LA7_0 = input.LA(1);
 
@@ -2233,7 +2233,7 @@
             }
             switch (alt7) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6952:26: ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT
+                    // InternalUISemanticsGrammar.g:7318:26: ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT
                     {
                     if ( input.LA(1)=='E'||input.LA(1)=='e' ) {
                         input.consume();
@@ -2244,7 +2244,7 @@
                         recover(mse);
                         throw mse;}
 
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6952:36: ( '+' | '-' )?
+                    // InternalUISemanticsGrammar.g:7318:36: ( '+' | '-' )?
                     int alt6=2;
                     int LA6_0 = input.LA(1);
 
@@ -2253,7 +2253,7 @@
                     }
                     switch (alt6) {
                         case 1 :
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:
+                            // InternalUISemanticsGrammar.g:
                             {
                             if ( input.LA(1)=='+'||input.LA(1)=='-' ) {
                                 input.consume();
@@ -2277,7 +2277,7 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6952:58: ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )?
+            // InternalUISemanticsGrammar.g:7318:58: ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )?
             int alt8=3;
             int LA8_0 = input.LA(1);
 
@@ -2289,7 +2289,7 @@
             }
             switch (alt8) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6952:59: ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' )
+                    // InternalUISemanticsGrammar.g:7318:59: ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' )
                     {
                     if ( input.LA(1)=='B'||input.LA(1)=='b' ) {
                         input.consume();
@@ -2313,7 +2313,7 @@
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6952:87: ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' )
+                    // InternalUISemanticsGrammar.g:7318: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();
@@ -2346,10 +2346,10 @@
         try {
             int _type = RULE_ID;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6954:9: ( ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )* )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6954:11: ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
+            // InternalUISemanticsGrammar.g:7320:9: ( ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )* )
+            // InternalUISemanticsGrammar.g:7320:11: ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6954:11: ( '^' )?
+            // InternalUISemanticsGrammar.g:7320:11: ( '^' )?
             int alt9=2;
             int LA9_0 = input.LA(1);
 
@@ -2358,7 +2358,7 @@
             }
             switch (alt9) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6954:11: '^'
+                    // InternalUISemanticsGrammar.g:7320:11: '^'
                     {
                     match('^'); 
 
@@ -2376,7 +2376,7 @@
                 recover(mse);
                 throw mse;}
 
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6954:44: ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
+            // InternalUISemanticsGrammar.g:7320:44: ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
             loop10:
             do {
                 int alt10=2;
@@ -2389,7 +2389,7 @@
 
                 switch (alt10) {
             	case 1 :
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:
+            	    // InternalUISemanticsGrammar.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();
@@ -2425,10 +2425,10 @@
         try {
             int _type = RULE_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6956:13: ( ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6956:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
+            // InternalUISemanticsGrammar.g:7322:13: ( ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? ) )
+            // InternalUISemanticsGrammar.g:7322:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6956:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
+            // InternalUISemanticsGrammar.g:7322:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
             int alt15=2;
             int LA15_0 = input.LA(1);
 
@@ -2446,10 +2446,10 @@
             }
             switch (alt15) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6956:16: '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )?
+                    // InternalUISemanticsGrammar.g:7322:16: '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )?
                     {
                     match('\"'); 
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6956:20: ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )*
+                    // InternalUISemanticsGrammar.g:7322:20: ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )*
                     loop11:
                     do {
                         int alt11=3;
@@ -2465,7 +2465,7 @@
 
                         switch (alt11) {
                     	case 1 :
-                    	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6956:21: '\\\\' .
+                    	    // InternalUISemanticsGrammar.g:7322:21: '\\\\' .
                     	    {
                     	    match('\\'); 
                     	    matchAny(); 
@@ -2473,7 +2473,7 @@
                     	    }
                     	    break;
                     	case 2 :
-                    	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6956:28: ~ ( ( '\\\\' | '\"' ) )
+                    	    // InternalUISemanticsGrammar.g:7322:28: ~ ( ( '\\\\' | '\"' ) )
                     	    {
                     	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
                     	        input.consume();
@@ -2493,7 +2493,7 @@
                         }
                     } while (true);
 
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6956:44: ( '\"' )?
+                    // InternalUISemanticsGrammar.g:7322:44: ( '\"' )?
                     int alt12=2;
                     int LA12_0 = input.LA(1);
 
@@ -2502,7 +2502,7 @@
                     }
                     switch (alt12) {
                         case 1 :
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6956:44: '\"'
+                            // InternalUISemanticsGrammar.g:7322:44: '\"'
                             {
                             match('\"'); 
 
@@ -2515,10 +2515,10 @@
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6956:49: '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )?
+                    // InternalUISemanticsGrammar.g:7322:49: '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )?
                     {
                     match('\''); 
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6956:54: ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )*
+                    // InternalUISemanticsGrammar.g:7322:54: ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )*
                     loop13:
                     do {
                         int alt13=3;
@@ -2534,7 +2534,7 @@
 
                         switch (alt13) {
                     	case 1 :
-                    	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6956:55: '\\\\' .
+                    	    // InternalUISemanticsGrammar.g:7322:55: '\\\\' .
                     	    {
                     	    match('\\'); 
                     	    matchAny(); 
@@ -2542,7 +2542,7 @@
                     	    }
                     	    break;
                     	case 2 :
-                    	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6956:62: ~ ( ( '\\\\' | '\\'' ) )
+                    	    // InternalUISemanticsGrammar.g:7322:62: ~ ( ( '\\\\' | '\\'' ) )
                     	    {
                     	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
                     	        input.consume();
@@ -2562,7 +2562,7 @@
                         }
                     } while (true);
 
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6956:79: ( '\\'' )?
+                    // InternalUISemanticsGrammar.g:7322:79: ( '\\'' )?
                     int alt14=2;
                     int LA14_0 = input.LA(1);
 
@@ -2571,7 +2571,7 @@
                     }
                     switch (alt14) {
                         case 1 :
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6956:79: '\\''
+                            // InternalUISemanticsGrammar.g:7322:79: '\\''
                             {
                             match('\''); 
 
@@ -2602,12 +2602,12 @@
         try {
             int _type = RULE_ML_COMMENT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6958:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6958:19: '/*' ( options {greedy=false; } : . )* '*/'
+            // InternalUISemanticsGrammar.g:7324:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
+            // InternalUISemanticsGrammar.g:7324:19: '/*' ( options {greedy=false; } : . )* '*/'
             {
             match("/*"); 
 
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6958:24: ( options {greedy=false; } : . )*
+            // InternalUISemanticsGrammar.g:7324:24: ( options {greedy=false; } : . )*
             loop16:
             do {
                 int alt16=2;
@@ -2632,7 +2632,7 @@
 
                 switch (alt16) {
             	case 1 :
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6958:52: .
+            	    // InternalUISemanticsGrammar.g:7324:52: .
             	    {
             	    matchAny(); 
 
@@ -2662,12 +2662,12 @@
         try {
             int _type = RULE_SL_COMMENT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6960:17: ( '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6960:19: '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
+            // InternalUISemanticsGrammar.g:7326:17: ( '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
+            // InternalUISemanticsGrammar.g:7326:19: '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
             {
             match("//"); 
 
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6960:24: (~ ( ( '\\n' | '\\r' ) ) )*
+            // InternalUISemanticsGrammar.g:7326:24: (~ ( ( '\\n' | '\\r' ) ) )*
             loop17:
             do {
                 int alt17=2;
@@ -2680,7 +2680,7 @@
 
                 switch (alt17) {
             	case 1 :
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6960:24: ~ ( ( '\\n' | '\\r' ) )
+            	    // InternalUISemanticsGrammar.g:7326: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();
@@ -2700,7 +2700,7 @@
                 }
             } while (true);
 
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6960:40: ( ( '\\r' )? '\\n' )?
+            // InternalUISemanticsGrammar.g:7326:40: ( ( '\\r' )? '\\n' )?
             int alt19=2;
             int LA19_0 = input.LA(1);
 
@@ -2709,9 +2709,9 @@
             }
             switch (alt19) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6960:41: ( '\\r' )? '\\n'
+                    // InternalUISemanticsGrammar.g:7326:41: ( '\\r' )? '\\n'
                     {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6960:41: ( '\\r' )?
+                    // InternalUISemanticsGrammar.g:7326:41: ( '\\r' )?
                     int alt18=2;
                     int LA18_0 = input.LA(1);
 
@@ -2720,7 +2720,7 @@
                     }
                     switch (alt18) {
                         case 1 :
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6960:41: '\\r'
+                            // InternalUISemanticsGrammar.g:7326:41: '\\r'
                             {
                             match('\r'); 
 
@@ -2752,10 +2752,10 @@
         try {
             int _type = RULE_WS;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6962:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6962:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // InternalUISemanticsGrammar.g:7328:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
+            // InternalUISemanticsGrammar.g:7328:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6962:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // InternalUISemanticsGrammar.g:7328:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
             int cnt20=0;
             loop20:
             do {
@@ -2769,7 +2769,7 @@
 
                 switch (alt20) {
             	case 1 :
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:
+            	    // InternalUISemanticsGrammar.g:
             	    {
             	    if ( (input.LA(1)>='\t' && input.LA(1)<='\n')||input.LA(1)=='\r'||input.LA(1)==' ' ) {
             	        input.consume();
@@ -2809,8 +2809,8 @@
         try {
             int _type = RULE_ANY_OTHER;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6964:16: ( . )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:6964:18: .
+            // InternalUISemanticsGrammar.g:7330:16: ( . )
+            // InternalUISemanticsGrammar.g:7330:18: .
             {
             matchAny(); 
 
@@ -2825,691 +2825,691 @@
     // $ANTLR end "RULE_ANY_OTHER"
 
     public void mTokens() throws RecognitionException {
-        // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.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 | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_ID | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER )
+        // InternalUISemanticsGrammar.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 | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_ID | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER )
         int alt21=98;
         alt21 = dfa21.predict(input);
         switch (alt21) {
             case 1 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:10: T__13
+                // InternalUISemanticsGrammar.g:1:10: T__13
                 {
                 mT__13(); 
 
                 }
                 break;
             case 2 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:16: T__14
+                // InternalUISemanticsGrammar.g:1:16: T__14
                 {
                 mT__14(); 
 
                 }
                 break;
             case 3 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:22: T__15
+                // InternalUISemanticsGrammar.g:1:22: T__15
                 {
                 mT__15(); 
 
                 }
                 break;
             case 4 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:28: T__16
+                // InternalUISemanticsGrammar.g:1:28: T__16
                 {
                 mT__16(); 
 
                 }
                 break;
             case 5 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:34: T__17
+                // InternalUISemanticsGrammar.g:1:34: T__17
                 {
                 mT__17(); 
 
                 }
                 break;
             case 6 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:40: T__18
+                // InternalUISemanticsGrammar.g:1:40: T__18
                 {
                 mT__18(); 
 
                 }
                 break;
             case 7 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:46: T__19
+                // InternalUISemanticsGrammar.g:1:46: T__19
                 {
                 mT__19(); 
 
                 }
                 break;
             case 8 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:52: T__20
+                // InternalUISemanticsGrammar.g:1:52: T__20
                 {
                 mT__20(); 
 
                 }
                 break;
             case 9 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:58: T__21
+                // InternalUISemanticsGrammar.g:1:58: T__21
                 {
                 mT__21(); 
 
                 }
                 break;
             case 10 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:64: T__22
+                // InternalUISemanticsGrammar.g:1:64: T__22
                 {
                 mT__22(); 
 
                 }
                 break;
             case 11 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:70: T__23
+                // InternalUISemanticsGrammar.g:1:70: T__23
                 {
                 mT__23(); 
 
                 }
                 break;
             case 12 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:76: T__24
+                // InternalUISemanticsGrammar.g:1:76: T__24
                 {
                 mT__24(); 
 
                 }
                 break;
             case 13 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:82: T__25
+                // InternalUISemanticsGrammar.g:1:82: T__25
                 {
                 mT__25(); 
 
                 }
                 break;
             case 14 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:88: T__26
+                // InternalUISemanticsGrammar.g:1:88: T__26
                 {
                 mT__26(); 
 
                 }
                 break;
             case 15 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:94: T__27
+                // InternalUISemanticsGrammar.g:1:94: T__27
                 {
                 mT__27(); 
 
                 }
                 break;
             case 16 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:100: T__28
+                // InternalUISemanticsGrammar.g:1:100: T__28
                 {
                 mT__28(); 
 
                 }
                 break;
             case 17 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:106: T__29
+                // InternalUISemanticsGrammar.g:1:106: T__29
                 {
                 mT__29(); 
 
                 }
                 break;
             case 18 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:112: T__30
+                // InternalUISemanticsGrammar.g:1:112: T__30
                 {
                 mT__30(); 
 
                 }
                 break;
             case 19 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:118: T__31
+                // InternalUISemanticsGrammar.g:1:118: T__31
                 {
                 mT__31(); 
 
                 }
                 break;
             case 20 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:124: T__32
+                // InternalUISemanticsGrammar.g:1:124: T__32
                 {
                 mT__32(); 
 
                 }
                 break;
             case 21 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:130: T__33
+                // InternalUISemanticsGrammar.g:1:130: T__33
                 {
                 mT__33(); 
 
                 }
                 break;
             case 22 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:136: T__34
+                // InternalUISemanticsGrammar.g:1:136: T__34
                 {
                 mT__34(); 
 
                 }
                 break;
             case 23 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:142: T__35
+                // InternalUISemanticsGrammar.g:1:142: T__35
                 {
                 mT__35(); 
 
                 }
                 break;
             case 24 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:148: T__36
+                // InternalUISemanticsGrammar.g:1:148: T__36
                 {
                 mT__36(); 
 
                 }
                 break;
             case 25 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:154: T__37
+                // InternalUISemanticsGrammar.g:1:154: T__37
                 {
                 mT__37(); 
 
                 }
                 break;
             case 26 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:160: T__38
+                // InternalUISemanticsGrammar.g:1:160: T__38
                 {
                 mT__38(); 
 
                 }
                 break;
             case 27 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:166: T__39
+                // InternalUISemanticsGrammar.g:1:166: T__39
                 {
                 mT__39(); 
 
                 }
                 break;
             case 28 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:172: T__40
+                // InternalUISemanticsGrammar.g:1:172: T__40
                 {
                 mT__40(); 
 
                 }
                 break;
             case 29 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:178: T__41
+                // InternalUISemanticsGrammar.g:1:178: T__41
                 {
                 mT__41(); 
 
                 }
                 break;
             case 30 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:184: T__42
+                // InternalUISemanticsGrammar.g:1:184: T__42
                 {
                 mT__42(); 
 
                 }
                 break;
             case 31 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:190: T__43
+                // InternalUISemanticsGrammar.g:1:190: T__43
                 {
                 mT__43(); 
 
                 }
                 break;
             case 32 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:196: T__44
+                // InternalUISemanticsGrammar.g:1:196: T__44
                 {
                 mT__44(); 
 
                 }
                 break;
             case 33 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:202: T__45
+                // InternalUISemanticsGrammar.g:1:202: T__45
                 {
                 mT__45(); 
 
                 }
                 break;
             case 34 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:208: T__46
+                // InternalUISemanticsGrammar.g:1:208: T__46
                 {
                 mT__46(); 
 
                 }
                 break;
             case 35 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:214: T__47
+                // InternalUISemanticsGrammar.g:1:214: T__47
                 {
                 mT__47(); 
 
                 }
                 break;
             case 36 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:220: T__48
+                // InternalUISemanticsGrammar.g:1:220: T__48
                 {
                 mT__48(); 
 
                 }
                 break;
             case 37 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:226: T__49
+                // InternalUISemanticsGrammar.g:1:226: T__49
                 {
                 mT__49(); 
 
                 }
                 break;
             case 38 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:232: T__50
+                // InternalUISemanticsGrammar.g:1:232: T__50
                 {
                 mT__50(); 
 
                 }
                 break;
             case 39 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:238: T__51
+                // InternalUISemanticsGrammar.g:1:238: T__51
                 {
                 mT__51(); 
 
                 }
                 break;
             case 40 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:244: T__52
+                // InternalUISemanticsGrammar.g:1:244: T__52
                 {
                 mT__52(); 
 
                 }
                 break;
             case 41 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:250: T__53
+                // InternalUISemanticsGrammar.g:1:250: T__53
                 {
                 mT__53(); 
 
                 }
                 break;
             case 42 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:256: T__54
+                // InternalUISemanticsGrammar.g:1:256: T__54
                 {
                 mT__54(); 
 
                 }
                 break;
             case 43 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:262: T__55
+                // InternalUISemanticsGrammar.g:1:262: T__55
                 {
                 mT__55(); 
 
                 }
                 break;
             case 44 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:268: T__56
+                // InternalUISemanticsGrammar.g:1:268: T__56
                 {
                 mT__56(); 
 
                 }
                 break;
             case 45 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:274: T__57
+                // InternalUISemanticsGrammar.g:1:274: T__57
                 {
                 mT__57(); 
 
                 }
                 break;
             case 46 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:280: T__58
+                // InternalUISemanticsGrammar.g:1:280: T__58
                 {
                 mT__58(); 
 
                 }
                 break;
             case 47 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:286: T__59
+                // InternalUISemanticsGrammar.g:1:286: T__59
                 {
                 mT__59(); 
 
                 }
                 break;
             case 48 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:292: T__60
+                // InternalUISemanticsGrammar.g:1:292: T__60
                 {
                 mT__60(); 
 
                 }
                 break;
             case 49 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:298: T__61
+                // InternalUISemanticsGrammar.g:1:298: T__61
                 {
                 mT__61(); 
 
                 }
                 break;
             case 50 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:304: T__62
+                // InternalUISemanticsGrammar.g:1:304: T__62
                 {
                 mT__62(); 
 
                 }
                 break;
             case 51 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:310: T__63
+                // InternalUISemanticsGrammar.g:1:310: T__63
                 {
                 mT__63(); 
 
                 }
                 break;
             case 52 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:316: T__64
+                // InternalUISemanticsGrammar.g:1:316: T__64
                 {
                 mT__64(); 
 
                 }
                 break;
             case 53 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:322: T__65
+                // InternalUISemanticsGrammar.g:1:322: T__65
                 {
                 mT__65(); 
 
                 }
                 break;
             case 54 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:328: T__66
+                // InternalUISemanticsGrammar.g:1:328: T__66
                 {
                 mT__66(); 
 
                 }
                 break;
             case 55 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:334: T__67
+                // InternalUISemanticsGrammar.g:1:334: T__67
                 {
                 mT__67(); 
 
                 }
                 break;
             case 56 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:340: T__68
+                // InternalUISemanticsGrammar.g:1:340: T__68
                 {
                 mT__68(); 
 
                 }
                 break;
             case 57 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:346: T__69
+                // InternalUISemanticsGrammar.g:1:346: T__69
                 {
                 mT__69(); 
 
                 }
                 break;
             case 58 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:352: T__70
+                // InternalUISemanticsGrammar.g:1:352: T__70
                 {
                 mT__70(); 
 
                 }
                 break;
             case 59 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:358: T__71
+                // InternalUISemanticsGrammar.g:1:358: T__71
                 {
                 mT__71(); 
 
                 }
                 break;
             case 60 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:364: T__72
+                // InternalUISemanticsGrammar.g:1:364: T__72
                 {
                 mT__72(); 
 
                 }
                 break;
             case 61 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:370: T__73
+                // InternalUISemanticsGrammar.g:1:370: T__73
                 {
                 mT__73(); 
 
                 }
                 break;
             case 62 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:376: T__74
+                // InternalUISemanticsGrammar.g:1:376: T__74
                 {
                 mT__74(); 
 
                 }
                 break;
             case 63 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:382: T__75
+                // InternalUISemanticsGrammar.g:1:382: T__75
                 {
                 mT__75(); 
 
                 }
                 break;
             case 64 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:388: T__76
+                // InternalUISemanticsGrammar.g:1:388: T__76
                 {
                 mT__76(); 
 
                 }
                 break;
             case 65 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:394: T__77
+                // InternalUISemanticsGrammar.g:1:394: T__77
                 {
                 mT__77(); 
 
                 }
                 break;
             case 66 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:400: T__78
+                // InternalUISemanticsGrammar.g:1:400: T__78
                 {
                 mT__78(); 
 
                 }
                 break;
             case 67 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:406: T__79
+                // InternalUISemanticsGrammar.g:1:406: T__79
                 {
                 mT__79(); 
 
                 }
                 break;
             case 68 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:412: T__80
+                // InternalUISemanticsGrammar.g:1:412: T__80
                 {
                 mT__80(); 
 
                 }
                 break;
             case 69 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:418: T__81
+                // InternalUISemanticsGrammar.g:1:418: T__81
                 {
                 mT__81(); 
 
                 }
                 break;
             case 70 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:424: T__82
+                // InternalUISemanticsGrammar.g:1:424: T__82
                 {
                 mT__82(); 
 
                 }
                 break;
             case 71 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:430: T__83
+                // InternalUISemanticsGrammar.g:1:430: T__83
                 {
                 mT__83(); 
 
                 }
                 break;
             case 72 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:436: T__84
+                // InternalUISemanticsGrammar.g:1:436: T__84
                 {
                 mT__84(); 
 
                 }
                 break;
             case 73 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:442: T__85
+                // InternalUISemanticsGrammar.g:1:442: T__85
                 {
                 mT__85(); 
 
                 }
                 break;
             case 74 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:448: T__86
+                // InternalUISemanticsGrammar.g:1:448: T__86
                 {
                 mT__86(); 
 
                 }
                 break;
             case 75 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:454: T__87
+                // InternalUISemanticsGrammar.g:1:454: T__87
                 {
                 mT__87(); 
 
                 }
                 break;
             case 76 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:460: T__88
+                // InternalUISemanticsGrammar.g:1:460: T__88
                 {
                 mT__88(); 
 
                 }
                 break;
             case 77 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:466: T__89
+                // InternalUISemanticsGrammar.g:1:466: T__89
                 {
                 mT__89(); 
 
                 }
                 break;
             case 78 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:472: T__90
+                // InternalUISemanticsGrammar.g:1:472: T__90
                 {
                 mT__90(); 
 
                 }
                 break;
             case 79 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:478: T__91
+                // InternalUISemanticsGrammar.g:1:478: T__91
                 {
                 mT__91(); 
 
                 }
                 break;
             case 80 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:484: T__92
+                // InternalUISemanticsGrammar.g:1:484: T__92
                 {
                 mT__92(); 
 
                 }
                 break;
             case 81 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:490: T__93
+                // InternalUISemanticsGrammar.g:1:490: T__93
                 {
                 mT__93(); 
 
                 }
                 break;
             case 82 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:496: T__94
+                // InternalUISemanticsGrammar.g:1:496: T__94
                 {
                 mT__94(); 
 
                 }
                 break;
             case 83 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:502: T__95
+                // InternalUISemanticsGrammar.g:1:502: T__95
                 {
                 mT__95(); 
 
                 }
                 break;
             case 84 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:508: T__96
+                // InternalUISemanticsGrammar.g:1:508: T__96
                 {
                 mT__96(); 
 
                 }
                 break;
             case 85 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:514: T__97
+                // InternalUISemanticsGrammar.g:1:514: T__97
                 {
                 mT__97(); 
 
                 }
                 break;
             case 86 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:520: T__98
+                // InternalUISemanticsGrammar.g:1:520: T__98
                 {
                 mT__98(); 
 
                 }
                 break;
             case 87 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:526: T__99
+                // InternalUISemanticsGrammar.g:1:526: T__99
                 {
                 mT__99(); 
 
                 }
                 break;
             case 88 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:532: T__100
+                // InternalUISemanticsGrammar.g:1:532: T__100
                 {
                 mT__100(); 
 
                 }
                 break;
             case 89 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:539: T__101
+                // InternalUISemanticsGrammar.g:1:539: T__101
                 {
                 mT__101(); 
 
                 }
                 break;
             case 90 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:546: RULE_HEX
+                // InternalUISemanticsGrammar.g:1:546: RULE_HEX
                 {
                 mRULE_HEX(); 
 
                 }
                 break;
             case 91 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:555: RULE_INT
+                // InternalUISemanticsGrammar.g:1:555: RULE_INT
                 {
                 mRULE_INT(); 
 
                 }
                 break;
             case 92 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:564: RULE_DECIMAL
+                // InternalUISemanticsGrammar.g:1:564: RULE_DECIMAL
                 {
                 mRULE_DECIMAL(); 
 
                 }
                 break;
             case 93 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:577: RULE_ID
+                // InternalUISemanticsGrammar.g:1:577: RULE_ID
                 {
                 mRULE_ID(); 
 
                 }
                 break;
             case 94 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:585: RULE_STRING
+                // InternalUISemanticsGrammar.g:1:585: RULE_STRING
                 {
                 mRULE_STRING(); 
 
                 }
                 break;
             case 95 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:597: RULE_ML_COMMENT
+                // InternalUISemanticsGrammar.g:1:597: RULE_ML_COMMENT
                 {
                 mRULE_ML_COMMENT(); 
 
                 }
                 break;
             case 96 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:613: RULE_SL_COMMENT
+                // InternalUISemanticsGrammar.g:1:613: RULE_SL_COMMENT
                 {
                 mRULE_SL_COMMENT(); 
 
                 }
                 break;
             case 97 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:629: RULE_WS
+                // InternalUISemanticsGrammar.g:1:629: RULE_WS
                 {
                 mRULE_WS(); 
 
                 }
                 break;
             case 98 :
-                // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1:637: RULE_ANY_OTHER
+                // InternalUISemanticsGrammar.g:1:637: RULE_ANY_OTHER
                 {
                 mRULE_ANY_OTHER(); 
 
@@ -3531,7 +3531,7 @@
     static final String DFA21_maxS =
         "\1\uffff\1\163\2\uffff\1\141\1\170\1\157\1\156\1\171\1\75\1\uffff\2\151\2\162\1\72\1\157\1\151\1\171\1\76\1\75\1\76\2\75\1\76\1\75\1\174\1\46\1\75\1\56\1\72\6\uffff\1\150\1\165\1\145\1\170\1\154\1\172\5\uffff\1\164\1\172\3\uffff\2\164\1\141\1\163\1\144\1\163\1\146\1\172\1\160\1\163\1\172\1\141\1\151\1\160\1\156\4\uffff\1\156\1\163\1\162\1\157\1\151\2\uffff\1\156\1\162\1\154\1\163\1\162\1\171\1\160\1\162\1\75\27\uffff\1\75\1\uffff\1\74\12\uffff\1\151\1\167\1\154\1\164\1\uffff\1\154\4\uffff\1\151\1\uffff\3\145\1\143\1\155\1\145\1\160\2\141\1\uffff\1\157\1\164\1\uffff\2\164\1\145\1\143\1\144\1\151\2\172\1\160\1\172\1\141\1\172\1\163\1\164\1\147\1\145\1\172\1\145\1\157\6\uffff\1\154\1\172\1\154\1\165\1\157\1\147\1\150\1\172\1\162\1\153\1\145\1\172\1\157\1\142\1\165\1\162\1\141\1\151\1\143\1\162\1\150\1\151\1\142\1\144\2\uffff\1\145\1\uffff\1\154\1\uffff\1\145\1\172\1\145\1\172\1\uffff\1\157\1\167\1\145\1\uffff\1\172\1\162\1\156\1\157\1\172\1\uffff\1\156\1\163\1\141\1\156\1\uffff\1\151\2\154\1\164\1\156\1\143\1\150\1\172\1\162\1\156\1\151\1\141\1\162\2\172\1\uffff\1\164\1\uffff\1\146\2\172\1\uffff\1\156\1\163\1\162\1\uffff\1\141\1\151\1\163\1\147\1\164\1\156\1\145\1\164\1\172\1\143\2\172\1\uffff\1\157\1\147\1\154\2\164\1\171\2\uffff\2\172\2\uffff\2\172\1\151\1\154\1\157\1\172\1\145\1\172\1\164\1\144\1\172\1\uffff\1\145\2\uffff\1\156\1\163\1\151\1\157\1\171\1\172\4\uffff\1\145\1\103\1\156\1\uffff\1\172\1\uffff\2\172\1\uffff\1\157\1\151\1\172\1\164\1\162\1\172\1\uffff\1\163\1\157\1\172\3\uffff\1\146\1\172\1\uffff\1\171\1\172\1\uffff\1\172\1\155\1\uffff\1\172\1\145\1\172\2\uffff\1\155\1\uffff\1\144\1\uffff\1\141\1\172\1\156\1\uffff\1\144\1\172\1\uffff";
     static final String DFA21_acceptS =
-        "\2\uffff\1\2\1\3\6\uffff\1\14\24\uffff\1\72\1\73\1\74\1\75\1\76\1\77\6\uffff\1\135\2\136\1\141\1\142\2\uffff\1\135\1\2\1\3\17\uffff\1\34\1\61\1\12\1\14\5\uffff\1\70\1\24\11\uffff\1\54\1\31\1\32\1\65\1\57\1\33\1\51\1\66\1\60\1\35\1\137\1\140\1\62\1\36\1\63\1\55\1\37\1\41\1\40\1\42\1\100\1\43\1\131\1\uffff\1\64\1\uffff\1\67\1\56\1\71\1\130\1\72\1\73\1\74\1\75\1\76\1\77\4\uffff\1\132\1\uffff\1\133\1\134\1\136\1\141\1\uffff\1\15\11\uffff\1\110\2\uffff\1\101\23\uffff\1\46\1\44\1\47\1\45\1\52\1\53\30\uffff\1\112\1\111\1\uffff\1\23\1\uffff\1\106\4\uffff\1\124\3\uffff\1\115\5\uffff\1\105\4\uffff\1\102\17\uffff\1\26\1\uffff\1\117\3\uffff\1\120\3\uffff\1\127\14\uffff\1\114\6\uffff\1\25\1\116\2\uffff\1\122\1\107\13\uffff\1\7\1\uffff\1\10\1\103\6\uffff\1\30\1\121\1\123\1\1\3\uffff\1\113\1\uffff\1\16\2\uffff\1\104\6\uffff\1\125\3\uffff\1\13\1\27\1\6\2\uffff\1\17\2\uffff\1\22\2\uffff\1\11\3\uffff\1\21\1\4\1\uffff\1\50\1\uffff\1\20\3\uffff\1\126\2\uffff\1\5";
+        "\2\uffff\1\2\1\3\6\uffff\1\14\24\uffff\1\73\1\74\1\75\1\76\1\77\1\100\6\uffff\1\135\2\136\1\141\1\142\2\uffff\1\135\1\2\1\3\17\uffff\1\35\1\62\1\12\1\14\5\uffff\1\71\1\24\11\uffff\1\55\1\32\1\33\1\66\1\60\1\34\1\52\1\67\1\61\1\36\1\137\1\140\1\63\1\37\1\64\1\56\1\40\1\42\1\41\1\43\1\101\1\44\1\131\1\uffff\1\65\1\uffff\1\70\1\57\1\72\1\130\1\73\1\74\1\75\1\76\1\77\1\100\4\uffff\1\132\1\uffff\1\133\1\134\1\136\1\141\1\uffff\1\15\11\uffff\1\111\2\uffff\1\102\23\uffff\1\47\1\45\1\50\1\46\1\53\1\54\30\uffff\1\113\1\112\1\uffff\1\23\1\uffff\1\107\4\uffff\1\124\3\uffff\1\115\5\uffff\1\106\4\uffff\1\103\17\uffff\1\27\1\uffff\1\117\3\uffff\1\120\3\uffff\1\127\14\uffff\1\114\6\uffff\1\26\1\116\2\uffff\1\122\1\110\13\uffff\1\7\1\uffff\1\10\1\104\6\uffff\1\31\1\121\1\123\1\1\3\uffff\1\25\1\uffff\1\16\2\uffff\1\105\6\uffff\1\125\3\uffff\1\13\1\30\1\6\2\uffff\1\17\2\uffff\1\22\2\uffff\1\11\3\uffff\1\21\1\4\1\uffff\1\51\1\uffff\1\20\3\uffff\1\126\2\uffff\1\5";
     static final String DFA21_specialS =
         "\1\0\u015a\uffff}>";
     static final String[] DFA21_transitionS = {
diff --git a/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammarParser.java b/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammarParser.java
index 07e1167..7747e3f 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammarParser.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammarParser.java
@@ -1,15 +1,4 @@
-/**
- * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf), Loetz GmbH&Co.KG (Heidelberg)
- * 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:
- *         Florian Pirchner - Initial implementation
- */
-
-package org.eclipse.osbp.ecview.uisemantics.parser.antlr.internal; 
+package org.eclipse.osbp.ecview.uisemantics.parser.antlr.internal;
 
 import org.eclipse.xtext.*;
 import org.eclipse.xtext.parser.*;
@@ -30,10 +19,23 @@
 import java.util.ArrayList;
 import java.util.Map;
 import java.util.HashMap;
+/**
+ * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf), Loetz GmbH&Co.KG (Heidelberg)
+ * 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:
+ *         Florian Pirchner - Initial implementation
+ *
+ * generated by Xtext 2.11.0
+ *
+ */
 @SuppressWarnings("all")
 public class InternalUISemanticsGrammarParser extends AbstractInternalAntlrParser {
     public static final String[] tokenNames = new String[] {
-        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_STRING", "RULE_ID", "RULE_HEX", "RULE_INT", "RULE_DECIMAL", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'actions'", "'{'", "'}'", "'categories'", "'externalCommand'", "'disabled'", "'import'", "'static'", "'extension'", "'*'", "'ePackage'", "';'", "'as'", "'element'", "'bindings'", "'visibility'", "'validator'", "'property'", "'uri'", "':'", "'final'", "'list'", "'endpoint'", "'target'", "'='", "'+='", "'-='", "'*='", "'/='", "'%='", "'<'", "'>'", "'>='", "'||'", "'&&'", "'=='", "'!='", "'==='", "'!=='", "'instanceof'", "'->'", "'..<'", "'..'", "'=>'", "'<>'", "'?:'", "'+'", "'-'", "'**'", "'/'", "'%'", "'!'", "'++'", "'--'", "'.'", "'::'", "'?.'", "','", "'('", "')'", "'#'", "'['", "']'", "'|'", "'if'", "'else'", "'switch'", "'default'", "'case'", "'for'", "'while'", "'do'", "'var'", "'val'", "'extends'", "'super'", "'new'", "'false'", "'true'", "'null'", "'typeof'", "'throw'", "'return'", "'try'", "'finally'", "'synchronized'", "'catch'", "'?'", "'&'"
+        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_STRING", "RULE_ID", "RULE_HEX", "RULE_INT", "RULE_DECIMAL", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'actions'", "'{'", "'}'", "'categories'", "'externalCommand'", "'disabled'", "'import'", "'static'", "'extension'", "'*'", "'ePackage'", "';'", "'as'", "'element'", "'bindings'", "'visibility'", "'validator'", "'property'", "'uri'", "':'", "'extends'", "'final'", "'list'", "'endpoint'", "'target'", "'='", "'+='", "'-='", "'*='", "'/='", "'%='", "'<'", "'>'", "'>='", "'||'", "'&&'", "'=='", "'!='", "'==='", "'!=='", "'instanceof'", "'->'", "'..<'", "'..'", "'=>'", "'<>'", "'?:'", "'+'", "'-'", "'**'", "'/'", "'%'", "'!'", "'++'", "'--'", "'.'", "'::'", "'?.'", "','", "'('", "')'", "'#'", "'['", "']'", "'|'", "'if'", "'else'", "'switch'", "'default'", "'case'", "'for'", "'while'", "'do'", "'var'", "'val'", "'super'", "'new'", "'false'", "'true'", "'null'", "'typeof'", "'throw'", "'return'", "'try'", "'finally'", "'synchronized'", "'catch'", "'?'", "'&'"
     };
     public static final int RULE_HEX=6;
     public static final int T__50=50;
@@ -149,23 +151,23 @@
         
 
     public String[] getTokenNames() { return InternalUISemanticsGrammarParser.tokenNames; }
-    public String getGrammarFileName() { return "../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g"; }
+    public String getGrammarFileName() { return "InternalUISemanticsGrammar.g"; }
 
 
 
      	private UISemanticsGrammarGrammarAccess grammarAccess;
-     	
+
         public InternalUISemanticsGrammarParser(TokenStream input, UISemanticsGrammarGrammarAccess grammarAccess) {
             this(input);
             this.grammarAccess = grammarAccess;
             registerRules(grammarAccess.getGrammar());
         }
-        
+
         @Override
         protected String getFirstRuleName() {
-        	return "UxModel";	
+        	return "UxModel";
        	}
-       	
+
        	@Override
        	protected UISemanticsGrammarGrammarAccess getGrammarAccess() {
        		return grammarAccess;
@@ -173,8 +175,9 @@
 
 
 
+
     // $ANTLR start "entryRuleUxModel"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:67:1: entryRuleUxModel returns [EObject current=null] : iv_ruleUxModel= ruleUxModel EOF ;
+    // InternalUISemanticsGrammar.g:75:1: entryRuleUxModel returns [EObject current=null] : iv_ruleUxModel= ruleUxModel EOF ;
     public final EObject entryRuleUxModel() throws RecognitionException {
         EObject current = null;
 
@@ -182,13 +185,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:68:2: (iv_ruleUxModel= ruleUxModel EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:69:2: iv_ruleUxModel= ruleUxModel EOF
+            // InternalUISemanticsGrammar.g:75:48: (iv_ruleUxModel= ruleUxModel EOF )
+            // InternalUISemanticsGrammar.g:76:2: iv_ruleUxModel= ruleUxModel EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUxModelRule()); 
             }
-            pushFollow(FOLLOW_ruleUxModel_in_entryRuleUxModel75);
+            pushFollow(FOLLOW_1);
             iv_ruleUxModel=ruleUxModel();
 
             state._fsp--;
@@ -196,16 +199,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUxModel; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleUxModel85); 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;
@@ -214,7 +217,7 @@
 
 
     // $ANTLR start "ruleUxModel"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:76:1: ruleUxModel returns [EObject current=null] : ( () ( (lv_importSection_1_0= ruleXImportSection ) )? (otherlv_2= 'actions' otherlv_3= '{' ( (lv_viewActions_4_0= ruleUxAction ) )* otherlv_5= '}' )? (otherlv_6= 'categories' otherlv_7= '{' ( (lv_categories_8_0= ruleUxViewCategory ) )* otherlv_9= '}' )? ( (lv_elementDefinitions_10_0= ruleUxElementDefinition ) )* ) ;
+    // InternalUISemanticsGrammar.g:82:1: ruleUxModel returns [EObject current=null] : ( () ( (lv_importSection_1_0= ruleXImportSection ) )? (otherlv_2= 'actions' otherlv_3= '{' ( (lv_viewActions_4_0= ruleUxAction ) )* otherlv_5= '}' )? (otherlv_6= 'categories' otherlv_7= '{' ( (lv_categories_8_0= ruleUxViewCategory ) )* otherlv_9= '}' )? ( (lv_elementDefinitions_10_0= ruleUxElementDefinition ) )* ) ;
     public final EObject ruleUxModel() throws RecognitionException {
         EObject current = null;
 
@@ -233,29 +236,30 @@
         EObject lv_elementDefinitions_10_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:79:28: ( ( () ( (lv_importSection_1_0= ruleXImportSection ) )? (otherlv_2= 'actions' otherlv_3= '{' ( (lv_viewActions_4_0= ruleUxAction ) )* otherlv_5= '}' )? (otherlv_6= 'categories' otherlv_7= '{' ( (lv_categories_8_0= ruleUxViewCategory ) )* otherlv_9= '}' )? ( (lv_elementDefinitions_10_0= ruleUxElementDefinition ) )* ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:80:1: ( () ( (lv_importSection_1_0= ruleXImportSection ) )? (otherlv_2= 'actions' otherlv_3= '{' ( (lv_viewActions_4_0= ruleUxAction ) )* otherlv_5= '}' )? (otherlv_6= 'categories' otherlv_7= '{' ( (lv_categories_8_0= ruleUxViewCategory ) )* otherlv_9= '}' )? ( (lv_elementDefinitions_10_0= ruleUxElementDefinition ) )* )
+            // InternalUISemanticsGrammar.g:88:2: ( ( () ( (lv_importSection_1_0= ruleXImportSection ) )? (otherlv_2= 'actions' otherlv_3= '{' ( (lv_viewActions_4_0= ruleUxAction ) )* otherlv_5= '}' )? (otherlv_6= 'categories' otherlv_7= '{' ( (lv_categories_8_0= ruleUxViewCategory ) )* otherlv_9= '}' )? ( (lv_elementDefinitions_10_0= ruleUxElementDefinition ) )* ) )
+            // InternalUISemanticsGrammar.g:89:2: ( () ( (lv_importSection_1_0= ruleXImportSection ) )? (otherlv_2= 'actions' otherlv_3= '{' ( (lv_viewActions_4_0= ruleUxAction ) )* otherlv_5= '}' )? (otherlv_6= 'categories' otherlv_7= '{' ( (lv_categories_8_0= ruleUxViewCategory ) )* otherlv_9= '}' )? ( (lv_elementDefinitions_10_0= ruleUxElementDefinition ) )* )
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:80:1: ( () ( (lv_importSection_1_0= ruleXImportSection ) )? (otherlv_2= 'actions' otherlv_3= '{' ( (lv_viewActions_4_0= ruleUxAction ) )* otherlv_5= '}' )? (otherlv_6= 'categories' otherlv_7= '{' ( (lv_categories_8_0= ruleUxViewCategory ) )* otherlv_9= '}' )? ( (lv_elementDefinitions_10_0= ruleUxElementDefinition ) )* )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:80:2: () ( (lv_importSection_1_0= ruleXImportSection ) )? (otherlv_2= 'actions' otherlv_3= '{' ( (lv_viewActions_4_0= ruleUxAction ) )* otherlv_5= '}' )? (otherlv_6= 'categories' otherlv_7= '{' ( (lv_categories_8_0= ruleUxViewCategory ) )* otherlv_9= '}' )? ( (lv_elementDefinitions_10_0= ruleUxElementDefinition ) )*
+            // InternalUISemanticsGrammar.g:89:2: ( () ( (lv_importSection_1_0= ruleXImportSection ) )? (otherlv_2= 'actions' otherlv_3= '{' ( (lv_viewActions_4_0= ruleUxAction ) )* otherlv_5= '}' )? (otherlv_6= 'categories' otherlv_7= '{' ( (lv_categories_8_0= ruleUxViewCategory ) )* otherlv_9= '}' )? ( (lv_elementDefinitions_10_0= ruleUxElementDefinition ) )* )
+            // InternalUISemanticsGrammar.g:90:3: () ( (lv_importSection_1_0= ruleXImportSection ) )? (otherlv_2= 'actions' otherlv_3= '{' ( (lv_viewActions_4_0= ruleUxAction ) )* otherlv_5= '}' )? (otherlv_6= 'categories' otherlv_7= '{' ( (lv_categories_8_0= ruleUxViewCategory ) )* otherlv_9= '}' )? ( (lv_elementDefinitions_10_0= ruleUxElementDefinition ) )*
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:80:2: ()
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:81:5: 
+            // InternalUISemanticsGrammar.g:90:3: ()
+            // InternalUISemanticsGrammar.g:91:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getUxModelAccess().getUxModelAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getUxModelAccess().getUxModelAction_0(),
+              					current);
+              			
             }
 
             }
 
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:86:2: ( (lv_importSection_1_0= ruleXImportSection ) )?
+            // InternalUISemanticsGrammar.g:97:3: ( (lv_importSection_1_0= ruleXImportSection ) )?
             int alt1=2;
             int LA1_0 = input.LA(1);
 
@@ -264,33 +268,33 @@
             }
             switch (alt1) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:87:1: (lv_importSection_1_0= ruleXImportSection )
+                    // InternalUISemanticsGrammar.g:98:4: (lv_importSection_1_0= ruleXImportSection )
                     {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:87:1: (lv_importSection_1_0= ruleXImportSection )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:88:3: lv_importSection_1_0= ruleXImportSection
+                    // InternalUISemanticsGrammar.g:98:4: (lv_importSection_1_0= ruleXImportSection )
+                    // InternalUISemanticsGrammar.g:99:5: lv_importSection_1_0= ruleXImportSection
                     {
                     if ( state.backtracking==0 ) {
-                       
-                      	        newCompositeNode(grammarAccess.getUxModelAccess().getImportSectionXImportSectionParserRuleCall_1_0()); 
-                      	    
+
+                      					newCompositeNode(grammarAccess.getUxModelAccess().getImportSectionXImportSectionParserRuleCall_1_0());
+                      				
                     }
-                    pushFollow(FOLLOW_ruleXImportSection_in_ruleUxModel140);
+                    pushFollow(FOLLOW_3);
                     lv_importSection_1_0=ruleXImportSection();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElementForParent(grammarAccess.getUxModelRule());
-                      	        }
-                             		set(
-                             			current, 
-                             			"importSection",
-                              		lv_importSection_1_0, 
-                              		"XImportSection");
-                      	        afterParserOrEnumRuleCall();
-                      	    
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getUxModelRule());
+                      					}
+                      					set(
+                      						current,
+                      						"importSection",
+                      						lv_importSection_1_0,
+                      						"org.eclipse.xtext.xbase.Xtype.XImportSection");
+                      					afterParserOrEnumRuleCall();
+                      				
                     }
 
                     }
@@ -301,7 +305,7 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:104:3: (otherlv_2= 'actions' otherlv_3= '{' ( (lv_viewActions_4_0= ruleUxAction ) )* otherlv_5= '}' )?
+            // InternalUISemanticsGrammar.g:116:3: (otherlv_2= 'actions' otherlv_3= '{' ( (lv_viewActions_4_0= ruleUxAction ) )* otherlv_5= '}' )?
             int alt3=2;
             int LA3_0 = input.LA(1);
 
@@ -310,21 +314,21 @@
             }
             switch (alt3) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:104:5: otherlv_2= 'actions' otherlv_3= '{' ( (lv_viewActions_4_0= ruleUxAction ) )* otherlv_5= '}'
+                    // InternalUISemanticsGrammar.g:117:4: otherlv_2= 'actions' otherlv_3= '{' ( (lv_viewActions_4_0= ruleUxAction ) )* otherlv_5= '}'
                     {
-                    otherlv_2=(Token)match(input,13,FOLLOW_13_in_ruleUxModel154); if (state.failed) return current;
+                    otherlv_2=(Token)match(input,13,FOLLOW_4); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_2, grammarAccess.getUxModelAccess().getActionsKeyword_2_0());
-                          
+                      				newLeafNode(otherlv_2, grammarAccess.getUxModelAccess().getActionsKeyword_2_0());
+                      			
                     }
-                    otherlv_3=(Token)match(input,14,FOLLOW_14_in_ruleUxModel166); if (state.failed) return current;
+                    otherlv_3=(Token)match(input,14,FOLLOW_5); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_3, grammarAccess.getUxModelAccess().getLeftCurlyBracketKeyword_2_1());
-                          
+                      				newLeafNode(otherlv_3, grammarAccess.getUxModelAccess().getLeftCurlyBracketKeyword_2_1());
+                      			
                     }
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:112:1: ( (lv_viewActions_4_0= ruleUxAction ) )*
+                    // InternalUISemanticsGrammar.g:125:4: ( (lv_viewActions_4_0= ruleUxAction ) )*
                     loop2:
                     do {
                         int alt2=2;
@@ -337,33 +341,33 @@
 
                         switch (alt2) {
                     	case 1 :
-                    	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:113:1: (lv_viewActions_4_0= ruleUxAction )
+                    	    // InternalUISemanticsGrammar.g:126:5: (lv_viewActions_4_0= ruleUxAction )
                     	    {
-                    	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:113:1: (lv_viewActions_4_0= ruleUxAction )
-                    	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:114:3: lv_viewActions_4_0= ruleUxAction
+                    	    // InternalUISemanticsGrammar.g:126:5: (lv_viewActions_4_0= ruleUxAction )
+                    	    // InternalUISemanticsGrammar.g:127:6: lv_viewActions_4_0= ruleUxAction
                     	    {
                     	    if ( state.backtracking==0 ) {
-                    	       
-                    	      	        newCompositeNode(grammarAccess.getUxModelAccess().getViewActionsUxActionParserRuleCall_2_2_0()); 
-                    	      	    
+
+                    	      						newCompositeNode(grammarAccess.getUxModelAccess().getViewActionsUxActionParserRuleCall_2_2_0());
+                    	      					
                     	    }
-                    	    pushFollow(FOLLOW_ruleUxAction_in_ruleUxModel187);
+                    	    pushFollow(FOLLOW_5);
                     	    lv_viewActions_4_0=ruleUxAction();
 
                     	    state._fsp--;
                     	    if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
-                    	      	        if (current==null) {
-                    	      	            current = createModelElementForParent(grammarAccess.getUxModelRule());
-                    	      	        }
-                    	             		add(
-                    	             			current, 
-                    	             			"viewActions",
-                    	              		lv_viewActions_4_0, 
-                    	              		"UxAction");
-                    	      	        afterParserOrEnumRuleCall();
-                    	      	    
+                    	      						if (current==null) {
+                    	      							current = createModelElementForParent(grammarAccess.getUxModelRule());
+                    	      						}
+                    	      						add(
+                    	      							current,
+                    	      							"viewActions",
+                    	      							lv_viewActions_4_0,
+                    	      							"org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.UxAction");
+                    	      						afterParserOrEnumRuleCall();
+                    	      					
                     	    }
 
                     	    }
@@ -377,11 +381,11 @@
                         }
                     } while (true);
 
-                    otherlv_5=(Token)match(input,15,FOLLOW_15_in_ruleUxModel200); if (state.failed) return current;
+                    otherlv_5=(Token)match(input,15,FOLLOW_6); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_5, grammarAccess.getUxModelAccess().getRightCurlyBracketKeyword_2_3());
-                          
+                      				newLeafNode(otherlv_5, grammarAccess.getUxModelAccess().getRightCurlyBracketKeyword_2_3());
+                      			
                     }
 
                     }
@@ -389,7 +393,7 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:134:3: (otherlv_6= 'categories' otherlv_7= '{' ( (lv_categories_8_0= ruleUxViewCategory ) )* otherlv_9= '}' )?
+            // InternalUISemanticsGrammar.g:149:3: (otherlv_6= 'categories' otherlv_7= '{' ( (lv_categories_8_0= ruleUxViewCategory ) )* otherlv_9= '}' )?
             int alt5=2;
             int LA5_0 = input.LA(1);
 
@@ -398,21 +402,21 @@
             }
             switch (alt5) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:134:5: otherlv_6= 'categories' otherlv_7= '{' ( (lv_categories_8_0= ruleUxViewCategory ) )* otherlv_9= '}'
+                    // InternalUISemanticsGrammar.g:150:4: otherlv_6= 'categories' otherlv_7= '{' ( (lv_categories_8_0= ruleUxViewCategory ) )* otherlv_9= '}'
                     {
-                    otherlv_6=(Token)match(input,16,FOLLOW_16_in_ruleUxModel215); if (state.failed) return current;
+                    otherlv_6=(Token)match(input,16,FOLLOW_4); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_6, grammarAccess.getUxModelAccess().getCategoriesKeyword_3_0());
-                          
+                      				newLeafNode(otherlv_6, grammarAccess.getUxModelAccess().getCategoriesKeyword_3_0());
+                      			
                     }
-                    otherlv_7=(Token)match(input,14,FOLLOW_14_in_ruleUxModel227); if (state.failed) return current;
+                    otherlv_7=(Token)match(input,14,FOLLOW_5); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_7, grammarAccess.getUxModelAccess().getLeftCurlyBracketKeyword_3_1());
-                          
+                      				newLeafNode(otherlv_7, grammarAccess.getUxModelAccess().getLeftCurlyBracketKeyword_3_1());
+                      			
                     }
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:142:1: ( (lv_categories_8_0= ruleUxViewCategory ) )*
+                    // InternalUISemanticsGrammar.g:158:4: ( (lv_categories_8_0= ruleUxViewCategory ) )*
                     loop4:
                     do {
                         int alt4=2;
@@ -425,33 +429,33 @@
 
                         switch (alt4) {
                     	case 1 :
-                    	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:143:1: (lv_categories_8_0= ruleUxViewCategory )
+                    	    // InternalUISemanticsGrammar.g:159:5: (lv_categories_8_0= ruleUxViewCategory )
                     	    {
-                    	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:143:1: (lv_categories_8_0= ruleUxViewCategory )
-                    	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:144:3: lv_categories_8_0= ruleUxViewCategory
+                    	    // InternalUISemanticsGrammar.g:159:5: (lv_categories_8_0= ruleUxViewCategory )
+                    	    // InternalUISemanticsGrammar.g:160:6: lv_categories_8_0= ruleUxViewCategory
                     	    {
                     	    if ( state.backtracking==0 ) {
-                    	       
-                    	      	        newCompositeNode(grammarAccess.getUxModelAccess().getCategoriesUxViewCategoryParserRuleCall_3_2_0()); 
-                    	      	    
+
+                    	      						newCompositeNode(grammarAccess.getUxModelAccess().getCategoriesUxViewCategoryParserRuleCall_3_2_0());
+                    	      					
                     	    }
-                    	    pushFollow(FOLLOW_ruleUxViewCategory_in_ruleUxModel248);
+                    	    pushFollow(FOLLOW_5);
                     	    lv_categories_8_0=ruleUxViewCategory();
 
                     	    state._fsp--;
                     	    if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
-                    	      	        if (current==null) {
-                    	      	            current = createModelElementForParent(grammarAccess.getUxModelRule());
-                    	      	        }
-                    	             		add(
-                    	             			current, 
-                    	             			"categories",
-                    	              		lv_categories_8_0, 
-                    	              		"UxViewCategory");
-                    	      	        afterParserOrEnumRuleCall();
-                    	      	    
+                    	      						if (current==null) {
+                    	      							current = createModelElementForParent(grammarAccess.getUxModelRule());
+                    	      						}
+                    	      						add(
+                    	      							current,
+                    	      							"categories",
+                    	      							lv_categories_8_0,
+                    	      							"org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.UxViewCategory");
+                    	      						afterParserOrEnumRuleCall();
+                    	      					
                     	    }
 
                     	    }
@@ -465,11 +469,11 @@
                         }
                     } while (true);
 
-                    otherlv_9=(Token)match(input,15,FOLLOW_15_in_ruleUxModel261); if (state.failed) return current;
+                    otherlv_9=(Token)match(input,15,FOLLOW_7); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_9, grammarAccess.getUxModelAccess().getRightCurlyBracketKeyword_3_3());
-                          
+                      				newLeafNode(otherlv_9, grammarAccess.getUxModelAccess().getRightCurlyBracketKeyword_3_3());
+                      			
                     }
 
                     }
@@ -477,7 +481,7 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:164:3: ( (lv_elementDefinitions_10_0= ruleUxElementDefinition ) )*
+            // InternalUISemanticsGrammar.g:182:3: ( (lv_elementDefinitions_10_0= ruleUxElementDefinition ) )*
             loop6:
             do {
                 int alt6=2;
@@ -490,33 +494,33 @@
 
                 switch (alt6) {
             	case 1 :
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:165:1: (lv_elementDefinitions_10_0= ruleUxElementDefinition )
+            	    // InternalUISemanticsGrammar.g:183:4: (lv_elementDefinitions_10_0= ruleUxElementDefinition )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:165:1: (lv_elementDefinitions_10_0= ruleUxElementDefinition )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:166:3: lv_elementDefinitions_10_0= ruleUxElementDefinition
+            	    // InternalUISemanticsGrammar.g:183:4: (lv_elementDefinitions_10_0= ruleUxElementDefinition )
+            	    // InternalUISemanticsGrammar.g:184:5: lv_elementDefinitions_10_0= ruleUxElementDefinition
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getUxModelAccess().getElementDefinitionsUxElementDefinitionParserRuleCall_4_0()); 
-            	      	    
+
+            	      					newCompositeNode(grammarAccess.getUxModelAccess().getElementDefinitionsUxElementDefinitionParserRuleCall_4_0());
+            	      				
             	    }
-            	    pushFollow(FOLLOW_ruleUxElementDefinition_in_ruleUxModel284);
+            	    pushFollow(FOLLOW_7);
             	    lv_elementDefinitions_10_0=ruleUxElementDefinition();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getUxModelRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"elementDefinitions",
-            	              		lv_elementDefinitions_10_0, 
-            	              		"UxElementDefinition");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUxModelRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"elementDefinitions",
+            	      						lv_elementDefinitions_10_0,
+            	      						"org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.UxElementDefinition");
+            	      					afterParserOrEnumRuleCall();
+            	      				
             	    }
 
             	    }
@@ -537,14 +541,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -553,7 +559,7 @@
 
 
     // $ANTLR start "entryRuleUxAction"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:190:1: entryRuleUxAction returns [EObject current=null] : iv_ruleUxAction= ruleUxAction EOF ;
+    // InternalUISemanticsGrammar.g:205:1: entryRuleUxAction returns [EObject current=null] : iv_ruleUxAction= ruleUxAction EOF ;
     public final EObject entryRuleUxAction() throws RecognitionException {
         EObject current = null;
 
@@ -561,13 +567,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:191:2: (iv_ruleUxAction= ruleUxAction EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:192:2: iv_ruleUxAction= ruleUxAction EOF
+            // InternalUISemanticsGrammar.g:205:49: (iv_ruleUxAction= ruleUxAction EOF )
+            // InternalUISemanticsGrammar.g:206:2: iv_ruleUxAction= ruleUxAction EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUxActionRule()); 
             }
-            pushFollow(FOLLOW_ruleUxAction_in_entryRuleUxAction321);
+            pushFollow(FOLLOW_1);
             iv_ruleUxAction=ruleUxAction();
 
             state._fsp--;
@@ -575,16 +581,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUxAction; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleUxAction331); 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;
@@ -593,7 +599,7 @@
 
 
     // $ANTLR start "ruleUxAction"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:199:1: ruleUxAction returns [EObject current=null] : ( ( (lv_name_0_0= ruleQualifiedName ) ) (otherlv_1= 'externalCommand' ( (lv_externalCommandId_2_0= RULE_STRING ) ) )? ( (lv_initialDisabled_3_0= 'disabled' ) )? ) ;
+    // InternalUISemanticsGrammar.g:212:1: ruleUxAction returns [EObject current=null] : ( ( (lv_name_0_0= ruleQualifiedName ) ) (otherlv_1= 'externalCommand' ( (lv_externalCommandId_2_0= RULE_STRING ) ) )? ( (lv_initialDisabled_3_0= 'disabled' ) )? ) ;
     public final EObject ruleUxAction() throws RecognitionException {
         EObject current = null;
 
@@ -603,43 +609,44 @@
         AntlrDatatypeRuleToken lv_name_0_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:202:28: ( ( ( (lv_name_0_0= ruleQualifiedName ) ) (otherlv_1= 'externalCommand' ( (lv_externalCommandId_2_0= RULE_STRING ) ) )? ( (lv_initialDisabled_3_0= 'disabled' ) )? ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:203:1: ( ( (lv_name_0_0= ruleQualifiedName ) ) (otherlv_1= 'externalCommand' ( (lv_externalCommandId_2_0= RULE_STRING ) ) )? ( (lv_initialDisabled_3_0= 'disabled' ) )? )
+            // InternalUISemanticsGrammar.g:218:2: ( ( ( (lv_name_0_0= ruleQualifiedName ) ) (otherlv_1= 'externalCommand' ( (lv_externalCommandId_2_0= RULE_STRING ) ) )? ( (lv_initialDisabled_3_0= 'disabled' ) )? ) )
+            // InternalUISemanticsGrammar.g:219:2: ( ( (lv_name_0_0= ruleQualifiedName ) ) (otherlv_1= 'externalCommand' ( (lv_externalCommandId_2_0= RULE_STRING ) ) )? ( (lv_initialDisabled_3_0= 'disabled' ) )? )
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:203:1: ( ( (lv_name_0_0= ruleQualifiedName ) ) (otherlv_1= 'externalCommand' ( (lv_externalCommandId_2_0= RULE_STRING ) ) )? ( (lv_initialDisabled_3_0= 'disabled' ) )? )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:203:2: ( (lv_name_0_0= ruleQualifiedName ) ) (otherlv_1= 'externalCommand' ( (lv_externalCommandId_2_0= RULE_STRING ) ) )? ( (lv_initialDisabled_3_0= 'disabled' ) )?
+            // InternalUISemanticsGrammar.g:219:2: ( ( (lv_name_0_0= ruleQualifiedName ) ) (otherlv_1= 'externalCommand' ( (lv_externalCommandId_2_0= RULE_STRING ) ) )? ( (lv_initialDisabled_3_0= 'disabled' ) )? )
+            // InternalUISemanticsGrammar.g:220:3: ( (lv_name_0_0= ruleQualifiedName ) ) (otherlv_1= 'externalCommand' ( (lv_externalCommandId_2_0= RULE_STRING ) ) )? ( (lv_initialDisabled_3_0= 'disabled' ) )?
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:203:2: ( (lv_name_0_0= ruleQualifiedName ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:204:1: (lv_name_0_0= ruleQualifiedName )
+            // InternalUISemanticsGrammar.g:220:3: ( (lv_name_0_0= ruleQualifiedName ) )
+            // InternalUISemanticsGrammar.g:221:4: (lv_name_0_0= ruleQualifiedName )
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:204:1: (lv_name_0_0= ruleQualifiedName )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:205:3: lv_name_0_0= ruleQualifiedName
+            // InternalUISemanticsGrammar.g:221:4: (lv_name_0_0= ruleQualifiedName )
+            // InternalUISemanticsGrammar.g:222:5: lv_name_0_0= ruleQualifiedName
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getUxActionAccess().getNameQualifiedNameParserRuleCall_0_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getUxActionAccess().getNameQualifiedNameParserRuleCall_0_0());
+              				
             }
-            pushFollow(FOLLOW_ruleQualifiedName_in_ruleUxAction377);
+            pushFollow(FOLLOW_8);
             lv_name_0_0=ruleQualifiedName();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getUxActionRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"name",
-                      		lv_name_0_0, 
-                      		"QualifiedName");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getUxActionRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_0_0,
+              						"org.eclipse.xtext.xbase.Xbase.QualifiedName");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -647,7 +654,7 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:221:2: (otherlv_1= 'externalCommand' ( (lv_externalCommandId_2_0= RULE_STRING ) ) )?
+            // InternalUISemanticsGrammar.g:239:3: (otherlv_1= 'externalCommand' ( (lv_externalCommandId_2_0= RULE_STRING ) ) )?
             int alt7=2;
             int LA7_0 = input.LA(1);
 
@@ -656,37 +663,37 @@
             }
             switch (alt7) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:221:4: otherlv_1= 'externalCommand' ( (lv_externalCommandId_2_0= RULE_STRING ) )
+                    // InternalUISemanticsGrammar.g:240:4: otherlv_1= 'externalCommand' ( (lv_externalCommandId_2_0= RULE_STRING ) )
                     {
-                    otherlv_1=(Token)match(input,17,FOLLOW_17_in_ruleUxAction390); if (state.failed) return current;
+                    otherlv_1=(Token)match(input,17,FOLLOW_9); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_1, grammarAccess.getUxActionAccess().getExternalCommandKeyword_1_0());
-                          
+                      				newLeafNode(otherlv_1, grammarAccess.getUxActionAccess().getExternalCommandKeyword_1_0());
+                      			
                     }
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:225:1: ( (lv_externalCommandId_2_0= RULE_STRING ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:226:1: (lv_externalCommandId_2_0= RULE_STRING )
+                    // InternalUISemanticsGrammar.g:244:4: ( (lv_externalCommandId_2_0= RULE_STRING ) )
+                    // InternalUISemanticsGrammar.g:245:5: (lv_externalCommandId_2_0= RULE_STRING )
                     {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:226:1: (lv_externalCommandId_2_0= RULE_STRING )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:227:3: lv_externalCommandId_2_0= RULE_STRING
+                    // InternalUISemanticsGrammar.g:245:5: (lv_externalCommandId_2_0= RULE_STRING )
+                    // InternalUISemanticsGrammar.g:246:6: lv_externalCommandId_2_0= RULE_STRING
                     {
-                    lv_externalCommandId_2_0=(Token)match(input,RULE_STRING,FOLLOW_RULE_STRING_in_ruleUxAction407); if (state.failed) return current;
+                    lv_externalCommandId_2_0=(Token)match(input,RULE_STRING,FOLLOW_10); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      			newLeafNode(lv_externalCommandId_2_0, grammarAccess.getUxActionAccess().getExternalCommandIdSTRINGTerminalRuleCall_1_1_0()); 
-                      		
+                      						newLeafNode(lv_externalCommandId_2_0, grammarAccess.getUxActionAccess().getExternalCommandIdSTRINGTerminalRuleCall_1_1_0());
+                      					
                     }
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElement(grammarAccess.getUxActionRule());
-                      	        }
-                             		setWithLastConsumed(
-                             			current, 
-                             			"externalCommandId",
-                              		lv_externalCommandId_2_0, 
-                              		"STRING");
-                      	    
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getUxActionRule());
+                      						}
+                      						setWithLastConsumed(
+                      							current,
+                      							"externalCommandId",
+                      							lv_externalCommandId_2_0,
+                      							"org.eclipse.xtext.xbase.Xtype.STRING");
+                      					
                     }
 
                     }
@@ -700,7 +707,7 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:243:4: ( (lv_initialDisabled_3_0= 'disabled' ) )?
+            // InternalUISemanticsGrammar.g:263:3: ( (lv_initialDisabled_3_0= 'disabled' ) )?
             int alt8=2;
             int LA8_0 = input.LA(1);
 
@@ -709,24 +716,24 @@
             }
             switch (alt8) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:244:1: (lv_initialDisabled_3_0= 'disabled' )
+                    // InternalUISemanticsGrammar.g:264:4: (lv_initialDisabled_3_0= 'disabled' )
                     {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:244:1: (lv_initialDisabled_3_0= 'disabled' )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:245:3: lv_initialDisabled_3_0= 'disabled'
+                    // InternalUISemanticsGrammar.g:264:4: (lv_initialDisabled_3_0= 'disabled' )
+                    // InternalUISemanticsGrammar.g:265:5: lv_initialDisabled_3_0= 'disabled'
                     {
-                    lv_initialDisabled_3_0=(Token)match(input,18,FOLLOW_18_in_ruleUxAction432); if (state.failed) return current;
+                    lv_initialDisabled_3_0=(Token)match(input,18,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              newLeafNode(lv_initialDisabled_3_0, grammarAccess.getUxActionAccess().getInitialDisabledDisabledKeyword_2_0());
-                          
+                      					newLeafNode(lv_initialDisabled_3_0, grammarAccess.getUxActionAccess().getInitialDisabledDisabledKeyword_2_0());
+                      				
                     }
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElement(grammarAccess.getUxActionRule());
-                      	        }
-                             		setWithLastConsumed(current, "initialDisabled", true, "disabled");
-                      	    
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUxActionRule());
+                      					}
+                      					setWithLastConsumed(current, "initialDisabled", true, "disabled");
+                      				
                     }
 
                     }
@@ -744,14 +751,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -760,7 +769,7 @@
 
 
     // $ANTLR start "entryRuleUxViewCategory"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:266:1: entryRuleUxViewCategory returns [EObject current=null] : iv_ruleUxViewCategory= ruleUxViewCategory EOF ;
+    // InternalUISemanticsGrammar.g:281:1: entryRuleUxViewCategory returns [EObject current=null] : iv_ruleUxViewCategory= ruleUxViewCategory EOF ;
     public final EObject entryRuleUxViewCategory() throws RecognitionException {
         EObject current = null;
 
@@ -768,13 +777,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:267:2: (iv_ruleUxViewCategory= ruleUxViewCategory EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:268:2: iv_ruleUxViewCategory= ruleUxViewCategory EOF
+            // InternalUISemanticsGrammar.g:281:55: (iv_ruleUxViewCategory= ruleUxViewCategory EOF )
+            // InternalUISemanticsGrammar.g:282:2: iv_ruleUxViewCategory= ruleUxViewCategory EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUxViewCategoryRule()); 
             }
-            pushFollow(FOLLOW_ruleUxViewCategory_in_entryRuleUxViewCategory482);
+            pushFollow(FOLLOW_1);
             iv_ruleUxViewCategory=ruleUxViewCategory();
 
             state._fsp--;
@@ -782,16 +791,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUxViewCategory; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleUxViewCategory492); 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;
@@ -800,47 +809,48 @@
 
 
     // $ANTLR start "ruleUxViewCategory"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:275:1: ruleUxViewCategory returns [EObject current=null] : ( (lv_name_0_0= ruleQualifiedName ) ) ;
+    // InternalUISemanticsGrammar.g:288:1: ruleUxViewCategory returns [EObject current=null] : ( (lv_name_0_0= ruleQualifiedName ) ) ;
     public final EObject ruleUxViewCategory() throws RecognitionException {
         EObject current = null;
 
         AntlrDatatypeRuleToken lv_name_0_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:278:28: ( ( (lv_name_0_0= ruleQualifiedName ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:279:1: ( (lv_name_0_0= ruleQualifiedName ) )
+            // InternalUISemanticsGrammar.g:294:2: ( ( (lv_name_0_0= ruleQualifiedName ) ) )
+            // InternalUISemanticsGrammar.g:295:2: ( (lv_name_0_0= ruleQualifiedName ) )
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:279:1: ( (lv_name_0_0= ruleQualifiedName ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:280:1: (lv_name_0_0= ruleQualifiedName )
+            // InternalUISemanticsGrammar.g:295:2: ( (lv_name_0_0= ruleQualifiedName ) )
+            // InternalUISemanticsGrammar.g:296:3: (lv_name_0_0= ruleQualifiedName )
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:280:1: (lv_name_0_0= ruleQualifiedName )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:281:3: lv_name_0_0= ruleQualifiedName
+            // InternalUISemanticsGrammar.g:296:3: (lv_name_0_0= ruleQualifiedName )
+            // InternalUISemanticsGrammar.g:297:4: lv_name_0_0= ruleQualifiedName
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getUxViewCategoryAccess().getNameQualifiedNameParserRuleCall_0()); 
-              	    
+
+              				newCompositeNode(grammarAccess.getUxViewCategoryAccess().getNameQualifiedNameParserRuleCall_0());
+              			
             }
-            pushFollow(FOLLOW_ruleQualifiedName_in_ruleUxViewCategory537);
+            pushFollow(FOLLOW_2);
             lv_name_0_0=ruleQualifiedName();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getUxViewCategoryRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"name",
-                      		lv_name_0_0, 
-                      		"QualifiedName");
-              	        afterParserOrEnumRuleCall();
-              	    
+              				if (current==null) {
+              					current = createModelElementForParent(grammarAccess.getUxViewCategoryRule());
+              				}
+              				set(
+              					current,
+              					"name",
+              					lv_name_0_0,
+              					"org.eclipse.xtext.xbase.Xbase.QualifiedName");
+              				afterParserOrEnumRuleCall();
+              			
             }
 
             }
@@ -852,14 +862,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -868,7 +880,7 @@
 
 
     // $ANTLR start "entryRuleXImportDeclaration"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:305:1: entryRuleXImportDeclaration returns [EObject current=null] : iv_ruleXImportDeclaration= ruleXImportDeclaration EOF ;
+    // InternalUISemanticsGrammar.g:317:1: entryRuleXImportDeclaration returns [EObject current=null] : iv_ruleXImportDeclaration= ruleXImportDeclaration EOF ;
     public final EObject entryRuleXImportDeclaration() throws RecognitionException {
         EObject current = null;
 
@@ -876,13 +888,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:306:2: (iv_ruleXImportDeclaration= ruleXImportDeclaration EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:307:2: iv_ruleXImportDeclaration= ruleXImportDeclaration EOF
+            // InternalUISemanticsGrammar.g:317:59: (iv_ruleXImportDeclaration= ruleXImportDeclaration EOF )
+            // InternalUISemanticsGrammar.g:318:2: iv_ruleXImportDeclaration= ruleXImportDeclaration EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXImportDeclarationRule()); 
             }
-            pushFollow(FOLLOW_ruleXImportDeclaration_in_entryRuleXImportDeclaration572);
+            pushFollow(FOLLOW_1);
             iv_ruleXImportDeclaration=ruleXImportDeclaration();
 
             state._fsp--;
@@ -890,16 +902,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleXImportDeclaration; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXImportDeclaration582); 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;
@@ -908,7 +920,7 @@
 
 
     // $ANTLR start "ruleXImportDeclaration"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:314: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 ) ) ) ) ) | ( (otherlv_9= 'ePackage' ( (lv_importedEPackage_10_0= ruleUxEPackageImport ) ) ) (otherlv_11= ';' )? ) ) ;
+    // InternalUISemanticsGrammar.g:324: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 ) ) ) ) ) | ( (otherlv_9= 'ePackage' ( (lv_importedEPackage_10_0= ruleUxEPackageImport ) ) ) (otherlv_11= ';' )? ) ) ;
     public final EObject ruleXImportDeclaration() throws RecognitionException {
         EObject current = null;
 
@@ -925,13 +937,14 @@
         EObject lv_importedEPackage_10_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:317:28: ( ( ( () (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 ) ) ) ) ) | ( (otherlv_9= 'ePackage' ( (lv_importedEPackage_10_0= ruleUxEPackageImport ) ) ) (otherlv_11= ';' )? ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:318:1: ( ( () (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 ) ) ) ) ) | ( (otherlv_9= 'ePackage' ( (lv_importedEPackage_10_0= ruleUxEPackageImport ) ) ) (otherlv_11= ';' )? ) )
+            // InternalUISemanticsGrammar.g:330: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 ) ) ) ) ) | ( (otherlv_9= 'ePackage' ( (lv_importedEPackage_10_0= ruleUxEPackageImport ) ) ) (otherlv_11= ';' )? ) ) )
+            // InternalUISemanticsGrammar.g:331: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 ) ) ) ) ) | ( (otherlv_9= 'ePackage' ( (lv_importedEPackage_10_0= ruleUxEPackageImport ) ) ) (otherlv_11= ';' )? ) )
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:318:1: ( ( () (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 ) ) ) ) ) | ( (otherlv_9= 'ePackage' ( (lv_importedEPackage_10_0= ruleUxEPackageImport ) ) ) (otherlv_11= ';' )? ) )
+            // InternalUISemanticsGrammar.g:331: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 ) ) ) ) ) | ( (otherlv_9= 'ePackage' ( (lv_importedEPackage_10_0= ruleUxEPackageImport ) ) ) (otherlv_11= ';' )? ) )
             int alt13=2;
             int LA13_0 = input.LA(1);
 
@@ -950,62 +963,62 @@
             }
             switch (alt13) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:318: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 ) ) ) ) )
+                    // InternalUISemanticsGrammar.g:332: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 ) ) ) ) )
                     {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:318: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 ) ) ) ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:318: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 ) ) ) )
+                    // InternalUISemanticsGrammar.g:332: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 ) ) ) ) )
+                    // InternalUISemanticsGrammar.g:333:4: () (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 ) ) ) )
                     {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:318:3: ()
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:319:5: 
+                    // InternalUISemanticsGrammar.g:333:4: ()
+                    // InternalUISemanticsGrammar.g:334:5: 
                     {
                     if ( state.backtracking==0 ) {
 
-                              current = forceCreateModelElement(
-                                  grammarAccess.getXImportDeclarationAccess().getUxImportSectionDeclarationAction_0_0(),
-                                  current);
-                          
+                      					current = forceCreateModelElement(
+                      						grammarAccess.getXImportDeclarationAccess().getUxImportSectionDeclarationAction_0_0(),
+                      						current);
+                      				
                     }
 
                     }
 
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:324: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 ) ) ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:324:4: 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 ) ) )
+                    // InternalUISemanticsGrammar.g:340:4: (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 ) ) ) )
+                    // InternalUISemanticsGrammar.g:341:5: 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 ) ) )
                     {
-                    otherlv_1=(Token)match(input,19,FOLLOW_19_in_ruleXImportDeclaration630); if (state.failed) return current;
+                    otherlv_1=(Token)match(input,19,FOLLOW_11); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_1, grammarAccess.getXImportDeclarationAccess().getImportKeyword_0_1_0());
-                          
+                      					newLeafNode(otherlv_1, grammarAccess.getXImportDeclarationAccess().getImportKeyword_0_1_0());
+                      				
                     }
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:328:1: ( ( ( (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 ) ) )
+                    // InternalUISemanticsGrammar.g:345:5: ( ( ( (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 ) ) )
                     int alt11=3;
                     alt11 = dfa11.predict(input);
                     switch (alt11) {
                         case 1 :
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:328:2: ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) )
+                            // InternalUISemanticsGrammar.g:346:6: ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) )
                             {
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:328:2: ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) )
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:328:3: ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) )
+                            // InternalUISemanticsGrammar.g:346:6: ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) )
+                            // InternalUISemanticsGrammar.g:347:7: ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) )
                             {
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:328:3: ( (lv_static_2_0= 'static' ) )
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:329:1: (lv_static_2_0= 'static' )
+                            // InternalUISemanticsGrammar.g:347:7: ( (lv_static_2_0= 'static' ) )
+                            // InternalUISemanticsGrammar.g:348:8: (lv_static_2_0= 'static' )
                             {
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:329:1: (lv_static_2_0= 'static' )
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:330:3: lv_static_2_0= 'static'
+                            // InternalUISemanticsGrammar.g:348:8: (lv_static_2_0= 'static' )
+                            // InternalUISemanticsGrammar.g:349:9: lv_static_2_0= 'static'
                             {
-                            lv_static_2_0=(Token)match(input,20,FOLLOW_20_in_ruleXImportDeclaration650); if (state.failed) return current;
+                            lv_static_2_0=(Token)match(input,20,FOLLOW_12); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
-                                      newLeafNode(lv_static_2_0, grammarAccess.getXImportDeclarationAccess().getStaticStaticKeyword_0_1_1_0_0_0());
-                                  
+                              									newLeafNode(lv_static_2_0, grammarAccess.getXImportDeclarationAccess().getStaticStaticKeyword_0_1_1_0_0_0());
+                              								
                             }
                             if ( state.backtracking==0 ) {
 
-                              	        if (current==null) {
-                              	            current = createModelElement(grammarAccess.getXImportDeclarationRule());
-                              	        }
-                                     		setWithLastConsumed(current, "static", true, "static");
-                              	    
+                              									if (current==null) {
+                              										current = createModelElement(grammarAccess.getXImportDeclarationRule());
+                              									}
+                              									setWithLastConsumed(current, "static", true, "static");
+                              								
                             }
 
                             }
@@ -1013,7 +1026,7 @@
 
                             }
 
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:343:2: ( (lv_extension_3_0= 'extension' ) )?
+                            // InternalUISemanticsGrammar.g:361:7: ( (lv_extension_3_0= 'extension' ) )?
                             int alt9=2;
                             int LA9_0 = input.LA(1);
 
@@ -1022,24 +1035,24 @@
                             }
                             switch (alt9) {
                                 case 1 :
-                                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:344:1: (lv_extension_3_0= 'extension' )
+                                    // InternalUISemanticsGrammar.g:362:8: (lv_extension_3_0= 'extension' )
                                     {
-                                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:344:1: (lv_extension_3_0= 'extension' )
-                                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:345:3: lv_extension_3_0= 'extension'
+                                    // InternalUISemanticsGrammar.g:362:8: (lv_extension_3_0= 'extension' )
+                                    // InternalUISemanticsGrammar.g:363:9: lv_extension_3_0= 'extension'
                                     {
-                                    lv_extension_3_0=(Token)match(input,21,FOLLOW_21_in_ruleXImportDeclaration681); if (state.failed) return current;
+                                    lv_extension_3_0=(Token)match(input,21,FOLLOW_12); if (state.failed) return current;
                                     if ( state.backtracking==0 ) {
 
-                                              newLeafNode(lv_extension_3_0, grammarAccess.getXImportDeclarationAccess().getExtensionExtensionKeyword_0_1_1_0_1_0());
-                                          
+                                      									newLeafNode(lv_extension_3_0, grammarAccess.getXImportDeclarationAccess().getExtensionExtensionKeyword_0_1_1_0_1_0());
+                                      								
                                     }
                                     if ( state.backtracking==0 ) {
 
-                                      	        if (current==null) {
-                                      	            current = createModelElement(grammarAccess.getXImportDeclarationRule());
-                                      	        }
-                                             		setWithLastConsumed(current, "extension", true, "extension");
-                                      	    
+                                      									if (current==null) {
+                                      										current = createModelElement(grammarAccess.getXImportDeclarationRule());
+                                      									}
+                                      									setWithLastConsumed(current, "extension", true, "extension");
+                                      								
                                     }
 
                                     }
@@ -1050,33 +1063,33 @@
 
                             }
 
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:358:3: ( ( ruleQualifiedNameInStaticImport ) )
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:359:1: ( ruleQualifiedNameInStaticImport )
+                            // InternalUISemanticsGrammar.g:375:7: ( ( ruleQualifiedNameInStaticImport ) )
+                            // InternalUISemanticsGrammar.g:376:8: ( ruleQualifiedNameInStaticImport )
                             {
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:359:1: ( ruleQualifiedNameInStaticImport )
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:360:3: ruleQualifiedNameInStaticImport
+                            // InternalUISemanticsGrammar.g:376:8: ( ruleQualifiedNameInStaticImport )
+                            // InternalUISemanticsGrammar.g:377:9: ruleQualifiedNameInStaticImport
                             {
                             if ( state.backtracking==0 ) {
 
-                              			if (current==null) {
-                              	            current = createModelElement(grammarAccess.getXImportDeclarationRule());
-                              	        }
-                                      
+                              									if (current==null) {
+                              										current = createModelElement(grammarAccess.getXImportDeclarationRule());
+                              									}
+                              								
                             }
                             if ( state.backtracking==0 ) {
-                               
-                              	        newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_0_1_1_0_2_0()); 
-                              	    
+
+                              									newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_0_1_1_0_2_0());
+                              								
                             }
-                            pushFollow(FOLLOW_ruleQualifiedNameInStaticImport_in_ruleXImportDeclaration718);
+                            pushFollow(FOLLOW_13);
                             ruleQualifiedNameInStaticImport();
 
                             state._fsp--;
                             if (state.failed) return current;
                             if ( state.backtracking==0 ) {
-                               
-                              	        afterParserOrEnumRuleCall();
-                              	    
+
+                              									afterParserOrEnumRuleCall();
+                              								
                             }
 
                             }
@@ -1084,7 +1097,7 @@
 
                             }
 
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:373:2: ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) )
+                            // InternalUISemanticsGrammar.g:391:7: ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) )
                             int alt10=2;
                             int LA10_0 = input.LA(1);
 
@@ -1103,27 +1116,27 @@
                             }
                             switch (alt10) {
                                 case 1 :
-                                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:373:3: ( (lv_wildcard_5_0= '*' ) )
+                                    // InternalUISemanticsGrammar.g:392:8: ( (lv_wildcard_5_0= '*' ) )
                                     {
-                                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:373:3: ( (lv_wildcard_5_0= '*' ) )
-                                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:374:1: (lv_wildcard_5_0= '*' )
+                                    // InternalUISemanticsGrammar.g:392:8: ( (lv_wildcard_5_0= '*' ) )
+                                    // InternalUISemanticsGrammar.g:393:9: (lv_wildcard_5_0= '*' )
                                     {
-                                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:374:1: (lv_wildcard_5_0= '*' )
-                                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:375:3: lv_wildcard_5_0= '*'
+                                    // InternalUISemanticsGrammar.g:393:9: (lv_wildcard_5_0= '*' )
+                                    // InternalUISemanticsGrammar.g:394:10: lv_wildcard_5_0= '*'
                                     {
-                                    lv_wildcard_5_0=(Token)match(input,22,FOLLOW_22_in_ruleXImportDeclaration737); if (state.failed) return current;
+                                    lv_wildcard_5_0=(Token)match(input,22,FOLLOW_2); if (state.failed) return current;
                                     if ( state.backtracking==0 ) {
 
-                                              newLeafNode(lv_wildcard_5_0, grammarAccess.getXImportDeclarationAccess().getWildcardAsteriskKeyword_0_1_1_0_3_0_0());
-                                          
+                                      										newLeafNode(lv_wildcard_5_0, grammarAccess.getXImportDeclarationAccess().getWildcardAsteriskKeyword_0_1_1_0_3_0_0());
+                                      									
                                     }
                                     if ( state.backtracking==0 ) {
 
-                                      	        if (current==null) {
-                                      	            current = createModelElement(grammarAccess.getXImportDeclarationRule());
-                                      	        }
-                                             		setWithLastConsumed(current, "wildcard", true, "*");
-                                      	    
+                                      										if (current==null) {
+                                      											current = createModelElement(grammarAccess.getXImportDeclarationRule());
+                                      										}
+                                      										setWithLastConsumed(current, "wildcard", true, "*");
+                                      									
                                     }
 
                                     }
@@ -1135,36 +1148,36 @@
                                     }
                                     break;
                                 case 2 :
-                                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:389:6: ( (lv_memberName_6_0= ruleValidID ) )
+                                    // InternalUISemanticsGrammar.g:407:8: ( (lv_memberName_6_0= ruleValidID ) )
                                     {
-                                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:389:6: ( (lv_memberName_6_0= ruleValidID ) )
-                                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:390:1: (lv_memberName_6_0= ruleValidID )
+                                    // InternalUISemanticsGrammar.g:407:8: ( (lv_memberName_6_0= ruleValidID ) )
+                                    // InternalUISemanticsGrammar.g:408:9: (lv_memberName_6_0= ruleValidID )
                                     {
-                                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:390:1: (lv_memberName_6_0= ruleValidID )
-                                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:391:3: lv_memberName_6_0= ruleValidID
+                                    // InternalUISemanticsGrammar.g:408:9: (lv_memberName_6_0= ruleValidID )
+                                    // InternalUISemanticsGrammar.g:409:10: lv_memberName_6_0= ruleValidID
                                     {
                                     if ( state.backtracking==0 ) {
-                                       
-                                      	        newCompositeNode(grammarAccess.getXImportDeclarationAccess().getMemberNameValidIDParserRuleCall_0_1_1_0_3_1_0()); 
-                                      	    
+
+                                      										newCompositeNode(grammarAccess.getXImportDeclarationAccess().getMemberNameValidIDParserRuleCall_0_1_1_0_3_1_0());
+                                      									
                                     }
-                                    pushFollow(FOLLOW_ruleValidID_in_ruleXImportDeclaration777);
+                                    pushFollow(FOLLOW_2);
                                     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, 
-                                              		"ValidID");
-                                      	        afterParserOrEnumRuleCall();
-                                      	    
+                                      										if (current==null) {
+                                      											current = createModelElementForParent(grammarAccess.getXImportDeclarationRule());
+                                      										}
+                                      										set(
+                                      											current,
+                                      											"memberName",
+                                      											lv_memberName_6_0,
+                                      											"org.eclipse.xtext.xbase.Xtype.ValidID");
+                                      										afterParserOrEnumRuleCall();
+                                      									
                                     }
 
                                     }
@@ -1185,35 +1198,35 @@
                             }
                             break;
                         case 2 :
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:408:6: ( ( ruleQualifiedName ) )
+                            // InternalUISemanticsGrammar.g:429:6: ( ( ruleQualifiedName ) )
                             {
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:408:6: ( ( ruleQualifiedName ) )
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:409:1: ( ruleQualifiedName )
+                            // InternalUISemanticsGrammar.g:429:6: ( ( ruleQualifiedName ) )
+                            // InternalUISemanticsGrammar.g:430:7: ( ruleQualifiedName )
                             {
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:409:1: ( ruleQualifiedName )
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:410:3: ruleQualifiedName
+                            // InternalUISemanticsGrammar.g:430:7: ( ruleQualifiedName )
+                            // InternalUISemanticsGrammar.g:431:8: ruleQualifiedName
                             {
                             if ( state.backtracking==0 ) {
 
-                              			if (current==null) {
-                              	            current = createModelElement(grammarAccess.getXImportDeclarationRule());
-                              	        }
-                                      
+                              								if (current==null) {
+                              									current = createModelElement(grammarAccess.getXImportDeclarationRule());
+                              								}
+                              							
                             }
                             if ( state.backtracking==0 ) {
-                               
-                              	        newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_0_1_1_1_0()); 
-                              	    
+
+                              								newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_0_1_1_1_0());
+                              							
                             }
-                            pushFollow(FOLLOW_ruleQualifiedName_in_ruleXImportDeclaration808);
+                            pushFollow(FOLLOW_2);
                             ruleQualifiedName();
 
                             state._fsp--;
                             if (state.failed) return current;
                             if ( state.backtracking==0 ) {
-                               
-                              	        afterParserOrEnumRuleCall();
-                              	    
+
+                              								afterParserOrEnumRuleCall();
+                              							
                             }
 
                             }
@@ -1225,36 +1238,36 @@
                             }
                             break;
                         case 3 :
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:424:6: ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) )
+                            // InternalUISemanticsGrammar.g:446:6: ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) )
                             {
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:424:6: ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) )
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:425:1: (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard )
+                            // InternalUISemanticsGrammar.g:446:6: ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) )
+                            // InternalUISemanticsGrammar.g:447:7: (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard )
                             {
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:425:1: (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard )
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:426:3: lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard
+                            // InternalUISemanticsGrammar.g:447:7: (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard )
+                            // InternalUISemanticsGrammar.g:448:8: lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard
                             {
                             if ( state.backtracking==0 ) {
-                               
-                              	        newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceQualifiedNameWithWildcardParserRuleCall_0_1_1_2_0()); 
-                              	    
+
+                              								newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceQualifiedNameWithWildcardParserRuleCall_0_1_1_2_0());
+                              							
                             }
-                            pushFollow(FOLLOW_ruleQualifiedNameWithWildcard_in_ruleXImportDeclaration835);
+                            pushFollow(FOLLOW_2);
                             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, 
-                                      		"QualifiedNameWithWildcard");
-                              	        afterParserOrEnumRuleCall();
-                              	    
+                              								if (current==null) {
+                              									current = createModelElementForParent(grammarAccess.getXImportDeclarationRule());
+                              								}
+                              								set(
+                              									current,
+                              									"importedNamespace",
+                              									lv_importedNamespace_8_0,
+                              									"org.eclipse.xtext.xbase.Xtype.QualifiedNameWithWildcard");
+                              								afterParserOrEnumRuleCall();
+                              							
                             }
 
                             }
@@ -1278,48 +1291,48 @@
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:443:6: ( (otherlv_9= 'ePackage' ( (lv_importedEPackage_10_0= ruleUxEPackageImport ) ) ) (otherlv_11= ';' )? )
+                    // InternalUISemanticsGrammar.g:469:3: ( (otherlv_9= 'ePackage' ( (lv_importedEPackage_10_0= ruleUxEPackageImport ) ) ) (otherlv_11= ';' )? )
                     {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:443:6: ( (otherlv_9= 'ePackage' ( (lv_importedEPackage_10_0= ruleUxEPackageImport ) ) ) (otherlv_11= ';' )? )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:443:7: (otherlv_9= 'ePackage' ( (lv_importedEPackage_10_0= ruleUxEPackageImport ) ) ) (otherlv_11= ';' )?
+                    // InternalUISemanticsGrammar.g:469:3: ( (otherlv_9= 'ePackage' ( (lv_importedEPackage_10_0= ruleUxEPackageImport ) ) ) (otherlv_11= ';' )? )
+                    // InternalUISemanticsGrammar.g:470:4: (otherlv_9= 'ePackage' ( (lv_importedEPackage_10_0= ruleUxEPackageImport ) ) ) (otherlv_11= ';' )?
                     {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:443:7: (otherlv_9= 'ePackage' ( (lv_importedEPackage_10_0= ruleUxEPackageImport ) ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:443:9: otherlv_9= 'ePackage' ( (lv_importedEPackage_10_0= ruleUxEPackageImport ) )
+                    // InternalUISemanticsGrammar.g:470:4: (otherlv_9= 'ePackage' ( (lv_importedEPackage_10_0= ruleUxEPackageImport ) ) )
+                    // InternalUISemanticsGrammar.g:471:5: otherlv_9= 'ePackage' ( (lv_importedEPackage_10_0= ruleUxEPackageImport ) )
                     {
-                    otherlv_9=(Token)match(input,23,FOLLOW_23_in_ruleXImportDeclaration858); if (state.failed) return current;
+                    otherlv_9=(Token)match(input,23,FOLLOW_9); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_9, grammarAccess.getXImportDeclarationAccess().getEPackageKeyword_1_0_0());
-                          
+                      					newLeafNode(otherlv_9, grammarAccess.getXImportDeclarationAccess().getEPackageKeyword_1_0_0());
+                      				
                     }
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:447:1: ( (lv_importedEPackage_10_0= ruleUxEPackageImport ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:448:1: (lv_importedEPackage_10_0= ruleUxEPackageImport )
+                    // InternalUISemanticsGrammar.g:475:5: ( (lv_importedEPackage_10_0= ruleUxEPackageImport ) )
+                    // InternalUISemanticsGrammar.g:476:6: (lv_importedEPackage_10_0= ruleUxEPackageImport )
                     {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:448:1: (lv_importedEPackage_10_0= ruleUxEPackageImport )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:449:3: lv_importedEPackage_10_0= ruleUxEPackageImport
+                    // InternalUISemanticsGrammar.g:476:6: (lv_importedEPackage_10_0= ruleUxEPackageImport )
+                    // InternalUISemanticsGrammar.g:477:7: lv_importedEPackage_10_0= ruleUxEPackageImport
                     {
                     if ( state.backtracking==0 ) {
-                       
-                      	        newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedEPackageUxEPackageImportParserRuleCall_1_0_1_0()); 
-                      	    
+
+                      							newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedEPackageUxEPackageImportParserRuleCall_1_0_1_0());
+                      						
                     }
-                    pushFollow(FOLLOW_ruleUxEPackageImport_in_ruleXImportDeclaration879);
+                    pushFollow(FOLLOW_14);
                     lv_importedEPackage_10_0=ruleUxEPackageImport();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElementForParent(grammarAccess.getXImportDeclarationRule());
-                      	        }
-                             		set(
-                             			current, 
-                             			"importedEPackage",
-                              		lv_importedEPackage_10_0, 
-                              		"UxEPackageImport");
-                      	        afterParserOrEnumRuleCall();
-                      	    
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getXImportDeclarationRule());
+                      							}
+                      							set(
+                      								current,
+                      								"importedEPackage",
+                      								lv_importedEPackage_10_0,
+                      								"org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.UxEPackageImport");
+                      							afterParserOrEnumRuleCall();
+                      						
                     }
 
                     }
@@ -1330,7 +1343,7 @@
 
                     }
 
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:465:3: (otherlv_11= ';' )?
+                    // InternalUISemanticsGrammar.g:495:4: (otherlv_11= ';' )?
                     int alt12=2;
                     int LA12_0 = input.LA(1);
 
@@ -1339,13 +1352,13 @@
                     }
                     switch (alt12) {
                         case 1 :
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:465:5: otherlv_11= ';'
+                            // InternalUISemanticsGrammar.g:496:5: otherlv_11= ';'
                             {
-                            otherlv_11=(Token)match(input,24,FOLLOW_24_in_ruleXImportDeclaration893); if (state.failed) return current;
+                            otherlv_11=(Token)match(input,24,FOLLOW_2); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
-                                  	newLeafNode(otherlv_11, grammarAccess.getXImportDeclarationAccess().getSemicolonKeyword_1_1());
-                                  
+                              					newLeafNode(otherlv_11, grammarAccess.getXImportDeclarationAccess().getSemicolonKeyword_1_1());
+                              				
                             }
 
                             }
@@ -1366,14 +1379,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -1382,7 +1397,7 @@
 
 
     // $ANTLR start "entryRuleUxEPackageImport"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:477:1: entryRuleUxEPackageImport returns [EObject current=null] : iv_ruleUxEPackageImport= ruleUxEPackageImport EOF ;
+    // InternalUISemanticsGrammar.g:506:1: entryRuleUxEPackageImport returns [EObject current=null] : iv_ruleUxEPackageImport= ruleUxEPackageImport EOF ;
     public final EObject entryRuleUxEPackageImport() throws RecognitionException {
         EObject current = null;
 
@@ -1390,13 +1405,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:478:2: (iv_ruleUxEPackageImport= ruleUxEPackageImport EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:479:2: iv_ruleUxEPackageImport= ruleUxEPackageImport EOF
+            // InternalUISemanticsGrammar.g:506:57: (iv_ruleUxEPackageImport= ruleUxEPackageImport EOF )
+            // InternalUISemanticsGrammar.g:507:2: iv_ruleUxEPackageImport= ruleUxEPackageImport EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUxEPackageImportRule()); 
             }
-            pushFollow(FOLLOW_ruleUxEPackageImport_in_entryRuleUxEPackageImport932);
+            pushFollow(FOLLOW_1);
             iv_ruleUxEPackageImport=ruleUxEPackageImport();
 
             state._fsp--;
@@ -1404,16 +1419,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUxEPackageImport; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleUxEPackageImport942); 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;
@@ -1422,7 +1437,7 @@
 
 
     // $ANTLR start "ruleUxEPackageImport"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:486:1: ruleUxEPackageImport returns [EObject current=null] : ( ( (otherlv_0= RULE_STRING ) ) otherlv_1= 'as' ( (lv_alias_2_0= RULE_ID ) ) ) ;
+    // InternalUISemanticsGrammar.g:513:1: ruleUxEPackageImport returns [EObject current=null] : ( ( (otherlv_0= RULE_STRING ) ) otherlv_1= 'as' ( (lv_alias_2_0= RULE_ID ) ) ) ;
     public final EObject ruleUxEPackageImport() throws RecognitionException {
         EObject current = null;
 
@@ -1430,33 +1445,34 @@
         Token otherlv_1=null;
         Token lv_alias_2_0=null;
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:489:28: ( ( ( (otherlv_0= RULE_STRING ) ) otherlv_1= 'as' ( (lv_alias_2_0= RULE_ID ) ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:490:1: ( ( (otherlv_0= RULE_STRING ) ) otherlv_1= 'as' ( (lv_alias_2_0= RULE_ID ) ) )
+            // InternalUISemanticsGrammar.g:519:2: ( ( ( (otherlv_0= RULE_STRING ) ) otherlv_1= 'as' ( (lv_alias_2_0= RULE_ID ) ) ) )
+            // InternalUISemanticsGrammar.g:520:2: ( ( (otherlv_0= RULE_STRING ) ) otherlv_1= 'as' ( (lv_alias_2_0= RULE_ID ) ) )
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:490:1: ( ( (otherlv_0= RULE_STRING ) ) otherlv_1= 'as' ( (lv_alias_2_0= RULE_ID ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:490:2: ( (otherlv_0= RULE_STRING ) ) otherlv_1= 'as' ( (lv_alias_2_0= RULE_ID ) )
+            // InternalUISemanticsGrammar.g:520:2: ( ( (otherlv_0= RULE_STRING ) ) otherlv_1= 'as' ( (lv_alias_2_0= RULE_ID ) ) )
+            // InternalUISemanticsGrammar.g:521:3: ( (otherlv_0= RULE_STRING ) ) otherlv_1= 'as' ( (lv_alias_2_0= RULE_ID ) )
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:490:2: ( (otherlv_0= RULE_STRING ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:491:1: (otherlv_0= RULE_STRING )
+            // InternalUISemanticsGrammar.g:521:3: ( (otherlv_0= RULE_STRING ) )
+            // InternalUISemanticsGrammar.g:522:4: (otherlv_0= RULE_STRING )
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:491:1: (otherlv_0= RULE_STRING )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:492:3: otherlv_0= RULE_STRING
+            // InternalUISemanticsGrammar.g:522:4: (otherlv_0= RULE_STRING )
+            // InternalUISemanticsGrammar.g:523:5: otherlv_0= RULE_STRING
             {
             if ( state.backtracking==0 ) {
 
-              			if (current==null) {
-              	            current = createModelElement(grammarAccess.getUxEPackageImportRule());
-              	        }
-                      
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getUxEPackageImportRule());
+              					}
+              				
             }
-            otherlv_0=(Token)match(input,RULE_STRING,FOLLOW_RULE_STRING_in_ruleUxEPackageImport987); if (state.failed) return current;
+            otherlv_0=(Token)match(input,RULE_STRING,FOLLOW_15); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              		newLeafNode(otherlv_0, grammarAccess.getUxEPackageImportAccess().getEPackageEPackageCrossReference_0_0()); 
-              	
+              					newLeafNode(otherlv_0, grammarAccess.getUxEPackageImportAccess().getEPackageEPackageCrossReference_0_0());
+              				
             }
 
             }
@@ -1464,35 +1480,35 @@
 
             }
 
-            otherlv_1=(Token)match(input,25,FOLLOW_25_in_ruleUxEPackageImport999); if (state.failed) return current;
+            otherlv_1=(Token)match(input,25,FOLLOW_16); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getUxEPackageImportAccess().getAsKeyword_1());
-                  
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:507:1: ( (lv_alias_2_0= RULE_ID ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:508:1: (lv_alias_2_0= RULE_ID )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:508:1: (lv_alias_2_0= RULE_ID )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:509:3: lv_alias_2_0= RULE_ID
-            {
-            lv_alias_2_0=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleUxEPackageImport1016); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-              			newLeafNode(lv_alias_2_0, grammarAccess.getUxEPackageImportAccess().getAliasIDTerminalRuleCall_2_0()); 
+              			newLeafNode(otherlv_1, grammarAccess.getUxEPackageImportAccess().getAsKeyword_1());
               		
             }
+            // InternalUISemanticsGrammar.g:538:3: ( (lv_alias_2_0= RULE_ID ) )
+            // InternalUISemanticsGrammar.g:539:4: (lv_alias_2_0= RULE_ID )
+            {
+            // InternalUISemanticsGrammar.g:539:4: (lv_alias_2_0= RULE_ID )
+            // InternalUISemanticsGrammar.g:540:5: lv_alias_2_0= RULE_ID
+            {
+            lv_alias_2_0=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElement(grammarAccess.getUxEPackageImportRule());
-              	        }
-                     		setWithLastConsumed(
-                     			current, 
-                     			"alias",
-                      		lv_alias_2_0, 
-                      		"ID");
-              	    
+              					newLeafNode(lv_alias_2_0, grammarAccess.getUxEPackageImportAccess().getAliasIDTerminalRuleCall_2_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getUxEPackageImportRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"alias",
+              						lv_alias_2_0,
+              						"org.eclipse.xtext.xbase.Xtype.ID");
+              				
             }
 
             }
@@ -1507,14 +1523,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -1523,7 +1541,7 @@
 
 
     // $ANTLR start "entryRuleUxElementDefinition"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:533:1: entryRuleUxElementDefinition returns [EObject current=null] : iv_ruleUxElementDefinition= ruleUxElementDefinition EOF ;
+    // InternalUISemanticsGrammar.g:560:1: entryRuleUxElementDefinition returns [EObject current=null] : iv_ruleUxElementDefinition= ruleUxElementDefinition EOF ;
     public final EObject entryRuleUxElementDefinition() throws RecognitionException {
         EObject current = null;
 
@@ -1531,13 +1549,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:534:2: (iv_ruleUxElementDefinition= ruleUxElementDefinition EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:535:2: iv_ruleUxElementDefinition= ruleUxElementDefinition EOF
+            // InternalUISemanticsGrammar.g:560:60: (iv_ruleUxElementDefinition= ruleUxElementDefinition EOF )
+            // InternalUISemanticsGrammar.g:561:2: iv_ruleUxElementDefinition= ruleUxElementDefinition EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUxElementDefinitionRule()); 
             }
-            pushFollow(FOLLOW_ruleUxElementDefinition_in_entryRuleUxElementDefinition1057);
+            pushFollow(FOLLOW_1);
             iv_ruleUxElementDefinition=ruleUxElementDefinition();
 
             state._fsp--;
@@ -1545,16 +1563,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUxElementDefinition; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleUxElementDefinition1067); 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;
@@ -1563,7 +1581,7 @@
 
 
     // $ANTLR start "ruleUxElementDefinition"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:542:1: ruleUxElementDefinition returns [EObject current=null] : (otherlv_0= 'element' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_uri_3_0= ruleUxElementURI ) )? (otherlv_4= 'bindings' otherlv_5= '{' ( (lv_bindingContainer_6_0= ruleUxAvailableBindings ) ) otherlv_7= '}' )? (otherlv_8= 'visibility' otherlv_9= '{' ( (lv_visibilityContainer_10_0= ruleUxAvailableVisibilityOptions ) ) otherlv_11= '}' )? (otherlv_12= 'validator' otherlv_13= '{' ( (lv_validatorContainer_14_0= ruleUxAvailableValidatorProperties ) ) otherlv_15= '}' )? otherlv_16= '}' ) ;
+    // InternalUISemanticsGrammar.g:567:1: ruleUxElementDefinition returns [EObject current=null] : (otherlv_0= 'element' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_uri_3_0= ruleUxElementURI ) )? (otherlv_4= 'bindings' otherlv_5= '{' ( (lv_bindingContainer_6_0= ruleUxAvailableBindings ) ) otherlv_7= '}' )? (otherlv_8= 'visibility' otherlv_9= '{' ( (lv_visibilityContainer_10_0= ruleUxAvailableVisibilityOptions ) ) otherlv_11= '}' )? (otherlv_12= 'validator' otherlv_13= '{' ( (lv_validatorContainer_14_0= ruleUxAvailableValidatorProperties ) ) otherlv_15= '}' )? otherlv_16= '}' ) ;
     public final EObject ruleUxElementDefinition() throws RecognitionException {
         EObject current = null;
 
@@ -1589,58 +1607,59 @@
         EObject lv_validatorContainer_14_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:545:28: ( (otherlv_0= 'element' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_uri_3_0= ruleUxElementURI ) )? (otherlv_4= 'bindings' otherlv_5= '{' ( (lv_bindingContainer_6_0= ruleUxAvailableBindings ) ) otherlv_7= '}' )? (otherlv_8= 'visibility' otherlv_9= '{' ( (lv_visibilityContainer_10_0= ruleUxAvailableVisibilityOptions ) ) otherlv_11= '}' )? (otherlv_12= 'validator' otherlv_13= '{' ( (lv_validatorContainer_14_0= ruleUxAvailableValidatorProperties ) ) otherlv_15= '}' )? otherlv_16= '}' ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:546:1: (otherlv_0= 'element' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_uri_3_0= ruleUxElementURI ) )? (otherlv_4= 'bindings' otherlv_5= '{' ( (lv_bindingContainer_6_0= ruleUxAvailableBindings ) ) otherlv_7= '}' )? (otherlv_8= 'visibility' otherlv_9= '{' ( (lv_visibilityContainer_10_0= ruleUxAvailableVisibilityOptions ) ) otherlv_11= '}' )? (otherlv_12= 'validator' otherlv_13= '{' ( (lv_validatorContainer_14_0= ruleUxAvailableValidatorProperties ) ) otherlv_15= '}' )? otherlv_16= '}' )
+            // InternalUISemanticsGrammar.g:573:2: ( (otherlv_0= 'element' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_uri_3_0= ruleUxElementURI ) )? (otherlv_4= 'bindings' otherlv_5= '{' ( (lv_bindingContainer_6_0= ruleUxAvailableBindings ) ) otherlv_7= '}' )? (otherlv_8= 'visibility' otherlv_9= '{' ( (lv_visibilityContainer_10_0= ruleUxAvailableVisibilityOptions ) ) otherlv_11= '}' )? (otherlv_12= 'validator' otherlv_13= '{' ( (lv_validatorContainer_14_0= ruleUxAvailableValidatorProperties ) ) otherlv_15= '}' )? otherlv_16= '}' ) )
+            // InternalUISemanticsGrammar.g:574:2: (otherlv_0= 'element' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_uri_3_0= ruleUxElementURI ) )? (otherlv_4= 'bindings' otherlv_5= '{' ( (lv_bindingContainer_6_0= ruleUxAvailableBindings ) ) otherlv_7= '}' )? (otherlv_8= 'visibility' otherlv_9= '{' ( (lv_visibilityContainer_10_0= ruleUxAvailableVisibilityOptions ) ) otherlv_11= '}' )? (otherlv_12= 'validator' otherlv_13= '{' ( (lv_validatorContainer_14_0= ruleUxAvailableValidatorProperties ) ) otherlv_15= '}' )? otherlv_16= '}' )
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:546:1: (otherlv_0= 'element' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_uri_3_0= ruleUxElementURI ) )? (otherlv_4= 'bindings' otherlv_5= '{' ( (lv_bindingContainer_6_0= ruleUxAvailableBindings ) ) otherlv_7= '}' )? (otherlv_8= 'visibility' otherlv_9= '{' ( (lv_visibilityContainer_10_0= ruleUxAvailableVisibilityOptions ) ) otherlv_11= '}' )? (otherlv_12= 'validator' otherlv_13= '{' ( (lv_validatorContainer_14_0= ruleUxAvailableValidatorProperties ) ) otherlv_15= '}' )? otherlv_16= '}' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:546:3: otherlv_0= 'element' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_uri_3_0= ruleUxElementURI ) )? (otherlv_4= 'bindings' otherlv_5= '{' ( (lv_bindingContainer_6_0= ruleUxAvailableBindings ) ) otherlv_7= '}' )? (otherlv_8= 'visibility' otherlv_9= '{' ( (lv_visibilityContainer_10_0= ruleUxAvailableVisibilityOptions ) ) otherlv_11= '}' )? (otherlv_12= 'validator' otherlv_13= '{' ( (lv_validatorContainer_14_0= ruleUxAvailableValidatorProperties ) ) otherlv_15= '}' )? otherlv_16= '}'
+            // InternalUISemanticsGrammar.g:574:2: (otherlv_0= 'element' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_uri_3_0= ruleUxElementURI ) )? (otherlv_4= 'bindings' otherlv_5= '{' ( (lv_bindingContainer_6_0= ruleUxAvailableBindings ) ) otherlv_7= '}' )? (otherlv_8= 'visibility' otherlv_9= '{' ( (lv_visibilityContainer_10_0= ruleUxAvailableVisibilityOptions ) ) otherlv_11= '}' )? (otherlv_12= 'validator' otherlv_13= '{' ( (lv_validatorContainer_14_0= ruleUxAvailableValidatorProperties ) ) otherlv_15= '}' )? otherlv_16= '}' )
+            // InternalUISemanticsGrammar.g:575:3: otherlv_0= 'element' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_uri_3_0= ruleUxElementURI ) )? (otherlv_4= 'bindings' otherlv_5= '{' ( (lv_bindingContainer_6_0= ruleUxAvailableBindings ) ) otherlv_7= '}' )? (otherlv_8= 'visibility' otherlv_9= '{' ( (lv_visibilityContainer_10_0= ruleUxAvailableVisibilityOptions ) ) otherlv_11= '}' )? (otherlv_12= 'validator' otherlv_13= '{' ( (lv_validatorContainer_14_0= ruleUxAvailableValidatorProperties ) ) otherlv_15= '}' )? otherlv_16= '}'
             {
-            otherlv_0=(Token)match(input,26,FOLLOW_26_in_ruleUxElementDefinition1104); if (state.failed) return current;
+            otherlv_0=(Token)match(input,26,FOLLOW_16); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getUxElementDefinitionAccess().getElementKeyword_0());
-                  
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:550:1: ( (lv_name_1_0= RULE_ID ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:551:1: (lv_name_1_0= RULE_ID )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:551:1: (lv_name_1_0= RULE_ID )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:552:3: lv_name_1_0= RULE_ID
-            {
-            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleUxElementDefinition1121); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-              			newLeafNode(lv_name_1_0, grammarAccess.getUxElementDefinitionAccess().getNameIDTerminalRuleCall_1_0()); 
+              			newLeafNode(otherlv_0, grammarAccess.getUxElementDefinitionAccess().getElementKeyword_0());
               		
             }
+            // InternalUISemanticsGrammar.g:579:3: ( (lv_name_1_0= RULE_ID ) )
+            // InternalUISemanticsGrammar.g:580:4: (lv_name_1_0= RULE_ID )
+            {
+            // InternalUISemanticsGrammar.g:580:4: (lv_name_1_0= RULE_ID )
+            // InternalUISemanticsGrammar.g:581:5: lv_name_1_0= RULE_ID
+            {
+            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_4); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElement(grammarAccess.getUxElementDefinitionRule());
-              	        }
-                     		setWithLastConsumed(
-                     			current, 
-                     			"name",
-                      		lv_name_1_0, 
-                      		"ID");
-              	    
+              					newLeafNode(lv_name_1_0, grammarAccess.getUxElementDefinitionAccess().getNameIDTerminalRuleCall_1_0());
+              				
             }
-
-            }
-
-
-            }
-
-            otherlv_2=(Token)match(input,14,FOLLOW_14_in_ruleUxElementDefinition1138); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_2, grammarAccess.getUxElementDefinitionAccess().getLeftCurlyBracketKeyword_2());
-                  
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getUxElementDefinitionRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"name",
+              						lv_name_1_0,
+              						"org.eclipse.xtext.xbase.Xtype.ID");
+              				
             }
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:572:1: ( (lv_uri_3_0= ruleUxElementURI ) )?
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,14,FOLLOW_17); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getUxElementDefinitionAccess().getLeftCurlyBracketKeyword_2());
+              		
+            }
+            // InternalUISemanticsGrammar.g:601:3: ( (lv_uri_3_0= ruleUxElementURI ) )?
             int alt14=2;
             int LA14_0 = input.LA(1);
 
@@ -1649,33 +1668,33 @@
             }
             switch (alt14) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:573:1: (lv_uri_3_0= ruleUxElementURI )
+                    // InternalUISemanticsGrammar.g:602:4: (lv_uri_3_0= ruleUxElementURI )
                     {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:573:1: (lv_uri_3_0= ruleUxElementURI )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:574:3: lv_uri_3_0= ruleUxElementURI
+                    // InternalUISemanticsGrammar.g:602:4: (lv_uri_3_0= ruleUxElementURI )
+                    // InternalUISemanticsGrammar.g:603:5: lv_uri_3_0= ruleUxElementURI
                     {
                     if ( state.backtracking==0 ) {
-                       
-                      	        newCompositeNode(grammarAccess.getUxElementDefinitionAccess().getUriUxElementURIParserRuleCall_3_0()); 
-                      	    
+
+                      					newCompositeNode(grammarAccess.getUxElementDefinitionAccess().getUriUxElementURIParserRuleCall_3_0());
+                      				
                     }
-                    pushFollow(FOLLOW_ruleUxElementURI_in_ruleUxElementDefinition1159);
+                    pushFollow(FOLLOW_18);
                     lv_uri_3_0=ruleUxElementURI();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElementForParent(grammarAccess.getUxElementDefinitionRule());
-                      	        }
-                             		set(
-                             			current, 
-                             			"uri",
-                              		lv_uri_3_0, 
-                              		"UxElementURI");
-                      	        afterParserOrEnumRuleCall();
-                      	    
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getUxElementDefinitionRule());
+                      					}
+                      					set(
+                      						current,
+                      						"uri",
+                      						lv_uri_3_0,
+                      						"org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.UxElementURI");
+                      					afterParserOrEnumRuleCall();
+                      				
                     }
 
                     }
@@ -1686,7 +1705,7 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:590:3: (otherlv_4= 'bindings' otherlv_5= '{' ( (lv_bindingContainer_6_0= ruleUxAvailableBindings ) ) otherlv_7= '}' )?
+            // InternalUISemanticsGrammar.g:620:3: (otherlv_4= 'bindings' otherlv_5= '{' ( (lv_bindingContainer_6_0= ruleUxAvailableBindings ) ) otherlv_7= '}' )?
             int alt15=2;
             int LA15_0 = input.LA(1);
 
@@ -1695,48 +1714,48 @@
             }
             switch (alt15) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:590:5: otherlv_4= 'bindings' otherlv_5= '{' ( (lv_bindingContainer_6_0= ruleUxAvailableBindings ) ) otherlv_7= '}'
+                    // InternalUISemanticsGrammar.g:621:4: otherlv_4= 'bindings' otherlv_5= '{' ( (lv_bindingContainer_6_0= ruleUxAvailableBindings ) ) otherlv_7= '}'
                     {
-                    otherlv_4=(Token)match(input,27,FOLLOW_27_in_ruleUxElementDefinition1173); if (state.failed) return current;
+                    otherlv_4=(Token)match(input,27,FOLLOW_4); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_4, grammarAccess.getUxElementDefinitionAccess().getBindingsKeyword_4_0());
-                          
+                      				newLeafNode(otherlv_4, grammarAccess.getUxElementDefinitionAccess().getBindingsKeyword_4_0());
+                      			
                     }
-                    otherlv_5=(Token)match(input,14,FOLLOW_14_in_ruleUxElementDefinition1185); if (state.failed) return current;
+                    otherlv_5=(Token)match(input,14,FOLLOW_19); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_5, grammarAccess.getUxElementDefinitionAccess().getLeftCurlyBracketKeyword_4_1());
-                          
+                      				newLeafNode(otherlv_5, grammarAccess.getUxElementDefinitionAccess().getLeftCurlyBracketKeyword_4_1());
+                      			
                     }
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:598:1: ( (lv_bindingContainer_6_0= ruleUxAvailableBindings ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:599:1: (lv_bindingContainer_6_0= ruleUxAvailableBindings )
+                    // InternalUISemanticsGrammar.g:629:4: ( (lv_bindingContainer_6_0= ruleUxAvailableBindings ) )
+                    // InternalUISemanticsGrammar.g:630:5: (lv_bindingContainer_6_0= ruleUxAvailableBindings )
                     {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:599:1: (lv_bindingContainer_6_0= ruleUxAvailableBindings )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:600:3: lv_bindingContainer_6_0= ruleUxAvailableBindings
+                    // InternalUISemanticsGrammar.g:630:5: (lv_bindingContainer_6_0= ruleUxAvailableBindings )
+                    // InternalUISemanticsGrammar.g:631:6: lv_bindingContainer_6_0= ruleUxAvailableBindings
                     {
                     if ( state.backtracking==0 ) {
-                       
-                      	        newCompositeNode(grammarAccess.getUxElementDefinitionAccess().getBindingContainerUxAvailableBindingsParserRuleCall_4_2_0()); 
-                      	    
+
+                      						newCompositeNode(grammarAccess.getUxElementDefinitionAccess().getBindingContainerUxAvailableBindingsParserRuleCall_4_2_0());
+                      					
                     }
-                    pushFollow(FOLLOW_ruleUxAvailableBindings_in_ruleUxElementDefinition1206);
+                    pushFollow(FOLLOW_20);
                     lv_bindingContainer_6_0=ruleUxAvailableBindings();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElementForParent(grammarAccess.getUxElementDefinitionRule());
-                      	        }
-                             		set(
-                             			current, 
-                             			"bindingContainer",
-                              		lv_bindingContainer_6_0, 
-                              		"UxAvailableBindings");
-                      	        afterParserOrEnumRuleCall();
-                      	    
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getUxElementDefinitionRule());
+                      						}
+                      						set(
+                      							current,
+                      							"bindingContainer",
+                      							lv_bindingContainer_6_0,
+                      							"org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.UxAvailableBindings");
+                      						afterParserOrEnumRuleCall();
+                      					
                     }
 
                     }
@@ -1744,11 +1763,11 @@
 
                     }
 
-                    otherlv_7=(Token)match(input,15,FOLLOW_15_in_ruleUxElementDefinition1218); if (state.failed) return current;
+                    otherlv_7=(Token)match(input,15,FOLLOW_21); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_7, grammarAccess.getUxElementDefinitionAccess().getRightCurlyBracketKeyword_4_3());
-                          
+                      				newLeafNode(otherlv_7, grammarAccess.getUxElementDefinitionAccess().getRightCurlyBracketKeyword_4_3());
+                      			
                     }
 
                     }
@@ -1756,7 +1775,7 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:620:3: (otherlv_8= 'visibility' otherlv_9= '{' ( (lv_visibilityContainer_10_0= ruleUxAvailableVisibilityOptions ) ) otherlv_11= '}' )?
+            // InternalUISemanticsGrammar.g:653:3: (otherlv_8= 'visibility' otherlv_9= '{' ( (lv_visibilityContainer_10_0= ruleUxAvailableVisibilityOptions ) ) otherlv_11= '}' )?
             int alt16=2;
             int LA16_0 = input.LA(1);
 
@@ -1765,48 +1784,48 @@
             }
             switch (alt16) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:620:5: otherlv_8= 'visibility' otherlv_9= '{' ( (lv_visibilityContainer_10_0= ruleUxAvailableVisibilityOptions ) ) otherlv_11= '}'
+                    // InternalUISemanticsGrammar.g:654:4: otherlv_8= 'visibility' otherlv_9= '{' ( (lv_visibilityContainer_10_0= ruleUxAvailableVisibilityOptions ) ) otherlv_11= '}'
                     {
-                    otherlv_8=(Token)match(input,28,FOLLOW_28_in_ruleUxElementDefinition1233); if (state.failed) return current;
+                    otherlv_8=(Token)match(input,28,FOLLOW_4); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_8, grammarAccess.getUxElementDefinitionAccess().getVisibilityKeyword_5_0());
-                          
+                      				newLeafNode(otherlv_8, grammarAccess.getUxElementDefinitionAccess().getVisibilityKeyword_5_0());
+                      			
                     }
-                    otherlv_9=(Token)match(input,14,FOLLOW_14_in_ruleUxElementDefinition1245); if (state.failed) return current;
+                    otherlv_9=(Token)match(input,14,FOLLOW_22); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_9, grammarAccess.getUxElementDefinitionAccess().getLeftCurlyBracketKeyword_5_1());
-                          
+                      				newLeafNode(otherlv_9, grammarAccess.getUxElementDefinitionAccess().getLeftCurlyBracketKeyword_5_1());
+                      			
                     }
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:628:1: ( (lv_visibilityContainer_10_0= ruleUxAvailableVisibilityOptions ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:629:1: (lv_visibilityContainer_10_0= ruleUxAvailableVisibilityOptions )
+                    // InternalUISemanticsGrammar.g:662:4: ( (lv_visibilityContainer_10_0= ruleUxAvailableVisibilityOptions ) )
+                    // InternalUISemanticsGrammar.g:663:5: (lv_visibilityContainer_10_0= ruleUxAvailableVisibilityOptions )
                     {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:629:1: (lv_visibilityContainer_10_0= ruleUxAvailableVisibilityOptions )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:630:3: lv_visibilityContainer_10_0= ruleUxAvailableVisibilityOptions
+                    // InternalUISemanticsGrammar.g:663:5: (lv_visibilityContainer_10_0= ruleUxAvailableVisibilityOptions )
+                    // InternalUISemanticsGrammar.g:664:6: lv_visibilityContainer_10_0= ruleUxAvailableVisibilityOptions
                     {
                     if ( state.backtracking==0 ) {
-                       
-                      	        newCompositeNode(grammarAccess.getUxElementDefinitionAccess().getVisibilityContainerUxAvailableVisibilityOptionsParserRuleCall_5_2_0()); 
-                      	    
+
+                      						newCompositeNode(grammarAccess.getUxElementDefinitionAccess().getVisibilityContainerUxAvailableVisibilityOptionsParserRuleCall_5_2_0());
+                      					
                     }
-                    pushFollow(FOLLOW_ruleUxAvailableVisibilityOptions_in_ruleUxElementDefinition1266);
+                    pushFollow(FOLLOW_20);
                     lv_visibilityContainer_10_0=ruleUxAvailableVisibilityOptions();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElementForParent(grammarAccess.getUxElementDefinitionRule());
-                      	        }
-                             		set(
-                             			current, 
-                             			"visibilityContainer",
-                              		lv_visibilityContainer_10_0, 
-                              		"UxAvailableVisibilityOptions");
-                      	        afterParserOrEnumRuleCall();
-                      	    
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getUxElementDefinitionRule());
+                      						}
+                      						set(
+                      							current,
+                      							"visibilityContainer",
+                      							lv_visibilityContainer_10_0,
+                      							"org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.UxAvailableVisibilityOptions");
+                      						afterParserOrEnumRuleCall();
+                      					
                     }
 
                     }
@@ -1814,11 +1833,11 @@
 
                     }
 
-                    otherlv_11=(Token)match(input,15,FOLLOW_15_in_ruleUxElementDefinition1278); if (state.failed) return current;
+                    otherlv_11=(Token)match(input,15,FOLLOW_23); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_11, grammarAccess.getUxElementDefinitionAccess().getRightCurlyBracketKeyword_5_3());
-                          
+                      				newLeafNode(otherlv_11, grammarAccess.getUxElementDefinitionAccess().getRightCurlyBracketKeyword_5_3());
+                      			
                     }
 
                     }
@@ -1826,7 +1845,7 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:650:3: (otherlv_12= 'validator' otherlv_13= '{' ( (lv_validatorContainer_14_0= ruleUxAvailableValidatorProperties ) ) otherlv_15= '}' )?
+            // InternalUISemanticsGrammar.g:686:3: (otherlv_12= 'validator' otherlv_13= '{' ( (lv_validatorContainer_14_0= ruleUxAvailableValidatorProperties ) ) otherlv_15= '}' )?
             int alt17=2;
             int LA17_0 = input.LA(1);
 
@@ -1835,48 +1854,48 @@
             }
             switch (alt17) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:650:5: otherlv_12= 'validator' otherlv_13= '{' ( (lv_validatorContainer_14_0= ruleUxAvailableValidatorProperties ) ) otherlv_15= '}'
+                    // InternalUISemanticsGrammar.g:687:4: otherlv_12= 'validator' otherlv_13= '{' ( (lv_validatorContainer_14_0= ruleUxAvailableValidatorProperties ) ) otherlv_15= '}'
                     {
-                    otherlv_12=(Token)match(input,29,FOLLOW_29_in_ruleUxElementDefinition1293); if (state.failed) return current;
+                    otherlv_12=(Token)match(input,29,FOLLOW_4); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_12, grammarAccess.getUxElementDefinitionAccess().getValidatorKeyword_6_0());
-                          
+                      				newLeafNode(otherlv_12, grammarAccess.getUxElementDefinitionAccess().getValidatorKeyword_6_0());
+                      			
                     }
-                    otherlv_13=(Token)match(input,14,FOLLOW_14_in_ruleUxElementDefinition1305); if (state.failed) return current;
+                    otherlv_13=(Token)match(input,14,FOLLOW_24); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_13, grammarAccess.getUxElementDefinitionAccess().getLeftCurlyBracketKeyword_6_1());
-                          
+                      				newLeafNode(otherlv_13, grammarAccess.getUxElementDefinitionAccess().getLeftCurlyBracketKeyword_6_1());
+                      			
                     }
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:658:1: ( (lv_validatorContainer_14_0= ruleUxAvailableValidatorProperties ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:659:1: (lv_validatorContainer_14_0= ruleUxAvailableValidatorProperties )
+                    // InternalUISemanticsGrammar.g:695:4: ( (lv_validatorContainer_14_0= ruleUxAvailableValidatorProperties ) )
+                    // InternalUISemanticsGrammar.g:696:5: (lv_validatorContainer_14_0= ruleUxAvailableValidatorProperties )
                     {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:659:1: (lv_validatorContainer_14_0= ruleUxAvailableValidatorProperties )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:660:3: lv_validatorContainer_14_0= ruleUxAvailableValidatorProperties
+                    // InternalUISemanticsGrammar.g:696:5: (lv_validatorContainer_14_0= ruleUxAvailableValidatorProperties )
+                    // InternalUISemanticsGrammar.g:697:6: lv_validatorContainer_14_0= ruleUxAvailableValidatorProperties
                     {
                     if ( state.backtracking==0 ) {
-                       
-                      	        newCompositeNode(grammarAccess.getUxElementDefinitionAccess().getValidatorContainerUxAvailableValidatorPropertiesParserRuleCall_6_2_0()); 
-                      	    
+
+                      						newCompositeNode(grammarAccess.getUxElementDefinitionAccess().getValidatorContainerUxAvailableValidatorPropertiesParserRuleCall_6_2_0());
+                      					
                     }
-                    pushFollow(FOLLOW_ruleUxAvailableValidatorProperties_in_ruleUxElementDefinition1326);
+                    pushFollow(FOLLOW_20);
                     lv_validatorContainer_14_0=ruleUxAvailableValidatorProperties();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElementForParent(grammarAccess.getUxElementDefinitionRule());
-                      	        }
-                             		set(
-                             			current, 
-                             			"validatorContainer",
-                              		lv_validatorContainer_14_0, 
-                              		"UxAvailableValidatorProperties");
-                      	        afterParserOrEnumRuleCall();
-                      	    
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getUxElementDefinitionRule());
+                      						}
+                      						set(
+                      							current,
+                      							"validatorContainer",
+                      							lv_validatorContainer_14_0,
+                      							"org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.UxAvailableValidatorProperties");
+                      						afterParserOrEnumRuleCall();
+                      					
                     }
 
                     }
@@ -1884,11 +1903,11 @@
 
                     }
 
-                    otherlv_15=(Token)match(input,15,FOLLOW_15_in_ruleUxElementDefinition1338); if (state.failed) return current;
+                    otherlv_15=(Token)match(input,15,FOLLOW_20); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_15, grammarAccess.getUxElementDefinitionAccess().getRightCurlyBracketKeyword_6_3());
-                          
+                      				newLeafNode(otherlv_15, grammarAccess.getUxElementDefinitionAccess().getRightCurlyBracketKeyword_6_3());
+                      			
                     }
 
                     }
@@ -1896,11 +1915,11 @@
 
             }
 
-            otherlv_16=(Token)match(input,15,FOLLOW_15_in_ruleUxElementDefinition1352); if (state.failed) return current;
+            otherlv_16=(Token)match(input,15,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_16, grammarAccess.getUxElementDefinitionAccess().getRightCurlyBracketKeyword_7());
-                  
+              			newLeafNode(otherlv_16, grammarAccess.getUxElementDefinitionAccess().getRightCurlyBracketKeyword_7());
+              		
             }
 
             }
@@ -1909,14 +1928,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -1925,7 +1946,7 @@
 
 
     // $ANTLR start "entryRuleUxAvailableValidatorProperties"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:692:1: entryRuleUxAvailableValidatorProperties returns [EObject current=null] : iv_ruleUxAvailableValidatorProperties= ruleUxAvailableValidatorProperties EOF ;
+    // InternalUISemanticsGrammar.g:727:1: entryRuleUxAvailableValidatorProperties returns [EObject current=null] : iv_ruleUxAvailableValidatorProperties= ruleUxAvailableValidatorProperties EOF ;
     public final EObject entryRuleUxAvailableValidatorProperties() throws RecognitionException {
         EObject current = null;
 
@@ -1933,13 +1954,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:693:2: (iv_ruleUxAvailableValidatorProperties= ruleUxAvailableValidatorProperties EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:694:2: iv_ruleUxAvailableValidatorProperties= ruleUxAvailableValidatorProperties EOF
+            // InternalUISemanticsGrammar.g:727:71: (iv_ruleUxAvailableValidatorProperties= ruleUxAvailableValidatorProperties EOF )
+            // InternalUISemanticsGrammar.g:728:2: iv_ruleUxAvailableValidatorProperties= ruleUxAvailableValidatorProperties EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUxAvailableValidatorPropertiesRule()); 
             }
-            pushFollow(FOLLOW_ruleUxAvailableValidatorProperties_in_entryRuleUxAvailableValidatorProperties1388);
+            pushFollow(FOLLOW_1);
             iv_ruleUxAvailableValidatorProperties=ruleUxAvailableValidatorProperties();
 
             state._fsp--;
@@ -1947,16 +1968,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUxAvailableValidatorProperties; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleUxAvailableValidatorProperties1398); 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;
@@ -1965,36 +1986,37 @@
 
 
     // $ANTLR start "ruleUxAvailableValidatorProperties"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:701:1: ruleUxAvailableValidatorProperties returns [EObject current=null] : ( () ( (lv_properties_1_0= ruleUxValidatorProperty ) )* ) ;
+    // InternalUISemanticsGrammar.g:734:1: ruleUxAvailableValidatorProperties returns [EObject current=null] : ( () ( (lv_properties_1_0= ruleUxValidatorProperty ) )* ) ;
     public final EObject ruleUxAvailableValidatorProperties() throws RecognitionException {
         EObject current = null;
 
         EObject lv_properties_1_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:704:28: ( ( () ( (lv_properties_1_0= ruleUxValidatorProperty ) )* ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:705:1: ( () ( (lv_properties_1_0= ruleUxValidatorProperty ) )* )
+            // InternalUISemanticsGrammar.g:740:2: ( ( () ( (lv_properties_1_0= ruleUxValidatorProperty ) )* ) )
+            // InternalUISemanticsGrammar.g:741:2: ( () ( (lv_properties_1_0= ruleUxValidatorProperty ) )* )
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:705:1: ( () ( (lv_properties_1_0= ruleUxValidatorProperty ) )* )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:705:2: () ( (lv_properties_1_0= ruleUxValidatorProperty ) )*
+            // InternalUISemanticsGrammar.g:741:2: ( () ( (lv_properties_1_0= ruleUxValidatorProperty ) )* )
+            // InternalUISemanticsGrammar.g:742:3: () ( (lv_properties_1_0= ruleUxValidatorProperty ) )*
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:705:2: ()
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:706:5: 
+            // InternalUISemanticsGrammar.g:742:3: ()
+            // InternalUISemanticsGrammar.g:743:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getUxAvailableValidatorPropertiesAccess().getUxAvailableValidatorPropertiesAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getUxAvailableValidatorPropertiesAccess().getUxAvailableValidatorPropertiesAction_0(),
+              					current);
+              			
             }
 
             }
 
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:711:2: ( (lv_properties_1_0= ruleUxValidatorProperty ) )*
+            // InternalUISemanticsGrammar.g:749:3: ( (lv_properties_1_0= ruleUxValidatorProperty ) )*
             loop18:
             do {
                 int alt18=2;
@@ -2007,33 +2029,33 @@
 
                 switch (alt18) {
             	case 1 :
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:712:1: (lv_properties_1_0= ruleUxValidatorProperty )
+            	    // InternalUISemanticsGrammar.g:750:4: (lv_properties_1_0= ruleUxValidatorProperty )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:712:1: (lv_properties_1_0= ruleUxValidatorProperty )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:713:3: lv_properties_1_0= ruleUxValidatorProperty
+            	    // InternalUISemanticsGrammar.g:750:4: (lv_properties_1_0= ruleUxValidatorProperty )
+            	    // InternalUISemanticsGrammar.g:751:5: lv_properties_1_0= ruleUxValidatorProperty
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getUxAvailableValidatorPropertiesAccess().getPropertiesUxValidatorPropertyParserRuleCall_1_0()); 
-            	      	    
+
+            	      					newCompositeNode(grammarAccess.getUxAvailableValidatorPropertiesAccess().getPropertiesUxValidatorPropertyParserRuleCall_1_0());
+            	      				
             	    }
-            	    pushFollow(FOLLOW_ruleUxValidatorProperty_in_ruleUxAvailableValidatorProperties1453);
+            	    pushFollow(FOLLOW_25);
             	    lv_properties_1_0=ruleUxValidatorProperty();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getUxAvailableValidatorPropertiesRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"properties",
-            	              		lv_properties_1_0, 
-            	              		"UxValidatorProperty");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUxAvailableValidatorPropertiesRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"properties",
+            	      						lv_properties_1_0,
+            	      						"org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.UxValidatorProperty");
+            	      					afterParserOrEnumRuleCall();
+            	      				
             	    }
 
             	    }
@@ -2054,14 +2076,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -2070,7 +2094,7 @@
 
 
     // $ANTLR start "entryRuleUxValidatorProperty"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:737:1: entryRuleUxValidatorProperty returns [EObject current=null] : iv_ruleUxValidatorProperty= ruleUxValidatorProperty EOF ;
+    // InternalUISemanticsGrammar.g:772:1: entryRuleUxValidatorProperty returns [EObject current=null] : iv_ruleUxValidatorProperty= ruleUxValidatorProperty EOF ;
     public final EObject entryRuleUxValidatorProperty() throws RecognitionException {
         EObject current = null;
 
@@ -2078,13 +2102,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:738:2: (iv_ruleUxValidatorProperty= ruleUxValidatorProperty EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:739:2: iv_ruleUxValidatorProperty= ruleUxValidatorProperty EOF
+            // InternalUISemanticsGrammar.g:772:60: (iv_ruleUxValidatorProperty= ruleUxValidatorProperty EOF )
+            // InternalUISemanticsGrammar.g:773:2: iv_ruleUxValidatorProperty= ruleUxValidatorProperty EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUxValidatorPropertyRule()); 
             }
-            pushFollow(FOLLOW_ruleUxValidatorProperty_in_entryRuleUxValidatorProperty1490);
+            pushFollow(FOLLOW_1);
             iv_ruleUxValidatorProperty=ruleUxValidatorProperty();
 
             state._fsp--;
@@ -2092,16 +2116,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUxValidatorProperty; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleUxValidatorProperty1500); 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;
@@ -2110,51 +2134,52 @@
 
 
     // $ANTLR start "ruleUxValidatorProperty"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:746:1: ruleUxValidatorProperty returns [EObject current=null] : (otherlv_0= 'property' ( (lv_name_1_0= RULE_ID ) ) ) ;
+    // InternalUISemanticsGrammar.g:779:1: ruleUxValidatorProperty returns [EObject current=null] : (otherlv_0= 'property' ( (lv_name_1_0= RULE_ID ) ) ) ;
     public final EObject ruleUxValidatorProperty() throws RecognitionException {
         EObject current = null;
 
         Token otherlv_0=null;
         Token lv_name_1_0=null;
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:749:28: ( (otherlv_0= 'property' ( (lv_name_1_0= RULE_ID ) ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:750:1: (otherlv_0= 'property' ( (lv_name_1_0= RULE_ID ) ) )
+            // InternalUISemanticsGrammar.g:785:2: ( (otherlv_0= 'property' ( (lv_name_1_0= RULE_ID ) ) ) )
+            // InternalUISemanticsGrammar.g:786:2: (otherlv_0= 'property' ( (lv_name_1_0= RULE_ID ) ) )
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:750:1: (otherlv_0= 'property' ( (lv_name_1_0= RULE_ID ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:750:3: otherlv_0= 'property' ( (lv_name_1_0= RULE_ID ) )
+            // InternalUISemanticsGrammar.g:786:2: (otherlv_0= 'property' ( (lv_name_1_0= RULE_ID ) ) )
+            // InternalUISemanticsGrammar.g:787:3: otherlv_0= 'property' ( (lv_name_1_0= RULE_ID ) )
             {
-            otherlv_0=(Token)match(input,30,FOLLOW_30_in_ruleUxValidatorProperty1537); if (state.failed) return current;
+            otherlv_0=(Token)match(input,30,FOLLOW_16); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getUxValidatorPropertyAccess().getPropertyKeyword_0());
-                  
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:754:1: ( (lv_name_1_0= RULE_ID ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:755:1: (lv_name_1_0= RULE_ID )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:755:1: (lv_name_1_0= RULE_ID )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:756:3: lv_name_1_0= RULE_ID
-            {
-            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleUxValidatorProperty1554); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-              			newLeafNode(lv_name_1_0, grammarAccess.getUxValidatorPropertyAccess().getNameIDTerminalRuleCall_1_0()); 
+              			newLeafNode(otherlv_0, grammarAccess.getUxValidatorPropertyAccess().getPropertyKeyword_0());
               		
             }
+            // InternalUISemanticsGrammar.g:791:3: ( (lv_name_1_0= RULE_ID ) )
+            // InternalUISemanticsGrammar.g:792:4: (lv_name_1_0= RULE_ID )
+            {
+            // InternalUISemanticsGrammar.g:792:4: (lv_name_1_0= RULE_ID )
+            // InternalUISemanticsGrammar.g:793: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 ) {
 
-              	        if (current==null) {
-              	            current = createModelElement(grammarAccess.getUxValidatorPropertyRule());
-              	        }
-                     		setWithLastConsumed(
-                     			current, 
-                     			"name",
-                      		lv_name_1_0, 
-                      		"ID");
-              	    
+              					newLeafNode(lv_name_1_0, grammarAccess.getUxValidatorPropertyAccess().getNameIDTerminalRuleCall_1_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getUxValidatorPropertyRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"name",
+              						lv_name_1_0,
+              						"org.eclipse.xtext.xbase.Xtype.ID");
+              				
             }
 
             }
@@ -2169,14 +2194,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -2185,7 +2212,7 @@
 
 
     // $ANTLR start "entryRuleUxElementURI"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:780:1: entryRuleUxElementURI returns [EObject current=null] : iv_ruleUxElementURI= ruleUxElementURI EOF ;
+    // InternalUISemanticsGrammar.g:813:1: entryRuleUxElementURI returns [EObject current=null] : iv_ruleUxElementURI= ruleUxElementURI EOF ;
     public final EObject entryRuleUxElementURI() throws RecognitionException {
         EObject current = null;
 
@@ -2193,13 +2220,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:781:2: (iv_ruleUxElementURI= ruleUxElementURI EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:782:2: iv_ruleUxElementURI= ruleUxElementURI EOF
+            // InternalUISemanticsGrammar.g:813:53: (iv_ruleUxElementURI= ruleUxElementURI EOF )
+            // InternalUISemanticsGrammar.g:814:2: iv_ruleUxElementURI= ruleUxElementURI EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUxElementURIRule()); 
             }
-            pushFollow(FOLLOW_ruleUxElementURI_in_entryRuleUxElementURI1595);
+            pushFollow(FOLLOW_1);
             iv_ruleUxElementURI=ruleUxElementURI();
 
             state._fsp--;
@@ -2207,16 +2234,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUxElementURI; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleUxElementURI1605); 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;
@@ -2225,7 +2252,7 @@
 
 
     // $ANTLR start "ruleUxElementURI"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:789:1: ruleUxElementURI returns [EObject current=null] : (otherlv_0= 'uri' ( (otherlv_1= RULE_ID ) ) otherlv_2= ':' ( (otherlv_3= RULE_ID ) ) ) ;
+    // InternalUISemanticsGrammar.g:820:1: ruleUxElementURI returns [EObject current=null] : (otherlv_0= 'uri' ( (otherlv_1= RULE_ID ) ) otherlv_2= ':' ( (otherlv_3= RULE_ID ) ) ) ;
     public final EObject ruleUxElementURI() throws RecognitionException {
         EObject current = null;
 
@@ -2234,39 +2261,40 @@
         Token otherlv_2=null;
         Token otherlv_3=null;
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:792:28: ( (otherlv_0= 'uri' ( (otherlv_1= RULE_ID ) ) otherlv_2= ':' ( (otherlv_3= RULE_ID ) ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:793:1: (otherlv_0= 'uri' ( (otherlv_1= RULE_ID ) ) otherlv_2= ':' ( (otherlv_3= RULE_ID ) ) )
+            // InternalUISemanticsGrammar.g:826:2: ( (otherlv_0= 'uri' ( (otherlv_1= RULE_ID ) ) otherlv_2= ':' ( (otherlv_3= RULE_ID ) ) ) )
+            // InternalUISemanticsGrammar.g:827:2: (otherlv_0= 'uri' ( (otherlv_1= RULE_ID ) ) otherlv_2= ':' ( (otherlv_3= RULE_ID ) ) )
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:793:1: (otherlv_0= 'uri' ( (otherlv_1= RULE_ID ) ) otherlv_2= ':' ( (otherlv_3= RULE_ID ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:793:3: otherlv_0= 'uri' ( (otherlv_1= RULE_ID ) ) otherlv_2= ':' ( (otherlv_3= RULE_ID ) )
+            // InternalUISemanticsGrammar.g:827:2: (otherlv_0= 'uri' ( (otherlv_1= RULE_ID ) ) otherlv_2= ':' ( (otherlv_3= RULE_ID ) ) )
+            // InternalUISemanticsGrammar.g:828:3: otherlv_0= 'uri' ( (otherlv_1= RULE_ID ) ) otherlv_2= ':' ( (otherlv_3= RULE_ID ) )
             {
-            otherlv_0=(Token)match(input,31,FOLLOW_31_in_ruleUxElementURI1642); if (state.failed) return current;
+            otherlv_0=(Token)match(input,31,FOLLOW_16); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getUxElementURIAccess().getUriKeyword_0());
-                  
+              			newLeafNode(otherlv_0, grammarAccess.getUxElementURIAccess().getUriKeyword_0());
+              		
             }
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:797:1: ( (otherlv_1= RULE_ID ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:798:1: (otherlv_1= RULE_ID )
+            // InternalUISemanticsGrammar.g:832:3: ( (otherlv_1= RULE_ID ) )
+            // InternalUISemanticsGrammar.g:833:4: (otherlv_1= RULE_ID )
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:798:1: (otherlv_1= RULE_ID )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:799:3: otherlv_1= RULE_ID
+            // InternalUISemanticsGrammar.g:833:4: (otherlv_1= RULE_ID )
+            // InternalUISemanticsGrammar.g:834:5: otherlv_1= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
-              			if (current==null) {
-              	            current = createModelElement(grammarAccess.getUxElementURIRule());
-              	        }
-                      
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getUxElementURIRule());
+              					}
+              				
             }
-            otherlv_1=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleUxElementURI1662); if (state.failed) return current;
+            otherlv_1=(Token)match(input,RULE_ID,FOLLOW_26); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              		newLeafNode(otherlv_1, grammarAccess.getUxElementURIAccess().getEPackageUxEPackageImportCrossReference_1_0()); 
-              	
+              					newLeafNode(otherlv_1, grammarAccess.getUxElementURIAccess().getEPackageUxEPackageImportCrossReference_1_0());
+              				
             }
 
             }
@@ -2274,30 +2302,30 @@
 
             }
 
-            otherlv_2=(Token)match(input,32,FOLLOW_32_in_ruleUxElementURI1674); if (state.failed) return current;
+            otherlv_2=(Token)match(input,32,FOLLOW_16); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_2, grammarAccess.getUxElementURIAccess().getColonKeyword_2());
-                  
+              			newLeafNode(otherlv_2, grammarAccess.getUxElementURIAccess().getColonKeyword_2());
+              		
             }
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:814:1: ( (otherlv_3= RULE_ID ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:815:1: (otherlv_3= RULE_ID )
+            // InternalUISemanticsGrammar.g:849:3: ( (otherlv_3= RULE_ID ) )
+            // InternalUISemanticsGrammar.g:850:4: (otherlv_3= RULE_ID )
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:815:1: (otherlv_3= RULE_ID )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:816:3: otherlv_3= RULE_ID
+            // InternalUISemanticsGrammar.g:850:4: (otherlv_3= RULE_ID )
+            // InternalUISemanticsGrammar.g:851:5: otherlv_3= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
-              			if (current==null) {
-              	            current = createModelElement(grammarAccess.getUxElementURIRule());
-              	        }
-                      
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getUxElementURIRule());
+              					}
+              				
             }
-            otherlv_3=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleUxElementURI1694); 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.getUxElementURIAccess().getEClassEClassCrossReference_3_0()); 
-              	
+              					newLeafNode(otherlv_3, grammarAccess.getUxElementURIAccess().getEClassEClassCrossReference_3_0());
+              				
             }
 
             }
@@ -2312,14 +2340,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -2328,7 +2358,7 @@
 
 
     // $ANTLR start "entryRuleUxAvailableBindings"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:835:1: entryRuleUxAvailableBindings returns [EObject current=null] : iv_ruleUxAvailableBindings= ruleUxAvailableBindings EOF ;
+    // InternalUISemanticsGrammar.g:866:1: entryRuleUxAvailableBindings returns [EObject current=null] : iv_ruleUxAvailableBindings= ruleUxAvailableBindings EOF ;
     public final EObject entryRuleUxAvailableBindings() throws RecognitionException {
         EObject current = null;
 
@@ -2336,13 +2366,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:836:2: (iv_ruleUxAvailableBindings= ruleUxAvailableBindings EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:837:2: iv_ruleUxAvailableBindings= ruleUxAvailableBindings EOF
+            // InternalUISemanticsGrammar.g:866:60: (iv_ruleUxAvailableBindings= ruleUxAvailableBindings EOF )
+            // InternalUISemanticsGrammar.g:867:2: iv_ruleUxAvailableBindings= ruleUxAvailableBindings EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUxAvailableBindingsRule()); 
             }
-            pushFollow(FOLLOW_ruleUxAvailableBindings_in_entryRuleUxAvailableBindings1730);
+            pushFollow(FOLLOW_1);
             iv_ruleUxAvailableBindings=ruleUxAvailableBindings();
 
             state._fsp--;
@@ -2350,16 +2380,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUxAvailableBindings; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleUxAvailableBindings1740); 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;
@@ -2368,220 +2398,126 @@
 
 
     // $ANTLR start "ruleUxAvailableBindings"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:844:1: ruleUxAvailableBindings returns [EObject current=null] : ( () ( (lv_bindings_1_0= ruleUxBindingableOption ) )* ) ;
+    // InternalUISemanticsGrammar.g:873:1: ruleUxAvailableBindings returns [EObject current=null] : ( () (otherlv_1= 'extends' ( (otherlv_2= RULE_ID ) ) )? ( (lv_bindings_3_0= ruleUxBindingableOption ) )* ) ;
     public final EObject ruleUxAvailableBindings() throws RecognitionException {
         EObject current = null;
 
-        EObject lv_bindings_1_0 = null;
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        EObject lv_bindings_3_0 = null;
 
 
-         enterRule(); 
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:847:28: ( ( () ( (lv_bindings_1_0= ruleUxBindingableOption ) )* ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:848:1: ( () ( (lv_bindings_1_0= ruleUxBindingableOption ) )* )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:848:1: ( () ( (lv_bindings_1_0= ruleUxBindingableOption ) )* )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:848:2: () ( (lv_bindings_1_0= ruleUxBindingableOption ) )*
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:848:2: ()
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:849:5: 
-            {
-            if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getUxAvailableBindingsAccess().getUxAvailableBindingsAction_0(),
-                          current);
-                  
-            }
-
-            }
-
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:854:2: ( (lv_bindings_1_0= ruleUxBindingableOption ) )*
-            loop19:
-            do {
-                int alt19=2;
-                int LA19_0 = input.LA(1);
-
-                if ( ((LA19_0>=33 && LA19_0<=35)) ) {
-                    alt19=1;
-                }
-
-
-                switch (alt19) {
-            	case 1 :
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:855:1: (lv_bindings_1_0= ruleUxBindingableOption )
-            	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:855:1: (lv_bindings_1_0= ruleUxBindingableOption )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:856:3: lv_bindings_1_0= ruleUxBindingableOption
-            	    {
-            	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getUxAvailableBindingsAccess().getBindingsUxBindingableOptionParserRuleCall_1_0()); 
-            	      	    
-            	    }
-            	    pushFollow(FOLLOW_ruleUxBindingableOption_in_ruleUxAvailableBindings1795);
-            	    lv_bindings_1_0=ruleUxBindingableOption();
-
-            	    state._fsp--;
-            	    if (state.failed) return current;
-            	    if ( state.backtracking==0 ) {
-
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getUxAvailableBindingsRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"bindings",
-            	              		lv_bindings_1_0, 
-            	              		"UxBindingableOption");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
-            	    }
-
-            	    }
-
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop19;
-                }
-            } while (true);
-
-
-            }
-
-
-            }
-
-            if ( state.backtracking==0 ) {
-               leaveRule(); 
-            }
-        }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
-                appendSkippedTokens();
-            } 
-        finally {
-        }
-        return current;
-    }
-    // $ANTLR end "ruleUxAvailableBindings"
-
-
-    // $ANTLR start "entryRuleUxAvailableVisibilityOptions"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:880:1: entryRuleUxAvailableVisibilityOptions returns [EObject current=null] : iv_ruleUxAvailableVisibilityOptions= ruleUxAvailableVisibilityOptions EOF ;
-    public final EObject entryRuleUxAvailableVisibilityOptions() throws RecognitionException {
-        EObject current = null;
-
-        EObject iv_ruleUxAvailableVisibilityOptions = null;
-
+        	enterRule();
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:881:2: (iv_ruleUxAvailableVisibilityOptions= ruleUxAvailableVisibilityOptions EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:882:2: iv_ruleUxAvailableVisibilityOptions= ruleUxAvailableVisibilityOptions EOF
+            // InternalUISemanticsGrammar.g:879:2: ( ( () (otherlv_1= 'extends' ( (otherlv_2= RULE_ID ) ) )? ( (lv_bindings_3_0= ruleUxBindingableOption ) )* ) )
+            // InternalUISemanticsGrammar.g:880:2: ( () (otherlv_1= 'extends' ( (otherlv_2= RULE_ID ) ) )? ( (lv_bindings_3_0= ruleUxBindingableOption ) )* )
             {
-            if ( state.backtracking==0 ) {
-               newCompositeNode(grammarAccess.getUxAvailableVisibilityOptionsRule()); 
-            }
-            pushFollow(FOLLOW_ruleUxAvailableVisibilityOptions_in_entryRuleUxAvailableVisibilityOptions1832);
-            iv_ruleUxAvailableVisibilityOptions=ruleUxAvailableVisibilityOptions();
-
-            state._fsp--;
-            if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-               current =iv_ruleUxAvailableVisibilityOptions; 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleUxAvailableVisibilityOptions1842); if (state.failed) return current;
-
-            }
-
-        }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
-                appendSkippedTokens();
-            } 
-        finally {
-        }
-        return current;
-    }
-    // $ANTLR end "entryRuleUxAvailableVisibilityOptions"
-
-
-    // $ANTLR start "ruleUxAvailableVisibilityOptions"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:889:1: ruleUxAvailableVisibilityOptions returns [EObject current=null] : ( () ( (lv_bindings_1_0= ruleUxVisibleableOption ) )* ) ;
-    public final EObject ruleUxAvailableVisibilityOptions() throws RecognitionException {
-        EObject current = null;
-
-        EObject lv_bindings_1_0 = null;
-
-
-         enterRule(); 
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:892:28: ( ( () ( (lv_bindings_1_0= ruleUxVisibleableOption ) )* ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:893:1: ( () ( (lv_bindings_1_0= ruleUxVisibleableOption ) )* )
+            // InternalUISemanticsGrammar.g:880:2: ( () (otherlv_1= 'extends' ( (otherlv_2= RULE_ID ) ) )? ( (lv_bindings_3_0= ruleUxBindingableOption ) )* )
+            // InternalUISemanticsGrammar.g:881:3: () (otherlv_1= 'extends' ( (otherlv_2= RULE_ID ) ) )? ( (lv_bindings_3_0= ruleUxBindingableOption ) )*
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:893:1: ( () ( (lv_bindings_1_0= ruleUxVisibleableOption ) )* )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:893:2: () ( (lv_bindings_1_0= ruleUxVisibleableOption ) )*
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:893:2: ()
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:894:5: 
+            // InternalUISemanticsGrammar.g:881:3: ()
+            // InternalUISemanticsGrammar.g:882:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getUxAvailableVisibilityOptionsAccess().getUxAvailableVisibilityOptionsAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getUxAvailableBindingsAccess().getUxAvailableBindingsAction_0(),
+              					current);
+              			
             }
 
             }
 
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:899:2: ( (lv_bindings_1_0= ruleUxVisibleableOption ) )*
+            // InternalUISemanticsGrammar.g:888:3: (otherlv_1= 'extends' ( (otherlv_2= RULE_ID ) ) )?
+            int alt19=2;
+            int LA19_0 = input.LA(1);
+
+            if ( (LA19_0==33) ) {
+                alt19=1;
+            }
+            switch (alt19) {
+                case 1 :
+                    // InternalUISemanticsGrammar.g:889:4: otherlv_1= 'extends' ( (otherlv_2= RULE_ID ) )
+                    {
+                    otherlv_1=(Token)match(input,33,FOLLOW_16); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_1, grammarAccess.getUxAvailableBindingsAccess().getExtendsKeyword_1_0());
+                      			
+                    }
+                    // InternalUISemanticsGrammar.g:893:4: ( (otherlv_2= RULE_ID ) )
+                    // InternalUISemanticsGrammar.g:894:5: (otherlv_2= RULE_ID )
+                    {
+                    // InternalUISemanticsGrammar.g:894:5: (otherlv_2= RULE_ID )
+                    // InternalUISemanticsGrammar.g:895:6: otherlv_2= RULE_ID
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getUxAvailableBindingsRule());
+                      						}
+                      					
+                    }
+                    otherlv_2=(Token)match(input,RULE_ID,FOLLOW_27); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(otherlv_2, grammarAccess.getUxAvailableBindingsAccess().getSuperElementUxElementDefinitionCrossReference_1_1_0());
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalUISemanticsGrammar.g:907:3: ( (lv_bindings_3_0= ruleUxBindingableOption ) )*
             loop20:
             do {
                 int alt20=2;
                 int LA20_0 = input.LA(1);
 
-                if ( (LA20_0==35) ) {
+                if ( ((LA20_0>=34 && LA20_0<=36)) ) {
                     alt20=1;
                 }
 
 
                 switch (alt20) {
             	case 1 :
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:900:1: (lv_bindings_1_0= ruleUxVisibleableOption )
+            	    // InternalUISemanticsGrammar.g:908:4: (lv_bindings_3_0= ruleUxBindingableOption )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:900:1: (lv_bindings_1_0= ruleUxVisibleableOption )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:901:3: lv_bindings_1_0= ruleUxVisibleableOption
+            	    // InternalUISemanticsGrammar.g:908:4: (lv_bindings_3_0= ruleUxBindingableOption )
+            	    // InternalUISemanticsGrammar.g:909:5: lv_bindings_3_0= ruleUxBindingableOption
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getUxAvailableVisibilityOptionsAccess().getBindingsUxVisibleableOptionParserRuleCall_1_0()); 
-            	      	    
+
+            	      					newCompositeNode(grammarAccess.getUxAvailableBindingsAccess().getBindingsUxBindingableOptionParserRuleCall_2_0());
+            	      				
             	    }
-            	    pushFollow(FOLLOW_ruleUxVisibleableOption_in_ruleUxAvailableVisibilityOptions1897);
-            	    lv_bindings_1_0=ruleUxVisibleableOption();
+            	    pushFollow(FOLLOW_27);
+            	    lv_bindings_3_0=ruleUxBindingableOption();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getUxAvailableVisibilityOptionsRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"bindings",
-            	              		lv_bindings_1_0, 
-            	              		"UxVisibleableOption");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUxAvailableBindingsRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"bindings",
+            	      						lv_bindings_3_0,
+            	      						"org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.UxBindingableOption");
+            	      					afterParserOrEnumRuleCall();
+            	      				
             	    }
 
             	    }
@@ -2602,14 +2538,164 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUxAvailableBindings"
+
+
+    // $ANTLR start "entryRuleUxAvailableVisibilityOptions"
+    // InternalUISemanticsGrammar.g:930:1: entryRuleUxAvailableVisibilityOptions returns [EObject current=null] : iv_ruleUxAvailableVisibilityOptions= ruleUxAvailableVisibilityOptions EOF ;
+    public final EObject entryRuleUxAvailableVisibilityOptions() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUxAvailableVisibilityOptions = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:930:69: (iv_ruleUxAvailableVisibilityOptions= ruleUxAvailableVisibilityOptions EOF )
+            // InternalUISemanticsGrammar.g:931:2: iv_ruleUxAvailableVisibilityOptions= ruleUxAvailableVisibilityOptions EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUxAvailableVisibilityOptionsRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUxAvailableVisibilityOptions=ruleUxAvailableVisibilityOptions();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUxAvailableVisibilityOptions; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUxAvailableVisibilityOptions"
+
+
+    // $ANTLR start "ruleUxAvailableVisibilityOptions"
+    // InternalUISemanticsGrammar.g:937:1: ruleUxAvailableVisibilityOptions returns [EObject current=null] : ( () ( (lv_bindings_1_0= ruleUxVisibleableOption ) )* ) ;
+    public final EObject ruleUxAvailableVisibilityOptions() throws RecognitionException {
+        EObject current = null;
+
+        EObject lv_bindings_1_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUISemanticsGrammar.g:943:2: ( ( () ( (lv_bindings_1_0= ruleUxVisibleableOption ) )* ) )
+            // InternalUISemanticsGrammar.g:944:2: ( () ( (lv_bindings_1_0= ruleUxVisibleableOption ) )* )
+            {
+            // InternalUISemanticsGrammar.g:944:2: ( () ( (lv_bindings_1_0= ruleUxVisibleableOption ) )* )
+            // InternalUISemanticsGrammar.g:945:3: () ( (lv_bindings_1_0= ruleUxVisibleableOption ) )*
+            {
+            // InternalUISemanticsGrammar.g:945:3: ()
+            // InternalUISemanticsGrammar.g:946:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUxAvailableVisibilityOptionsAccess().getUxAvailableVisibilityOptionsAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalUISemanticsGrammar.g:952:3: ( (lv_bindings_1_0= ruleUxVisibleableOption ) )*
+            loop21:
+            do {
+                int alt21=2;
+                int LA21_0 = input.LA(1);
+
+                if ( (LA21_0==36) ) {
+                    alt21=1;
+                }
+
+
+                switch (alt21) {
+            	case 1 :
+            	    // InternalUISemanticsGrammar.g:953:4: (lv_bindings_1_0= ruleUxVisibleableOption )
+            	    {
+            	    // InternalUISemanticsGrammar.g:953:4: (lv_bindings_1_0= ruleUxVisibleableOption )
+            	    // InternalUISemanticsGrammar.g:954:5: lv_bindings_1_0= ruleUxVisibleableOption
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUxAvailableVisibilityOptionsAccess().getBindingsUxVisibleableOptionParserRuleCall_1_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_28);
+            	    lv_bindings_1_0=ruleUxVisibleableOption();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUxAvailableVisibilityOptionsRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"bindings",
+            	      						lv_bindings_1_0,
+            	      						"org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.UxVisibleableOption");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop21;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
         finally {
         }
         return current;
@@ -2618,7 +2704,7 @@
 
 
     // $ANTLR start "entryRuleUxBindingableOption"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:925:1: entryRuleUxBindingableOption returns [EObject current=null] : iv_ruleUxBindingableOption= ruleUxBindingableOption EOF ;
+    // InternalUISemanticsGrammar.g:975:1: entryRuleUxBindingableOption returns [EObject current=null] : iv_ruleUxBindingableOption= ruleUxBindingableOption EOF ;
     public final EObject entryRuleUxBindingableOption() throws RecognitionException {
         EObject current = null;
 
@@ -2626,13 +2712,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:926:2: (iv_ruleUxBindingableOption= ruleUxBindingableOption EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:927:2: iv_ruleUxBindingableOption= ruleUxBindingableOption EOF
+            // InternalUISemanticsGrammar.g:975:60: (iv_ruleUxBindingableOption= ruleUxBindingableOption EOF )
+            // InternalUISemanticsGrammar.g:976:2: iv_ruleUxBindingableOption= ruleUxBindingableOption EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUxBindingableOptionRule()); 
             }
-            pushFollow(FOLLOW_ruleUxBindingableOption_in_entryRuleUxBindingableOption1934);
+            pushFollow(FOLLOW_1);
             iv_ruleUxBindingableOption=ruleUxBindingableOption();
 
             state._fsp--;
@@ -2640,16 +2726,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUxBindingableOption; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleUxBindingableOption1944); 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;
@@ -2658,7 +2744,7 @@
 
 
     // $ANTLR start "ruleUxBindingableOption"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:934:1: ruleUxBindingableOption returns [EObject current=null] : ( ( (lv_final_0_0= 'final' ) )? ( (lv_listbinding_1_0= 'list' ) )? otherlv_2= 'endpoint' ( (lv_name_3_0= RULE_ID ) ) ( (lv_jvmType_4_0= ruleJvmTypeReference ) ) (otherlv_5= 'target' ( (lv_targetName_6_0= RULE_ID ) ) )? ) ;
+    // InternalUISemanticsGrammar.g:982:1: ruleUxBindingableOption returns [EObject current=null] : ( ( (lv_final_0_0= 'final' ) )? ( (lv_listbinding_1_0= 'list' ) )? otherlv_2= 'endpoint' ( (lv_name_3_0= RULE_ID ) ) ( (lv_jvmType_4_0= ruleJvmTypeReference ) ) (otherlv_5= 'target' ( (lv_targetName_6_0= RULE_ID ) ) )? ) ;
     public final EObject ruleUxBindingableOption() throws RecognitionException {
         EObject current = null;
 
@@ -2671,53 +2757,17 @@
         EObject lv_jvmType_4_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:937:28: ( ( ( (lv_final_0_0= 'final' ) )? ( (lv_listbinding_1_0= 'list' ) )? otherlv_2= 'endpoint' ( (lv_name_3_0= RULE_ID ) ) ( (lv_jvmType_4_0= ruleJvmTypeReference ) ) (otherlv_5= 'target' ( (lv_targetName_6_0= RULE_ID ) ) )? ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:938:1: ( ( (lv_final_0_0= 'final' ) )? ( (lv_listbinding_1_0= 'list' ) )? otherlv_2= 'endpoint' ( (lv_name_3_0= RULE_ID ) ) ( (lv_jvmType_4_0= ruleJvmTypeReference ) ) (otherlv_5= 'target' ( (lv_targetName_6_0= RULE_ID ) ) )? )
+            // InternalUISemanticsGrammar.g:988:2: ( ( ( (lv_final_0_0= 'final' ) )? ( (lv_listbinding_1_0= 'list' ) )? otherlv_2= 'endpoint' ( (lv_name_3_0= RULE_ID ) ) ( (lv_jvmType_4_0= ruleJvmTypeReference ) ) (otherlv_5= 'target' ( (lv_targetName_6_0= RULE_ID ) ) )? ) )
+            // InternalUISemanticsGrammar.g:989:2: ( ( (lv_final_0_0= 'final' ) )? ( (lv_listbinding_1_0= 'list' ) )? otherlv_2= 'endpoint' ( (lv_name_3_0= RULE_ID ) ) ( (lv_jvmType_4_0= ruleJvmTypeReference ) ) (otherlv_5= 'target' ( (lv_targetName_6_0= RULE_ID ) ) )? )
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:938:1: ( ( (lv_final_0_0= 'final' ) )? ( (lv_listbinding_1_0= 'list' ) )? otherlv_2= 'endpoint' ( (lv_name_3_0= RULE_ID ) ) ( (lv_jvmType_4_0= ruleJvmTypeReference ) ) (otherlv_5= 'target' ( (lv_targetName_6_0= RULE_ID ) ) )? )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:938:2: ( (lv_final_0_0= 'final' ) )? ( (lv_listbinding_1_0= 'list' ) )? otherlv_2= 'endpoint' ( (lv_name_3_0= RULE_ID ) ) ( (lv_jvmType_4_0= ruleJvmTypeReference ) ) (otherlv_5= 'target' ( (lv_targetName_6_0= RULE_ID ) ) )?
+            // InternalUISemanticsGrammar.g:989:2: ( ( (lv_final_0_0= 'final' ) )? ( (lv_listbinding_1_0= 'list' ) )? otherlv_2= 'endpoint' ( (lv_name_3_0= RULE_ID ) ) ( (lv_jvmType_4_0= ruleJvmTypeReference ) ) (otherlv_5= 'target' ( (lv_targetName_6_0= RULE_ID ) ) )? )
+            // InternalUISemanticsGrammar.g:990:3: ( (lv_final_0_0= 'final' ) )? ( (lv_listbinding_1_0= 'list' ) )? otherlv_2= 'endpoint' ( (lv_name_3_0= RULE_ID ) ) ( (lv_jvmType_4_0= ruleJvmTypeReference ) ) (otherlv_5= 'target' ( (lv_targetName_6_0= RULE_ID ) ) )?
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:938:2: ( (lv_final_0_0= 'final' ) )?
-            int alt21=2;
-            int LA21_0 = input.LA(1);
-
-            if ( (LA21_0==33) ) {
-                alt21=1;
-            }
-            switch (alt21) {
-                case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:939:1: (lv_final_0_0= 'final' )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:939:1: (lv_final_0_0= 'final' )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:940:3: lv_final_0_0= 'final'
-                    {
-                    lv_final_0_0=(Token)match(input,33,FOLLOW_33_in_ruleUxBindingableOption1987); if (state.failed) return current;
-                    if ( state.backtracking==0 ) {
-
-                              newLeafNode(lv_final_0_0, grammarAccess.getUxBindingableOptionAccess().getFinalFinalKeyword_0_0());
-                          
-                    }
-                    if ( state.backtracking==0 ) {
-
-                      	        if (current==null) {
-                      	            current = createModelElement(grammarAccess.getUxBindingableOptionRule());
-                      	        }
-                             		setWithLastConsumed(current, "final", true, "final");
-                      	    
-                    }
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:953:3: ( (lv_listbinding_1_0= 'list' ) )?
+            // InternalUISemanticsGrammar.g:990:3: ( (lv_final_0_0= 'final' ) )?
             int alt22=2;
             int LA22_0 = input.LA(1);
 
@@ -2726,24 +2776,24 @@
             }
             switch (alt22) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:954:1: (lv_listbinding_1_0= 'list' )
+                    // InternalUISemanticsGrammar.g:991:4: (lv_final_0_0= 'final' )
                     {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:954:1: (lv_listbinding_1_0= 'list' )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:955:3: lv_listbinding_1_0= 'list'
+                    // InternalUISemanticsGrammar.g:991:4: (lv_final_0_0= 'final' )
+                    // InternalUISemanticsGrammar.g:992:5: lv_final_0_0= 'final'
                     {
-                    lv_listbinding_1_0=(Token)match(input,34,FOLLOW_34_in_ruleUxBindingableOption2019); if (state.failed) return current;
+                    lv_final_0_0=(Token)match(input,34,FOLLOW_29); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              newLeafNode(lv_listbinding_1_0, grammarAccess.getUxBindingableOptionAccess().getListbindingListKeyword_1_0());
-                          
+                      					newLeafNode(lv_final_0_0, grammarAccess.getUxBindingableOptionAccess().getFinalFinalKeyword_0_0());
+                      				
                     }
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElement(grammarAccess.getUxBindingableOptionRule());
-                      	        }
-                             		setWithLastConsumed(current, "listbinding", true, "list");
-                      	    
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUxBindingableOptionRule());
+                      					}
+                      					setWithLastConsumed(current, "final", true, "final");
+                      				
                     }
 
                     }
@@ -2754,35 +2804,72 @@
 
             }
 
-            otherlv_2=(Token)match(input,35,FOLLOW_35_in_ruleUxBindingableOption2045); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
+            // InternalUISemanticsGrammar.g:1004:3: ( (lv_listbinding_1_0= 'list' ) )?
+            int alt23=2;
+            int LA23_0 = input.LA(1);
 
-                  	newLeafNode(otherlv_2, grammarAccess.getUxBindingableOptionAccess().getEndpointKeyword_2());
-                  
+            if ( (LA23_0==35) ) {
+                alt23=1;
             }
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:972:1: ( (lv_name_3_0= RULE_ID ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:973:1: (lv_name_3_0= RULE_ID )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:973:1: (lv_name_3_0= RULE_ID )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:974:3: lv_name_3_0= RULE_ID
-            {
-            lv_name_3_0=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleUxBindingableOption2062); if (state.failed) return current;
+            switch (alt23) {
+                case 1 :
+                    // InternalUISemanticsGrammar.g:1005:4: (lv_listbinding_1_0= 'list' )
+                    {
+                    // InternalUISemanticsGrammar.g:1005:4: (lv_listbinding_1_0= 'list' )
+                    // InternalUISemanticsGrammar.g:1006:5: lv_listbinding_1_0= 'list'
+                    {
+                    lv_listbinding_1_0=(Token)match(input,35,FOLLOW_30); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_listbinding_1_0, grammarAccess.getUxBindingableOptionAccess().getListbindingListKeyword_1_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getUxBindingableOptionRule());
+                      					}
+                      					setWithLastConsumed(current, "listbinding", true, "list");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_2=(Token)match(input,36,FOLLOW_16); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              			newLeafNode(lv_name_3_0, grammarAccess.getUxBindingableOptionAccess().getNameIDTerminalRuleCall_3_0()); 
+              			newLeafNode(otherlv_2, grammarAccess.getUxBindingableOptionAccess().getEndpointKeyword_2());
               		
             }
+            // InternalUISemanticsGrammar.g:1022:3: ( (lv_name_3_0= RULE_ID ) )
+            // InternalUISemanticsGrammar.g:1023:4: (lv_name_3_0= RULE_ID )
+            {
+            // InternalUISemanticsGrammar.g:1023:4: (lv_name_3_0= RULE_ID )
+            // InternalUISemanticsGrammar.g:1024:5: lv_name_3_0= RULE_ID
+            {
+            lv_name_3_0=(Token)match(input,RULE_ID,FOLLOW_31); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElement(grammarAccess.getUxBindingableOptionRule());
-              	        }
-                     		setWithLastConsumed(
-                     			current, 
-                     			"name",
-                      		lv_name_3_0, 
-                      		"ID");
-              	    
+              					newLeafNode(lv_name_3_0, grammarAccess.getUxBindingableOptionAccess().getNameIDTerminalRuleCall_3_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getUxBindingableOptionRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"name",
+              						lv_name_3_0,
+              						"org.eclipse.xtext.xbase.Xtype.ID");
+              				
             }
 
             }
@@ -2790,34 +2877,34 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:990:2: ( (lv_jvmType_4_0= ruleJvmTypeReference ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:991:1: (lv_jvmType_4_0= ruleJvmTypeReference )
+            // InternalUISemanticsGrammar.g:1040:3: ( (lv_jvmType_4_0= ruleJvmTypeReference ) )
+            // InternalUISemanticsGrammar.g:1041:4: (lv_jvmType_4_0= ruleJvmTypeReference )
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:991:1: (lv_jvmType_4_0= ruleJvmTypeReference )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:992:3: lv_jvmType_4_0= ruleJvmTypeReference
+            // InternalUISemanticsGrammar.g:1041:4: (lv_jvmType_4_0= ruleJvmTypeReference )
+            // InternalUISemanticsGrammar.g:1042:5: lv_jvmType_4_0= ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getUxBindingableOptionAccess().getJvmTypeJvmTypeReferenceParserRuleCall_4_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getUxBindingableOptionAccess().getJvmTypeJvmTypeReferenceParserRuleCall_4_0());
+              				
             }
-            pushFollow(FOLLOW_ruleJvmTypeReference_in_ruleUxBindingableOption2088);
+            pushFollow(FOLLOW_32);
             lv_jvmType_4_0=ruleJvmTypeReference();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getUxBindingableOptionRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"jvmType",
-                      		lv_jvmType_4_0, 
-                      		"JvmTypeReference");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getUxBindingableOptionRule());
+              					}
+              					set(
+              						current,
+              						"jvmType",
+              						lv_jvmType_4_0,
+              						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -2825,46 +2912,46 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1008:2: (otherlv_5= 'target' ( (lv_targetName_6_0= RULE_ID ) ) )?
-            int alt23=2;
-            int LA23_0 = input.LA(1);
+            // InternalUISemanticsGrammar.g:1059:3: (otherlv_5= 'target' ( (lv_targetName_6_0= RULE_ID ) ) )?
+            int alt24=2;
+            int LA24_0 = input.LA(1);
 
-            if ( (LA23_0==36) ) {
-                alt23=1;
+            if ( (LA24_0==37) ) {
+                alt24=1;
             }
-            switch (alt23) {
+            switch (alt24) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1008:4: otherlv_5= 'target' ( (lv_targetName_6_0= RULE_ID ) )
+                    // InternalUISemanticsGrammar.g:1060:4: otherlv_5= 'target' ( (lv_targetName_6_0= RULE_ID ) )
                     {
-                    otherlv_5=(Token)match(input,36,FOLLOW_36_in_ruleUxBindingableOption2101); if (state.failed) return current;
+                    otherlv_5=(Token)match(input,37,FOLLOW_16); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_5, grammarAccess.getUxBindingableOptionAccess().getTargetKeyword_5_0());
-                          
+                      				newLeafNode(otherlv_5, grammarAccess.getUxBindingableOptionAccess().getTargetKeyword_5_0());
+                      			
                     }
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1012:1: ( (lv_targetName_6_0= RULE_ID ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1013:1: (lv_targetName_6_0= RULE_ID )
+                    // InternalUISemanticsGrammar.g:1064:4: ( (lv_targetName_6_0= RULE_ID ) )
+                    // InternalUISemanticsGrammar.g:1065:5: (lv_targetName_6_0= RULE_ID )
                     {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1013:1: (lv_targetName_6_0= RULE_ID )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1014:3: lv_targetName_6_0= RULE_ID
+                    // InternalUISemanticsGrammar.g:1065:5: (lv_targetName_6_0= RULE_ID )
+                    // InternalUISemanticsGrammar.g:1066:6: lv_targetName_6_0= RULE_ID
                     {
-                    lv_targetName_6_0=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleUxBindingableOption2118); if (state.failed) return current;
+                    lv_targetName_6_0=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      			newLeafNode(lv_targetName_6_0, grammarAccess.getUxBindingableOptionAccess().getTargetNameIDTerminalRuleCall_5_1_0()); 
-                      		
+                      						newLeafNode(lv_targetName_6_0, grammarAccess.getUxBindingableOptionAccess().getTargetNameIDTerminalRuleCall_5_1_0());
+                      					
                     }
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElement(grammarAccess.getUxBindingableOptionRule());
-                      	        }
-                             		setWithLastConsumed(
-                             			current, 
-                             			"targetName",
-                              		lv_targetName_6_0, 
-                              		"ID");
-                      	    
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getUxBindingableOptionRule());
+                      						}
+                      						setWithLastConsumed(
+                      							current,
+                      							"targetName",
+                      							lv_targetName_6_0,
+                      							"org.eclipse.xtext.xbase.Xtype.ID");
+                      					
                     }
 
                     }
@@ -2885,14 +2972,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -2901,7 +2990,7 @@
 
 
     // $ANTLR start "entryRuleUxVisibleableOption"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1038:1: entryRuleUxVisibleableOption returns [EObject current=null] : iv_ruleUxVisibleableOption= ruleUxVisibleableOption EOF ;
+    // InternalUISemanticsGrammar.g:1087:1: entryRuleUxVisibleableOption returns [EObject current=null] : iv_ruleUxVisibleableOption= ruleUxVisibleableOption EOF ;
     public final EObject entryRuleUxVisibleableOption() throws RecognitionException {
         EObject current = null;
 
@@ -2909,13 +2998,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1039:2: (iv_ruleUxVisibleableOption= ruleUxVisibleableOption EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1040:2: iv_ruleUxVisibleableOption= ruleUxVisibleableOption EOF
+            // InternalUISemanticsGrammar.g:1087:60: (iv_ruleUxVisibleableOption= ruleUxVisibleableOption EOF )
+            // InternalUISemanticsGrammar.g:1088:2: iv_ruleUxVisibleableOption= ruleUxVisibleableOption EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUxVisibleableOptionRule()); 
             }
-            pushFollow(FOLLOW_ruleUxVisibleableOption_in_entryRuleUxVisibleableOption2161);
+            pushFollow(FOLLOW_1);
             iv_ruleUxVisibleableOption=ruleUxVisibleableOption();
 
             state._fsp--;
@@ -2923,16 +3012,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleUxVisibleableOption; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleUxVisibleableOption2171); 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;
@@ -2941,7 +3030,7 @@
 
 
     // $ANTLR start "ruleUxVisibleableOption"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1047:1: ruleUxVisibleableOption returns [EObject current=null] : (otherlv_0= 'endpoint' ( (lv_name_1_0= RULE_ID ) ) ( (lv_jvmType_2_0= ruleJvmTypeReference ) ) ) ;
+    // InternalUISemanticsGrammar.g:1094:1: ruleUxVisibleableOption returns [EObject current=null] : (otherlv_0= 'endpoint' ( (lv_name_1_0= RULE_ID ) ) ( (lv_jvmType_2_0= ruleJvmTypeReference ) ) ) ;
     public final EObject ruleUxVisibleableOption() throws RecognitionException {
         EObject current = null;
 
@@ -2950,44 +3039,45 @@
         EObject lv_jvmType_2_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1050:28: ( (otherlv_0= 'endpoint' ( (lv_name_1_0= RULE_ID ) ) ( (lv_jvmType_2_0= ruleJvmTypeReference ) ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1051:1: (otherlv_0= 'endpoint' ( (lv_name_1_0= RULE_ID ) ) ( (lv_jvmType_2_0= ruleJvmTypeReference ) ) )
+            // InternalUISemanticsGrammar.g:1100:2: ( (otherlv_0= 'endpoint' ( (lv_name_1_0= RULE_ID ) ) ( (lv_jvmType_2_0= ruleJvmTypeReference ) ) ) )
+            // InternalUISemanticsGrammar.g:1101:2: (otherlv_0= 'endpoint' ( (lv_name_1_0= RULE_ID ) ) ( (lv_jvmType_2_0= ruleJvmTypeReference ) ) )
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1051:1: (otherlv_0= 'endpoint' ( (lv_name_1_0= RULE_ID ) ) ( (lv_jvmType_2_0= ruleJvmTypeReference ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1051:3: otherlv_0= 'endpoint' ( (lv_name_1_0= RULE_ID ) ) ( (lv_jvmType_2_0= ruleJvmTypeReference ) )
+            // InternalUISemanticsGrammar.g:1101:2: (otherlv_0= 'endpoint' ( (lv_name_1_0= RULE_ID ) ) ( (lv_jvmType_2_0= ruleJvmTypeReference ) ) )
+            // InternalUISemanticsGrammar.g:1102:3: otherlv_0= 'endpoint' ( (lv_name_1_0= RULE_ID ) ) ( (lv_jvmType_2_0= ruleJvmTypeReference ) )
             {
-            otherlv_0=(Token)match(input,35,FOLLOW_35_in_ruleUxVisibleableOption2208); if (state.failed) return current;
+            otherlv_0=(Token)match(input,36,FOLLOW_16); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getUxVisibleableOptionAccess().getEndpointKeyword_0());
-                  
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1055:1: ( (lv_name_1_0= RULE_ID ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1056:1: (lv_name_1_0= RULE_ID )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1056:1: (lv_name_1_0= RULE_ID )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1057:3: lv_name_1_0= RULE_ID
-            {
-            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleUxVisibleableOption2225); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-              			newLeafNode(lv_name_1_0, grammarAccess.getUxVisibleableOptionAccess().getNameIDTerminalRuleCall_1_0()); 
+              			newLeafNode(otherlv_0, grammarAccess.getUxVisibleableOptionAccess().getEndpointKeyword_0());
               		
             }
+            // InternalUISemanticsGrammar.g:1106:3: ( (lv_name_1_0= RULE_ID ) )
+            // InternalUISemanticsGrammar.g:1107:4: (lv_name_1_0= RULE_ID )
+            {
+            // InternalUISemanticsGrammar.g:1107:4: (lv_name_1_0= RULE_ID )
+            // InternalUISemanticsGrammar.g:1108:5: lv_name_1_0= RULE_ID
+            {
+            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_31); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElement(grammarAccess.getUxVisibleableOptionRule());
-              	        }
-                     		setWithLastConsumed(
-                     			current, 
-                     			"name",
-                      		lv_name_1_0, 
-                      		"ID");
-              	    
+              					newLeafNode(lv_name_1_0, grammarAccess.getUxVisibleableOptionAccess().getNameIDTerminalRuleCall_1_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getUxVisibleableOptionRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"name",
+              						lv_name_1_0,
+              						"org.eclipse.xtext.xbase.Xtype.ID");
+              				
             }
 
             }
@@ -2995,34 +3085,34 @@
 
             }
 
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1073:2: ( (lv_jvmType_2_0= ruleJvmTypeReference ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1074:1: (lv_jvmType_2_0= ruleJvmTypeReference )
+            // InternalUISemanticsGrammar.g:1124:3: ( (lv_jvmType_2_0= ruleJvmTypeReference ) )
+            // InternalUISemanticsGrammar.g:1125:4: (lv_jvmType_2_0= ruleJvmTypeReference )
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1074:1: (lv_jvmType_2_0= ruleJvmTypeReference )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1075:3: lv_jvmType_2_0= ruleJvmTypeReference
+            // InternalUISemanticsGrammar.g:1125:4: (lv_jvmType_2_0= ruleJvmTypeReference )
+            // InternalUISemanticsGrammar.g:1126:5: lv_jvmType_2_0= ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getUxVisibleableOptionAccess().getJvmTypeJvmTypeReferenceParserRuleCall_2_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getUxVisibleableOptionAccess().getJvmTypeJvmTypeReferenceParserRuleCall_2_0());
+              				
             }
-            pushFollow(FOLLOW_ruleJvmTypeReference_in_ruleUxVisibleableOption2251);
+            pushFollow(FOLLOW_2);
             lv_jvmType_2_0=ruleJvmTypeReference();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getUxVisibleableOptionRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"jvmType",
-                      		lv_jvmType_2_0, 
-                      		"JvmTypeReference");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getUxVisibleableOptionRule());
+              					}
+              					set(
+              						current,
+              						"jvmType",
+              						lv_jvmType_2_0,
+              						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -3037,14 +3127,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -3053,7 +3145,7 @@
 
 
     // $ANTLR start "entryRuleXExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1099:1: entryRuleXExpression returns [EObject current=null] : iv_ruleXExpression= ruleXExpression EOF ;
+    // InternalUISemanticsGrammar.g:1147:1: entryRuleXExpression returns [EObject current=null] : iv_ruleXExpression= ruleXExpression EOF ;
     public final EObject entryRuleXExpression() throws RecognitionException {
         EObject current = null;
 
@@ -3061,13 +3153,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1100:2: (iv_ruleXExpression= ruleXExpression EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1101:2: iv_ruleXExpression= ruleXExpression EOF
+            // InternalUISemanticsGrammar.g:1147:52: (iv_ruleXExpression= ruleXExpression EOF )
+            // InternalUISemanticsGrammar.g:1148:2: iv_ruleXExpression= ruleXExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXExpressionRule()); 
             }
-            pushFollow(FOLLOW_ruleXExpression_in_entryRuleXExpression2287);
+            pushFollow(FOLLOW_1);
             iv_ruleXExpression=ruleXExpression();
 
             state._fsp--;
@@ -3075,16 +3167,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleXExpression; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXExpression2297); 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;
@@ -3093,47 +3185,50 @@
 
 
     // $ANTLR start "ruleXExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1108:1: ruleXExpression returns [EObject current=null] : this_XAssignment_0= ruleXAssignment ;
+    // InternalUISemanticsGrammar.g:1154: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(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1111:28: (this_XAssignment_0= ruleXAssignment )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1113:5: this_XAssignment_0= ruleXAssignment
+            // InternalUISemanticsGrammar.g:1160:2: (this_XAssignment_0= ruleXAssignment )
+            // InternalUISemanticsGrammar.g:1161:2: this_XAssignment_0= ruleXAssignment
             {
             if ( state.backtracking==0 ) {
-               
-                      newCompositeNode(grammarAccess.getXExpressionAccess().getXAssignmentParserRuleCall()); 
-                  
+
+              		newCompositeNode(grammarAccess.getXExpressionAccess().getXAssignmentParserRuleCall());
+              	
             }
-            pushFollow(FOLLOW_ruleXAssignment_in_ruleXExpression2343);
+            pushFollow(FOLLOW_2);
             this_XAssignment_0=ruleXAssignment();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
-               
-                      current = this_XAssignment_0; 
-                      afterParserOrEnumRuleCall();
-                  
+
+              		current = this_XAssignment_0;
+              		afterParserOrEnumRuleCall();
+              	
             }
 
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -3142,7 +3237,7 @@
 
 
     // $ANTLR start "entryRuleXAssignment"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1129:1: entryRuleXAssignment returns [EObject current=null] : iv_ruleXAssignment= ruleXAssignment EOF ;
+    // InternalUISemanticsGrammar.g:1172:1: entryRuleXAssignment returns [EObject current=null] : iv_ruleXAssignment= ruleXAssignment EOF ;
     public final EObject entryRuleXAssignment() throws RecognitionException {
         EObject current = null;
 
@@ -3150,13 +3245,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1130:2: (iv_ruleXAssignment= ruleXAssignment EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1131:2: iv_ruleXAssignment= ruleXAssignment EOF
+            // InternalUISemanticsGrammar.g:1172:52: (iv_ruleXAssignment= ruleXAssignment EOF )
+            // InternalUISemanticsGrammar.g:1173:2: iv_ruleXAssignment= ruleXAssignment EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXAssignmentRule()); 
             }
-            pushFollow(FOLLOW_ruleXAssignment_in_entryRuleXAssignment2377);
+            pushFollow(FOLLOW_1);
             iv_ruleXAssignment=ruleXAssignment();
 
             state._fsp--;
@@ -3164,16 +3259,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleXAssignment; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXAssignment2387); 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;
@@ -3182,7 +3277,7 @@
 
 
     // $ANTLR start "ruleXAssignment"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1138:1: ruleXAssignment returns [EObject current=null] : ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) ) ;
+    // InternalUISemanticsGrammar.g:1179: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;
 
@@ -3193,48 +3288,49 @@
         EObject lv_rightOperand_7_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1141:28: ( ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1142:1: ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) )
+            // InternalUISemanticsGrammar.g:1185:2: ( ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) ) )
+            // InternalUISemanticsGrammar.g:1186:2: ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) )
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1142:1: ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) )
-            int alt25=2;
+            // InternalUISemanticsGrammar.g:1186:2: ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) )
+            int alt26=2;
             switch ( input.LA(1) ) {
             case RULE_ID:
                 {
-                int LA25_1 = input.LA(2);
+                int LA26_1 = input.LA(2);
 
-                if ( (LA25_1==EOF||(LA25_1>=RULE_STRING && LA25_1<=RULE_DECIMAL)||(LA25_1>=14 && LA25_1<=15)||(LA25_1>=19 && LA25_1<=22)||(LA25_1>=24 && LA25_1<=25)||LA25_1==32||(LA25_1>=38 && LA25_1<=75)||(LA25_1>=77 && LA25_1<=99)) ) {
-                    alt25=2;
+                if ( (LA26_1==EOF||(LA26_1>=RULE_STRING && LA26_1<=RULE_DECIMAL)||(LA26_1>=14 && LA26_1<=15)||(LA26_1>=19 && LA26_1<=22)||(LA26_1>=24 && LA26_1<=25)||(LA26_1>=32 && LA26_1<=33)||(LA26_1>=39 && LA26_1<=76)||(LA26_1>=78 && LA26_1<=99)) ) {
+                    alt26=2;
                 }
-                else if ( (LA25_1==37) ) {
-                    alt25=1;
+                else if ( (LA26_1==38) ) {
+                    alt26=1;
                 }
                 else {
                     if (state.backtracking>0) {state.failed=true; return current;}
                     NoViableAltException nvae =
-                        new NoViableAltException("", 25, 1, input);
+                        new NoViableAltException("", 26, 1, input);
 
                     throw nvae;
                 }
                 }
                 break;
-            case 87:
+            case 33:
                 {
-                int LA25_2 = input.LA(2);
+                int LA26_2 = input.LA(2);
 
-                if ( (LA25_2==EOF||(LA25_2>=RULE_STRING && LA25_2<=RULE_DECIMAL)||(LA25_2>=14 && LA25_2<=15)||(LA25_2>=19 && LA25_2<=22)||(LA25_2>=24 && LA25_2<=25)||LA25_2==32||(LA25_2>=38 && LA25_2<=75)||(LA25_2>=77 && LA25_2<=99)) ) {
-                    alt25=2;
+                if ( (LA26_2==EOF||(LA26_2>=RULE_STRING && LA26_2<=RULE_DECIMAL)||(LA26_2>=14 && LA26_2<=15)||(LA26_2>=19 && LA26_2<=22)||(LA26_2>=24 && LA26_2<=25)||(LA26_2>=32 && LA26_2<=33)||(LA26_2>=39 && LA26_2<=76)||(LA26_2>=78 && LA26_2<=99)) ) {
+                    alt26=2;
                 }
-                else if ( (LA25_2==37) ) {
-                    alt25=1;
+                else if ( (LA26_2==38) ) {
+                    alt26=1;
                 }
                 else {
                     if (state.backtracking>0) {state.failed=true; return current;}
                     NoViableAltException nvae =
-                        new NoViableAltException("", 25, 2, input);
+                        new NoViableAltException("", 26, 2, input);
 
                     throw nvae;
                 }
@@ -3242,18 +3338,18 @@
                 break;
             case 20:
                 {
-                int LA25_3 = input.LA(2);
+                int LA26_3 = input.LA(2);
 
-                if ( (LA25_3==37) ) {
-                    alt25=1;
+                if ( (LA26_3==EOF||(LA26_3>=RULE_STRING && LA26_3<=RULE_DECIMAL)||(LA26_3>=14 && LA26_3<=15)||(LA26_3>=19 && LA26_3<=22)||(LA26_3>=24 && LA26_3<=25)||(LA26_3>=32 && LA26_3<=33)||(LA26_3>=39 && LA26_3<=76)||(LA26_3>=78 && LA26_3<=99)) ) {
+                    alt26=2;
                 }
-                else if ( (LA25_3==EOF||(LA25_3>=RULE_STRING && LA25_3<=RULE_DECIMAL)||(LA25_3>=14 && LA25_3<=15)||(LA25_3>=19 && LA25_3<=22)||(LA25_3>=24 && LA25_3<=25)||LA25_3==32||(LA25_3>=38 && LA25_3<=75)||(LA25_3>=77 && LA25_3<=99)) ) {
-                    alt25=2;
+                else if ( (LA26_3==38) ) {
+                    alt26=1;
                 }
                 else {
                     if (state.backtracking>0) {state.failed=true; return current;}
                     NoViableAltException nvae =
-                        new NoViableAltException("", 25, 3, input);
+                        new NoViableAltException("", 26, 3, input);
 
                     throw nvae;
                 }
@@ -3261,18 +3357,18 @@
                 break;
             case 19:
                 {
-                int LA25_4 = input.LA(2);
+                int LA26_4 = input.LA(2);
 
-                if ( (LA25_4==37) ) {
-                    alt25=1;
+                if ( (LA26_4==38) ) {
+                    alt26=1;
                 }
-                else if ( (LA25_4==EOF||(LA25_4>=RULE_STRING && LA25_4<=RULE_DECIMAL)||(LA25_4>=14 && LA25_4<=15)||(LA25_4>=19 && LA25_4<=22)||(LA25_4>=24 && LA25_4<=25)||LA25_4==32||(LA25_4>=38 && LA25_4<=75)||(LA25_4>=77 && LA25_4<=99)) ) {
-                    alt25=2;
+                else if ( (LA26_4==EOF||(LA26_4>=RULE_STRING && LA26_4<=RULE_DECIMAL)||(LA26_4>=14 && LA26_4<=15)||(LA26_4>=19 && LA26_4<=22)||(LA26_4>=24 && LA26_4<=25)||(LA26_4>=32 && LA26_4<=33)||(LA26_4>=39 && LA26_4<=76)||(LA26_4>=78 && LA26_4<=99)) ) {
+                    alt26=2;
                 }
                 else {
                     if (state.backtracking>0) {state.failed=true; return current;}
                     NoViableAltException nvae =
-                        new NoViableAltException("", 25, 4, input);
+                        new NoViableAltException("", 26, 4, input);
 
                     throw nvae;
                 }
@@ -3280,18 +3376,18 @@
                 break;
             case 21:
                 {
-                int LA25_5 = input.LA(2);
+                int LA26_5 = input.LA(2);
 
-                if ( (LA25_5==37) ) {
-                    alt25=1;
+                if ( (LA26_5==38) ) {
+                    alt26=1;
                 }
-                else if ( (LA25_5==EOF||(LA25_5>=RULE_STRING && LA25_5<=RULE_DECIMAL)||(LA25_5>=14 && LA25_5<=15)||(LA25_5>=19 && LA25_5<=22)||(LA25_5>=24 && LA25_5<=25)||LA25_5==32||(LA25_5>=38 && LA25_5<=75)||(LA25_5>=77 && LA25_5<=99)) ) {
-                    alt25=2;
+                else if ( (LA26_5==EOF||(LA26_5>=RULE_STRING && LA26_5<=RULE_DECIMAL)||(LA26_5>=14 && LA26_5<=15)||(LA26_5>=19 && LA26_5<=22)||(LA26_5>=24 && LA26_5<=25)||(LA26_5>=32 && LA26_5<=33)||(LA26_5>=39 && LA26_5<=76)||(LA26_5>=78 && LA26_5<=99)) ) {
+                    alt26=2;
                 }
                 else {
                     if (state.backtracking>0) {state.failed=true; return current;}
                     NoViableAltException nvae =
-                        new NoViableAltException("", 25, 5, input);
+                        new NoViableAltException("", 26, 5, input);
 
                     throw nvae;
                 }
@@ -3302,18 +3398,18 @@
             case RULE_INT:
             case RULE_DECIMAL:
             case 14:
-            case 43:
-            case 59:
+            case 44:
             case 60:
-            case 64:
-            case 71:
-            case 73:
+            case 61:
+            case 65:
+            case 72:
             case 74:
-            case 77:
-            case 79:
-            case 82:
+            case 75:
+            case 78:
+            case 80:
             case 83:
             case 84:
+            case 85:
             case 88:
             case 89:
             case 90:
@@ -3325,64 +3421,64 @@
             case 96:
             case 98:
                 {
-                alt25=2;
+                alt26=2;
                 }
                 break;
             default:
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 25, 0, input);
+                    new NoViableAltException("", 26, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt25) {
+            switch (alt26) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1142:2: ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) )
+                    // InternalUISemanticsGrammar.g:1187:3: ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) )
                     {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1142:2: ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1142:3: () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) )
+                    // InternalUISemanticsGrammar.g:1187:3: ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) )
+                    // InternalUISemanticsGrammar.g:1188:4: () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) )
                     {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1142:3: ()
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1143:5: 
+                    // InternalUISemanticsGrammar.g:1188:4: ()
+                    // InternalUISemanticsGrammar.g:1189:5: 
                     {
                     if ( state.backtracking==0 ) {
 
-                              current = forceCreateModelElement(
-                                  grammarAccess.getXAssignmentAccess().getXAssignmentAction_0_0(),
-                                  current);
-                          
+                      					current = forceCreateModelElement(
+                      						grammarAccess.getXAssignmentAccess().getXAssignmentAction_0_0(),
+                      						current);
+                      				
                     }
 
                     }
 
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1148:2: ( ( ruleFeatureCallID ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1149:1: ( ruleFeatureCallID )
+                    // InternalUISemanticsGrammar.g:1195:4: ( ( ruleFeatureCallID ) )
+                    // InternalUISemanticsGrammar.g:1196:5: ( ruleFeatureCallID )
                     {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1149:1: ( ruleFeatureCallID )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1150:3: ruleFeatureCallID
+                    // InternalUISemanticsGrammar.g:1196:5: ( ruleFeatureCallID )
+                    // InternalUISemanticsGrammar.g:1197:6: ruleFeatureCallID
                     {
                     if ( state.backtracking==0 ) {
 
-                      			if (current==null) {
-                      	            current = createModelElement(grammarAccess.getXAssignmentRule());
-                      	        }
-                              
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getXAssignmentRule());
+                      						}
+                      					
                     }
                     if ( state.backtracking==0 ) {
-                       
-                      	        newCompositeNode(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementCrossReference_0_1_0()); 
-                      	    
+
+                      						newCompositeNode(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementCrossReference_0_1_0());
+                      					
                     }
-                    pushFollow(FOLLOW_ruleFeatureCallID_in_ruleXAssignment2445);
+                    pushFollow(FOLLOW_33);
                     ruleFeatureCallID();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                      	        afterParserOrEnumRuleCall();
-                      	    
+
+                      						afterParserOrEnumRuleCall();
+                      					
                     }
 
                     }
@@ -3391,48 +3487,48 @@
                     }
 
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getXAssignmentAccess().getOpSingleAssignParserRuleCall_0_2()); 
-                          
+
+                      				newCompositeNode(grammarAccess.getXAssignmentAccess().getOpSingleAssignParserRuleCall_0_2());
+                      			
                     }
-                    pushFollow(FOLLOW_ruleOpSingleAssign_in_ruleXAssignment2461);
+                    pushFollow(FOLLOW_34);
                     ruleOpSingleAssign();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              afterParserOrEnumRuleCall();
-                          
+
+                      				afterParserOrEnumRuleCall();
+                      			
                     }
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1171:1: ( (lv_value_3_0= ruleXAssignment ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1172:1: (lv_value_3_0= ruleXAssignment )
+                    // InternalUISemanticsGrammar.g:1218:4: ( (lv_value_3_0= ruleXAssignment ) )
+                    // InternalUISemanticsGrammar.g:1219:5: (lv_value_3_0= ruleXAssignment )
                     {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1172:1: (lv_value_3_0= ruleXAssignment )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1173:3: lv_value_3_0= ruleXAssignment
+                    // InternalUISemanticsGrammar.g:1219:5: (lv_value_3_0= ruleXAssignment )
+                    // InternalUISemanticsGrammar.g:1220:6: lv_value_3_0= ruleXAssignment
                     {
                     if ( state.backtracking==0 ) {
-                       
-                      	        newCompositeNode(grammarAccess.getXAssignmentAccess().getValueXAssignmentParserRuleCall_0_3_0()); 
-                      	    
+
+                      						newCompositeNode(grammarAccess.getXAssignmentAccess().getValueXAssignmentParserRuleCall_0_3_0());
+                      					
                     }
-                    pushFollow(FOLLOW_ruleXAssignment_in_ruleXAssignment2481);
+                    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, 
-                              		"XAssignment");
-                      	        afterParserOrEnumRuleCall();
-                      	    
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getXAssignmentRule());
+                      						}
+                      						set(
+                      							current,
+                      							"value",
+                      							lv_value_3_0,
+                      							"org.eclipse.xtext.xbase.Xbase.XAssignment");
+                      						afterParserOrEnumRuleCall();
+                      					
                     }
 
                     }
@@ -3447,80 +3543,80 @@
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1190:6: (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? )
+                    // InternalUISemanticsGrammar.g:1239:3: (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? )
                     {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1190:6: (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1191:5: this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )?
+                    // InternalUISemanticsGrammar.g:1239:3: (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? )
+                    // InternalUISemanticsGrammar.g:1240:4: this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )?
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getXAssignmentAccess().getXOrExpressionParserRuleCall_1_0()); 
-                          
+
+                      				newCompositeNode(grammarAccess.getXAssignmentAccess().getXOrExpressionParserRuleCall_1_0());
+                      			
                     }
-                    pushFollow(FOLLOW_ruleXOrExpression_in_ruleXAssignment2511);
+                    pushFollow(FOLLOW_35);
                     this_XOrExpression_4=ruleXOrExpression();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_XOrExpression_4; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      				current = this_XOrExpression_4;
+                      				afterParserOrEnumRuleCall();
+                      			
                     }
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1199:1: ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )?
-                    int alt24=2;
-                    alt24 = dfa24.predict(input);
-                    switch (alt24) {
+                    // InternalUISemanticsGrammar.g:1248:4: ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )?
+                    int alt25=2;
+                    alt25 = dfa25.predict(input);
+                    switch (alt25) {
                         case 1 :
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1199:2: ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) )
+                            // InternalUISemanticsGrammar.g:1249:5: ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) )
                             {
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1199:2: ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) )
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1199:3: ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) )
+                            // InternalUISemanticsGrammar.g:1249:5: ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) )
+                            // InternalUISemanticsGrammar.g:1250:6: ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) )
                             {
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1204:6: ( () ( ( ruleOpMultiAssign ) ) )
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1204:7: () ( ( ruleOpMultiAssign ) )
+                            // InternalUISemanticsGrammar.g:1260:6: ( () ( ( ruleOpMultiAssign ) ) )
+                            // InternalUISemanticsGrammar.g:1261:7: () ( ( ruleOpMultiAssign ) )
                             {
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1204:7: ()
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1205:5: 
+                            // InternalUISemanticsGrammar.g:1261:7: ()
+                            // InternalUISemanticsGrammar.g:1262:8: 
                             {
                             if ( state.backtracking==0 ) {
 
-                                      current = forceCreateModelElementAndSet(
-                                          grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0(),
-                                          current);
-                                  
+                              								current = forceCreateModelElementAndSet(
+                              									grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0(),
+                              									current);
+                              							
                             }
 
                             }
 
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1210:2: ( ( ruleOpMultiAssign ) )
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1211:1: ( ruleOpMultiAssign )
+                            // InternalUISemanticsGrammar.g:1268:7: ( ( ruleOpMultiAssign ) )
+                            // InternalUISemanticsGrammar.g:1269:8: ( ruleOpMultiAssign )
                             {
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1211:1: ( ruleOpMultiAssign )
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1212:3: ruleOpMultiAssign
+                            // InternalUISemanticsGrammar.g:1269:8: ( ruleOpMultiAssign )
+                            // InternalUISemanticsGrammar.g:1270:9: ruleOpMultiAssign
                             {
                             if ( state.backtracking==0 ) {
 
-                              			if (current==null) {
-                              	            current = createModelElement(grammarAccess.getXAssignmentRule());
-                              	        }
-                                      
+                              									if (current==null) {
+                              										current = createModelElement(grammarAccess.getXAssignmentRule());
+                              									}
+                              								
                             }
                             if ( state.backtracking==0 ) {
-                               
-                              	        newCompositeNode(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_0_0_1_0()); 
-                              	    
+
+                              									newCompositeNode(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_0_0_1_0());
+                              								
                             }
-                            pushFollow(FOLLOW_ruleOpMultiAssign_in_ruleXAssignment2564);
+                            pushFollow(FOLLOW_34);
                             ruleOpMultiAssign();
 
                             state._fsp--;
                             if (state.failed) return current;
                             if ( state.backtracking==0 ) {
-                               
-                              	        afterParserOrEnumRuleCall();
-                              	    
+
+                              									afterParserOrEnumRuleCall();
+                              								
                             }
 
                             }
@@ -3534,34 +3630,34 @@
 
                             }
 
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1225:4: ( (lv_rightOperand_7_0= ruleXAssignment ) )
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1226:1: (lv_rightOperand_7_0= ruleXAssignment )
+                            // InternalUISemanticsGrammar.g:1286:5: ( (lv_rightOperand_7_0= ruleXAssignment ) )
+                            // InternalUISemanticsGrammar.g:1287:6: (lv_rightOperand_7_0= ruleXAssignment )
                             {
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1226:1: (lv_rightOperand_7_0= ruleXAssignment )
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1227:3: lv_rightOperand_7_0= ruleXAssignment
+                            // InternalUISemanticsGrammar.g:1287:6: (lv_rightOperand_7_0= ruleXAssignment )
+                            // InternalUISemanticsGrammar.g:1288:7: lv_rightOperand_7_0= ruleXAssignment
                             {
                             if ( state.backtracking==0 ) {
-                               
-                              	        newCompositeNode(grammarAccess.getXAssignmentAccess().getRightOperandXAssignmentParserRuleCall_1_1_1_0()); 
-                              	    
+
+                              							newCompositeNode(grammarAccess.getXAssignmentAccess().getRightOperandXAssignmentParserRuleCall_1_1_1_0());
+                              						
                             }
-                            pushFollow(FOLLOW_ruleXAssignment_in_ruleXAssignment2587);
+                            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, 
-                                      		"XAssignment");
-                              	        afterParserOrEnumRuleCall();
-                              	    
+                              							if (current==null) {
+                              								current = createModelElementForParent(grammarAccess.getXAssignmentRule());
+                              							}
+                              							set(
+                              								current,
+                              								"rightOperand",
+                              								lv_rightOperand_7_0,
+                              								"org.eclipse.xtext.xbase.Xbase.XAssignment");
+                              							afterParserOrEnumRuleCall();
+                              						
                             }
 
                             }
@@ -3588,14 +3684,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -3604,7 +3702,7 @@
 
 
     // $ANTLR start "entryRuleOpSingleAssign"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1251:1: entryRuleOpSingleAssign returns [String current=null] : iv_ruleOpSingleAssign= ruleOpSingleAssign EOF ;
+    // InternalUISemanticsGrammar.g:1311:1: entryRuleOpSingleAssign returns [String current=null] : iv_ruleOpSingleAssign= ruleOpSingleAssign EOF ;
     public final String entryRuleOpSingleAssign() throws RecognitionException {
         String current = null;
 
@@ -3612,13 +3710,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1252:2: (iv_ruleOpSingleAssign= ruleOpSingleAssign EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1253:2: iv_ruleOpSingleAssign= ruleOpSingleAssign EOF
+            // InternalUISemanticsGrammar.g:1311:54: (iv_ruleOpSingleAssign= ruleOpSingleAssign EOF )
+            // InternalUISemanticsGrammar.g:1312:2: iv_ruleOpSingleAssign= ruleOpSingleAssign EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getOpSingleAssignRule()); 
             }
-            pushFollow(FOLLOW_ruleOpSingleAssign_in_entryRuleOpSingleAssign2627);
+            pushFollow(FOLLOW_1);
             iv_ruleOpSingleAssign=ruleOpSingleAssign();
 
             state._fsp--;
@@ -3626,16 +3724,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleOpSingleAssign.getText(); 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleOpSingleAssign2638); 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;
@@ -3644,37 +3742,40 @@
 
 
     // $ANTLR start "ruleOpSingleAssign"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1260:1: ruleOpSingleAssign returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : kw= '=' ;
+    // InternalUISemanticsGrammar.g:1318:1: ruleOpSingleAssign returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : kw= '=' ;
     public final AntlrDatatypeRuleToken ruleOpSingleAssign() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
         Token kw=null;
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1263:28: (kw= '=' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1265:2: kw= '='
+            // InternalUISemanticsGrammar.g:1324:2: (kw= '=' )
+            // InternalUISemanticsGrammar.g:1325:2: kw= '='
             {
-            kw=(Token)match(input,37,FOLLOW_37_in_ruleOpSingleAssign2675); if (state.failed) return current;
+            kw=(Token)match(input,38,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                      current.merge(kw);
-                      newLeafNode(kw, grammarAccess.getOpSingleAssignAccess().getEqualsSignKeyword()); 
-                  
+              		current.merge(kw);
+              		newLeafNode(kw, grammarAccess.getOpSingleAssignAccess().getEqualsSignKeyword());
+              	
             }
 
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -3683,7 +3784,7 @@
 
 
     // $ANTLR start "entryRuleOpMultiAssign"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1278:1: entryRuleOpMultiAssign returns [String current=null] : iv_ruleOpMultiAssign= ruleOpMultiAssign EOF ;
+    // InternalUISemanticsGrammar.g:1333:1: entryRuleOpMultiAssign returns [String current=null] : iv_ruleOpMultiAssign= ruleOpMultiAssign EOF ;
     public final String entryRuleOpMultiAssign() throws RecognitionException {
         String current = null;
 
@@ -3691,13 +3792,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1279:2: (iv_ruleOpMultiAssign= ruleOpMultiAssign EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1280:2: iv_ruleOpMultiAssign= ruleOpMultiAssign EOF
+            // InternalUISemanticsGrammar.g:1333:53: (iv_ruleOpMultiAssign= ruleOpMultiAssign EOF )
+            // InternalUISemanticsGrammar.g:1334:2: iv_ruleOpMultiAssign= ruleOpMultiAssign EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getOpMultiAssignRule()); 
             }
-            pushFollow(FOLLOW_ruleOpMultiAssign_in_entryRuleOpMultiAssign2715);
+            pushFollow(FOLLOW_1);
             iv_ruleOpMultiAssign=ruleOpMultiAssign();
 
             state._fsp--;
@@ -3705,16 +3806,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleOpMultiAssign.getText(); 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleOpMultiAssign2726); 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;
@@ -3723,156 +3824,157 @@
 
 
     // $ANTLR start "ruleOpMultiAssign"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1287:1: ruleOpMultiAssign returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) ) ;
+    // InternalUISemanticsGrammar.g:1340: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(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1290:28: ( (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1291:1: (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) )
+            // InternalUISemanticsGrammar.g:1346:2: ( (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) ) )
+            // InternalUISemanticsGrammar.g:1347:2: (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) )
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1291:1: (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) )
-            int alt27=7;
+            // InternalUISemanticsGrammar.g:1347:2: (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) )
+            int alt28=7;
             switch ( input.LA(1) ) {
-            case 38:
-                {
-                alt27=1;
-                }
-                break;
             case 39:
                 {
-                alt27=2;
+                alt28=1;
                 }
                 break;
             case 40:
                 {
-                alt27=3;
+                alt28=2;
                 }
                 break;
             case 41:
                 {
-                alt27=4;
+                alt28=3;
                 }
                 break;
             case 42:
                 {
-                alt27=5;
+                alt28=4;
                 }
                 break;
             case 43:
                 {
-                alt27=6;
+                alt28=5;
                 }
                 break;
             case 44:
                 {
-                alt27=7;
+                alt28=6;
+                }
+                break;
+            case 45:
+                {
+                alt28=7;
                 }
                 break;
             default:
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 27, 0, input);
+                    new NoViableAltException("", 28, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt27) {
+            switch (alt28) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1292:2: kw= '+='
+                    // InternalUISemanticsGrammar.g:1348:3: kw= '+='
                     {
-                    kw=(Token)match(input,38,FOLLOW_38_in_ruleOpMultiAssign2764); if (state.failed) return current;
+                    kw=(Token)match(input,39,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0()); 
-                          
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0());
+                      		
                     }
 
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1299:2: kw= '-='
+                    // InternalUISemanticsGrammar.g:1354:3: kw= '-='
                     {
-                    kw=(Token)match(input,39,FOLLOW_39_in_ruleOpMultiAssign2783); if (state.failed) return current;
+                    kw=(Token)match(input,40,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getHyphenMinusEqualsSignKeyword_1()); 
-                          
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getHyphenMinusEqualsSignKeyword_1());
+                      		
                     }
 
                     }
                     break;
                 case 3 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1306:2: kw= '*='
+                    // InternalUISemanticsGrammar.g:1360:3: kw= '*='
                     {
-                    kw=(Token)match(input,40,FOLLOW_40_in_ruleOpMultiAssign2802); if (state.failed) return current;
+                    kw=(Token)match(input,41,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getAsteriskEqualsSignKeyword_2()); 
-                          
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getAsteriskEqualsSignKeyword_2());
+                      		
                     }
 
                     }
                     break;
                 case 4 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1313:2: kw= '/='
+                    // InternalUISemanticsGrammar.g:1366:3: kw= '/='
                     {
-                    kw=(Token)match(input,41,FOLLOW_41_in_ruleOpMultiAssign2821); if (state.failed) return current;
+                    kw=(Token)match(input,42,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getSolidusEqualsSignKeyword_3()); 
-                          
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getSolidusEqualsSignKeyword_3());
+                      		
                     }
 
                     }
                     break;
                 case 5 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1320:2: kw= '%='
+                    // InternalUISemanticsGrammar.g:1372:3: kw= '%='
                     {
-                    kw=(Token)match(input,42,FOLLOW_42_in_ruleOpMultiAssign2840); if (state.failed) return current;
+                    kw=(Token)match(input,43,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getPercentSignEqualsSignKeyword_4()); 
-                          
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getPercentSignEqualsSignKeyword_4());
+                      		
                     }
 
                     }
                     break;
                 case 6 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1326:6: (kw= '<' kw= '<' kw= '=' )
+                    // InternalUISemanticsGrammar.g:1378:3: (kw= '<' kw= '<' kw= '=' )
                     {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1326:6: (kw= '<' kw= '<' kw= '=' )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1327:2: kw= '<' kw= '<' kw= '='
+                    // InternalUISemanticsGrammar.g:1378:3: (kw= '<' kw= '<' kw= '=' )
+                    // InternalUISemanticsGrammar.g:1379:4: kw= '<' kw= '<' kw= '='
                     {
-                    kw=(Token)match(input,43,FOLLOW_43_in_ruleOpMultiAssign2860); if (state.failed) return current;
+                    kw=(Token)match(input,44,FOLLOW_36); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_0()); 
-                          
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_0());
+                      			
                     }
-                    kw=(Token)match(input,43,FOLLOW_43_in_ruleOpMultiAssign2873); if (state.failed) return current;
+                    kw=(Token)match(input,44,FOLLOW_33); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_1()); 
-                          
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_1());
+                      			
                     }
-                    kw=(Token)match(input,37,FOLLOW_37_in_ruleOpMultiAssign2886); if (state.failed) return current;
+                    kw=(Token)match(input,38,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getEqualsSignKeyword_5_2()); 
-                          
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getEqualsSignKeyword_5_2());
+                      			
                     }
 
                     }
@@ -3881,35 +3983,35 @@
                     }
                     break;
                 case 7 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1345:6: (kw= '>' (kw= '>' )? kw= '>=' )
+                    // InternalUISemanticsGrammar.g:1396:3: (kw= '>' (kw= '>' )? kw= '>=' )
                     {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1345:6: (kw= '>' (kw= '>' )? kw= '>=' )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1346:2: kw= '>' (kw= '>' )? kw= '>='
+                    // InternalUISemanticsGrammar.g:1396:3: (kw= '>' (kw= '>' )? kw= '>=' )
+                    // InternalUISemanticsGrammar.g:1397:4: kw= '>' (kw= '>' )? kw= '>='
                     {
-                    kw=(Token)match(input,44,FOLLOW_44_in_ruleOpMultiAssign2907); if (state.failed) return current;
+                    kw=(Token)match(input,45,FOLLOW_37); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_0()); 
-                          
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_0());
+                      			
                     }
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1351:1: (kw= '>' )?
-                    int alt26=2;
-                    int LA26_0 = input.LA(1);
+                    // InternalUISemanticsGrammar.g:1402:4: (kw= '>' )?
+                    int alt27=2;
+                    int LA27_0 = input.LA(1);
 
-                    if ( (LA26_0==44) ) {
-                        alt26=1;
+                    if ( (LA27_0==45) ) {
+                        alt27=1;
                     }
-                    switch (alt26) {
+                    switch (alt27) {
                         case 1 :
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1352:2: kw= '>'
+                            // InternalUISemanticsGrammar.g:1403:5: kw= '>'
                             {
-                            kw=(Token)match(input,44,FOLLOW_44_in_ruleOpMultiAssign2921); if (state.failed) return current;
+                            kw=(Token)match(input,45,FOLLOW_38); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
-                                      current.merge(kw);
-                                      newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_1()); 
-                                  
+                              					current.merge(kw);
+                              					newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_1());
+                              				
                             }
 
                             }
@@ -3917,12 +4019,12 @@
 
                     }
 
-                    kw=(Token)match(input,45,FOLLOW_45_in_ruleOpMultiAssign2936); if (state.failed) return current;
+                    kw=(Token)match(input,46,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignEqualsSignKeyword_6_2()); 
-                          
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignEqualsSignKeyword_6_2());
+                      			
                     }
 
                     }
@@ -3937,14 +4039,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -3953,7 +4057,7 @@
 
 
     // $ANTLR start "entryRuleXOrExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1371:1: entryRuleXOrExpression returns [EObject current=null] : iv_ruleXOrExpression= ruleXOrExpression EOF ;
+    // InternalUISemanticsGrammar.g:1419:1: entryRuleXOrExpression returns [EObject current=null] : iv_ruleXOrExpression= ruleXOrExpression EOF ;
     public final EObject entryRuleXOrExpression() throws RecognitionException {
         EObject current = null;
 
@@ -3961,13 +4065,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1372:2: (iv_ruleXOrExpression= ruleXOrExpression EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1373:2: iv_ruleXOrExpression= ruleXOrExpression EOF
+            // InternalUISemanticsGrammar.g:1419:54: (iv_ruleXOrExpression= ruleXOrExpression EOF )
+            // InternalUISemanticsGrammar.g:1420:2: iv_ruleXOrExpression= ruleXOrExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXOrExpressionRule()); 
             }
-            pushFollow(FOLLOW_ruleXOrExpression_in_entryRuleXOrExpression2977);
+            pushFollow(FOLLOW_1);
             iv_ruleXOrExpression=ruleXOrExpression();
 
             state._fsp--;
@@ -3975,16 +4079,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleXOrExpression; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXOrExpression2987); 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;
@@ -3993,7 +4097,7 @@
 
 
     // $ANTLR start "ruleXOrExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1380:1: ruleXOrExpression returns [EObject current=null] : (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* ) ;
+    // InternalUISemanticsGrammar.g:1426: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;
 
@@ -4002,332 +4106,33 @@
         EObject lv_rightOperand_3_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1383:28: ( (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1384:1: (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* )
+            // InternalUISemanticsGrammar.g:1432:2: ( (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* ) )
+            // InternalUISemanticsGrammar.g:1433:2: (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* )
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1384:1: (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1385:5: this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )*
+            // InternalUISemanticsGrammar.g:1433:2: (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* )
+            // InternalUISemanticsGrammar.g:1434:3: this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )*
             {
             if ( state.backtracking==0 ) {
-               
-                      newCompositeNode(grammarAccess.getXOrExpressionAccess().getXAndExpressionParserRuleCall_0()); 
-                  
+
+              			newCompositeNode(grammarAccess.getXOrExpressionAccess().getXAndExpressionParserRuleCall_0());
+              		
             }
-            pushFollow(FOLLOW_ruleXAndExpression_in_ruleXOrExpression3034);
+            pushFollow(FOLLOW_39);
             this_XAndExpression_0=ruleXAndExpression();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
-               
-                      current = this_XAndExpression_0; 
-                      afterParserOrEnumRuleCall();
-                  
+
+              			current = this_XAndExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
             }
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1393:1: ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )*
-            loop28:
-            do {
-                int alt28=2;
-                int LA28_0 = input.LA(1);
-
-                if ( (LA28_0==46) ) {
-                    int LA28_2 = input.LA(2);
-
-                    if ( (synpred2_InternalUISemanticsGrammar()) ) {
-                        alt28=1;
-                    }
-
-
-                }
-
-
-                switch (alt28) {
-            	case 1 :
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1393:2: ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) )
-            	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1393:2: ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1393:3: ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) )
-            	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1398:6: ( () ( ( ruleOpOr ) ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1398:7: () ( ( ruleOpOr ) )
-            	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1398:7: ()
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1399:5: 
-            	    {
-            	    if ( state.backtracking==0 ) {
-
-            	              current = forceCreateModelElementAndSet(
-            	                  grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
-            	                  current);
-            	          
-            	    }
-
-            	    }
-
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1404:2: ( ( ruleOpOr ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1405:1: ( ruleOpOr )
-            	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1405:1: ( ruleOpOr )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1406:3: 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_ruleOpOr_in_ruleXOrExpression3087);
-            	    ruleOpOr();
-
-            	    state._fsp--;
-            	    if (state.failed) return current;
-            	    if ( state.backtracking==0 ) {
-            	       
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
-            	    }
-
-            	    }
-
-
-            	    }
-
-
-            	    }
-
-
-            	    }
-
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1419:4: ( (lv_rightOperand_3_0= ruleXAndExpression ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1420:1: (lv_rightOperand_3_0= ruleXAndExpression )
-            	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1420:1: (lv_rightOperand_3_0= ruleXAndExpression )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1421:3: lv_rightOperand_3_0= ruleXAndExpression
-            	    {
-            	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getXOrExpressionAccess().getRightOperandXAndExpressionParserRuleCall_1_1_0()); 
-            	      	    
-            	    }
-            	    pushFollow(FOLLOW_ruleXAndExpression_in_ruleXOrExpression3110);
-            	    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, 
-            	              		"XAndExpression");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
-            	    }
-
-            	    }
-
-
-            	    }
-
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop28;
-                }
-            } while (true);
-
-
-            }
-
-
-            }
-
-            if ( state.backtracking==0 ) {
-               leaveRule(); 
-            }
-        }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
-                appendSkippedTokens();
-            } 
-        finally {
-        }
-        return current;
-    }
-    // $ANTLR end "ruleXOrExpression"
-
-
-    // $ANTLR start "entryRuleOpOr"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1445:1: entryRuleOpOr returns [String current=null] : iv_ruleOpOr= ruleOpOr EOF ;
-    public final String entryRuleOpOr() throws RecognitionException {
-        String current = null;
-
-        AntlrDatatypeRuleToken iv_ruleOpOr = null;
-
-
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1446:2: (iv_ruleOpOr= ruleOpOr EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1447:2: iv_ruleOpOr= ruleOpOr EOF
-            {
-            if ( state.backtracking==0 ) {
-               newCompositeNode(grammarAccess.getOpOrRule()); 
-            }
-            pushFollow(FOLLOW_ruleOpOr_in_entryRuleOpOr3149);
-            iv_ruleOpOr=ruleOpOr();
-
-            state._fsp--;
-            if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-               current =iv_ruleOpOr.getText(); 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleOpOr3160); if (state.failed) return current;
-
-            }
-
-        }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
-                appendSkippedTokens();
-            } 
-        finally {
-        }
-        return current;
-    }
-    // $ANTLR end "entryRuleOpOr"
-
-
-    // $ANTLR start "ruleOpOr"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1454:1: ruleOpOr returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : kw= '||' ;
-    public final AntlrDatatypeRuleToken ruleOpOr() throws RecognitionException {
-        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
-
-        Token kw=null;
-
-         enterRule(); 
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1457:28: (kw= '||' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1459:2: kw= '||'
-            {
-            kw=(Token)match(input,46,FOLLOW_46_in_ruleOpOr3197); 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"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1472:1: entryRuleXAndExpression returns [EObject current=null] : iv_ruleXAndExpression= ruleXAndExpression EOF ;
-    public final EObject entryRuleXAndExpression() throws RecognitionException {
-        EObject current = null;
-
-        EObject iv_ruleXAndExpression = null;
-
-
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1473:2: (iv_ruleXAndExpression= ruleXAndExpression EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1474:2: iv_ruleXAndExpression= ruleXAndExpression EOF
-            {
-            if ( state.backtracking==0 ) {
-               newCompositeNode(grammarAccess.getXAndExpressionRule()); 
-            }
-            pushFollow(FOLLOW_ruleXAndExpression_in_entryRuleXAndExpression3236);
-            iv_ruleXAndExpression=ruleXAndExpression();
-
-            state._fsp--;
-            if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-               current =iv_ruleXAndExpression; 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXAndExpression3246); if (state.failed) return current;
-
-            }
-
-        }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
-                appendSkippedTokens();
-            } 
-        finally {
-        }
-        return current;
-    }
-    // $ANTLR end "entryRuleXAndExpression"
-
-
-    // $ANTLR start "ruleXAndExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1481: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 {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1484:28: ( (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1485:1: (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1485:1: (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1486:5: this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )*
-            {
-            if ( state.backtracking==0 ) {
-               
-                      newCompositeNode(grammarAccess.getXAndExpressionAccess().getXEqualityExpressionParserRuleCall_0()); 
-                  
-            }
-            pushFollow(FOLLOW_ruleXEqualityExpression_in_ruleXAndExpression3293);
-            this_XEqualityExpression_0=ruleXEqualityExpression();
-
-            state._fsp--;
-            if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-               
-                      current = this_XEqualityExpression_0; 
-                      afterParserOrEnumRuleCall();
-                  
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1494:1: ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )*
+            // InternalUISemanticsGrammar.g:1442:3: ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )*
             loop29:
             do {
                 int alt29=2;
@@ -4336,7 +4141,7 @@
                 if ( (LA29_0==47) ) {
                     int LA29_2 = input.LA(2);
 
-                    if ( (synpred3_InternalUISemanticsGrammar()) ) {
+                    if ( (synpred2_InternalUISemanticsGrammar()) ) {
                         alt29=1;
                     }
 
@@ -4346,95 +4151,95 @@
 
                 switch (alt29) {
             	case 1 :
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1494:2: ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) )
+            	    // InternalUISemanticsGrammar.g:1443:4: ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1494:2: ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1494:3: ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) )
+            	    // InternalUISemanticsGrammar.g:1443:4: ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) )
+            	    // InternalUISemanticsGrammar.g:1444:5: ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1499:6: ( () ( ( ruleOpAnd ) ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1499:7: () ( ( ruleOpAnd ) )
+            	    // InternalUISemanticsGrammar.g:1454:5: ( () ( ( ruleOpOr ) ) )
+            	    // InternalUISemanticsGrammar.g:1455:6: () ( ( ruleOpOr ) )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1499:7: ()
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1500:5: 
+            	    // InternalUISemanticsGrammar.g:1455:6: ()
+            	    // InternalUISemanticsGrammar.g:1456:7: 
             	    {
             	    if ( state.backtracking==0 ) {
 
-            	              current = forceCreateModelElementAndSet(
-            	                  grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
-            	                  current);
-            	          
+            	      							current = forceCreateModelElementAndSet(
+            	      								grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
+            	      								current);
+            	      						
             	    }
 
             	    }
 
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1505:2: ( ( ruleOpAnd ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1506:1: ( ruleOpAnd )
+            	    // InternalUISemanticsGrammar.g:1462:6: ( ( ruleOpOr ) )
+            	    // InternalUISemanticsGrammar.g:1463:7: ( ruleOpOr )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1506:1: ( ruleOpAnd )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1507:3: ruleOpAnd
+            	    // InternalUISemanticsGrammar.g:1463:7: ( ruleOpOr )
+            	    // InternalUISemanticsGrammar.g:1464:8: ruleOpOr
             	    {
             	    if ( state.backtracking==0 ) {
 
-            	      			if (current==null) {
-            	      	            current = createModelElement(grammarAccess.getXAndExpressionRule());
-            	      	        }
-            	              
+            	      								if (current==null) {
+            	      									current = createModelElement(grammarAccess.getXOrExpressionRule());
+            	      								}
+            	      							
             	    }
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getXAndExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
-            	      	    
+
+            	      								newCompositeNode(grammarAccess.getXOrExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
+            	      							
             	    }
-            	    pushFollow(FOLLOW_ruleOpAnd_in_ruleXAndExpression3346);
-            	    ruleOpAnd();
-
-            	    state._fsp--;
-            	    if (state.failed) return current;
-            	    if ( state.backtracking==0 ) {
-            	       
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
-            	    }
-
-            	    }
-
-
-            	    }
-
-
-            	    }
-
-
-            	    }
-
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1520:4: ( (lv_rightOperand_3_0= ruleXEqualityExpression ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1521:1: (lv_rightOperand_3_0= ruleXEqualityExpression )
-            	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1521:1: (lv_rightOperand_3_0= ruleXEqualityExpression )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1522:3: lv_rightOperand_3_0= ruleXEqualityExpression
-            	    {
-            	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getXAndExpressionAccess().getRightOperandXEqualityExpressionParserRuleCall_1_1_0()); 
-            	      	    
-            	    }
-            	    pushFollow(FOLLOW_ruleXEqualityExpression_in_ruleXAndExpression3369);
-            	    lv_rightOperand_3_0=ruleXEqualityExpression();
+            	    pushFollow(FOLLOW_34);
+            	    ruleOpOr();
 
             	    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, 
-            	              		"XEqualityExpression");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      								afterParserOrEnumRuleCall();
+            	      							
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    // InternalUISemanticsGrammar.g:1480:4: ( (lv_rightOperand_3_0= ruleXAndExpression ) )
+            	    // InternalUISemanticsGrammar.g:1481:5: (lv_rightOperand_3_0= ruleXAndExpression )
+            	    {
+            	    // InternalUISemanticsGrammar.g:1481:5: (lv_rightOperand_3_0= ruleXAndExpression )
+            	    // InternalUISemanticsGrammar.g:1482:6: lv_rightOperand_3_0= ruleXAndExpression
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getXOrExpressionAccess().getRightOperandXAndExpressionParserRuleCall_1_1_0());
+            	      					
+            	    }
+            	    pushFollow(FOLLOW_39);
+            	    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();
+            	      					
             	    }
 
             	    }
@@ -4458,318 +4263,289 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
     }
-    // $ANTLR end "ruleXAndExpression"
+    // $ANTLR end "ruleXOrExpression"
 
 
-    // $ANTLR start "entryRuleOpAnd"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1546:1: entryRuleOpAnd returns [String current=null] : iv_ruleOpAnd= ruleOpAnd EOF ;
-    public final String entryRuleOpAnd() throws RecognitionException {
+    // $ANTLR start "entryRuleOpOr"
+    // InternalUISemanticsGrammar.g:1504:1: entryRuleOpOr returns [String current=null] : iv_ruleOpOr= ruleOpOr EOF ;
+    public final String entryRuleOpOr() throws RecognitionException {
         String current = null;
 
-        AntlrDatatypeRuleToken iv_ruleOpAnd = null;
+        AntlrDatatypeRuleToken iv_ruleOpOr = null;
 
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1547:2: (iv_ruleOpAnd= ruleOpAnd EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1548:2: iv_ruleOpAnd= ruleOpAnd EOF
+            // InternalUISemanticsGrammar.g:1504:44: (iv_ruleOpOr= ruleOpOr EOF )
+            // InternalUISemanticsGrammar.g:1505:2: iv_ruleOpOr= ruleOpOr EOF
             {
             if ( state.backtracking==0 ) {
-               newCompositeNode(grammarAccess.getOpAndRule()); 
+               newCompositeNode(grammarAccess.getOpOrRule()); 
             }
-            pushFollow(FOLLOW_ruleOpAnd_in_entryRuleOpAnd3408);
-            iv_ruleOpAnd=ruleOpAnd();
+            pushFollow(FOLLOW_1);
+            iv_ruleOpOr=ruleOpOr();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
-               current =iv_ruleOpAnd.getText(); 
+               current =iv_ruleOpOr.getText(); 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleOpAnd3419); 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 "entryRuleOpAnd"
+    // $ANTLR end "entryRuleOpOr"
 
 
-    // $ANTLR start "ruleOpAnd"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1555:1: ruleOpAnd returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : kw= '&&' ;
-    public final AntlrDatatypeRuleToken ruleOpAnd() throws RecognitionException {
+    // $ANTLR start "ruleOpOr"
+    // InternalUISemanticsGrammar.g:1511:1: ruleOpOr returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : kw= '||' ;
+    public final AntlrDatatypeRuleToken ruleOpOr() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
         Token kw=null;
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1558:28: (kw= '&&' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1560:2: kw= '&&'
+            // InternalUISemanticsGrammar.g:1517:2: (kw= '||' )
+            // InternalUISemanticsGrammar.g:1518:2: kw= '||'
             {
-            kw=(Token)match(input,47,FOLLOW_47_in_ruleOpAnd3456); if (state.failed) return current;
+            kw=(Token)match(input,47,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                      current.merge(kw);
-                      newLeafNode(kw, grammarAccess.getOpAndAccess().getAmpersandAmpersandKeyword()); 
-                  
+              		current.merge(kw);
+              		newLeafNode(kw, grammarAccess.getOpOrAccess().getVerticalLineVerticalLineKeyword());
+              	
             }
 
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
     }
-    // $ANTLR end "ruleOpAnd"
+    // $ANTLR end "ruleOpOr"
 
 
-    // $ANTLR start "entryRuleXEqualityExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1573:1: entryRuleXEqualityExpression returns [EObject current=null] : iv_ruleXEqualityExpression= ruleXEqualityExpression EOF ;
-    public final EObject entryRuleXEqualityExpression() throws RecognitionException {
+    // $ANTLR start "entryRuleXAndExpression"
+    // InternalUISemanticsGrammar.g:1526:1: entryRuleXAndExpression returns [EObject current=null] : iv_ruleXAndExpression= ruleXAndExpression EOF ;
+    public final EObject entryRuleXAndExpression() throws RecognitionException {
         EObject current = null;
 
-        EObject iv_ruleXEqualityExpression = null;
+        EObject iv_ruleXAndExpression = null;
 
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1574:2: (iv_ruleXEqualityExpression= ruleXEqualityExpression EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1575:2: iv_ruleXEqualityExpression= ruleXEqualityExpression EOF
+            // InternalUISemanticsGrammar.g:1526:55: (iv_ruleXAndExpression= ruleXAndExpression EOF )
+            // InternalUISemanticsGrammar.g:1527:2: iv_ruleXAndExpression= ruleXAndExpression EOF
             {
             if ( state.backtracking==0 ) {
-               newCompositeNode(grammarAccess.getXEqualityExpressionRule()); 
+               newCompositeNode(grammarAccess.getXAndExpressionRule()); 
             }
-            pushFollow(FOLLOW_ruleXEqualityExpression_in_entryRuleXEqualityExpression3495);
-            iv_ruleXEqualityExpression=ruleXEqualityExpression();
+            pushFollow(FOLLOW_1);
+            iv_ruleXAndExpression=ruleXAndExpression();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
-               current =iv_ruleXEqualityExpression; 
+               current =iv_ruleXAndExpression; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXEqualityExpression3505); 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 "entryRuleXEqualityExpression"
+    // $ANTLR end "entryRuleXAndExpression"
 
 
-    // $ANTLR start "ruleXEqualityExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1582:1: ruleXEqualityExpression returns [EObject current=null] : (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* ) ;
-    public final EObject ruleXEqualityExpression() throws RecognitionException {
+    // $ANTLR start "ruleXAndExpression"
+    // InternalUISemanticsGrammar.g:1533: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_XRelationalExpression_0 = null;
+        EObject this_XEqualityExpression_0 = null;
 
         EObject lv_rightOperand_3_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1585:28: ( (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1586:1: (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* )
+            // InternalUISemanticsGrammar.g:1539:2: ( (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* ) )
+            // InternalUISemanticsGrammar.g:1540:2: (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* )
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1586:1: (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1587:5: this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )*
+            // InternalUISemanticsGrammar.g:1540:2: (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* )
+            // InternalUISemanticsGrammar.g:1541:3: this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )*
             {
             if ( state.backtracking==0 ) {
-               
-                      newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getXRelationalExpressionParserRuleCall_0()); 
-                  
+
+              			newCompositeNode(grammarAccess.getXAndExpressionAccess().getXEqualityExpressionParserRuleCall_0());
+              		
             }
-            pushFollow(FOLLOW_ruleXRelationalExpression_in_ruleXEqualityExpression3552);
-            this_XRelationalExpression_0=ruleXRelationalExpression();
+            pushFollow(FOLLOW_40);
+            this_XEqualityExpression_0=ruleXEqualityExpression();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
-               
-                      current = this_XRelationalExpression_0; 
-                      afterParserOrEnumRuleCall();
-                  
+
+              			current = this_XEqualityExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
             }
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1595:1: ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )*
+            // InternalUISemanticsGrammar.g:1549:3: ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )*
             loop30:
             do {
                 int alt30=2;
-                switch ( input.LA(1) ) {
-                case 48:
-                    {
+                int LA30_0 = input.LA(1);
+
+                if ( (LA30_0==48) ) {
                     int LA30_2 = input.LA(2);
 
-                    if ( (synpred4_InternalUISemanticsGrammar()) ) {
+                    if ( (synpred3_InternalUISemanticsGrammar()) ) {
                         alt30=1;
                     }
 
 
-                    }
-                    break;
-                case 49:
-                    {
-                    int LA30_3 = input.LA(2);
-
-                    if ( (synpred4_InternalUISemanticsGrammar()) ) {
-                        alt30=1;
-                    }
-
-
-                    }
-                    break;
-                case 50:
-                    {
-                    int LA30_4 = input.LA(2);
-
-                    if ( (synpred4_InternalUISemanticsGrammar()) ) {
-                        alt30=1;
-                    }
-
-
-                    }
-                    break;
-                case 51:
-                    {
-                    int LA30_5 = input.LA(2);
-
-                    if ( (synpred4_InternalUISemanticsGrammar()) ) {
-                        alt30=1;
-                    }
-
-
-                    }
-                    break;
-
                 }
 
+
                 switch (alt30) {
             	case 1 :
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1595:2: ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) )
+            	    // InternalUISemanticsGrammar.g:1550:4: ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1595:2: ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1595:3: ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) )
+            	    // InternalUISemanticsGrammar.g:1550:4: ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) )
+            	    // InternalUISemanticsGrammar.g:1551:5: ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1600:6: ( () ( ( ruleOpEquality ) ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1600:7: () ( ( ruleOpEquality ) )
+            	    // InternalUISemanticsGrammar.g:1561:5: ( () ( ( ruleOpAnd ) ) )
+            	    // InternalUISemanticsGrammar.g:1562:6: () ( ( ruleOpAnd ) )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1600:7: ()
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1601:5: 
+            	    // InternalUISemanticsGrammar.g:1562:6: ()
+            	    // InternalUISemanticsGrammar.g:1563:7: 
             	    {
             	    if ( state.backtracking==0 ) {
 
-            	              current = forceCreateModelElementAndSet(
-            	                  grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
-            	                  current);
-            	          
+            	      							current = forceCreateModelElementAndSet(
+            	      								grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
+            	      								current);
+            	      						
             	    }
 
             	    }
 
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1606:2: ( ( ruleOpEquality ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1607:1: ( ruleOpEquality )
+            	    // InternalUISemanticsGrammar.g:1569:6: ( ( ruleOpAnd ) )
+            	    // InternalUISemanticsGrammar.g:1570:7: ( ruleOpAnd )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1607:1: ( ruleOpEquality )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1608:3: ruleOpEquality
+            	    // InternalUISemanticsGrammar.g:1570:7: ( ruleOpAnd )
+            	    // InternalUISemanticsGrammar.g:1571:8: ruleOpAnd
             	    {
             	    if ( state.backtracking==0 ) {
 
-            	      			if (current==null) {
-            	      	            current = createModelElement(grammarAccess.getXEqualityExpressionRule());
-            	      	        }
-            	              
+            	      								if (current==null) {
+            	      									current = createModelElement(grammarAccess.getXAndExpressionRule());
+            	      								}
+            	      							
             	    }
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
-            	      	    
+
+            	      								newCompositeNode(grammarAccess.getXAndExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
+            	      							
             	    }
-            	    pushFollow(FOLLOW_ruleOpEquality_in_ruleXEqualityExpression3605);
-            	    ruleOpEquality();
-
-            	    state._fsp--;
-            	    if (state.failed) return current;
-            	    if ( state.backtracking==0 ) {
-            	       
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
-            	    }
-
-            	    }
-
-
-            	    }
-
-
-            	    }
-
-
-            	    }
-
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1621:4: ( (lv_rightOperand_3_0= ruleXRelationalExpression ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1622:1: (lv_rightOperand_3_0= ruleXRelationalExpression )
-            	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1622:1: (lv_rightOperand_3_0= ruleXRelationalExpression )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1623:3: lv_rightOperand_3_0= ruleXRelationalExpression
-            	    {
-            	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getRightOperandXRelationalExpressionParserRuleCall_1_1_0()); 
-            	      	    
-            	    }
-            	    pushFollow(FOLLOW_ruleXRelationalExpression_in_ruleXEqualityExpression3628);
-            	    lv_rightOperand_3_0=ruleXRelationalExpression();
+            	    pushFollow(FOLLOW_34);
+            	    ruleOpAnd();
 
             	    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, 
-            	              		"XRelationalExpression");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      								afterParserOrEnumRuleCall();
+            	      							
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    // InternalUISemanticsGrammar.g:1587:4: ( (lv_rightOperand_3_0= ruleXEqualityExpression ) )
+            	    // InternalUISemanticsGrammar.g:1588:5: (lv_rightOperand_3_0= ruleXEqualityExpression )
+            	    {
+            	    // InternalUISemanticsGrammar.g:1588:5: (lv_rightOperand_3_0= ruleXEqualityExpression )
+            	    // InternalUISemanticsGrammar.g:1589:6: lv_rightOperand_3_0= ruleXEqualityExpression
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getXAndExpressionAccess().getRightOperandXEqualityExpressionParserRuleCall_1_1_0());
+            	      					
+            	    }
+            	    pushFollow(FOLLOW_40);
+            	    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();
+            	      					
             	    }
 
             	    }
@@ -4793,14 +4569,357 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXAndExpression"
+
+
+    // $ANTLR start "entryRuleOpAnd"
+    // InternalUISemanticsGrammar.g:1611:1: entryRuleOpAnd returns [String current=null] : iv_ruleOpAnd= ruleOpAnd EOF ;
+    public final String entryRuleOpAnd() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleOpAnd = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:1611:45: (iv_ruleOpAnd= ruleOpAnd EOF )
+            // InternalUISemanticsGrammar.g:1612: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"
+    // InternalUISemanticsGrammar.g:1618:1: ruleOpAnd returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : kw= '&&' ;
+    public final AntlrDatatypeRuleToken ruleOpAnd() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalUISemanticsGrammar.g:1624:2: (kw= '&&' )
+            // InternalUISemanticsGrammar.g:1625:2: kw= '&&'
+            {
+            kw=(Token)match(input,48,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"
+    // InternalUISemanticsGrammar.g:1633:1: entryRuleXEqualityExpression returns [EObject current=null] : iv_ruleXEqualityExpression= ruleXEqualityExpression EOF ;
+    public final EObject entryRuleXEqualityExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXEqualityExpression = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:1633:60: (iv_ruleXEqualityExpression= ruleXEqualityExpression EOF )
+            // InternalUISemanticsGrammar.g:1634: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"
+    // InternalUISemanticsGrammar.g:1640: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 {
+            // InternalUISemanticsGrammar.g:1646:2: ( (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* ) )
+            // InternalUISemanticsGrammar.g:1647:2: (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* )
+            {
+            // InternalUISemanticsGrammar.g:1647:2: (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* )
+            // InternalUISemanticsGrammar.g:1648:3: this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )*
+            {
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getXRelationalExpressionParserRuleCall_0());
+              		
+            }
+            pushFollow(FOLLOW_41);
+            this_XRelationalExpression_0=ruleXRelationalExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_XRelationalExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalUISemanticsGrammar.g:1656:3: ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )*
+            loop31:
+            do {
+                int alt31=2;
+                switch ( input.LA(1) ) {
+                case 49:
+                    {
+                    int LA31_2 = input.LA(2);
+
+                    if ( (synpred4_InternalUISemanticsGrammar()) ) {
+                        alt31=1;
+                    }
+
+
+                    }
+                    break;
+                case 50:
+                    {
+                    int LA31_3 = input.LA(2);
+
+                    if ( (synpred4_InternalUISemanticsGrammar()) ) {
+                        alt31=1;
+                    }
+
+
+                    }
+                    break;
+                case 51:
+                    {
+                    int LA31_4 = input.LA(2);
+
+                    if ( (synpred4_InternalUISemanticsGrammar()) ) {
+                        alt31=1;
+                    }
+
+
+                    }
+                    break;
+                case 52:
+                    {
+                    int LA31_5 = input.LA(2);
+
+                    if ( (synpred4_InternalUISemanticsGrammar()) ) {
+                        alt31=1;
+                    }
+
+
+                    }
+                    break;
+
+                }
+
+                switch (alt31) {
+            	case 1 :
+            	    // InternalUISemanticsGrammar.g:1657:4: ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) )
+            	    {
+            	    // InternalUISemanticsGrammar.g:1657:4: ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) )
+            	    // InternalUISemanticsGrammar.g:1658:5: ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) )
+            	    {
+            	    // InternalUISemanticsGrammar.g:1668:5: ( () ( ( ruleOpEquality ) ) )
+            	    // InternalUISemanticsGrammar.g:1669:6: () ( ( ruleOpEquality ) )
+            	    {
+            	    // InternalUISemanticsGrammar.g:1669:6: ()
+            	    // InternalUISemanticsGrammar.g:1670:7: 
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      							current = forceCreateModelElementAndSet(
+            	      								grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
+            	      								current);
+            	      						
+            	    }
+
+            	    }
+
+            	    // InternalUISemanticsGrammar.g:1676:6: ( ( ruleOpEquality ) )
+            	    // InternalUISemanticsGrammar.g:1677:7: ( ruleOpEquality )
+            	    {
+            	    // InternalUISemanticsGrammar.g:1677:7: ( ruleOpEquality )
+            	    // InternalUISemanticsGrammar.g:1678: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_34);
+            	    ruleOpEquality();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      								afterParserOrEnumRuleCall();
+            	      							
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    // InternalUISemanticsGrammar.g:1694:4: ( (lv_rightOperand_3_0= ruleXRelationalExpression ) )
+            	    // InternalUISemanticsGrammar.g:1695:5: (lv_rightOperand_3_0= ruleXRelationalExpression )
+            	    {
+            	    // InternalUISemanticsGrammar.g:1695:5: (lv_rightOperand_3_0= ruleXRelationalExpression )
+            	    // InternalUISemanticsGrammar.g:1696:6: lv_rightOperand_3_0= ruleXRelationalExpression
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getRightOperandXRelationalExpressionParserRuleCall_1_1_0());
+            	      					
+            	    }
+            	    pushFollow(FOLLOW_41);
+            	    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 loop31;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
         finally {
         }
         return current;
@@ -4809,7 +4928,7 @@
 
 
     // $ANTLR start "entryRuleOpEquality"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1647:1: entryRuleOpEquality returns [String current=null] : iv_ruleOpEquality= ruleOpEquality EOF ;
+    // InternalUISemanticsGrammar.g:1718:1: entryRuleOpEquality returns [String current=null] : iv_ruleOpEquality= ruleOpEquality EOF ;
     public final String entryRuleOpEquality() throws RecognitionException {
         String current = null;
 
@@ -4817,13 +4936,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1648:2: (iv_ruleOpEquality= ruleOpEquality EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1649:2: iv_ruleOpEquality= ruleOpEquality EOF
+            // InternalUISemanticsGrammar.g:1718:50: (iv_ruleOpEquality= ruleOpEquality EOF )
+            // InternalUISemanticsGrammar.g:1719:2: iv_ruleOpEquality= ruleOpEquality EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getOpEqualityRule()); 
             }
-            pushFollow(FOLLOW_ruleOpEquality_in_entryRuleOpEquality3667);
+            pushFollow(FOLLOW_1);
             iv_ruleOpEquality=ruleOpEquality();
 
             state._fsp--;
@@ -4831,16 +4950,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleOpEquality.getText(); 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleOpEquality3678); 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;
@@ -4849,98 +4968,99 @@
 
 
     // $ANTLR start "ruleOpEquality"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1656:1: ruleOpEquality returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' ) ;
+    // InternalUISemanticsGrammar.g:1725: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(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1659:28: ( (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1660:1: (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' )
+            // InternalUISemanticsGrammar.g:1731:2: ( (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' ) )
+            // InternalUISemanticsGrammar.g:1732:2: (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' )
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1660:1: (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' )
-            int alt31=4;
+            // InternalUISemanticsGrammar.g:1732:2: (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' )
+            int alt32=4;
             switch ( input.LA(1) ) {
-            case 48:
-                {
-                alt31=1;
-                }
-                break;
             case 49:
                 {
-                alt31=2;
+                alt32=1;
                 }
                 break;
             case 50:
                 {
-                alt31=3;
+                alt32=2;
                 }
                 break;
             case 51:
                 {
-                alt31=4;
+                alt32=3;
+                }
+                break;
+            case 52:
+                {
+                alt32=4;
                 }
                 break;
             default:
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 31, 0, input);
+                    new NoViableAltException("", 32, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt31) {
+            switch (alt32) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1661:2: kw= '=='
+                    // InternalUISemanticsGrammar.g:1733:3: kw= '=='
                     {
-                    kw=(Token)match(input,48,FOLLOW_48_in_ruleOpEquality3716); if (state.failed) return current;
+                    kw=(Token)match(input,49,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignKeyword_0()); 
-                          
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignKeyword_0());
+                      		
                     }
 
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1668:2: kw= '!='
+                    // InternalUISemanticsGrammar.g:1739:3: kw= '!='
                     {
-                    kw=(Token)match(input,49,FOLLOW_49_in_ruleOpEquality3735); if (state.failed) return current;
+                    kw=(Token)match(input,50,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignKeyword_1()); 
-                          
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignKeyword_1());
+                      		
                     }
 
                     }
                     break;
                 case 3 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1675:2: kw= '==='
+                    // InternalUISemanticsGrammar.g:1745:3: kw= '==='
                     {
-                    kw=(Token)match(input,50,FOLLOW_50_in_ruleOpEquality3754); if (state.failed) return current;
+                    kw=(Token)match(input,51,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignEqualsSignKeyword_2()); 
-                          
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignEqualsSignKeyword_2());
+                      		
                     }
 
                     }
                     break;
                 case 4 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1682:2: kw= '!=='
+                    // InternalUISemanticsGrammar.g:1751:3: kw= '!=='
                     {
-                    kw=(Token)match(input,51,FOLLOW_51_in_ruleOpEquality3773); if (state.failed) return current;
+                    kw=(Token)match(input,52,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignEqualsSignKeyword_3()); 
-                          
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignEqualsSignKeyword_3());
+                      		
                     }
 
                     }
@@ -4952,14 +5072,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -4968,7 +5090,7 @@
 
 
     // $ANTLR start "entryRuleXRelationalExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1695:1: entryRuleXRelationalExpression returns [EObject current=null] : iv_ruleXRelationalExpression= ruleXRelationalExpression EOF ;
+    // InternalUISemanticsGrammar.g:1760:1: entryRuleXRelationalExpression returns [EObject current=null] : iv_ruleXRelationalExpression= ruleXRelationalExpression EOF ;
     public final EObject entryRuleXRelationalExpression() throws RecognitionException {
         EObject current = null;
 
@@ -4976,13 +5098,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1696:2: (iv_ruleXRelationalExpression= ruleXRelationalExpression EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1697:2: iv_ruleXRelationalExpression= ruleXRelationalExpression EOF
+            // InternalUISemanticsGrammar.g:1760:62: (iv_ruleXRelationalExpression= ruleXRelationalExpression EOF )
+            // InternalUISemanticsGrammar.g:1761:2: iv_ruleXRelationalExpression= ruleXRelationalExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXRelationalExpressionRule()); 
             }
-            pushFollow(FOLLOW_ruleXRelationalExpression_in_entryRuleXRelationalExpression3813);
+            pushFollow(FOLLOW_1);
             iv_ruleXRelationalExpression=ruleXRelationalExpression();
 
             state._fsp--;
@@ -4990,16 +5112,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleXRelationalExpression; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXRelationalExpression3823); 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;
@@ -5008,7 +5130,7 @@
 
 
     // $ANTLR start "ruleXRelationalExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1704: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 ) ) ) )* ) ;
+    // InternalUISemanticsGrammar.g:1767: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;
 
@@ -5020,64 +5142,43 @@
         EObject lv_rightOperand_6_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1707:28: ( (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1708:1: (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* )
+            // InternalUISemanticsGrammar.g:1773:2: ( (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* ) )
+            // InternalUISemanticsGrammar.g:1774:2: (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* )
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1708:1: (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1709:5: this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )*
+            // InternalUISemanticsGrammar.g:1774:2: (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* )
+            // InternalUISemanticsGrammar.g:1775: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()); 
-                  
+
+              			newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getXOtherOperatorExpressionParserRuleCall_0());
+              		
             }
-            pushFollow(FOLLOW_ruleXOtherOperatorExpression_in_ruleXRelationalExpression3870);
+            pushFollow(FOLLOW_42);
             this_XOtherOperatorExpression_0=ruleXOtherOperatorExpression();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
-               
-                      current = this_XOtherOperatorExpression_0; 
-                      afterParserOrEnumRuleCall();
-                  
+
+              			current = this_XOtherOperatorExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
             }
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1717:1: ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )*
-            loop32:
+            // InternalUISemanticsGrammar.g:1783:3: ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )*
+            loop33:
             do {
-                int alt32=3;
+                int alt33=3;
                 switch ( input.LA(1) ) {
-                case 43:
-                    {
-                    int LA32_2 = input.LA(2);
-
-                    if ( (synpred6_InternalUISemanticsGrammar()) ) {
-                        alt32=2;
-                    }
-
-
-                    }
-                    break;
                 case 44:
                     {
-                    int LA32_3 = input.LA(2);
+                    int LA33_2 = input.LA(2);
 
                     if ( (synpred6_InternalUISemanticsGrammar()) ) {
-                        alt32=2;
-                    }
-
-
-                    }
-                    break;
-                case 52:
-                    {
-                    int LA32_4 = input.LA(2);
-
-                    if ( (synpred5_InternalUISemanticsGrammar()) ) {
-                        alt32=1;
+                        alt33=2;
                     }
 
 
@@ -5085,10 +5186,32 @@
                     break;
                 case 45:
                     {
-                    int LA32_5 = input.LA(2);
+                    int LA33_3 = input.LA(2);
 
                     if ( (synpred6_InternalUISemanticsGrammar()) ) {
-                        alt32=2;
+                        alt33=2;
+                    }
+
+
+                    }
+                    break;
+                case 53:
+                    {
+                    int LA33_4 = input.LA(2);
+
+                    if ( (synpred5_InternalUISemanticsGrammar()) ) {
+                        alt33=1;
+                    }
+
+
+                    }
+                    break;
+                case 46:
+                    {
+                    int LA33_5 = input.LA(2);
+
+                    if ( (synpred6_InternalUISemanticsGrammar()) ) {
+                        alt33=2;
                     }
 
 
@@ -5097,37 +5220,37 @@
 
                 }
 
-                switch (alt32) {
+                switch (alt33) {
             	case 1 :
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1717:2: ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )
+            	    // InternalUISemanticsGrammar.g:1784:4: ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1717:2: ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1717:3: ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) )
+            	    // InternalUISemanticsGrammar.g:1784:4: ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )
+            	    // InternalUISemanticsGrammar.g:1785:5: ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1717:3: ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1717:4: ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' )
+            	    // InternalUISemanticsGrammar.g:1785:5: ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) )
+            	    // InternalUISemanticsGrammar.g:1786:6: ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1719:5: ( () otherlv_2= 'instanceof' )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1719:6: () otherlv_2= 'instanceof'
+            	    // InternalUISemanticsGrammar.g:1792:6: ( () otherlv_2= 'instanceof' )
+            	    // InternalUISemanticsGrammar.g:1793:7: () otherlv_2= 'instanceof'
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1719:6: ()
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1720:5: 
+            	    // InternalUISemanticsGrammar.g:1793:7: ()
+            	    // InternalUISemanticsGrammar.g:1794:8: 
             	    {
             	    if ( state.backtracking==0 ) {
 
-            	              current = forceCreateModelElementAndSet(
-            	                  grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0(),
-            	                  current);
-            	          
+            	      								current = forceCreateModelElementAndSet(
+            	      									grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0(),
+            	      									current);
+            	      							
             	    }
 
             	    }
 
-            	    otherlv_2=(Token)match(input,52,FOLLOW_52_in_ruleXRelationalExpression3906); if (state.failed) return current;
+            	    otherlv_2=(Token)match(input,53,FOLLOW_31); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	          	newLeafNode(otherlv_2, grammarAccess.getXRelationalExpressionAccess().getInstanceofKeyword_1_0_0_0_1());
-            	          
+            	      							newLeafNode(otherlv_2, grammarAccess.getXRelationalExpressionAccess().getInstanceofKeyword_1_0_0_0_1());
+            	      						
             	    }
 
             	    }
@@ -5135,34 +5258,34 @@
 
             	    }
 
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1729:3: ( (lv_type_3_0= ruleJvmTypeReference ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1730:1: (lv_type_3_0= ruleJvmTypeReference )
+            	    // InternalUISemanticsGrammar.g:1806:5: ( (lv_type_3_0= ruleJvmTypeReference ) )
+            	    // InternalUISemanticsGrammar.g:1807:6: (lv_type_3_0= ruleJvmTypeReference )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1730:1: (lv_type_3_0= ruleJvmTypeReference )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1731:3: lv_type_3_0= ruleJvmTypeReference
+            	    // InternalUISemanticsGrammar.g:1807:6: (lv_type_3_0= ruleJvmTypeReference )
+            	    // InternalUISemanticsGrammar.g:1808:7: lv_type_3_0= ruleJvmTypeReference
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_0_1_0()); 
-            	      	    
+
+            	      							newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_0_1_0());
+            	      						
             	    }
-            	    pushFollow(FOLLOW_ruleJvmTypeReference_in_ruleXRelationalExpression3929);
+            	    pushFollow(FOLLOW_42);
             	    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, 
-            	              		"JvmTypeReference");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      							if (current==null) {
+            	      								current = createModelElementForParent(grammarAccess.getXRelationalExpressionRule());
+            	      							}
+            	      							set(
+            	      								current,
+            	      								"type",
+            	      								lv_type_3_0,
+            	      								"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+            	      							afterParserOrEnumRuleCall();
+            	      						
             	    }
 
             	    }
@@ -5177,57 +5300,57 @@
             	    }
             	    break;
             	case 2 :
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1748:6: ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) )
+            	    // InternalUISemanticsGrammar.g:1827:4: ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1748:6: ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1748:7: ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) )
+            	    // InternalUISemanticsGrammar.g:1827:4: ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) )
+            	    // InternalUISemanticsGrammar.g:1828:5: ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1748:7: ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1748:8: ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) )
+            	    // InternalUISemanticsGrammar.g:1828:5: ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) )
+            	    // InternalUISemanticsGrammar.g:1829:6: ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1753:6: ( () ( ( ruleOpCompare ) ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1753:7: () ( ( ruleOpCompare ) )
+            	    // InternalUISemanticsGrammar.g:1839:6: ( () ( ( ruleOpCompare ) ) )
+            	    // InternalUISemanticsGrammar.g:1840:7: () ( ( ruleOpCompare ) )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1753:7: ()
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1754:5: 
+            	    // InternalUISemanticsGrammar.g:1840:7: ()
+            	    // InternalUISemanticsGrammar.g:1841:8: 
             	    {
             	    if ( state.backtracking==0 ) {
 
-            	              current = forceCreateModelElementAndSet(
-            	                  grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0(),
-            	                  current);
-            	          
+            	      								current = forceCreateModelElementAndSet(
+            	      									grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0(),
+            	      									current);
+            	      							
             	    }
 
             	    }
 
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1759:2: ( ( ruleOpCompare ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1760:1: ( ruleOpCompare )
+            	    // InternalUISemanticsGrammar.g:1847:7: ( ( ruleOpCompare ) )
+            	    // InternalUISemanticsGrammar.g:1848:8: ( ruleOpCompare )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1760:1: ( ruleOpCompare )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1761:3: ruleOpCompare
+            	    // InternalUISemanticsGrammar.g:1848:8: ( ruleOpCompare )
+            	    // InternalUISemanticsGrammar.g:1849:9: ruleOpCompare
             	    {
             	    if ( state.backtracking==0 ) {
 
-            	      			if (current==null) {
-            	      	            current = createModelElement(grammarAccess.getXRelationalExpressionRule());
-            	      	        }
-            	              
+            	      									if (current==null) {
+            	      										current = createModelElement(grammarAccess.getXRelationalExpressionRule());
+            	      									}
+            	      								
             	    }
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_0_0_1_0()); 
-            	      	    
+
+            	      									newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_0_0_1_0());
+            	      								
             	    }
-            	    pushFollow(FOLLOW_ruleOpCompare_in_ruleXRelationalExpression3990);
+            	    pushFollow(FOLLOW_34);
             	    ruleOpCompare();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+
+            	      									afterParserOrEnumRuleCall();
+            	      								
             	    }
 
             	    }
@@ -5241,34 +5364,34 @@
 
             	    }
 
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1774:4: ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1775:1: (lv_rightOperand_6_0= ruleXOtherOperatorExpression )
+            	    // InternalUISemanticsGrammar.g:1865:5: ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) )
+            	    // InternalUISemanticsGrammar.g:1866:6: (lv_rightOperand_6_0= ruleXOtherOperatorExpression )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1775:1: (lv_rightOperand_6_0= ruleXOtherOperatorExpression )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1776:3: lv_rightOperand_6_0= ruleXOtherOperatorExpression
+            	    // InternalUISemanticsGrammar.g:1866:6: (lv_rightOperand_6_0= ruleXOtherOperatorExpression )
+            	    // InternalUISemanticsGrammar.g:1867:7: lv_rightOperand_6_0= ruleXOtherOperatorExpression
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getRightOperandXOtherOperatorExpressionParserRuleCall_1_1_1_0()); 
-            	      	    
+
+            	      							newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getRightOperandXOtherOperatorExpressionParserRuleCall_1_1_1_0());
+            	      						
             	    }
-            	    pushFollow(FOLLOW_ruleXOtherOperatorExpression_in_ruleXRelationalExpression4013);
+            	    pushFollow(FOLLOW_42);
             	    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, 
-            	              		"XOtherOperatorExpression");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      							if (current==null) {
+            	      								current = createModelElementForParent(grammarAccess.getXRelationalExpressionRule());
+            	      							}
+            	      							set(
+            	      								current,
+            	      								"rightOperand",
+            	      								lv_rightOperand_6_0,
+            	      								"org.eclipse.xtext.xbase.Xbase.XOtherOperatorExpression");
+            	      							afterParserOrEnumRuleCall();
+            	      						
             	    }
 
             	    }
@@ -5284,7 +5407,7 @@
             	    break;
 
             	default :
-            	    break loop32;
+            	    break loop33;
                 }
             } while (true);
 
@@ -5295,14 +5418,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -5311,7 +5436,7 @@
 
 
     // $ANTLR start "entryRuleOpCompare"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1800:1: entryRuleOpCompare returns [String current=null] : iv_ruleOpCompare= ruleOpCompare EOF ;
+    // InternalUISemanticsGrammar.g:1890:1: entryRuleOpCompare returns [String current=null] : iv_ruleOpCompare= ruleOpCompare EOF ;
     public final String entryRuleOpCompare() throws RecognitionException {
         String current = null;
 
@@ -5319,13 +5444,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1801:2: (iv_ruleOpCompare= ruleOpCompare EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1802:2: iv_ruleOpCompare= ruleOpCompare EOF
+            // InternalUISemanticsGrammar.g:1890:49: (iv_ruleOpCompare= ruleOpCompare EOF )
+            // InternalUISemanticsGrammar.g:1891:2: iv_ruleOpCompare= ruleOpCompare EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getOpCompareRule()); 
             }
-            pushFollow(FOLLOW_ruleOpCompare_in_entryRuleOpCompare4053);
+            pushFollow(FOLLOW_1);
             iv_ruleOpCompare=ruleOpCompare();
 
             state._fsp--;
@@ -5333,16 +5458,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleOpCompare.getText(); 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleOpCompare4064); 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;
@@ -5351,91 +5476,92 @@
 
 
     // $ANTLR start "ruleOpCompare"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1809:1: ruleOpCompare returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' ) ;
+    // InternalUISemanticsGrammar.g:1897: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(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1812:28: ( (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1813:1: (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' )
+            // InternalUISemanticsGrammar.g:1903:2: ( (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' ) )
+            // InternalUISemanticsGrammar.g:1904:2: (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' )
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1813:1: (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' )
-            int alt33=4;
+            // InternalUISemanticsGrammar.g:1904:2: (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' )
+            int alt34=4;
             switch ( input.LA(1) ) {
-            case 45:
+            case 46:
                 {
-                alt33=1;
+                alt34=1;
                 }
                 break;
-            case 43:
+            case 44:
                 {
-                int LA33_2 = input.LA(2);
+                int LA34_2 = input.LA(2);
 
-                if ( (LA33_2==EOF||(LA33_2>=RULE_STRING && LA33_2<=RULE_DECIMAL)||LA33_2==14||(LA33_2>=19 && LA33_2<=21)||LA33_2==43||(LA33_2>=59 && LA33_2<=60)||LA33_2==64||LA33_2==71||(LA33_2>=73 && LA33_2<=74)||LA33_2==77||LA33_2==79||(LA33_2>=82 && LA33_2<=84)||(LA33_2>=87 && LA33_2<=96)||LA33_2==98) ) {
-                    alt33=4;
+                if ( (LA34_2==EOF||(LA34_2>=RULE_STRING && LA34_2<=RULE_DECIMAL)||LA34_2==14||(LA34_2>=19 && LA34_2<=21)||LA34_2==33||LA34_2==44||(LA34_2>=60 && LA34_2<=61)||LA34_2==65||LA34_2==72||(LA34_2>=74 && LA34_2<=75)||LA34_2==78||LA34_2==80||(LA34_2>=83 && LA34_2<=85)||(LA34_2>=88 && LA34_2<=96)||LA34_2==98) ) {
+                    alt34=4;
                 }
-                else if ( (LA33_2==37) ) {
-                    alt33=2;
+                else if ( (LA34_2==38) ) {
+                    alt34=2;
                 }
                 else {
                     if (state.backtracking>0) {state.failed=true; return current;}
                     NoViableAltException nvae =
-                        new NoViableAltException("", 33, 2, input);
+                        new NoViableAltException("", 34, 2, input);
 
                     throw nvae;
                 }
                 }
                 break;
-            case 44:
+            case 45:
                 {
-                alt33=3;
+                alt34=3;
                 }
                 break;
             default:
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 33, 0, input);
+                    new NoViableAltException("", 34, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt33) {
+            switch (alt34) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1814:2: kw= '>='
+                    // InternalUISemanticsGrammar.g:1905:3: kw= '>='
                     {
-                    kw=(Token)match(input,45,FOLLOW_45_in_ruleOpCompare4102); if (state.failed) return current;
+                    kw=(Token)match(input,46,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getOpCompareAccess().getGreaterThanSignEqualsSignKeyword_0()); 
-                          
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpCompareAccess().getGreaterThanSignEqualsSignKeyword_0());
+                      		
                     }
 
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1820:6: (kw= '<' kw= '=' )
+                    // InternalUISemanticsGrammar.g:1911:3: (kw= '<' kw= '=' )
                     {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1820:6: (kw= '<' kw= '=' )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1821:2: kw= '<' kw= '='
+                    // InternalUISemanticsGrammar.g:1911:3: (kw= '<' kw= '=' )
+                    // InternalUISemanticsGrammar.g:1912:4: kw= '<' kw= '='
                     {
-                    kw=(Token)match(input,43,FOLLOW_43_in_ruleOpCompare4122); if (state.failed) return current;
+                    kw=(Token)match(input,44,FOLLOW_33); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getOpCompareAccess().getLessThanSignKeyword_1_0()); 
-                          
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getOpCompareAccess().getLessThanSignKeyword_1_0());
+                      			
                     }
-                    kw=(Token)match(input,37,FOLLOW_37_in_ruleOpCompare4135); if (state.failed) return current;
+                    kw=(Token)match(input,38,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getOpCompareAccess().getEqualsSignKeyword_1_1()); 
-                          
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getOpCompareAccess().getEqualsSignKeyword_1_1());
+                      			
                     }
 
                     }
@@ -5444,27 +5570,27 @@
                     }
                     break;
                 case 3 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1834:2: kw= '>'
+                    // InternalUISemanticsGrammar.g:1924:3: kw= '>'
                     {
-                    kw=(Token)match(input,44,FOLLOW_44_in_ruleOpCompare4155); if (state.failed) return current;
+                    kw=(Token)match(input,45,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getOpCompareAccess().getGreaterThanSignKeyword_2()); 
-                          
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpCompareAccess().getGreaterThanSignKeyword_2());
+                      		
                     }
 
                     }
                     break;
                 case 4 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1841:2: kw= '<'
+                    // InternalUISemanticsGrammar.g:1930:3: kw= '<'
                     {
-                    kw=(Token)match(input,43,FOLLOW_43_in_ruleOpCompare4174); if (state.failed) return current;
+                    kw=(Token)match(input,44,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getOpCompareAccess().getLessThanSignKeyword_3()); 
-                          
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpCompareAccess().getLessThanSignKeyword_3());
+                      		
                     }
 
                     }
@@ -5476,14 +5602,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -5492,7 +5620,7 @@
 
 
     // $ANTLR start "entryRuleXOtherOperatorExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1854:1: entryRuleXOtherOperatorExpression returns [EObject current=null] : iv_ruleXOtherOperatorExpression= ruleXOtherOperatorExpression EOF ;
+    // InternalUISemanticsGrammar.g:1939:1: entryRuleXOtherOperatorExpression returns [EObject current=null] : iv_ruleXOtherOperatorExpression= ruleXOtherOperatorExpression EOF ;
     public final EObject entryRuleXOtherOperatorExpression() throws RecognitionException {
         EObject current = null;
 
@@ -5500,13 +5628,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1855:2: (iv_ruleXOtherOperatorExpression= ruleXOtherOperatorExpression EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1856:2: iv_ruleXOtherOperatorExpression= ruleXOtherOperatorExpression EOF
+            // InternalUISemanticsGrammar.g:1939:65: (iv_ruleXOtherOperatorExpression= ruleXOtherOperatorExpression EOF )
+            // InternalUISemanticsGrammar.g:1940:2: iv_ruleXOtherOperatorExpression= ruleXOtherOperatorExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXOtherOperatorExpressionRule()); 
             }
-            pushFollow(FOLLOW_ruleXOtherOperatorExpression_in_entryRuleXOtherOperatorExpression4214);
+            pushFollow(FOLLOW_1);
             iv_ruleXOtherOperatorExpression=ruleXOtherOperatorExpression();
 
             state._fsp--;
@@ -5514,16 +5642,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleXOtherOperatorExpression; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXOtherOperatorExpression4224); 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;
@@ -5532,7 +5660,7 @@
 
 
     // $ANTLR start "ruleXOtherOperatorExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1863:1: ruleXOtherOperatorExpression returns [EObject current=null] : (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* ) ;
+    // InternalUISemanticsGrammar.g:1946: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;
 
@@ -5541,86 +5669,87 @@
         EObject lv_rightOperand_3_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1866:28: ( (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1867:1: (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* )
+            // InternalUISemanticsGrammar.g:1952:2: ( (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* ) )
+            // InternalUISemanticsGrammar.g:1953:2: (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* )
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1867:1: (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1868:5: this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )*
+            // InternalUISemanticsGrammar.g:1953:2: (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* )
+            // InternalUISemanticsGrammar.g:1954:3: this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )*
             {
             if ( state.backtracking==0 ) {
-               
-                      newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getXAdditiveExpressionParserRuleCall_0()); 
-                  
+
+              			newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getXAdditiveExpressionParserRuleCall_0());
+              		
             }
-            pushFollow(FOLLOW_ruleXAdditiveExpression_in_ruleXOtherOperatorExpression4271);
+            pushFollow(FOLLOW_43);
             this_XAdditiveExpression_0=ruleXAdditiveExpression();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
-               
-                      current = this_XAdditiveExpression_0; 
-                      afterParserOrEnumRuleCall();
-                  
+
+              			current = this_XAdditiveExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
             }
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1876:1: ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )*
-            loop34:
+            // InternalUISemanticsGrammar.g:1962:3: ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )*
+            loop35:
             do {
-                int alt34=2;
-                alt34 = dfa34.predict(input);
-                switch (alt34) {
+                int alt35=2;
+                alt35 = dfa35.predict(input);
+                switch (alt35) {
             	case 1 :
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1876:2: ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) )
+            	    // InternalUISemanticsGrammar.g:1963:4: ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1876:2: ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1876:3: ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) )
+            	    // InternalUISemanticsGrammar.g:1963:4: ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) )
+            	    // InternalUISemanticsGrammar.g:1964:5: ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1881:6: ( () ( ( ruleOpOther ) ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1881:7: () ( ( ruleOpOther ) )
+            	    // InternalUISemanticsGrammar.g:1974:5: ( () ( ( ruleOpOther ) ) )
+            	    // InternalUISemanticsGrammar.g:1975:6: () ( ( ruleOpOther ) )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1881:7: ()
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1882:5: 
+            	    // InternalUISemanticsGrammar.g:1975:6: ()
+            	    // InternalUISemanticsGrammar.g:1976:7: 
             	    {
             	    if ( state.backtracking==0 ) {
 
-            	              current = forceCreateModelElementAndSet(
-            	                  grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
-            	                  current);
-            	          
+            	      							current = forceCreateModelElementAndSet(
+            	      								grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
+            	      								current);
+            	      						
             	    }
 
             	    }
 
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1887:2: ( ( ruleOpOther ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1888:1: ( ruleOpOther )
+            	    // InternalUISemanticsGrammar.g:1982:6: ( ( ruleOpOther ) )
+            	    // InternalUISemanticsGrammar.g:1983:7: ( ruleOpOther )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1888:1: ( ruleOpOther )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1889:3: ruleOpOther
+            	    // InternalUISemanticsGrammar.g:1983:7: ( ruleOpOther )
+            	    // InternalUISemanticsGrammar.g:1984:8: ruleOpOther
             	    {
             	    if ( state.backtracking==0 ) {
 
-            	      			if (current==null) {
-            	      	            current = createModelElement(grammarAccess.getXOtherOperatorExpressionRule());
-            	      	        }
-            	              
+            	      								if (current==null) {
+            	      									current = createModelElement(grammarAccess.getXOtherOperatorExpressionRule());
+            	      								}
+            	      							
             	    }
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
-            	      	    
+
+            	      								newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
+            	      							
             	    }
-            	    pushFollow(FOLLOW_ruleOpOther_in_ruleXOtherOperatorExpression4324);
+            	    pushFollow(FOLLOW_34);
             	    ruleOpOther();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+
+            	      								afterParserOrEnumRuleCall();
+            	      							
             	    }
 
             	    }
@@ -5634,34 +5763,34 @@
 
             	    }
 
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1902:4: ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1903:1: (lv_rightOperand_3_0= ruleXAdditiveExpression )
+            	    // InternalUISemanticsGrammar.g:2000:4: ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) )
+            	    // InternalUISemanticsGrammar.g:2001:5: (lv_rightOperand_3_0= ruleXAdditiveExpression )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1903:1: (lv_rightOperand_3_0= ruleXAdditiveExpression )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1904:3: lv_rightOperand_3_0= ruleXAdditiveExpression
+            	    // InternalUISemanticsGrammar.g:2001:5: (lv_rightOperand_3_0= ruleXAdditiveExpression )
+            	    // InternalUISemanticsGrammar.g:2002:6: lv_rightOperand_3_0= ruleXAdditiveExpression
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getRightOperandXAdditiveExpressionParserRuleCall_1_1_0()); 
-            	      	    
+
+            	      						newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getRightOperandXAdditiveExpressionParserRuleCall_1_1_0());
+            	      					
             	    }
-            	    pushFollow(FOLLOW_ruleXAdditiveExpression_in_ruleXOtherOperatorExpression4347);
+            	    pushFollow(FOLLOW_43);
             	    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, 
-            	              		"XAdditiveExpression");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getXOtherOperatorExpressionRule());
+            	      						}
+            	      						set(
+            	      							current,
+            	      							"rightOperand",
+            	      							lv_rightOperand_3_0,
+            	      							"org.eclipse.xtext.xbase.Xbase.XAdditiveExpression");
+            	      						afterParserOrEnumRuleCall();
+            	      					
             	    }
 
             	    }
@@ -5674,7 +5803,7 @@
             	    break;
 
             	default :
-            	    break loop34;
+            	    break loop35;
                 }
             } while (true);
 
@@ -5685,14 +5814,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -5701,7 +5832,7 @@
 
 
     // $ANTLR start "entryRuleOpOther"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1928:1: entryRuleOpOther returns [String current=null] : iv_ruleOpOther= ruleOpOther EOF ;
+    // InternalUISemanticsGrammar.g:2024:1: entryRuleOpOther returns [String current=null] : iv_ruleOpOther= ruleOpOther EOF ;
     public final String entryRuleOpOther() throws RecognitionException {
         String current = null;
 
@@ -5709,13 +5840,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1929:2: (iv_ruleOpOther= ruleOpOther EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1930:2: iv_ruleOpOther= ruleOpOther EOF
+            // InternalUISemanticsGrammar.g:2024:47: (iv_ruleOpOther= ruleOpOther EOF )
+            // InternalUISemanticsGrammar.g:2025:2: iv_ruleOpOther= ruleOpOther EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getOpOtherRule()); 
             }
-            pushFollow(FOLLOW_ruleOpOther_in_entryRuleOpOther4386);
+            pushFollow(FOLLOW_1);
             iv_ruleOpOther=ruleOpOther();
 
             state._fsp--;
@@ -5723,16 +5854,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleOpOther.getText(); 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleOpOther4397); 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;
@@ -5741,67 +5872,68 @@
 
 
     // $ANTLR start "ruleOpOther"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1937:1: ruleOpOther returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' ) ;
+    // InternalUISemanticsGrammar.g:2031: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(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1940:28: ( (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1941:1: (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' )
+            // InternalUISemanticsGrammar.g:2037:2: ( (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' ) )
+            // InternalUISemanticsGrammar.g:2038:2: (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' )
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1941:1: (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' )
-            int alt37=9;
-            alt37 = dfa37.predict(input);
-            switch (alt37) {
+            // InternalUISemanticsGrammar.g:2038:2: (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' )
+            int alt38=9;
+            alt38 = dfa38.predict(input);
+            switch (alt38) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1942:2: kw= '->'
+                    // InternalUISemanticsGrammar.g:2039:3: kw= '->'
                     {
-                    kw=(Token)match(input,53,FOLLOW_53_in_ruleOpOther4435); if (state.failed) return current;
+                    kw=(Token)match(input,54,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getOpOtherAccess().getHyphenMinusGreaterThanSignKeyword_0()); 
-                          
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getHyphenMinusGreaterThanSignKeyword_0());
+                      		
                     }
 
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1949:2: kw= '..<'
+                    // InternalUISemanticsGrammar.g:2045:3: kw= '..<'
                     {
-                    kw=(Token)match(input,54,FOLLOW_54_in_ruleOpOther4454); if (state.failed) return current;
+                    kw=(Token)match(input,55,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopLessThanSignKeyword_1()); 
-                          
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopLessThanSignKeyword_1());
+                      		
                     }
 
                     }
                     break;
                 case 3 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1955:6: (kw= '>' kw= '..' )
+                    // InternalUISemanticsGrammar.g:2051:3: (kw= '>' kw= '..' )
                     {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1955:6: (kw= '>' kw= '..' )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1956:2: kw= '>' kw= '..'
+                    // InternalUISemanticsGrammar.g:2051:3: (kw= '>' kw= '..' )
+                    // InternalUISemanticsGrammar.g:2052:4: kw= '>' kw= '..'
                     {
-                    kw=(Token)match(input,44,FOLLOW_44_in_ruleOpOther4474); if (state.failed) return current;
+                    kw=(Token)match(input,45,FOLLOW_44); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_2_0()); 
-                          
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_2_0());
+                      			
                     }
-                    kw=(Token)match(input,55,FOLLOW_55_in_ruleOpOther4487); if (state.failed) return current;
+                    kw=(Token)match(input,56,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_2_1()); 
-                          
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_2_1());
+                      			
                     }
 
                     }
@@ -5810,61 +5942,61 @@
                     }
                     break;
                 case 4 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1969:2: kw= '..'
+                    // InternalUISemanticsGrammar.g:2064:3: kw= '..'
                     {
-                    kw=(Token)match(input,55,FOLLOW_55_in_ruleOpOther4507); if (state.failed) return current;
+                    kw=(Token)match(input,56,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_3()); 
-                          
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_3());
+                      		
                     }
 
                     }
                     break;
                 case 5 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1976:2: kw= '=>'
+                    // InternalUISemanticsGrammar.g:2070:3: kw= '=>'
                     {
-                    kw=(Token)match(input,56,FOLLOW_56_in_ruleOpOther4526); if (state.failed) return current;
+                    kw=(Token)match(input,57,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_4()); 
-                          
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_4());
+                      		
                     }
 
                     }
                     break;
                 case 6 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1982:6: (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) )
+                    // InternalUISemanticsGrammar.g:2076:3: (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) )
                     {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1982:6: (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1983:2: kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' )
+                    // InternalUISemanticsGrammar.g:2076:3: (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) )
+                    // InternalUISemanticsGrammar.g:2077:4: kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' )
                     {
-                    kw=(Token)match(input,44,FOLLOW_44_in_ruleOpOther4546); if (state.failed) return current;
+                    kw=(Token)match(input,45,FOLLOW_45); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_0()); 
-                          
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_0());
+                      			
                     }
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1988:1: ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' )
-                    int alt35=2;
-                    int LA35_0 = input.LA(1);
+                    // InternalUISemanticsGrammar.g:2082:4: ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' )
+                    int alt36=2;
+                    int LA36_0 = input.LA(1);
 
-                    if ( (LA35_0==44) ) {
-                        int LA35_1 = input.LA(2);
+                    if ( (LA36_0==45) ) {
+                        int LA36_1 = input.LA(2);
 
-                        if ( (LA35_1==EOF||(LA35_1>=RULE_STRING && LA35_1<=RULE_DECIMAL)||LA35_1==14||(LA35_1>=19 && LA35_1<=21)||LA35_1==43||(LA35_1>=59 && LA35_1<=60)||LA35_1==64||LA35_1==71||(LA35_1>=73 && LA35_1<=74)||LA35_1==77||LA35_1==79||(LA35_1>=82 && LA35_1<=84)||(LA35_1>=87 && LA35_1<=96)||LA35_1==98) ) {
-                            alt35=2;
+                        if ( (LA36_1==EOF||(LA36_1>=RULE_STRING && LA36_1<=RULE_DECIMAL)||LA36_1==14||(LA36_1>=19 && LA36_1<=21)||LA36_1==33||LA36_1==44||(LA36_1>=60 && LA36_1<=61)||LA36_1==65||LA36_1==72||(LA36_1>=74 && LA36_1<=75)||LA36_1==78||LA36_1==80||(LA36_1>=83 && LA36_1<=85)||(LA36_1>=88 && LA36_1<=96)||LA36_1==98) ) {
+                            alt36=2;
                         }
-                        else if ( (LA35_1==44) && (synpred8_InternalUISemanticsGrammar())) {
-                            alt35=1;
+                        else if ( (LA36_1==45) && (synpred8_InternalUISemanticsGrammar())) {
+                            alt36=1;
                         }
                         else {
                             if (state.backtracking>0) {state.failed=true; return current;}
                             NoViableAltException nvae =
-                                new NoViableAltException("", 35, 1, input);
+                                new NoViableAltException("", 36, 1, input);
 
                             throw nvae;
                         }
@@ -5872,33 +6004,33 @@
                     else {
                         if (state.backtracking>0) {state.failed=true; return current;}
                         NoViableAltException nvae =
-                            new NoViableAltException("", 35, 0, input);
+                            new NoViableAltException("", 36, 0, input);
 
                         throw nvae;
                     }
-                    switch (alt35) {
+                    switch (alt36) {
                         case 1 :
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1988:2: ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) )
+                            // InternalUISemanticsGrammar.g:2083:5: ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) )
                             {
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1988:2: ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) )
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1988:3: ( ( '>' '>' ) )=> (kw= '>' kw= '>' )
+                            // InternalUISemanticsGrammar.g:2083:5: ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) )
+                            // InternalUISemanticsGrammar.g:2084:6: ( ( '>' '>' ) )=> (kw= '>' kw= '>' )
                             {
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1992:5: (kw= '>' kw= '>' )
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:1993:2: kw= '>' kw= '>'
+                            // InternalUISemanticsGrammar.g:2089:6: (kw= '>' kw= '>' )
+                            // InternalUISemanticsGrammar.g:2090:7: kw= '>' kw= '>'
                             {
-                            kw=(Token)match(input,44,FOLLOW_44_in_ruleOpOther4577); if (state.failed) return current;
+                            kw=(Token)match(input,45,FOLLOW_45); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
-                                      current.merge(kw);
-                                      newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_0()); 
-                                  
+                              							current.merge(kw);
+                              							newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_0());
+                              						
                             }
-                            kw=(Token)match(input,44,FOLLOW_44_in_ruleOpOther4590); if (state.failed) return current;
+                            kw=(Token)match(input,45,FOLLOW_2); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
-                                      current.merge(kw);
-                                      newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_1()); 
-                                  
+                              							current.merge(kw);
+                              							newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_1());
+                              						
                             }
 
                             }
@@ -5910,14 +6042,14 @@
                             }
                             break;
                         case 2 :
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2006:2: kw= '>'
+                            // InternalUISemanticsGrammar.g:2103:5: kw= '>'
                             {
-                            kw=(Token)match(input,44,FOLLOW_44_in_ruleOpOther4611); if (state.failed) return current;
+                            kw=(Token)match(input,45,FOLLOW_2); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
-                                      current.merge(kw);
-                                      newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_1()); 
-                                  
+                              					current.merge(kw);
+                              					newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_1());
+                              				
                             }
 
                             }
@@ -5932,72 +6064,72 @@
                     }
                     break;
                 case 7 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2012:6: (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) )
+                    // InternalUISemanticsGrammar.g:2111:3: (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) )
                     {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2012:6: (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2013:2: kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' )
+                    // InternalUISemanticsGrammar.g:2111:3: (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) )
+                    // InternalUISemanticsGrammar.g:2112:4: kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' )
                     {
-                    kw=(Token)match(input,43,FOLLOW_43_in_ruleOpOther4633); if (state.failed) return current;
+                    kw=(Token)match(input,44,FOLLOW_46); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_0()); 
-                          
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_0());
+                      			
                     }
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2018:1: ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' )
-                    int alt36=3;
-                    int LA36_0 = input.LA(1);
+                    // InternalUISemanticsGrammar.g:2117:4: ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' )
+                    int alt37=3;
+                    int LA37_0 = input.LA(1);
 
-                    if ( (LA36_0==43) ) {
-                        int LA36_1 = input.LA(2);
+                    if ( (LA37_0==44) ) {
+                        int LA37_1 = input.LA(2);
 
                         if ( (synpred9_InternalUISemanticsGrammar()) ) {
-                            alt36=1;
+                            alt37=1;
                         }
                         else if ( (true) ) {
-                            alt36=2;
+                            alt37=2;
                         }
                         else {
                             if (state.backtracking>0) {state.failed=true; return current;}
                             NoViableAltException nvae =
-                                new NoViableAltException("", 36, 1, input);
+                                new NoViableAltException("", 37, 1, input);
 
                             throw nvae;
                         }
                     }
-                    else if ( (LA36_0==56) ) {
-                        alt36=3;
+                    else if ( (LA37_0==57) ) {
+                        alt37=3;
                     }
                     else {
                         if (state.backtracking>0) {state.failed=true; return current;}
                         NoViableAltException nvae =
-                            new NoViableAltException("", 36, 0, input);
+                            new NoViableAltException("", 37, 0, input);
 
                         throw nvae;
                     }
-                    switch (alt36) {
+                    switch (alt37) {
                         case 1 :
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2018:2: ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) )
+                            // InternalUISemanticsGrammar.g:2118:5: ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) )
                             {
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2018:2: ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) )
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2018:3: ( ( '<' '<' ) )=> (kw= '<' kw= '<' )
+                            // InternalUISemanticsGrammar.g:2118:5: ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) )
+                            // InternalUISemanticsGrammar.g:2119:6: ( ( '<' '<' ) )=> (kw= '<' kw= '<' )
                             {
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2022:5: (kw= '<' kw= '<' )
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2023:2: kw= '<' kw= '<'
+                            // InternalUISemanticsGrammar.g:2124:6: (kw= '<' kw= '<' )
+                            // InternalUISemanticsGrammar.g:2125:7: kw= '<' kw= '<'
                             {
-                            kw=(Token)match(input,43,FOLLOW_43_in_ruleOpOther4664); if (state.failed) return current;
+                            kw=(Token)match(input,44,FOLLOW_36); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
-                                      current.merge(kw);
-                                      newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_0()); 
-                                  
+                              							current.merge(kw);
+                              							newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_0());
+                              						
                             }
-                            kw=(Token)match(input,43,FOLLOW_43_in_ruleOpOther4677); if (state.failed) return current;
+                            kw=(Token)match(input,44,FOLLOW_2); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
-                                      current.merge(kw);
-                                      newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_1()); 
-                                  
+                              							current.merge(kw);
+                              							newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_1());
+                              						
                             }
 
                             }
@@ -6009,27 +6141,27 @@
                             }
                             break;
                         case 2 :
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2036:2: kw= '<'
+                            // InternalUISemanticsGrammar.g:2138:5: kw= '<'
                             {
-                            kw=(Token)match(input,43,FOLLOW_43_in_ruleOpOther4698); if (state.failed) return current;
+                            kw=(Token)match(input,44,FOLLOW_2); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
-                                      current.merge(kw);
-                                      newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_1()); 
-                                  
+                              					current.merge(kw);
+                              					newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_1());
+                              				
                             }
 
                             }
                             break;
                         case 3 :
-                            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2043:2: kw= '=>'
+                            // InternalUISemanticsGrammar.g:2144:5: kw= '=>'
                             {
-                            kw=(Token)match(input,56,FOLLOW_56_in_ruleOpOther4717); if (state.failed) return current;
+                            kw=(Token)match(input,57,FOLLOW_2); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
-                                      current.merge(kw);
-                                      newLeafNode(kw, grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_6_1_2()); 
-                                  
+                              					current.merge(kw);
+                              					newLeafNode(kw, grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_6_1_2());
+                              				
                             }
 
                             }
@@ -6044,27 +6176,27 @@
                     }
                     break;
                 case 8 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2050:2: kw= '<>'
+                    // InternalUISemanticsGrammar.g:2152:3: kw= '<>'
                     {
-                    kw=(Token)match(input,57,FOLLOW_57_in_ruleOpOther4738); if (state.failed) return current;
+                    kw=(Token)match(input,58,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignGreaterThanSignKeyword_7()); 
-                          
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignGreaterThanSignKeyword_7());
+                      		
                     }
 
                     }
                     break;
                 case 9 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2057:2: kw= '?:'
+                    // InternalUISemanticsGrammar.g:2158:3: kw= '?:'
                     {
-                    kw=(Token)match(input,58,FOLLOW_58_in_ruleOpOther4757); if (state.failed) return current;
+                    kw=(Token)match(input,59,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getOpOtherAccess().getQuestionMarkColonKeyword_8()); 
-                          
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getQuestionMarkColonKeyword_8());
+                      		
                     }
 
                     }
@@ -6076,14 +6208,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -6092,7 +6226,7 @@
 
 
     // $ANTLR start "entryRuleXAdditiveExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2070:1: entryRuleXAdditiveExpression returns [EObject current=null] : iv_ruleXAdditiveExpression= ruleXAdditiveExpression EOF ;
+    // InternalUISemanticsGrammar.g:2167:1: entryRuleXAdditiveExpression returns [EObject current=null] : iv_ruleXAdditiveExpression= ruleXAdditiveExpression EOF ;
     public final EObject entryRuleXAdditiveExpression() throws RecognitionException {
         EObject current = null;
 
@@ -6100,13 +6234,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2071:2: (iv_ruleXAdditiveExpression= ruleXAdditiveExpression EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2072:2: iv_ruleXAdditiveExpression= ruleXAdditiveExpression EOF
+            // InternalUISemanticsGrammar.g:2167:60: (iv_ruleXAdditiveExpression= ruleXAdditiveExpression EOF )
+            // InternalUISemanticsGrammar.g:2168:2: iv_ruleXAdditiveExpression= ruleXAdditiveExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXAdditiveExpressionRule()); 
             }
-            pushFollow(FOLLOW_ruleXAdditiveExpression_in_entryRuleXAdditiveExpression4797);
+            pushFollow(FOLLOW_1);
             iv_ruleXAdditiveExpression=ruleXAdditiveExpression();
 
             state._fsp--;
@@ -6114,16 +6248,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleXAdditiveExpression; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXAdditiveExpression4807); 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;
@@ -6132,7 +6266,7 @@
 
 
     // $ANTLR start "ruleXAdditiveExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2079:1: ruleXAdditiveExpression returns [EObject current=null] : (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* ) ;
+    // InternalUISemanticsGrammar.g:2174: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;
 
@@ -6141,107 +6275,108 @@
         EObject lv_rightOperand_3_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2082:28: ( (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2083:1: (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* )
+            // InternalUISemanticsGrammar.g:2180:2: ( (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* ) )
+            // InternalUISemanticsGrammar.g:2181:2: (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* )
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2083:1: (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2084:5: this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )*
+            // InternalUISemanticsGrammar.g:2181:2: (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* )
+            // InternalUISemanticsGrammar.g:2182:3: this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )*
             {
             if ( state.backtracking==0 ) {
-               
-                      newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getXMultiplicativeExpressionParserRuleCall_0()); 
-                  
+
+              			newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getXMultiplicativeExpressionParserRuleCall_0());
+              		
             }
-            pushFollow(FOLLOW_ruleXMultiplicativeExpression_in_ruleXAdditiveExpression4854);
+            pushFollow(FOLLOW_47);
             this_XMultiplicativeExpression_0=ruleXMultiplicativeExpression();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
-               
-                      current = this_XMultiplicativeExpression_0; 
-                      afterParserOrEnumRuleCall();
-                  
+
+              			current = this_XMultiplicativeExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
             }
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2092:1: ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )*
-            loop38:
+            // InternalUISemanticsGrammar.g:2190:3: ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )*
+            loop39:
             do {
-                int alt38=2;
-                int LA38_0 = input.LA(1);
+                int alt39=2;
+                int LA39_0 = input.LA(1);
 
-                if ( (LA38_0==59) ) {
-                    int LA38_2 = input.LA(2);
+                if ( (LA39_0==60) ) {
+                    int LA39_2 = input.LA(2);
 
                     if ( (synpred10_InternalUISemanticsGrammar()) ) {
-                        alt38=1;
+                        alt39=1;
                     }
 
 
                 }
-                else if ( (LA38_0==60) ) {
-                    int LA38_3 = input.LA(2);
+                else if ( (LA39_0==61) ) {
+                    int LA39_3 = input.LA(2);
 
                     if ( (synpred10_InternalUISemanticsGrammar()) ) {
-                        alt38=1;
+                        alt39=1;
                     }
 
 
                 }
 
 
-                switch (alt38) {
+                switch (alt39) {
             	case 1 :
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2092:2: ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) )
+            	    // InternalUISemanticsGrammar.g:2191:4: ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2092:2: ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2092:3: ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) )
+            	    // InternalUISemanticsGrammar.g:2191:4: ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) )
+            	    // InternalUISemanticsGrammar.g:2192:5: ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2097:6: ( () ( ( ruleOpAdd ) ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2097:7: () ( ( ruleOpAdd ) )
+            	    // InternalUISemanticsGrammar.g:2202:5: ( () ( ( ruleOpAdd ) ) )
+            	    // InternalUISemanticsGrammar.g:2203:6: () ( ( ruleOpAdd ) )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2097:7: ()
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2098:5: 
+            	    // InternalUISemanticsGrammar.g:2203:6: ()
+            	    // InternalUISemanticsGrammar.g:2204:7: 
             	    {
             	    if ( state.backtracking==0 ) {
 
-            	              current = forceCreateModelElementAndSet(
-            	                  grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
-            	                  current);
-            	          
+            	      							current = forceCreateModelElementAndSet(
+            	      								grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
+            	      								current);
+            	      						
             	    }
 
             	    }
 
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2103:2: ( ( ruleOpAdd ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2104:1: ( ruleOpAdd )
+            	    // InternalUISemanticsGrammar.g:2210:6: ( ( ruleOpAdd ) )
+            	    // InternalUISemanticsGrammar.g:2211:7: ( ruleOpAdd )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2104:1: ( ruleOpAdd )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2105:3: ruleOpAdd
+            	    // InternalUISemanticsGrammar.g:2211:7: ( ruleOpAdd )
+            	    // InternalUISemanticsGrammar.g:2212:8: ruleOpAdd
             	    {
             	    if ( state.backtracking==0 ) {
 
-            	      			if (current==null) {
-            	      	            current = createModelElement(grammarAccess.getXAdditiveExpressionRule());
-            	      	        }
-            	              
+            	      								if (current==null) {
+            	      									current = createModelElement(grammarAccess.getXAdditiveExpressionRule());
+            	      								}
+            	      							
             	    }
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
-            	      	    
+
+            	      								newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
+            	      							
             	    }
-            	    pushFollow(FOLLOW_ruleOpAdd_in_ruleXAdditiveExpression4907);
+            	    pushFollow(FOLLOW_34);
             	    ruleOpAdd();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+
+            	      								afterParserOrEnumRuleCall();
+            	      							
             	    }
 
             	    }
@@ -6255,34 +6390,34 @@
 
             	    }
 
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2118:4: ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2119:1: (lv_rightOperand_3_0= ruleXMultiplicativeExpression )
+            	    // InternalUISemanticsGrammar.g:2228:4: ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) )
+            	    // InternalUISemanticsGrammar.g:2229:5: (lv_rightOperand_3_0= ruleXMultiplicativeExpression )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2119:1: (lv_rightOperand_3_0= ruleXMultiplicativeExpression )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2120:3: lv_rightOperand_3_0= ruleXMultiplicativeExpression
+            	    // InternalUISemanticsGrammar.g:2229:5: (lv_rightOperand_3_0= ruleXMultiplicativeExpression )
+            	    // InternalUISemanticsGrammar.g:2230:6: lv_rightOperand_3_0= ruleXMultiplicativeExpression
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getRightOperandXMultiplicativeExpressionParserRuleCall_1_1_0()); 
-            	      	    
+
+            	      						newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getRightOperandXMultiplicativeExpressionParserRuleCall_1_1_0());
+            	      					
             	    }
-            	    pushFollow(FOLLOW_ruleXMultiplicativeExpression_in_ruleXAdditiveExpression4930);
+            	    pushFollow(FOLLOW_47);
             	    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, 
-            	              		"XMultiplicativeExpression");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getXAdditiveExpressionRule());
+            	      						}
+            	      						set(
+            	      							current,
+            	      							"rightOperand",
+            	      							lv_rightOperand_3_0,
+            	      							"org.eclipse.xtext.xbase.Xbase.XMultiplicativeExpression");
+            	      						afterParserOrEnumRuleCall();
+            	      					
             	    }
 
             	    }
@@ -6295,7 +6430,7 @@
             	    break;
 
             	default :
-            	    break loop38;
+            	    break loop39;
                 }
             } while (true);
 
@@ -6306,14 +6441,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -6322,7 +6459,7 @@
 
 
     // $ANTLR start "entryRuleOpAdd"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2144:1: entryRuleOpAdd returns [String current=null] : iv_ruleOpAdd= ruleOpAdd EOF ;
+    // InternalUISemanticsGrammar.g:2252:1: entryRuleOpAdd returns [String current=null] : iv_ruleOpAdd= ruleOpAdd EOF ;
     public final String entryRuleOpAdd() throws RecognitionException {
         String current = null;
 
@@ -6330,13 +6467,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2145:2: (iv_ruleOpAdd= ruleOpAdd EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2146:2: iv_ruleOpAdd= ruleOpAdd EOF
+            // InternalUISemanticsGrammar.g:2252:45: (iv_ruleOpAdd= ruleOpAdd EOF )
+            // InternalUISemanticsGrammar.g:2253:2: iv_ruleOpAdd= ruleOpAdd EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getOpAddRule()); 
             }
-            pushFollow(FOLLOW_ruleOpAdd_in_entryRuleOpAdd4969);
+            pushFollow(FOLLOW_1);
             iv_ruleOpAdd=ruleOpAdd();
 
             state._fsp--;
@@ -6344,16 +6481,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleOpAdd.getText(); 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleOpAdd4980); 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;
@@ -6362,58 +6499,59 @@
 
 
     // $ANTLR start "ruleOpAdd"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2153:1: ruleOpAdd returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '+' | kw= '-' ) ;
+    // InternalUISemanticsGrammar.g:2259:1: ruleOpAdd returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '+' | kw= '-' ) ;
     public final AntlrDatatypeRuleToken ruleOpAdd() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
         Token kw=null;
 
-         enterRule(); 
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2156:28: ( (kw= '+' | kw= '-' ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2157:1: (kw= '+' | kw= '-' )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2157:1: (kw= '+' | kw= '-' )
-            int alt39=2;
-            int LA39_0 = input.LA(1);
 
-            if ( (LA39_0==59) ) {
-                alt39=1;
+        	enterRule();
+
+        try {
+            // InternalUISemanticsGrammar.g:2265:2: ( (kw= '+' | kw= '-' ) )
+            // InternalUISemanticsGrammar.g:2266:2: (kw= '+' | kw= '-' )
+            {
+            // InternalUISemanticsGrammar.g:2266:2: (kw= '+' | kw= '-' )
+            int alt40=2;
+            int LA40_0 = input.LA(1);
+
+            if ( (LA40_0==60) ) {
+                alt40=1;
             }
-            else if ( (LA39_0==60) ) {
-                alt39=2;
+            else if ( (LA40_0==61) ) {
+                alt40=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 39, 0, input);
+                    new NoViableAltException("", 40, 0, input);
 
                 throw nvae;
             }
-            switch (alt39) {
+            switch (alt40) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2158:2: kw= '+'
+                    // InternalUISemanticsGrammar.g:2267:3: kw= '+'
                     {
-                    kw=(Token)match(input,59,FOLLOW_59_in_ruleOpAdd5018); if (state.failed) return current;
+                    kw=(Token)match(input,60,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getOpAddAccess().getPlusSignKeyword_0()); 
-                          
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpAddAccess().getPlusSignKeyword_0());
+                      		
                     }
 
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2165:2: kw= '-'
+                    // InternalUISemanticsGrammar.g:2273:3: kw= '-'
                     {
-                    kw=(Token)match(input,60,FOLLOW_60_in_ruleOpAdd5037); if (state.failed) return current;
+                    kw=(Token)match(input,61,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getOpAddAccess().getHyphenMinusKeyword_1()); 
-                          
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpAddAccess().getHyphenMinusKeyword_1());
+                      		
                     }
 
                     }
@@ -6425,14 +6563,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -6441,7 +6581,7 @@
 
 
     // $ANTLR start "entryRuleXMultiplicativeExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2178:1: entryRuleXMultiplicativeExpression returns [EObject current=null] : iv_ruleXMultiplicativeExpression= ruleXMultiplicativeExpression EOF ;
+    // InternalUISemanticsGrammar.g:2282:1: entryRuleXMultiplicativeExpression returns [EObject current=null] : iv_ruleXMultiplicativeExpression= ruleXMultiplicativeExpression EOF ;
     public final EObject entryRuleXMultiplicativeExpression() throws RecognitionException {
         EObject current = null;
 
@@ -6449,13 +6589,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2179:2: (iv_ruleXMultiplicativeExpression= ruleXMultiplicativeExpression EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2180:2: iv_ruleXMultiplicativeExpression= ruleXMultiplicativeExpression EOF
+            // InternalUISemanticsGrammar.g:2282:66: (iv_ruleXMultiplicativeExpression= ruleXMultiplicativeExpression EOF )
+            // InternalUISemanticsGrammar.g:2283:2: iv_ruleXMultiplicativeExpression= ruleXMultiplicativeExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXMultiplicativeExpressionRule()); 
             }
-            pushFollow(FOLLOW_ruleXMultiplicativeExpression_in_entryRuleXMultiplicativeExpression5077);
+            pushFollow(FOLLOW_1);
             iv_ruleXMultiplicativeExpression=ruleXMultiplicativeExpression();
 
             state._fsp--;
@@ -6463,16 +6603,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleXMultiplicativeExpression; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXMultiplicativeExpression5087); 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;
@@ -6481,7 +6621,7 @@
 
 
     // $ANTLR start "ruleXMultiplicativeExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2187:1: ruleXMultiplicativeExpression returns [EObject current=null] : (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* ) ;
+    // InternalUISemanticsGrammar.g:2289: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;
 
@@ -6490,53 +6630,43 @@
         EObject lv_rightOperand_3_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2190:28: ( (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2191:1: (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* )
+            // InternalUISemanticsGrammar.g:2295:2: ( (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* ) )
+            // InternalUISemanticsGrammar.g:2296:2: (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* )
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2191:1: (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2192:5: this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )*
+            // InternalUISemanticsGrammar.g:2296:2: (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* )
+            // InternalUISemanticsGrammar.g:2297:3: this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )*
             {
             if ( state.backtracking==0 ) {
-               
-                      newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getXUnaryOperationParserRuleCall_0()); 
-                  
+
+              			newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getXUnaryOperationParserRuleCall_0());
+              		
             }
-            pushFollow(FOLLOW_ruleXUnaryOperation_in_ruleXMultiplicativeExpression5134);
+            pushFollow(FOLLOW_48);
             this_XUnaryOperation_0=ruleXUnaryOperation();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
-               
-                      current = this_XUnaryOperation_0; 
-                      afterParserOrEnumRuleCall();
-                  
+
+              			current = this_XUnaryOperation_0;
+              			afterParserOrEnumRuleCall();
+              		
             }
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2200:1: ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )*
-            loop40:
+            // InternalUISemanticsGrammar.g:2305:3: ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )*
+            loop41:
             do {
-                int alt40=2;
+                int alt41=2;
                 switch ( input.LA(1) ) {
                 case 22:
                     {
-                    int LA40_2 = input.LA(2);
+                    int LA41_2 = input.LA(2);
 
                     if ( (synpred11_InternalUISemanticsGrammar()) ) {
-                        alt40=1;
-                    }
-
-
-                    }
-                    break;
-                case 61:
-                    {
-                    int LA40_3 = input.LA(2);
-
-                    if ( (synpred11_InternalUISemanticsGrammar()) ) {
-                        alt40=1;
+                        alt41=1;
                     }
 
 
@@ -6544,10 +6674,10 @@
                     break;
                 case 62:
                     {
-                    int LA40_4 = input.LA(2);
+                    int LA41_3 = input.LA(2);
 
                     if ( (synpred11_InternalUISemanticsGrammar()) ) {
-                        alt40=1;
+                        alt41=1;
                     }
 
 
@@ -6555,10 +6685,21 @@
                     break;
                 case 63:
                     {
-                    int LA40_5 = input.LA(2);
+                    int LA41_4 = input.LA(2);
 
                     if ( (synpred11_InternalUISemanticsGrammar()) ) {
-                        alt40=1;
+                        alt41=1;
+                    }
+
+
+                    }
+                    break;
+                case 64:
+                    {
+                    int LA41_5 = input.LA(2);
+
+                    if ( (synpred11_InternalUISemanticsGrammar()) ) {
+                        alt41=1;
                     }
 
 
@@ -6567,56 +6708,56 @@
 
                 }
 
-                switch (alt40) {
+                switch (alt41) {
             	case 1 :
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2200:2: ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) )
+            	    // InternalUISemanticsGrammar.g:2306:4: ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2200:2: ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2200:3: ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) )
+            	    // InternalUISemanticsGrammar.g:2306:4: ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) )
+            	    // InternalUISemanticsGrammar.g:2307:5: ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2205:6: ( () ( ( ruleOpMulti ) ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2205:7: () ( ( ruleOpMulti ) )
+            	    // InternalUISemanticsGrammar.g:2317:5: ( () ( ( ruleOpMulti ) ) )
+            	    // InternalUISemanticsGrammar.g:2318:6: () ( ( ruleOpMulti ) )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2205:7: ()
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2206:5: 
+            	    // InternalUISemanticsGrammar.g:2318:6: ()
+            	    // InternalUISemanticsGrammar.g:2319:7: 
             	    {
             	    if ( state.backtracking==0 ) {
 
-            	              current = forceCreateModelElementAndSet(
-            	                  grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
-            	                  current);
-            	          
+            	      							current = forceCreateModelElementAndSet(
+            	      								grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
+            	      								current);
+            	      						
             	    }
 
             	    }
 
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2211:2: ( ( ruleOpMulti ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2212:1: ( ruleOpMulti )
+            	    // InternalUISemanticsGrammar.g:2325:6: ( ( ruleOpMulti ) )
+            	    // InternalUISemanticsGrammar.g:2326:7: ( ruleOpMulti )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2212:1: ( ruleOpMulti )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2213:3: ruleOpMulti
+            	    // InternalUISemanticsGrammar.g:2326:7: ( ruleOpMulti )
+            	    // InternalUISemanticsGrammar.g:2327:8: ruleOpMulti
             	    {
             	    if ( state.backtracking==0 ) {
 
-            	      			if (current==null) {
-            	      	            current = createModelElement(grammarAccess.getXMultiplicativeExpressionRule());
-            	      	        }
-            	              
+            	      								if (current==null) {
+            	      									current = createModelElement(grammarAccess.getXMultiplicativeExpressionRule());
+            	      								}
+            	      							
             	    }
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
-            	      	    
+
+            	      								newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
+            	      							
             	    }
-            	    pushFollow(FOLLOW_ruleOpMulti_in_ruleXMultiplicativeExpression5187);
+            	    pushFollow(FOLLOW_34);
             	    ruleOpMulti();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+
+            	      								afterParserOrEnumRuleCall();
+            	      							
             	    }
 
             	    }
@@ -6630,34 +6771,34 @@
 
             	    }
 
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2226:4: ( (lv_rightOperand_3_0= ruleXUnaryOperation ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2227:1: (lv_rightOperand_3_0= ruleXUnaryOperation )
+            	    // InternalUISemanticsGrammar.g:2343:4: ( (lv_rightOperand_3_0= ruleXUnaryOperation ) )
+            	    // InternalUISemanticsGrammar.g:2344:5: (lv_rightOperand_3_0= ruleXUnaryOperation )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2227:1: (lv_rightOperand_3_0= ruleXUnaryOperation )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2228:3: lv_rightOperand_3_0= ruleXUnaryOperation
+            	    // InternalUISemanticsGrammar.g:2344:5: (lv_rightOperand_3_0= ruleXUnaryOperation )
+            	    // InternalUISemanticsGrammar.g:2345:6: lv_rightOperand_3_0= ruleXUnaryOperation
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getRightOperandXUnaryOperationParserRuleCall_1_1_0()); 
-            	      	    
+
+            	      						newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getRightOperandXUnaryOperationParserRuleCall_1_1_0());
+            	      					
             	    }
-            	    pushFollow(FOLLOW_ruleXUnaryOperation_in_ruleXMultiplicativeExpression5210);
+            	    pushFollow(FOLLOW_48);
             	    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, 
-            	              		"XUnaryOperation");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getXMultiplicativeExpressionRule());
+            	      						}
+            	      						set(
+            	      							current,
+            	      							"rightOperand",
+            	      							lv_rightOperand_3_0,
+            	      							"org.eclipse.xtext.xbase.Xbase.XUnaryOperation");
+            	      						afterParserOrEnumRuleCall();
+            	      					
             	    }
 
             	    }
@@ -6670,7 +6811,7 @@
             	    break;
 
             	default :
-            	    break loop40;
+            	    break loop41;
                 }
             } while (true);
 
@@ -6681,14 +6822,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -6697,7 +6840,7 @@
 
 
     // $ANTLR start "entryRuleOpMulti"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2252:1: entryRuleOpMulti returns [String current=null] : iv_ruleOpMulti= ruleOpMulti EOF ;
+    // InternalUISemanticsGrammar.g:2367:1: entryRuleOpMulti returns [String current=null] : iv_ruleOpMulti= ruleOpMulti EOF ;
     public final String entryRuleOpMulti() throws RecognitionException {
         String current = null;
 
@@ -6705,13 +6848,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2253:2: (iv_ruleOpMulti= ruleOpMulti EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2254:2: iv_ruleOpMulti= ruleOpMulti EOF
+            // InternalUISemanticsGrammar.g:2367:47: (iv_ruleOpMulti= ruleOpMulti EOF )
+            // InternalUISemanticsGrammar.g:2368:2: iv_ruleOpMulti= ruleOpMulti EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getOpMultiRule()); 
             }
-            pushFollow(FOLLOW_ruleOpMulti_in_entryRuleOpMulti5249);
+            pushFollow(FOLLOW_1);
             iv_ruleOpMulti=ruleOpMulti();
 
             state._fsp--;
@@ -6719,16 +6862,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleOpMulti.getText(); 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleOpMulti5260); 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;
@@ -6737,98 +6880,99 @@
 
 
     // $ANTLR start "ruleOpMulti"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2261:1: ruleOpMulti returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '*' | kw= '**' | kw= '/' | kw= '%' ) ;
+    // InternalUISemanticsGrammar.g:2374: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(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2264:28: ( (kw= '*' | kw= '**' | kw= '/' | kw= '%' ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2265:1: (kw= '*' | kw= '**' | kw= '/' | kw= '%' )
+            // InternalUISemanticsGrammar.g:2380:2: ( (kw= '*' | kw= '**' | kw= '/' | kw= '%' ) )
+            // InternalUISemanticsGrammar.g:2381:2: (kw= '*' | kw= '**' | kw= '/' | kw= '%' )
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2265:1: (kw= '*' | kw= '**' | kw= '/' | kw= '%' )
-            int alt41=4;
+            // InternalUISemanticsGrammar.g:2381:2: (kw= '*' | kw= '**' | kw= '/' | kw= '%' )
+            int alt42=4;
             switch ( input.LA(1) ) {
             case 22:
                 {
-                alt41=1;
-                }
-                break;
-            case 61:
-                {
-                alt41=2;
+                alt42=1;
                 }
                 break;
             case 62:
                 {
-                alt41=3;
+                alt42=2;
                 }
                 break;
             case 63:
                 {
-                alt41=4;
+                alt42=3;
+                }
+                break;
+            case 64:
+                {
+                alt42=4;
                 }
                 break;
             default:
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 41, 0, input);
+                    new NoViableAltException("", 42, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt41) {
+            switch (alt42) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2266:2: kw= '*'
+                    // InternalUISemanticsGrammar.g:2382:3: kw= '*'
                     {
-                    kw=(Token)match(input,22,FOLLOW_22_in_ruleOpMulti5298); if (state.failed) return current;
+                    kw=(Token)match(input,22,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getOpMultiAccess().getAsteriskKeyword_0()); 
-                          
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpMultiAccess().getAsteriskKeyword_0());
+                      		
                     }
 
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2273:2: kw= '**'
+                    // InternalUISemanticsGrammar.g:2388:3: kw= '**'
                     {
-                    kw=(Token)match(input,61,FOLLOW_61_in_ruleOpMulti5317); if (state.failed) return current;
+                    kw=(Token)match(input,62,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getOpMultiAccess().getAsteriskAsteriskKeyword_1()); 
-                          
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpMultiAccess().getAsteriskAsteriskKeyword_1());
+                      		
                     }
 
                     }
                     break;
                 case 3 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2280:2: kw= '/'
+                    // InternalUISemanticsGrammar.g:2394:3: kw= '/'
                     {
-                    kw=(Token)match(input,62,FOLLOW_62_in_ruleOpMulti5336); if (state.failed) return current;
+                    kw=(Token)match(input,63,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getOpMultiAccess().getSolidusKeyword_2()); 
-                          
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpMultiAccess().getSolidusKeyword_2());
+                      		
                     }
 
                     }
                     break;
                 case 4 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2287:2: kw= '%'
+                    // InternalUISemanticsGrammar.g:2400:3: kw= '%'
                     {
-                    kw=(Token)match(input,63,FOLLOW_63_in_ruleOpMulti5355); if (state.failed) return current;
+                    kw=(Token)match(input,64,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getOpMultiAccess().getPercentSignKeyword_3()); 
-                          
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpMultiAccess().getPercentSignKeyword_3());
+                      		
                     }
 
                     }
@@ -6840,14 +6984,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -6856,7 +7002,7 @@
 
 
     // $ANTLR start "entryRuleXUnaryOperation"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2300:1: entryRuleXUnaryOperation returns [EObject current=null] : iv_ruleXUnaryOperation= ruleXUnaryOperation EOF ;
+    // InternalUISemanticsGrammar.g:2409:1: entryRuleXUnaryOperation returns [EObject current=null] : iv_ruleXUnaryOperation= ruleXUnaryOperation EOF ;
     public final EObject entryRuleXUnaryOperation() throws RecognitionException {
         EObject current = null;
 
@@ -6864,13 +7010,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2301:2: (iv_ruleXUnaryOperation= ruleXUnaryOperation EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2302:2: iv_ruleXUnaryOperation= ruleXUnaryOperation EOF
+            // InternalUISemanticsGrammar.g:2409:56: (iv_ruleXUnaryOperation= ruleXUnaryOperation EOF )
+            // InternalUISemanticsGrammar.g:2410:2: iv_ruleXUnaryOperation= ruleXUnaryOperation EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXUnaryOperationRule()); 
             }
-            pushFollow(FOLLOW_ruleXUnaryOperation_in_entryRuleXUnaryOperation5395);
+            pushFollow(FOLLOW_1);
             iv_ruleXUnaryOperation=ruleXUnaryOperation();
 
             state._fsp--;
@@ -6878,16 +7024,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleXUnaryOperation; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXUnaryOperation5405); 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;
@@ -6896,7 +7042,7 @@
 
 
     // $ANTLR start "ruleXUnaryOperation"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2309:1: ruleXUnaryOperation returns [EObject current=null] : ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression ) ;
+    // InternalUISemanticsGrammar.g:2416: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;
 
@@ -6905,76 +7051,77 @@
         EObject this_XCastedExpression_3 = null;
 
 
-         enterRule(); 
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2312:28: ( ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2313:1: ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2313:1: ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression )
-            int alt42=2;
-            int LA42_0 = input.LA(1);
 
-            if ( ((LA42_0>=59 && LA42_0<=60)||LA42_0==64) ) {
-                alt42=1;
+        	enterRule();
+
+        try {
+            // InternalUISemanticsGrammar.g:2422:2: ( ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression ) )
+            // InternalUISemanticsGrammar.g:2423:2: ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression )
+            {
+            // InternalUISemanticsGrammar.g:2423:2: ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression )
+            int alt43=2;
+            int LA43_0 = input.LA(1);
+
+            if ( ((LA43_0>=60 && LA43_0<=61)||LA43_0==65) ) {
+                alt43=1;
             }
-            else if ( ((LA42_0>=RULE_STRING && LA42_0<=RULE_DECIMAL)||LA42_0==14||(LA42_0>=19 && LA42_0<=21)||LA42_0==43||LA42_0==71||(LA42_0>=73 && LA42_0<=74)||LA42_0==77||LA42_0==79||(LA42_0>=82 && LA42_0<=84)||(LA42_0>=87 && LA42_0<=96)||LA42_0==98) ) {
-                alt42=2;
+            else if ( ((LA43_0>=RULE_STRING && LA43_0<=RULE_DECIMAL)||LA43_0==14||(LA43_0>=19 && LA43_0<=21)||LA43_0==33||LA43_0==44||LA43_0==72||(LA43_0>=74 && LA43_0<=75)||LA43_0==78||LA43_0==80||(LA43_0>=83 && LA43_0<=85)||(LA43_0>=88 && LA43_0<=96)||LA43_0==98) ) {
+                alt43=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 42, 0, input);
+                    new NoViableAltException("", 43, 0, input);
 
                 throw nvae;
             }
-            switch (alt42) {
+            switch (alt43) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2313:2: ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) )
+                    // InternalUISemanticsGrammar.g:2424:3: ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) )
                     {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2313:2: ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2313:3: () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) )
+                    // InternalUISemanticsGrammar.g:2424:3: ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) )
+                    // InternalUISemanticsGrammar.g:2425:4: () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) )
                     {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2313:3: ()
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2314:5: 
+                    // InternalUISemanticsGrammar.g:2425:4: ()
+                    // InternalUISemanticsGrammar.g:2426:5: 
                     {
                     if ( state.backtracking==0 ) {
 
-                              current = forceCreateModelElement(
-                                  grammarAccess.getXUnaryOperationAccess().getXUnaryOperationAction_0_0(),
-                                  current);
-                          
+                      					current = forceCreateModelElement(
+                      						grammarAccess.getXUnaryOperationAccess().getXUnaryOperationAction_0_0(),
+                      						current);
+                      				
                     }
 
                     }
 
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2319:2: ( ( ruleOpUnary ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2320:1: ( ruleOpUnary )
+                    // InternalUISemanticsGrammar.g:2432:4: ( ( ruleOpUnary ) )
+                    // InternalUISemanticsGrammar.g:2433:5: ( ruleOpUnary )
                     {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2320:1: ( ruleOpUnary )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2321:3: ruleOpUnary
+                    // InternalUISemanticsGrammar.g:2433:5: ( ruleOpUnary )
+                    // InternalUISemanticsGrammar.g:2434:6: ruleOpUnary
                     {
                     if ( state.backtracking==0 ) {
 
-                      			if (current==null) {
-                      	            current = createModelElement(grammarAccess.getXUnaryOperationRule());
-                      	        }
-                              
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getXUnaryOperationRule());
+                      						}
+                      					
                     }
                     if ( state.backtracking==0 ) {
-                       
-                      	        newCompositeNode(grammarAccess.getXUnaryOperationAccess().getFeatureJvmIdentifiableElementCrossReference_0_1_0()); 
-                      	    
+
+                      						newCompositeNode(grammarAccess.getXUnaryOperationAccess().getFeatureJvmIdentifiableElementCrossReference_0_1_0());
+                      					
                     }
-                    pushFollow(FOLLOW_ruleOpUnary_in_ruleXUnaryOperation5463);
+                    pushFollow(FOLLOW_34);
                     ruleOpUnary();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                      	        afterParserOrEnumRuleCall();
-                      	    
+
+                      						afterParserOrEnumRuleCall();
+                      					
                     }
 
                     }
@@ -6982,34 +7129,34 @@
 
                     }
 
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2334:2: ( (lv_operand_2_0= ruleXUnaryOperation ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2335:1: (lv_operand_2_0= ruleXUnaryOperation )
+                    // InternalUISemanticsGrammar.g:2448:4: ( (lv_operand_2_0= ruleXUnaryOperation ) )
+                    // InternalUISemanticsGrammar.g:2449:5: (lv_operand_2_0= ruleXUnaryOperation )
                     {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2335:1: (lv_operand_2_0= ruleXUnaryOperation )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2336:3: lv_operand_2_0= ruleXUnaryOperation
+                    // InternalUISemanticsGrammar.g:2449:5: (lv_operand_2_0= ruleXUnaryOperation )
+                    // InternalUISemanticsGrammar.g:2450:6: lv_operand_2_0= ruleXUnaryOperation
                     {
                     if ( state.backtracking==0 ) {
-                       
-                      	        newCompositeNode(grammarAccess.getXUnaryOperationAccess().getOperandXUnaryOperationParserRuleCall_0_2_0()); 
-                      	    
+
+                      						newCompositeNode(grammarAccess.getXUnaryOperationAccess().getOperandXUnaryOperationParserRuleCall_0_2_0());
+                      					
                     }
-                    pushFollow(FOLLOW_ruleXUnaryOperation_in_ruleXUnaryOperation5484);
+                    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, 
-                              		"XUnaryOperation");
-                      	        afterParserOrEnumRuleCall();
-                      	    
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getXUnaryOperationRule());
+                      						}
+                      						set(
+                      							current,
+                      							"operand",
+                      							lv_operand_2_0,
+                      							"org.eclipse.xtext.xbase.Xbase.XUnaryOperation");
+                      						afterParserOrEnumRuleCall();
+                      					
                     }
 
                     }
@@ -7024,23 +7171,23 @@
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2354:5: this_XCastedExpression_3= ruleXCastedExpression
+                    // InternalUISemanticsGrammar.g:2469:3: this_XCastedExpression_3= ruleXCastedExpression
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getXUnaryOperationAccess().getXCastedExpressionParserRuleCall_1()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getXUnaryOperationAccess().getXCastedExpressionParserRuleCall_1());
+                      		
                     }
-                    pushFollow(FOLLOW_ruleXCastedExpression_in_ruleXUnaryOperation5513);
+                    pushFollow(FOLLOW_2);
                     this_XCastedExpression_3=ruleXCastedExpression();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_XCastedExpression_3; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_XCastedExpression_3;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
@@ -7052,14 +7199,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -7068,7 +7217,7 @@
 
 
     // $ANTLR start "entryRuleOpUnary"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2370:1: entryRuleOpUnary returns [String current=null] : iv_ruleOpUnary= ruleOpUnary EOF ;
+    // InternalUISemanticsGrammar.g:2481:1: entryRuleOpUnary returns [String current=null] : iv_ruleOpUnary= ruleOpUnary EOF ;
     public final String entryRuleOpUnary() throws RecognitionException {
         String current = null;
 
@@ -7076,13 +7225,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2371:2: (iv_ruleOpUnary= ruleOpUnary EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2372:2: iv_ruleOpUnary= ruleOpUnary EOF
+            // InternalUISemanticsGrammar.g:2481:47: (iv_ruleOpUnary= ruleOpUnary EOF )
+            // InternalUISemanticsGrammar.g:2482:2: iv_ruleOpUnary= ruleOpUnary EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getOpUnaryRule()); 
             }
-            pushFollow(FOLLOW_ruleOpUnary_in_entryRuleOpUnary5549);
+            pushFollow(FOLLOW_1);
             iv_ruleOpUnary=ruleOpUnary();
 
             state._fsp--;
@@ -7090,16 +7239,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleOpUnary.getText(); 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleOpUnary5560); 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;
@@ -7108,80 +7257,81 @@
 
 
     // $ANTLR start "ruleOpUnary"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2379:1: ruleOpUnary returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '!' | kw= '-' | kw= '+' ) ;
+    // InternalUISemanticsGrammar.g:2488:1: ruleOpUnary returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '!' | kw= '-' | kw= '+' ) ;
     public final AntlrDatatypeRuleToken ruleOpUnary() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
         Token kw=null;
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2382:28: ( (kw= '!' | kw= '-' | kw= '+' ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2383:1: (kw= '!' | kw= '-' | kw= '+' )
+            // InternalUISemanticsGrammar.g:2494:2: ( (kw= '!' | kw= '-' | kw= '+' ) )
+            // InternalUISemanticsGrammar.g:2495:2: (kw= '!' | kw= '-' | kw= '+' )
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2383:1: (kw= '!' | kw= '-' | kw= '+' )
-            int alt43=3;
+            // InternalUISemanticsGrammar.g:2495:2: (kw= '!' | kw= '-' | kw= '+' )
+            int alt44=3;
             switch ( input.LA(1) ) {
-            case 64:
+            case 65:
                 {
-                alt43=1;
+                alt44=1;
+                }
+                break;
+            case 61:
+                {
+                alt44=2;
                 }
                 break;
             case 60:
                 {
-                alt43=2;
-                }
-                break;
-            case 59:
-                {
-                alt43=3;
+                alt44=3;
                 }
                 break;
             default:
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 43, 0, input);
+                    new NoViableAltException("", 44, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt43) {
+            switch (alt44) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2384:2: kw= '!'
+                    // InternalUISemanticsGrammar.g:2496:3: kw= '!'
                     {
-                    kw=(Token)match(input,64,FOLLOW_64_in_ruleOpUnary5598); if (state.failed) return current;
+                    kw=(Token)match(input,65,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getOpUnaryAccess().getExclamationMarkKeyword_0()); 
-                          
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpUnaryAccess().getExclamationMarkKeyword_0());
+                      		
                     }
 
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2391:2: kw= '-'
+                    // InternalUISemanticsGrammar.g:2502:3: kw= '-'
                     {
-                    kw=(Token)match(input,60,FOLLOW_60_in_ruleOpUnary5617); if (state.failed) return current;
+                    kw=(Token)match(input,61,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getOpUnaryAccess().getHyphenMinusKeyword_1()); 
-                          
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpUnaryAccess().getHyphenMinusKeyword_1());
+                      		
                     }
 
                     }
                     break;
                 case 3 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2398:2: kw= '+'
+                    // InternalUISemanticsGrammar.g:2508:3: kw= '+'
                     {
-                    kw=(Token)match(input,59,FOLLOW_59_in_ruleOpUnary5636); if (state.failed) return current;
+                    kw=(Token)match(input,60,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getOpUnaryAccess().getPlusSignKeyword_2()); 
-                          
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpUnaryAccess().getPlusSignKeyword_2());
+                      		
                     }
 
                     }
@@ -7193,14 +7343,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -7209,7 +7361,7 @@
 
 
     // $ANTLR start "entryRuleXCastedExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2411:1: entryRuleXCastedExpression returns [EObject current=null] : iv_ruleXCastedExpression= ruleXCastedExpression EOF ;
+    // InternalUISemanticsGrammar.g:2517:1: entryRuleXCastedExpression returns [EObject current=null] : iv_ruleXCastedExpression= ruleXCastedExpression EOF ;
     public final EObject entryRuleXCastedExpression() throws RecognitionException {
         EObject current = null;
 
@@ -7217,13 +7369,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2412:2: (iv_ruleXCastedExpression= ruleXCastedExpression EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2413:2: iv_ruleXCastedExpression= ruleXCastedExpression EOF
+            // InternalUISemanticsGrammar.g:2517:58: (iv_ruleXCastedExpression= ruleXCastedExpression EOF )
+            // InternalUISemanticsGrammar.g:2518:2: iv_ruleXCastedExpression= ruleXCastedExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXCastedExpressionRule()); 
             }
-            pushFollow(FOLLOW_ruleXCastedExpression_in_entryRuleXCastedExpression5676);
+            pushFollow(FOLLOW_1);
             iv_ruleXCastedExpression=ruleXCastedExpression();
 
             state._fsp--;
@@ -7231,16 +7383,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleXCastedExpression; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXCastedExpression5686); 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;
@@ -7249,7 +7401,7 @@
 
 
     // $ANTLR start "ruleXCastedExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2420:1: ruleXCastedExpression returns [EObject current=null] : (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* ) ;
+    // InternalUISemanticsGrammar.g:2524: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;
 
@@ -7259,76 +7411,77 @@
         EObject lv_type_3_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2423:28: ( (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2424:1: (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* )
+            // InternalUISemanticsGrammar.g:2530:2: ( (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* ) )
+            // InternalUISemanticsGrammar.g:2531:2: (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* )
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2424:1: (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2425:5: this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )*
+            // InternalUISemanticsGrammar.g:2531:2: (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* )
+            // InternalUISemanticsGrammar.g:2532:3: this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )*
             {
             if ( state.backtracking==0 ) {
-               
-                      newCompositeNode(grammarAccess.getXCastedExpressionAccess().getXPostfixOperationParserRuleCall_0()); 
-                  
+
+              			newCompositeNode(grammarAccess.getXCastedExpressionAccess().getXPostfixOperationParserRuleCall_0());
+              		
             }
-            pushFollow(FOLLOW_ruleXPostfixOperation_in_ruleXCastedExpression5733);
+            pushFollow(FOLLOW_49);
             this_XPostfixOperation_0=ruleXPostfixOperation();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
-               
-                      current = this_XPostfixOperation_0; 
-                      afterParserOrEnumRuleCall();
-                  
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2433:1: ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )*
-            loop44:
-            do {
-                int alt44=2;
-                int LA44_0 = input.LA(1);
 
-                if ( (LA44_0==25) ) {
-                    int LA44_2 = input.LA(2);
+              			current = this_XPostfixOperation_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalUISemanticsGrammar.g:2540:3: ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )*
+            loop45:
+            do {
+                int alt45=2;
+                int LA45_0 = input.LA(1);
+
+                if ( (LA45_0==25) ) {
+                    int LA45_2 = input.LA(2);
 
                     if ( (synpred12_InternalUISemanticsGrammar()) ) {
-                        alt44=1;
+                        alt45=1;
                     }
 
 
                 }
 
 
-                switch (alt44) {
+                switch (alt45) {
             	case 1 :
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2433:2: ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) )
+            	    // InternalUISemanticsGrammar.g:2541:4: ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2433:2: ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2433:3: ( ( () 'as' ) )=> ( () otherlv_2= 'as' )
+            	    // InternalUISemanticsGrammar.g:2541:4: ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) )
+            	    // InternalUISemanticsGrammar.g:2542:5: ( ( () 'as' ) )=> ( () otherlv_2= 'as' )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2435:5: ( () otherlv_2= 'as' )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2435:6: () otherlv_2= 'as'
+            	    // InternalUISemanticsGrammar.g:2548:5: ( () otherlv_2= 'as' )
+            	    // InternalUISemanticsGrammar.g:2549:6: () otherlv_2= 'as'
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2435:6: ()
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2436:5: 
+            	    // InternalUISemanticsGrammar.g:2549:6: ()
+            	    // InternalUISemanticsGrammar.g:2550:7: 
             	    {
             	    if ( state.backtracking==0 ) {
 
-            	              current = forceCreateModelElementAndSet(
-            	                  grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0(),
-            	                  current);
-            	          
+            	      							current = forceCreateModelElementAndSet(
+            	      								grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0(),
+            	      								current);
+            	      						
             	    }
 
             	    }
 
-            	    otherlv_2=(Token)match(input,25,FOLLOW_25_in_ruleXCastedExpression5768); if (state.failed) return current;
+            	    otherlv_2=(Token)match(input,25,FOLLOW_31); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	          	newLeafNode(otherlv_2, grammarAccess.getXCastedExpressionAccess().getAsKeyword_1_0_0_1());
-            	          
+            	      						newLeafNode(otherlv_2, grammarAccess.getXCastedExpressionAccess().getAsKeyword_1_0_0_1());
+            	      					
             	    }
 
             	    }
@@ -7336,34 +7489,34 @@
 
             	    }
 
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2445:3: ( (lv_type_3_0= ruleJvmTypeReference ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2446:1: (lv_type_3_0= ruleJvmTypeReference )
+            	    // InternalUISemanticsGrammar.g:2562:4: ( (lv_type_3_0= ruleJvmTypeReference ) )
+            	    // InternalUISemanticsGrammar.g:2563:5: (lv_type_3_0= ruleJvmTypeReference )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2446:1: (lv_type_3_0= ruleJvmTypeReference )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2447:3: lv_type_3_0= ruleJvmTypeReference
+            	    // InternalUISemanticsGrammar.g:2563:5: (lv_type_3_0= ruleJvmTypeReference )
+            	    // InternalUISemanticsGrammar.g:2564:6: lv_type_3_0= ruleJvmTypeReference
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getXCastedExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_1_0()); 
-            	      	    
+
+            	      						newCompositeNode(grammarAccess.getXCastedExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_1_0());
+            	      					
             	    }
-            	    pushFollow(FOLLOW_ruleJvmTypeReference_in_ruleXCastedExpression5791);
+            	    pushFollow(FOLLOW_49);
             	    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, 
-            	              		"JvmTypeReference");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getXCastedExpressionRule());
+            	      						}
+            	      						set(
+            	      							current,
+            	      							"type",
+            	      							lv_type_3_0,
+            	      							"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+            	      						afterParserOrEnumRuleCall();
+            	      					
             	    }
 
             	    }
@@ -7376,7 +7529,7 @@
             	    break;
 
             	default :
-            	    break loop44;
+            	    break loop45;
                 }
             } while (true);
 
@@ -7387,14 +7540,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -7403,7 +7558,7 @@
 
 
     // $ANTLR start "entryRuleXPostfixOperation"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2471:1: entryRuleXPostfixOperation returns [EObject current=null] : iv_ruleXPostfixOperation= ruleXPostfixOperation EOF ;
+    // InternalUISemanticsGrammar.g:2586:1: entryRuleXPostfixOperation returns [EObject current=null] : iv_ruleXPostfixOperation= ruleXPostfixOperation EOF ;
     public final EObject entryRuleXPostfixOperation() throws RecognitionException {
         EObject current = null;
 
@@ -7411,13 +7566,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2472:2: (iv_ruleXPostfixOperation= ruleXPostfixOperation EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2473:2: iv_ruleXPostfixOperation= ruleXPostfixOperation EOF
+            // InternalUISemanticsGrammar.g:2586:58: (iv_ruleXPostfixOperation= ruleXPostfixOperation EOF )
+            // InternalUISemanticsGrammar.g:2587:2: iv_ruleXPostfixOperation= ruleXPostfixOperation EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXPostfixOperationRule()); 
             }
-            pushFollow(FOLLOW_ruleXPostfixOperation_in_entryRuleXPostfixOperation5829);
+            pushFollow(FOLLOW_1);
             iv_ruleXPostfixOperation=ruleXPostfixOperation();
 
             state._fsp--;
@@ -7425,16 +7580,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleXPostfixOperation; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXPostfixOperation5839); 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;
@@ -7443,103 +7598,104 @@
 
 
     // $ANTLR start "ruleXPostfixOperation"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2480:1: ruleXPostfixOperation returns [EObject current=null] : (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? ) ;
+    // InternalUISemanticsGrammar.g:2593: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(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2483:28: ( (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2484:1: (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? )
+            // InternalUISemanticsGrammar.g:2599:2: ( (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? ) )
+            // InternalUISemanticsGrammar.g:2600:2: (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? )
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2484:1: (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2485:5: this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )?
+            // InternalUISemanticsGrammar.g:2600:2: (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? )
+            // InternalUISemanticsGrammar.g:2601:3: this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )?
             {
             if ( state.backtracking==0 ) {
-               
-                      newCompositeNode(grammarAccess.getXPostfixOperationAccess().getXMemberFeatureCallParserRuleCall_0()); 
-                  
+
+              			newCompositeNode(grammarAccess.getXPostfixOperationAccess().getXMemberFeatureCallParserRuleCall_0());
+              		
             }
-            pushFollow(FOLLOW_ruleXMemberFeatureCall_in_ruleXPostfixOperation5886);
+            pushFollow(FOLLOW_50);
             this_XMemberFeatureCall_0=ruleXMemberFeatureCall();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
-               
-                      current = this_XMemberFeatureCall_0; 
-                      afterParserOrEnumRuleCall();
-                  
-            }
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2493:1: ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )?
-            int alt45=2;
-            int LA45_0 = input.LA(1);
 
-            if ( (LA45_0==65) ) {
-                int LA45_1 = input.LA(2);
+              			current = this_XMemberFeatureCall_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalUISemanticsGrammar.g:2609:3: ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )?
+            int alt46=2;
+            int LA46_0 = input.LA(1);
+
+            if ( (LA46_0==66) ) {
+                int LA46_1 = input.LA(2);
 
                 if ( (synpred13_InternalUISemanticsGrammar()) ) {
-                    alt45=1;
+                    alt46=1;
                 }
             }
-            else if ( (LA45_0==66) ) {
-                int LA45_2 = input.LA(2);
+            else if ( (LA46_0==67) ) {
+                int LA46_2 = input.LA(2);
 
                 if ( (synpred13_InternalUISemanticsGrammar()) ) {
-                    alt45=1;
+                    alt46=1;
                 }
             }
-            switch (alt45) {
+            switch (alt46) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2493:2: ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) )
+                    // InternalUISemanticsGrammar.g:2610:4: ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) )
                     {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2498:6: ( () ( ( ruleOpPostfix ) ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2498:7: () ( ( ruleOpPostfix ) )
+                    // InternalUISemanticsGrammar.g:2620:4: ( () ( ( ruleOpPostfix ) ) )
+                    // InternalUISemanticsGrammar.g:2621:5: () ( ( ruleOpPostfix ) )
                     {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2498:7: ()
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2499:5: 
+                    // InternalUISemanticsGrammar.g:2621:5: ()
+                    // InternalUISemanticsGrammar.g:2622:6: 
                     {
                     if ( state.backtracking==0 ) {
 
-                              current = forceCreateModelElementAndSet(
-                                  grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0(),
-                                  current);
-                          
+                      						current = forceCreateModelElementAndSet(
+                      							grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0(),
+                      							current);
+                      					
                     }
 
                     }
 
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2504:2: ( ( ruleOpPostfix ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2505:1: ( ruleOpPostfix )
+                    // InternalUISemanticsGrammar.g:2628:5: ( ( ruleOpPostfix ) )
+                    // InternalUISemanticsGrammar.g:2629:6: ( ruleOpPostfix )
                     {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2505:1: ( ruleOpPostfix )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2506:3: ruleOpPostfix
+                    // InternalUISemanticsGrammar.g:2629:6: ( ruleOpPostfix )
+                    // InternalUISemanticsGrammar.g:2630:7: ruleOpPostfix
                     {
                     if ( state.backtracking==0 ) {
 
-                      			if (current==null) {
-                      	            current = createModelElement(grammarAccess.getXPostfixOperationRule());
-                      	        }
-                              
+                      							if (current==null) {
+                      								current = createModelElement(grammarAccess.getXPostfixOperationRule());
+                      							}
+                      						
                     }
                     if ( state.backtracking==0 ) {
-                       
-                      	        newCompositeNode(grammarAccess.getXPostfixOperationAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_1_0()); 
-                      	    
+
+                      							newCompositeNode(grammarAccess.getXPostfixOperationAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_1_0());
+                      						
                     }
-                    pushFollow(FOLLOW_ruleOpPostfix_in_ruleXPostfixOperation5938);
+                    pushFollow(FOLLOW_2);
                     ruleOpPostfix();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                      	        afterParserOrEnumRuleCall();
-                      	    
+
+                      							afterParserOrEnumRuleCall();
+                      						
                     }
 
                     }
@@ -7563,14 +7719,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -7579,7 +7737,7 @@
 
 
     // $ANTLR start "entryRuleOpPostfix"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2527:1: entryRuleOpPostfix returns [String current=null] : iv_ruleOpPostfix= ruleOpPostfix EOF ;
+    // InternalUISemanticsGrammar.g:2650:1: entryRuleOpPostfix returns [String current=null] : iv_ruleOpPostfix= ruleOpPostfix EOF ;
     public final String entryRuleOpPostfix() throws RecognitionException {
         String current = null;
 
@@ -7587,13 +7745,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2528:2: (iv_ruleOpPostfix= ruleOpPostfix EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2529:2: iv_ruleOpPostfix= ruleOpPostfix EOF
+            // InternalUISemanticsGrammar.g:2650:49: (iv_ruleOpPostfix= ruleOpPostfix EOF )
+            // InternalUISemanticsGrammar.g:2651:2: iv_ruleOpPostfix= ruleOpPostfix EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getOpPostfixRule()); 
             }
-            pushFollow(FOLLOW_ruleOpPostfix_in_entryRuleOpPostfix5978);
+            pushFollow(FOLLOW_1);
             iv_ruleOpPostfix=ruleOpPostfix();
 
             state._fsp--;
@@ -7601,16 +7759,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleOpPostfix.getText(); 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleOpPostfix5989); 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;
@@ -7619,58 +7777,59 @@
 
 
     // $ANTLR start "ruleOpPostfix"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2536:1: ruleOpPostfix returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '++' | kw= '--' ) ;
+    // InternalUISemanticsGrammar.g:2657:1: ruleOpPostfix returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '++' | kw= '--' ) ;
     public final AntlrDatatypeRuleToken ruleOpPostfix() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
         Token kw=null;
 
-         enterRule(); 
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2539:28: ( (kw= '++' | kw= '--' ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2540:1: (kw= '++' | kw= '--' )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2540:1: (kw= '++' | kw= '--' )
-            int alt46=2;
-            int LA46_0 = input.LA(1);
 
-            if ( (LA46_0==65) ) {
-                alt46=1;
+        	enterRule();
+
+        try {
+            // InternalUISemanticsGrammar.g:2663:2: ( (kw= '++' | kw= '--' ) )
+            // InternalUISemanticsGrammar.g:2664:2: (kw= '++' | kw= '--' )
+            {
+            // InternalUISemanticsGrammar.g:2664:2: (kw= '++' | kw= '--' )
+            int alt47=2;
+            int LA47_0 = input.LA(1);
+
+            if ( (LA47_0==66) ) {
+                alt47=1;
             }
-            else if ( (LA46_0==66) ) {
-                alt46=2;
+            else if ( (LA47_0==67) ) {
+                alt47=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 46, 0, input);
+                    new NoViableAltException("", 47, 0, input);
 
                 throw nvae;
             }
-            switch (alt46) {
+            switch (alt47) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2541:2: kw= '++'
+                    // InternalUISemanticsGrammar.g:2665:3: kw= '++'
                     {
-                    kw=(Token)match(input,65,FOLLOW_65_in_ruleOpPostfix6027); if (state.failed) return current;
+                    kw=(Token)match(input,66,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getOpPostfixAccess().getPlusSignPlusSignKeyword_0()); 
-                          
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpPostfixAccess().getPlusSignPlusSignKeyword_0());
+                      		
                     }
 
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2548:2: kw= '--'
+                    // InternalUISemanticsGrammar.g:2671:3: kw= '--'
                     {
-                    kw=(Token)match(input,66,FOLLOW_66_in_ruleOpPostfix6046); if (state.failed) return current;
+                    kw=(Token)match(input,67,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getOpPostfixAccess().getHyphenMinusHyphenMinusKeyword_1()); 
-                          
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpPostfixAccess().getHyphenMinusHyphenMinusKeyword_1());
+                      		
                     }
 
                     }
@@ -7682,14 +7841,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -7698,7 +7859,7 @@
 
 
     // $ANTLR start "entryRuleXMemberFeatureCall"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2561:1: entryRuleXMemberFeatureCall returns [EObject current=null] : iv_ruleXMemberFeatureCall= ruleXMemberFeatureCall EOF ;
+    // InternalUISemanticsGrammar.g:2680:1: entryRuleXMemberFeatureCall returns [EObject current=null] : iv_ruleXMemberFeatureCall= ruleXMemberFeatureCall EOF ;
     public final EObject entryRuleXMemberFeatureCall() throws RecognitionException {
         EObject current = null;
 
@@ -7706,13 +7867,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2562:2: (iv_ruleXMemberFeatureCall= ruleXMemberFeatureCall EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2563:2: iv_ruleXMemberFeatureCall= ruleXMemberFeatureCall EOF
+            // InternalUISemanticsGrammar.g:2680:59: (iv_ruleXMemberFeatureCall= ruleXMemberFeatureCall EOF )
+            // InternalUISemanticsGrammar.g:2681:2: iv_ruleXMemberFeatureCall= ruleXMemberFeatureCall EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXMemberFeatureCallRule()); 
             }
-            pushFollow(FOLLOW_ruleXMemberFeatureCall_in_entryRuleXMemberFeatureCall6086);
+            pushFollow(FOLLOW_1);
             iv_ruleXMemberFeatureCall=ruleXMemberFeatureCall();
 
             state._fsp--;
@@ -7720,16 +7881,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleXMemberFeatureCall; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXMemberFeatureCall6096); 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;
@@ -7738,7 +7899,7 @@
 
 
     // $ANTLR start "ruleXMemberFeatureCall"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2570: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 ) )? ) )* ) ;
+    // InternalUISemanticsGrammar.g:2687: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;
 
@@ -7770,59 +7931,46 @@
         EObject lv_memberCallArguments_23_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2573:28: ( (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 ) )? ) )* ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2574:1: (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 ) )? ) )* )
+            // InternalUISemanticsGrammar.g:2693: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 ) )? ) )* ) )
+            // InternalUISemanticsGrammar.g:2694: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 ) )? ) )* )
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2574:1: (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 ) )? ) )* )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2575:5: 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 ) )? ) )*
+            // InternalUISemanticsGrammar.g:2694: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 ) )? ) )* )
+            // InternalUISemanticsGrammar.g:2695: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()); 
-                  
+
+              			newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getXPrimaryExpressionParserRuleCall_0());
+              		
             }
-            pushFollow(FOLLOW_ruleXPrimaryExpression_in_ruleXMemberFeatureCall6143);
+            pushFollow(FOLLOW_51);
             this_XPrimaryExpression_0=ruleXPrimaryExpression();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
-               
-                      current = this_XPrimaryExpression_0; 
-                      afterParserOrEnumRuleCall();
-                  
+
+              			current = this_XPrimaryExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
             }
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2583:1: ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( 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 ) )? ) )*
-            loop55:
+            // InternalUISemanticsGrammar.g:2703: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 ) )? ) )*
+            loop56:
             do {
-                int alt55=3;
+                int alt56=3;
                 switch ( input.LA(1) ) {
-                case 67:
-                    {
-                    int LA55_2 = input.LA(2);
-
-                    if ( (synpred14_InternalUISemanticsGrammar()) ) {
-                        alt55=1;
-                    }
-                    else if ( (synpred15_InternalUISemanticsGrammar()) ) {
-                        alt55=2;
-                    }
-
-
-                    }
-                    break;
                 case 68:
                     {
-                    int LA55_3 = input.LA(2);
+                    int LA56_2 = input.LA(2);
 
                     if ( (synpred14_InternalUISemanticsGrammar()) ) {
-                        alt55=1;
+                        alt56=1;
                     }
                     else if ( (synpred15_InternalUISemanticsGrammar()) ) {
-                        alt55=2;
+                        alt56=2;
                     }
 
 
@@ -7830,10 +7978,24 @@
                     break;
                 case 69:
                     {
-                    int LA55_4 = input.LA(2);
+                    int LA56_3 = input.LA(2);
+
+                    if ( (synpred14_InternalUISemanticsGrammar()) ) {
+                        alt56=1;
+                    }
+                    else if ( (synpred15_InternalUISemanticsGrammar()) ) {
+                        alt56=2;
+                    }
+
+
+                    }
+                    break;
+                case 70:
+                    {
+                    int LA56_4 = input.LA(2);
 
                     if ( (synpred15_InternalUISemanticsGrammar()) ) {
-                        alt55=2;
+                        alt56=2;
                     }
 
 
@@ -7842,84 +8004,84 @@
 
                 }
 
-                switch (alt55) {
+                switch (alt56) {
             	case 1 :
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2583:2: ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) )
+            	    // InternalUISemanticsGrammar.g:2704:4: ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2583:2: ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2583:3: ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) )
+            	    // InternalUISemanticsGrammar.g:2704:4: ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) )
+            	    // InternalUISemanticsGrammar.g:2705:5: ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2583:3: ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2583:4: ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
+            	    // InternalUISemanticsGrammar.g:2705:5: ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )
+            	    // InternalUISemanticsGrammar.g:2706:6: ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2596:25: ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2596:26: () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign
+            	    // InternalUISemanticsGrammar.g:2726:6: ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
+            	    // InternalUISemanticsGrammar.g:2727:7: () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2596:26: ()
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2597:5: 
+            	    // InternalUISemanticsGrammar.g:2727:7: ()
+            	    // InternalUISemanticsGrammar.g:2728:8: 
             	    {
             	    if ( state.backtracking==0 ) {
 
-            	              current = forceCreateModelElementAndSet(
-            	                  grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0(),
-            	                  current);
-            	          
+            	      								current = forceCreateModelElementAndSet(
+            	      									grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0(),
+            	      									current);
+            	      							
             	    }
 
             	    }
 
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2602:2: (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) )
-            	    int alt47=2;
-            	    int LA47_0 = input.LA(1);
+            	    // InternalUISemanticsGrammar.g:2734:7: (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) )
+            	    int alt48=2;
+            	    int LA48_0 = input.LA(1);
 
-            	    if ( (LA47_0==67) ) {
-            	        alt47=1;
+            	    if ( (LA48_0==68) ) {
+            	        alt48=1;
             	    }
-            	    else if ( (LA47_0==68) ) {
-            	        alt47=2;
+            	    else if ( (LA48_0==69) ) {
+            	        alt48=2;
             	    }
             	    else {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        NoViableAltException nvae =
-            	            new NoViableAltException("", 47, 0, input);
+            	            new NoViableAltException("", 48, 0, input);
 
             	        throw nvae;
             	    }
-            	    switch (alt47) {
+            	    switch (alt48) {
             	        case 1 :
-            	            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2602:4: otherlv_2= '.'
+            	            // InternalUISemanticsGrammar.g:2735:8: otherlv_2= '.'
             	            {
-            	            otherlv_2=(Token)match(input,67,FOLLOW_67_in_ruleXMemberFeatureCall6215); if (state.failed) return current;
+            	            otherlv_2=(Token)match(input,68,FOLLOW_52); if (state.failed) return current;
             	            if ( state.backtracking==0 ) {
 
-            	                  	newLeafNode(otherlv_2, grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_0_0_0_1_0());
-            	                  
+            	              								newLeafNode(otherlv_2, grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_0_0_0_1_0());
+            	              							
             	            }
 
             	            }
             	            break;
             	        case 2 :
-            	            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2607:6: ( (lv_explicitStatic_3_0= '::' ) )
+            	            // InternalUISemanticsGrammar.g:2740:8: ( (lv_explicitStatic_3_0= '::' ) )
             	            {
-            	            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2607:6: ( (lv_explicitStatic_3_0= '::' ) )
-            	            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2608:1: (lv_explicitStatic_3_0= '::' )
+            	            // InternalUISemanticsGrammar.g:2740:8: ( (lv_explicitStatic_3_0= '::' ) )
+            	            // InternalUISemanticsGrammar.g:2741:9: (lv_explicitStatic_3_0= '::' )
             	            {
-            	            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2608:1: (lv_explicitStatic_3_0= '::' )
-            	            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2609:3: lv_explicitStatic_3_0= '::'
+            	            // InternalUISemanticsGrammar.g:2741:9: (lv_explicitStatic_3_0= '::' )
+            	            // InternalUISemanticsGrammar.g:2742:10: lv_explicitStatic_3_0= '::'
             	            {
-            	            lv_explicitStatic_3_0=(Token)match(input,68,FOLLOW_68_in_ruleXMemberFeatureCall6239); if (state.failed) return current;
+            	            lv_explicitStatic_3_0=(Token)match(input,69,FOLLOW_52); if (state.failed) return current;
             	            if ( state.backtracking==0 ) {
 
-            	                      newLeafNode(lv_explicitStatic_3_0, grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_0_0_0_1_1_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, "::");
-            	              	    
+            	              										if (current==null) {
+            	              											current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
+            	              										}
+            	              										setWithLastConsumed(current, "explicitStatic", true, "::");
+            	              									
             	            }
 
             	            }
@@ -7933,33 +8095,33 @@
 
             	    }
 
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2622:3: ( ( ruleFeatureCallID ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2623:1: ( ruleFeatureCallID )
+            	    // InternalUISemanticsGrammar.g:2755:7: ( ( ruleFeatureCallID ) )
+            	    // InternalUISemanticsGrammar.g:2756:8: ( ruleFeatureCallID )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2623:1: ( ruleFeatureCallID )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2624:3: ruleFeatureCallID
+            	    // InternalUISemanticsGrammar.g:2756:8: ( ruleFeatureCallID )
+            	    // InternalUISemanticsGrammar.g:2757:9: ruleFeatureCallID
             	    {
             	    if ( state.backtracking==0 ) {
 
-            	      			if (current==null) {
-            	      	            current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
-            	      	        }
-            	              
+            	      									if (current==null) {
+            	      										current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
+            	      									}
+            	      								
             	    }
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_0_2_0()); 
-            	      	    
+
+            	      									newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_0_2_0());
+            	      								
             	    }
-            	    pushFollow(FOLLOW_ruleFeatureCallID_in_ruleXMemberFeatureCall6276);
+            	    pushFollow(FOLLOW_33);
             	    ruleFeatureCallID();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+
+            	      									afterParserOrEnumRuleCall();
+            	      								
             	    }
 
             	    }
@@ -7968,19 +8130,19 @@
             	    }
 
             	    if ( state.backtracking==0 ) {
-            	       
-            	              newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getOpSingleAssignParserRuleCall_1_0_0_0_3()); 
-            	          
+
+            	      							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getOpSingleAssignParserRuleCall_1_0_0_0_3());
+            	      						
             	    }
-            	    pushFollow(FOLLOW_ruleOpSingleAssign_in_ruleXMemberFeatureCall6292);
+            	    pushFollow(FOLLOW_34);
             	    ruleOpSingleAssign();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
-            	       
-            	              afterParserOrEnumRuleCall();
-            	          
+
+            	      							afterParserOrEnumRuleCall();
+            	      						
             	    }
 
             	    }
@@ -7988,34 +8150,34 @@
 
             	    }
 
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2645:3: ( (lv_value_6_0= ruleXAssignment ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2646:1: (lv_value_6_0= ruleXAssignment )
+            	    // InternalUISemanticsGrammar.g:2780:5: ( (lv_value_6_0= ruleXAssignment ) )
+            	    // InternalUISemanticsGrammar.g:2781:6: (lv_value_6_0= ruleXAssignment )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2646:1: (lv_value_6_0= ruleXAssignment )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2647:3: lv_value_6_0= ruleXAssignment
+            	    // InternalUISemanticsGrammar.g:2781:6: (lv_value_6_0= ruleXAssignment )
+            	    // InternalUISemanticsGrammar.g:2782:7: lv_value_6_0= ruleXAssignment
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getValueXAssignmentParserRuleCall_1_0_1_0()); 
-            	      	    
+
+            	      							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getValueXAssignmentParserRuleCall_1_0_1_0());
+            	      						
             	    }
-            	    pushFollow(FOLLOW_ruleXAssignment_in_ruleXMemberFeatureCall6314);
+            	    pushFollow(FOLLOW_51);
             	    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, 
-            	              		"XAssignment");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      							if (current==null) {
+            	      								current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
+            	      							}
+            	      							set(
+            	      								current,
+            	      								"value",
+            	      								lv_value_6_0,
+            	      								"org.eclipse.xtext.xbase.Xbase.XAssignment");
+            	      							afterParserOrEnumRuleCall();
+            	      						
             	    }
 
             	    }
@@ -8030,91 +8192,91 @@
             	    }
             	    break;
             	case 2 :
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2664:6: ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (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 ) )? )
+            	    // InternalUISemanticsGrammar.g:2801: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 ) )? )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2664:6: ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (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 ) )? )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2664:7: ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (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 ) )?
+            	    // InternalUISemanticsGrammar.g:2801: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 ) )? )
+            	    // InternalUISemanticsGrammar.g:2802: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 ) )?
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2664:7: ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2664:8: ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) )
+            	    // InternalUISemanticsGrammar.g:2802:5: ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) )
+            	    // InternalUISemanticsGrammar.g:2803:6: ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2680:7: ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2680:8: () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) )
+            	    // InternalUISemanticsGrammar.g:2823:6: ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) )
+            	    // InternalUISemanticsGrammar.g:2824:7: () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2680:8: ()
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2681:5: 
+            	    // InternalUISemanticsGrammar.g:2824:7: ()
+            	    // InternalUISemanticsGrammar.g:2825:8: 
             	    {
             	    if ( state.backtracking==0 ) {
 
-            	              current = forceCreateModelElementAndSet(
-            	                  grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0(),
-            	                  current);
-            	          
+            	      								current = forceCreateModelElementAndSet(
+            	      									grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0(),
+            	      									current);
+            	      							
             	    }
 
             	    }
 
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2686:2: (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) )
-            	    int alt48=3;
+            	    // InternalUISemanticsGrammar.g:2831:7: (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) )
+            	    int alt49=3;
             	    switch ( input.LA(1) ) {
-            	    case 67:
+            	    case 68:
             	        {
-            	        alt48=1;
+            	        alt49=1;
+            	        }
+            	        break;
+            	    case 70:
+            	        {
+            	        alt49=2;
             	        }
             	        break;
             	    case 69:
             	        {
-            	        alt48=2;
-            	        }
-            	        break;
-            	    case 68:
-            	        {
-            	        alt48=3;
+            	        alt49=3;
             	        }
             	        break;
             	    default:
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        NoViableAltException nvae =
-            	            new NoViableAltException("", 48, 0, input);
+            	            new NoViableAltException("", 49, 0, input);
 
             	        throw nvae;
             	    }
 
-            	    switch (alt48) {
+            	    switch (alt49) {
             	        case 1 :
-            	            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2686:4: otherlv_8= '.'
+            	            // InternalUISemanticsGrammar.g:2832:8: otherlv_8= '.'
             	            {
-            	            otherlv_8=(Token)match(input,67,FOLLOW_67_in_ruleXMemberFeatureCall6400); if (state.failed) return current;
+            	            otherlv_8=(Token)match(input,68,FOLLOW_53); if (state.failed) return current;
             	            if ( state.backtracking==0 ) {
 
-            	                  	newLeafNode(otherlv_8, grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_1_0_0_1_0());
-            	                  
+            	              								newLeafNode(otherlv_8, grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_1_0_0_1_0());
+            	              							
             	            }
 
             	            }
             	            break;
             	        case 2 :
-            	            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2691:6: ( (lv_nullSafe_9_0= '?.' ) )
+            	            // InternalUISemanticsGrammar.g:2837:8: ( (lv_nullSafe_9_0= '?.' ) )
             	            {
-            	            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2691:6: ( (lv_nullSafe_9_0= '?.' ) )
-            	            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2692:1: (lv_nullSafe_9_0= '?.' )
+            	            // InternalUISemanticsGrammar.g:2837:8: ( (lv_nullSafe_9_0= '?.' ) )
+            	            // InternalUISemanticsGrammar.g:2838:9: (lv_nullSafe_9_0= '?.' )
             	            {
-            	            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2692:1: (lv_nullSafe_9_0= '?.' )
-            	            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2693:3: lv_nullSafe_9_0= '?.'
+            	            // InternalUISemanticsGrammar.g:2838:9: (lv_nullSafe_9_0= '?.' )
+            	            // InternalUISemanticsGrammar.g:2839:10: lv_nullSafe_9_0= '?.'
             	            {
-            	            lv_nullSafe_9_0=(Token)match(input,69,FOLLOW_69_in_ruleXMemberFeatureCall6424); if (state.failed) return current;
+            	            lv_nullSafe_9_0=(Token)match(input,70,FOLLOW_53); if (state.failed) return current;
             	            if ( state.backtracking==0 ) {
 
-            	                      newLeafNode(lv_nullSafe_9_0, grammarAccess.getXMemberFeatureCallAccess().getNullSafeQuestionMarkFullStopKeyword_1_1_0_0_1_1_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, "?.");
-            	              	    
+            	              										if (current==null) {
+            	              											current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
+            	              										}
+            	              										setWithLastConsumed(current, "nullSafe", true, "?.");
+            	              									
             	            }
 
             	            }
@@ -8126,27 +8288,27 @@
             	            }
             	            break;
             	        case 3 :
-            	            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2707:6: ( (lv_explicitStatic_10_0= '::' ) )
+            	            // InternalUISemanticsGrammar.g:2852:8: ( (lv_explicitStatic_10_0= '::' ) )
             	            {
-            	            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2707:6: ( (lv_explicitStatic_10_0= '::' ) )
-            	            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2708:1: (lv_explicitStatic_10_0= '::' )
+            	            // InternalUISemanticsGrammar.g:2852:8: ( (lv_explicitStatic_10_0= '::' ) )
+            	            // InternalUISemanticsGrammar.g:2853:9: (lv_explicitStatic_10_0= '::' )
             	            {
-            	            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2708:1: (lv_explicitStatic_10_0= '::' )
-            	            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2709:3: lv_explicitStatic_10_0= '::'
+            	            // InternalUISemanticsGrammar.g:2853:9: (lv_explicitStatic_10_0= '::' )
+            	            // InternalUISemanticsGrammar.g:2854:10: lv_explicitStatic_10_0= '::'
             	            {
-            	            lv_explicitStatic_10_0=(Token)match(input,68,FOLLOW_68_in_ruleXMemberFeatureCall6461); if (state.failed) return current;
+            	            lv_explicitStatic_10_0=(Token)match(input,69,FOLLOW_53); if (state.failed) return current;
             	            if ( state.backtracking==0 ) {
 
-            	                      newLeafNode(lv_explicitStatic_10_0, grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_1_0_0_1_2_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, "::");
-            	              	    
+            	              										if (current==null) {
+            	              											current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
+            	              										}
+            	              										setWithLastConsumed(current, "explicitStatic", true, "::");
+            	              									
             	            }
 
             	            }
@@ -8166,51 +8328,51 @@
 
             	    }
 
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2722:5: (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )?
-            	    int alt50=2;
-            	    int LA50_0 = input.LA(1);
+            	    // InternalUISemanticsGrammar.g:2869:5: (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )?
+            	    int alt51=2;
+            	    int LA51_0 = input.LA(1);
 
-            	    if ( (LA50_0==43) ) {
-            	        alt50=1;
+            	    if ( (LA51_0==44) ) {
+            	        alt51=1;
             	    }
-            	    switch (alt50) {
+            	    switch (alt51) {
             	        case 1 :
-            	            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2722:7: otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>'
+            	            // InternalUISemanticsGrammar.g:2870:6: otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>'
             	            {
-            	            otherlv_11=(Token)match(input,43,FOLLOW_43_in_ruleXMemberFeatureCall6490); if (state.failed) return current;
+            	            otherlv_11=(Token)match(input,44,FOLLOW_54); if (state.failed) return current;
             	            if ( state.backtracking==0 ) {
 
-            	                  	newLeafNode(otherlv_11, grammarAccess.getXMemberFeatureCallAccess().getLessThanSignKeyword_1_1_1_0());
-            	                  
+            	              						newLeafNode(otherlv_11, grammarAccess.getXMemberFeatureCallAccess().getLessThanSignKeyword_1_1_1_0());
+            	              					
             	            }
-            	            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2726:1: ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) )
-            	            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2727:1: (lv_typeArguments_12_0= ruleJvmArgumentTypeReference )
+            	            // InternalUISemanticsGrammar.g:2874:6: ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) )
+            	            // InternalUISemanticsGrammar.g:2875:7: (lv_typeArguments_12_0= ruleJvmArgumentTypeReference )
             	            {
-            	            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2727:1: (lv_typeArguments_12_0= ruleJvmArgumentTypeReference )
-            	            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2728:3: lv_typeArguments_12_0= ruleJvmArgumentTypeReference
+            	            // InternalUISemanticsGrammar.g:2875:7: (lv_typeArguments_12_0= ruleJvmArgumentTypeReference )
+            	            // InternalUISemanticsGrammar.g:2876:8: lv_typeArguments_12_0= ruleJvmArgumentTypeReference
             	            {
             	            if ( state.backtracking==0 ) {
-            	               
-            	              	        newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_1_0()); 
-            	              	    
+
+            	              								newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_1_0());
+            	              							
             	            }
-            	            pushFollow(FOLLOW_ruleJvmArgumentTypeReference_in_ruleXMemberFeatureCall6511);
+            	            pushFollow(FOLLOW_55);
             	            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, 
-            	                      		"JvmArgumentTypeReference");
-            	              	        afterParserOrEnumRuleCall();
-            	              	    
+            	              								if (current==null) {
+            	              									current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
+            	              								}
+            	              								add(
+            	              									current,
+            	              									"typeArguments",
+            	              									lv_typeArguments_12_0,
+            	              									"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
+            	              								afterParserOrEnumRuleCall();
+            	              							
             	            }
 
             	            }
@@ -8218,55 +8380,55 @@
 
             	            }
 
-            	            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2744:2: (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )*
-            	            loop49:
+            	            // InternalUISemanticsGrammar.g:2893:6: (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )*
+            	            loop50:
             	            do {
-            	                int alt49=2;
-            	                int LA49_0 = input.LA(1);
+            	                int alt50=2;
+            	                int LA50_0 = input.LA(1);
 
-            	                if ( (LA49_0==70) ) {
-            	                    alt49=1;
+            	                if ( (LA50_0==71) ) {
+            	                    alt50=1;
             	                }
 
 
-            	                switch (alt49) {
+            	                switch (alt50) {
             	            	case 1 :
-            	            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2744:4: otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) )
+            	            	    // InternalUISemanticsGrammar.g:2894:7: otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) )
             	            	    {
-            	            	    otherlv_13=(Token)match(input,70,FOLLOW_70_in_ruleXMemberFeatureCall6524); if (state.failed) return current;
+            	            	    otherlv_13=(Token)match(input,71,FOLLOW_54); if (state.failed) return current;
             	            	    if ( state.backtracking==0 ) {
 
-            	            	          	newLeafNode(otherlv_13, grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_1_2_0());
-            	            	          
+            	            	      							newLeafNode(otherlv_13, grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_1_2_0());
+            	            	      						
             	            	    }
-            	            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2748:1: ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) )
-            	            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2749:1: (lv_typeArguments_14_0= ruleJvmArgumentTypeReference )
+            	            	    // InternalUISemanticsGrammar.g:2898:7: ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) )
+            	            	    // InternalUISemanticsGrammar.g:2899:8: (lv_typeArguments_14_0= ruleJvmArgumentTypeReference )
             	            	    {
-            	            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2749:1: (lv_typeArguments_14_0= ruleJvmArgumentTypeReference )
-            	            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2750:3: lv_typeArguments_14_0= ruleJvmArgumentTypeReference
+            	            	    // InternalUISemanticsGrammar.g:2899:8: (lv_typeArguments_14_0= ruleJvmArgumentTypeReference )
+            	            	    // InternalUISemanticsGrammar.g:2900:9: lv_typeArguments_14_0= ruleJvmArgumentTypeReference
             	            	    {
             	            	    if ( state.backtracking==0 ) {
-            	            	       
-            	            	      	        newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_2_1_0()); 
-            	            	      	    
+
+            	            	      									newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_2_1_0());
+            	            	      								
             	            	    }
-            	            	    pushFollow(FOLLOW_ruleJvmArgumentTypeReference_in_ruleXMemberFeatureCall6545);
+            	            	    pushFollow(FOLLOW_55);
             	            	    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, 
-            	            	              		"JvmArgumentTypeReference");
-            	            	      	        afterParserOrEnumRuleCall();
-            	            	      	    
+            	            	      									if (current==null) {
+            	            	      										current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
+            	            	      									}
+            	            	      									add(
+            	            	      										current,
+            	            	      										"typeArguments",
+            	            	      										lv_typeArguments_14_0,
+            	            	      										"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
+            	            	      									afterParserOrEnumRuleCall();
+            	            	      								
             	            	    }
 
             	            	    }
@@ -8279,15 +8441,15 @@
             	            	    break;
 
             	            	default :
-            	            	    break loop49;
+            	            	    break loop50;
             	                }
             	            } while (true);
 
-            	            otherlv_15=(Token)match(input,44,FOLLOW_44_in_ruleXMemberFeatureCall6559); if (state.failed) return current;
+            	            otherlv_15=(Token)match(input,45,FOLLOW_53); if (state.failed) return current;
             	            if ( state.backtracking==0 ) {
 
-            	                  	newLeafNode(otherlv_15, grammarAccess.getXMemberFeatureCallAccess().getGreaterThanSignKeyword_1_1_1_3());
-            	                  
+            	              						newLeafNode(otherlv_15, grammarAccess.getXMemberFeatureCallAccess().getGreaterThanSignKeyword_1_1_1_3());
+            	              					
             	            }
 
             	            }
@@ -8295,33 +8457,33 @@
 
             	    }
 
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2770:3: ( ( ruleIdOrSuper ) )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2771:1: ( ruleIdOrSuper )
+            	    // InternalUISemanticsGrammar.g:2923:5: ( ( ruleIdOrSuper ) )
+            	    // InternalUISemanticsGrammar.g:2924:6: ( ruleIdOrSuper )
             	    {
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2771:1: ( ruleIdOrSuper )
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2772:3: ruleIdOrSuper
+            	    // InternalUISemanticsGrammar.g:2924:6: ( ruleIdOrSuper )
+            	    // InternalUISemanticsGrammar.g:2925:7: ruleIdOrSuper
             	    {
             	    if ( state.backtracking==0 ) {
 
-            	      			if (current==null) {
-            	      	            current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
-            	      	        }
-            	              
+            	      							if (current==null) {
+            	      								current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
+            	      							}
+            	      						
             	    }
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_2_0()); 
-            	      	    
+
+            	      							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_2_0());
+            	      						
             	    }
-            	    pushFollow(FOLLOW_ruleIdOrSuper_in_ruleXMemberFeatureCall6584);
+            	    pushFollow(FOLLOW_56);
             	    ruleIdOrSuper();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+
+            	      							afterParserOrEnumRuleCall();
+            	      						
             	    }
 
             	    }
@@ -8329,32 +8491,32 @@
 
             	    }
 
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2785:2: ( ( ( ( '(' ) )=> (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 alt53=2;
-            	    alt53 = dfa53.predict(input);
-            	    switch (alt53) {
+            	    // InternalUISemanticsGrammar.g:2939: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 alt54=2;
+            	    alt54 = dfa54.predict(input);
+            	    switch (alt54) {
             	        case 1 :
-            	            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2785:3: ( ( ( '(' ) )=> (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= ')'
+            	            // InternalUISemanticsGrammar.g:2940: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= ')'
             	            {
-            	            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2785:3: ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) )
-            	            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2785:4: ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' )
+            	            // InternalUISemanticsGrammar.g:2940:6: ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) )
+            	            // InternalUISemanticsGrammar.g:2941:7: ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' )
             	            {
-            	            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2792:1: (lv_explicitOperationCall_17_0= '(' )
-            	            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2793:3: lv_explicitOperationCall_17_0= '('
+            	            // InternalUISemanticsGrammar.g:2945:7: (lv_explicitOperationCall_17_0= '(' )
+            	            // InternalUISemanticsGrammar.g:2946:8: lv_explicitOperationCall_17_0= '('
             	            {
-            	            lv_explicitOperationCall_17_0=(Token)match(input,71,FOLLOW_71_in_ruleXMemberFeatureCall6618); if (state.failed) return current;
+            	            lv_explicitOperationCall_17_0=(Token)match(input,72,FOLLOW_57); if (state.failed) return current;
             	            if ( state.backtracking==0 ) {
 
-            	                      newLeafNode(lv_explicitOperationCall_17_0, grammarAccess.getXMemberFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_1_1_3_0_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, "(");
-            	              	    
+            	              								if (current==null) {
+            	              									current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
+            	              								}
+            	              								setWithLastConsumed(current, "explicitOperationCall", true, "(");
+            	              							
             	            }
 
             	            }
@@ -8362,41 +8524,41 @@
 
             	            }
 
-            	            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2806:2: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )?
-            	            int alt52=3;
-            	            alt52 = dfa52.predict(input);
-            	            switch (alt52) {
+            	            // InternalUISemanticsGrammar.g:2958:6: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )?
+            	            int alt53=3;
+            	            alt53 = dfa53.predict(input);
+            	            switch (alt53) {
             	                case 1 :
-            	                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2806:3: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) )
+            	                    // InternalUISemanticsGrammar.g:2959:7: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) )
             	                    {
-            	                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2806:3: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) )
-            	                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2806:4: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure )
+            	                    // InternalUISemanticsGrammar.g:2959:7: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) )
+            	                    // InternalUISemanticsGrammar.g:2960:8: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure )
             	                    {
-            	                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2823:1: (lv_memberCallArguments_18_0= ruleXShortClosure )
-            	                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2824:3: lv_memberCallArguments_18_0= ruleXShortClosure
+            	                    // InternalUISemanticsGrammar.g:2985:8: (lv_memberCallArguments_18_0= ruleXShortClosure )
+            	                    // InternalUISemanticsGrammar.g:2986:9: lv_memberCallArguments_18_0= ruleXShortClosure
             	                    {
             	                    if ( state.backtracking==0 ) {
-            	                       
-            	                      	        newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXShortClosureParserRuleCall_1_1_3_1_0_0()); 
-            	                      	    
+
+            	                      									newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXShortClosureParserRuleCall_1_1_3_1_0_0());
+            	                      								
             	                    }
-            	                    pushFollow(FOLLOW_ruleXShortClosure_in_ruleXMemberFeatureCall6703);
+            	                    pushFollow(FOLLOW_58);
             	                    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, 
-            	                              		"XShortClosure");
-            	                      	        afterParserOrEnumRuleCall();
-            	                      	    
+            	                      									if (current==null) {
+            	                      										current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
+            	                      									}
+            	                      									add(
+            	                      										current,
+            	                      										"memberCallArguments",
+            	                      										lv_memberCallArguments_18_0,
+            	                      										"org.eclipse.xtext.xbase.Xbase.XShortClosure");
+            	                      									afterParserOrEnumRuleCall();
+            	                      								
             	                    }
 
             	                    }
@@ -8408,39 +8570,39 @@
             	                    }
             	                    break;
             	                case 2 :
-            	                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2841:6: ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* )
+            	                    // InternalUISemanticsGrammar.g:3004:7: ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* )
             	                    {
-            	                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2841:6: ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* )
-            	                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2841:7: ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )*
+            	                    // InternalUISemanticsGrammar.g:3004:7: ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* )
+            	                    // InternalUISemanticsGrammar.g:3005:8: ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )*
             	                    {
-            	                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2841:7: ( (lv_memberCallArguments_19_0= ruleXExpression ) )
-            	                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2842:1: (lv_memberCallArguments_19_0= ruleXExpression )
+            	                    // InternalUISemanticsGrammar.g:3005:8: ( (lv_memberCallArguments_19_0= ruleXExpression ) )
+            	                    // InternalUISemanticsGrammar.g:3006:9: (lv_memberCallArguments_19_0= ruleXExpression )
             	                    {
-            	                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2842:1: (lv_memberCallArguments_19_0= ruleXExpression )
-            	                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2843:3: lv_memberCallArguments_19_0= ruleXExpression
+            	                    // InternalUISemanticsGrammar.g:3006:9: (lv_memberCallArguments_19_0= ruleXExpression )
+            	                    // InternalUISemanticsGrammar.g:3007:10: lv_memberCallArguments_19_0= ruleXExpression
             	                    {
             	                    if ( state.backtracking==0 ) {
-            	                       
-            	                      	        newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_0_0()); 
-            	                      	    
+
+            	                      										newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_0_0());
+            	                      									
             	                    }
-            	                    pushFollow(FOLLOW_ruleXExpression_in_ruleXMemberFeatureCall6731);
+            	                    pushFollow(FOLLOW_59);
             	                    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, 
-            	                              		"XExpression");
-            	                      	        afterParserOrEnumRuleCall();
-            	                      	    
+            	                      										if (current==null) {
+            	                      											current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
+            	                      										}
+            	                      										add(
+            	                      											current,
+            	                      											"memberCallArguments",
+            	                      											lv_memberCallArguments_19_0,
+            	                      											"org.eclipse.xtext.xbase.Xbase.XExpression");
+            	                      										afterParserOrEnumRuleCall();
+            	                      									
             	                    }
 
             	                    }
@@ -8448,55 +8610,55 @@
 
             	                    }
 
-            	                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2859:2: (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )*
-            	                    loop51:
+            	                    // InternalUISemanticsGrammar.g:3024:8: (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )*
+            	                    loop52:
             	                    do {
-            	                        int alt51=2;
-            	                        int LA51_0 = input.LA(1);
+            	                        int alt52=2;
+            	                        int LA52_0 = input.LA(1);
 
-            	                        if ( (LA51_0==70) ) {
-            	                            alt51=1;
+            	                        if ( (LA52_0==71) ) {
+            	                            alt52=1;
             	                        }
 
 
-            	                        switch (alt51) {
+            	                        switch (alt52) {
             	                    	case 1 :
-            	                    	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2859:4: otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) )
+            	                    	    // InternalUISemanticsGrammar.g:3025:9: otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) )
             	                    	    {
-            	                    	    otherlv_20=(Token)match(input,70,FOLLOW_70_in_ruleXMemberFeatureCall6744); if (state.failed) return current;
+            	                    	    otherlv_20=(Token)match(input,71,FOLLOW_34); if (state.failed) return current;
             	                    	    if ( state.backtracking==0 ) {
 
-            	                    	          	newLeafNode(otherlv_20, grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_3_1_1_1_0());
-            	                    	          
+            	                    	      									newLeafNode(otherlv_20, grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_3_1_1_1_0());
+            	                    	      								
             	                    	    }
-            	                    	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2863:1: ( (lv_memberCallArguments_21_0= ruleXExpression ) )
-            	                    	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2864:1: (lv_memberCallArguments_21_0= ruleXExpression )
+            	                    	    // InternalUISemanticsGrammar.g:3029:9: ( (lv_memberCallArguments_21_0= ruleXExpression ) )
+            	                    	    // InternalUISemanticsGrammar.g:3030:10: (lv_memberCallArguments_21_0= ruleXExpression )
             	                    	    {
-            	                    	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2864:1: (lv_memberCallArguments_21_0= ruleXExpression )
-            	                    	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2865:3: lv_memberCallArguments_21_0= ruleXExpression
+            	                    	    // InternalUISemanticsGrammar.g:3030:10: (lv_memberCallArguments_21_0= ruleXExpression )
+            	                    	    // InternalUISemanticsGrammar.g:3031:11: lv_memberCallArguments_21_0= ruleXExpression
             	                    	    {
             	                    	    if ( state.backtracking==0 ) {
-            	                    	       
-            	                    	      	        newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_1_1_0()); 
-            	                    	      	    
+
+            	                    	      											newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_1_1_0());
+            	                    	      										
             	                    	    }
-            	                    	    pushFollow(FOLLOW_ruleXExpression_in_ruleXMemberFeatureCall6765);
+            	                    	    pushFollow(FOLLOW_59);
             	                    	    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, 
-            	                    	              		"XExpression");
-            	                    	      	        afterParserOrEnumRuleCall();
-            	                    	      	    
+            	                    	      											if (current==null) {
+            	                    	      												current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
+            	                    	      											}
+            	                    	      											add(
+            	                    	      												current,
+            	                    	      												"memberCallArguments",
+            	                    	      												lv_memberCallArguments_21_0,
+            	                    	      												"org.eclipse.xtext.xbase.Xbase.XExpression");
+            	                    	      											afterParserOrEnumRuleCall();
+            	                    	      										
             	                    	    }
 
             	                    	    }
@@ -8509,7 +8671,7 @@
             	                    	    break;
 
             	                    	default :
-            	                    	    break loop51;
+            	                    	    break loop52;
             	                        }
             	                    } while (true);
 
@@ -8522,11 +8684,11 @@
 
             	            }
 
-            	            otherlv_22=(Token)match(input,72,FOLLOW_72_in_ruleXMemberFeatureCall6782); if (state.failed) return current;
+            	            otherlv_22=(Token)match(input,73,FOLLOW_60); if (state.failed) return current;
             	            if ( state.backtracking==0 ) {
 
-            	                  	newLeafNode(otherlv_22, grammarAccess.getXMemberFeatureCallAccess().getRightParenthesisKeyword_1_1_3_2());
-            	                  
+            	              						newLeafNode(otherlv_22, grammarAccess.getXMemberFeatureCallAccess().getRightParenthesisKeyword_1_1_3_2());
+            	              					
             	            }
 
             	            }
@@ -8534,38 +8696,38 @@
 
             	    }
 
-            	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2885:3: ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )?
-            	    int alt54=2;
-            	    alt54 = dfa54.predict(input);
-            	    switch (alt54) {
+            	    // InternalUISemanticsGrammar.g:3056:5: ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )?
+            	    int alt55=2;
+            	    alt55 = dfa55.predict(input);
+            	    switch (alt55) {
             	        case 1 :
-            	            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2885:4: ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure )
+            	            // InternalUISemanticsGrammar.g:3057:6: ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure )
             	            {
-            	            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2888:1: (lv_memberCallArguments_23_0= ruleXClosure )
-            	            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2889:3: lv_memberCallArguments_23_0= ruleXClosure
+            	            // InternalUISemanticsGrammar.g:3063:6: (lv_memberCallArguments_23_0= ruleXClosure )
+            	            // InternalUISemanticsGrammar.g:3064:7: lv_memberCallArguments_23_0= ruleXClosure
             	            {
             	            if ( state.backtracking==0 ) {
-            	               
-            	              	        newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXClosureParserRuleCall_1_1_4_0()); 
-            	              	    
+
+            	              							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXClosureParserRuleCall_1_1_4_0());
+            	              						
             	            }
-            	            pushFollow(FOLLOW_ruleXClosure_in_ruleXMemberFeatureCall6817);
+            	            pushFollow(FOLLOW_51);
             	            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, 
-            	                      		"XClosure");
-            	              	        afterParserOrEnumRuleCall();
-            	              	    
+            	              							if (current==null) {
+            	              								current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
+            	              							}
+            	              							add(
+            	              								current,
+            	              								"memberCallArguments",
+            	              								lv_memberCallArguments_23_0,
+            	              								"org.eclipse.xtext.xbase.Xbase.XClosure");
+            	              							afterParserOrEnumRuleCall();
+            	              						
             	            }
 
             	            }
@@ -8584,7 +8746,7 @@
             	    break;
 
             	default :
-            	    break loop55;
+            	    break loop56;
                 }
             } while (true);
 
@@ -8595,14 +8757,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -8611,7 +8775,7 @@
 
 
     // $ANTLR start "entryRuleXPrimaryExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2913:1: entryRuleXPrimaryExpression returns [EObject current=null] : iv_ruleXPrimaryExpression= ruleXPrimaryExpression EOF ;
+    // InternalUISemanticsGrammar.g:3087:1: entryRuleXPrimaryExpression returns [EObject current=null] : iv_ruleXPrimaryExpression= ruleXPrimaryExpression EOF ;
     public final EObject entryRuleXPrimaryExpression() throws RecognitionException {
         EObject current = null;
 
@@ -8619,13 +8783,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2914:2: (iv_ruleXPrimaryExpression= ruleXPrimaryExpression EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2915:2: iv_ruleXPrimaryExpression= ruleXPrimaryExpression EOF
+            // InternalUISemanticsGrammar.g:3087:59: (iv_ruleXPrimaryExpression= ruleXPrimaryExpression EOF )
+            // InternalUISemanticsGrammar.g:3088:2: iv_ruleXPrimaryExpression= ruleXPrimaryExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXPrimaryExpressionRule()); 
             }
-            pushFollow(FOLLOW_ruleXPrimaryExpression_in_entryRuleXPrimaryExpression6857);
+            pushFollow(FOLLOW_1);
             iv_ruleXPrimaryExpression=ruleXPrimaryExpression();
 
             state._fsp--;
@@ -8633,16 +8797,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleXPrimaryExpression; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXPrimaryExpression6867); 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;
@@ -8651,7 +8815,7 @@
 
 
     // $ANTLR start "ruleXPrimaryExpression"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2922: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 ) ;
+    // InternalUISemanticsGrammar.g:3094: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;
 
@@ -8686,103 +8850,104 @@
         EObject this_XParenthesizedExpression_14 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2925:28: ( (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 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2926:1: (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 )
+            // InternalUISemanticsGrammar.g:3100: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 ) )
+            // InternalUISemanticsGrammar.g:3101: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 )
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2926:1: (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 alt56=15;
-            alt56 = dfa56.predict(input);
-            switch (alt56) {
+            // InternalUISemanticsGrammar.g:3101: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 alt57=15;
+            alt57 = dfa57.predict(input);
+            switch (alt57) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2927:5: this_XConstructorCall_0= ruleXConstructorCall
+                    // InternalUISemanticsGrammar.g:3102:3: this_XConstructorCall_0= ruleXConstructorCall
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXConstructorCallParserRuleCall_0()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXConstructorCallParserRuleCall_0());
+                      		
                     }
-                    pushFollow(FOLLOW_ruleXConstructorCall_in_ruleXPrimaryExpression6914);
+                    pushFollow(FOLLOW_2);
                     this_XConstructorCall_0=ruleXConstructorCall();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_XConstructorCall_0; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_XConstructorCall_0;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2937:5: this_XBlockExpression_1= ruleXBlockExpression
+                    // InternalUISemanticsGrammar.g:3111:3: this_XBlockExpression_1= ruleXBlockExpression
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXBlockExpressionParserRuleCall_1()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXBlockExpressionParserRuleCall_1());
+                      		
                     }
-                    pushFollow(FOLLOW_ruleXBlockExpression_in_ruleXPrimaryExpression6941);
+                    pushFollow(FOLLOW_2);
                     this_XBlockExpression_1=ruleXBlockExpression();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_XBlockExpression_1; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_XBlockExpression_1;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 3 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2947:5: this_XSwitchExpression_2= ruleXSwitchExpression
+                    // InternalUISemanticsGrammar.g:3120:3: this_XSwitchExpression_2= ruleXSwitchExpression
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXSwitchExpressionParserRuleCall_2()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXSwitchExpressionParserRuleCall_2());
+                      		
                     }
-                    pushFollow(FOLLOW_ruleXSwitchExpression_in_ruleXPrimaryExpression6968);
+                    pushFollow(FOLLOW_2);
                     this_XSwitchExpression_2=ruleXSwitchExpression();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_XSwitchExpression_2; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_XSwitchExpression_2;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 4 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2956:6: ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression )
+                    // InternalUISemanticsGrammar.g:3129:3: ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression )
                     {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2956:6: ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2956:7: ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression
+                    // InternalUISemanticsGrammar.g:3129:3: ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression )
+                    // InternalUISemanticsGrammar.g:3130:4: ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXSynchronizedExpressionParserRuleCall_3()); 
-                          
+
+                      				newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXSynchronizedExpressionParserRuleCall_3());
+                      			
                     }
-                    pushFollow(FOLLOW_ruleXSynchronizedExpression_in_ruleXPrimaryExpression7012);
+                    pushFollow(FOLLOW_2);
                     this_XSynchronizedExpression_3=ruleXSynchronizedExpression();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_XSynchronizedExpression_3; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      				current = this_XSynchronizedExpression_3;
+                      				afterParserOrEnumRuleCall();
+                      			
                     }
 
                     }
@@ -8791,92 +8956,92 @@
                     }
                     break;
                 case 5 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2970:5: this_XFeatureCall_4= ruleXFeatureCall
+                    // InternalUISemanticsGrammar.g:3147:3: this_XFeatureCall_4= ruleXFeatureCall
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXFeatureCallParserRuleCall_4()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXFeatureCallParserRuleCall_4());
+                      		
                     }
-                    pushFollow(FOLLOW_ruleXFeatureCall_in_ruleXPrimaryExpression7040);
+                    pushFollow(FOLLOW_2);
                     this_XFeatureCall_4=ruleXFeatureCall();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_XFeatureCall_4; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_XFeatureCall_4;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 6 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2980:5: this_XLiteral_5= ruleXLiteral
+                    // InternalUISemanticsGrammar.g:3156:3: this_XLiteral_5= ruleXLiteral
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXLiteralParserRuleCall_5()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXLiteralParserRuleCall_5());
+                      		
                     }
-                    pushFollow(FOLLOW_ruleXLiteral_in_ruleXPrimaryExpression7067);
+                    pushFollow(FOLLOW_2);
                     this_XLiteral_5=ruleXLiteral();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_XLiteral_5; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_XLiteral_5;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 7 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2990:5: this_XIfExpression_6= ruleXIfExpression
+                    // InternalUISemanticsGrammar.g:3165:3: this_XIfExpression_6= ruleXIfExpression
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXIfExpressionParserRuleCall_6()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXIfExpressionParserRuleCall_6());
+                      		
                     }
-                    pushFollow(FOLLOW_ruleXIfExpression_in_ruleXPrimaryExpression7094);
+                    pushFollow(FOLLOW_2);
                     this_XIfExpression_6=ruleXIfExpression();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_XIfExpression_6; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_XIfExpression_6;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 8 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2999:6: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression )
+                    // InternalUISemanticsGrammar.g:3174:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression )
                     {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2999:6: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:2999:7: ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression
+                    // InternalUISemanticsGrammar.g:3174:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression )
+                    // InternalUISemanticsGrammar.g:3175:4: ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXForLoopExpressionParserRuleCall_7()); 
-                          
+
+                      				newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXForLoopExpressionParserRuleCall_7());
+                      			
                     }
-                    pushFollow(FOLLOW_ruleXForLoopExpression_in_ruleXPrimaryExpression7151);
+                    pushFollow(FOLLOW_2);
                     this_XForLoopExpression_7=ruleXForLoopExpression();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_XForLoopExpression_7; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      				current = this_XForLoopExpression_7;
+                      				afterParserOrEnumRuleCall();
+                      			
                     }
 
                     }
@@ -8885,155 +9050,155 @@
                     }
                     break;
                 case 9 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3018:5: this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression
+                    // InternalUISemanticsGrammar.g:3198:3: this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXBasicForLoopExpressionParserRuleCall_8()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXBasicForLoopExpressionParserRuleCall_8());
+                      		
                     }
-                    pushFollow(FOLLOW_ruleXBasicForLoopExpression_in_ruleXPrimaryExpression7179);
+                    pushFollow(FOLLOW_2);
                     this_XBasicForLoopExpression_8=ruleXBasicForLoopExpression();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_XBasicForLoopExpression_8; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_XBasicForLoopExpression_8;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 10 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3028:5: this_XWhileExpression_9= ruleXWhileExpression
+                    // InternalUISemanticsGrammar.g:3207:3: this_XWhileExpression_9= ruleXWhileExpression
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXWhileExpressionParserRuleCall_9()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXWhileExpressionParserRuleCall_9());
+                      		
                     }
-                    pushFollow(FOLLOW_ruleXWhileExpression_in_ruleXPrimaryExpression7206);
+                    pushFollow(FOLLOW_2);
                     this_XWhileExpression_9=ruleXWhileExpression();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_XWhileExpression_9; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_XWhileExpression_9;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 11 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3038:5: this_XDoWhileExpression_10= ruleXDoWhileExpression
+                    // InternalUISemanticsGrammar.g:3216:3: this_XDoWhileExpression_10= ruleXDoWhileExpression
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXDoWhileExpressionParserRuleCall_10()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXDoWhileExpressionParserRuleCall_10());
+                      		
                     }
-                    pushFollow(FOLLOW_ruleXDoWhileExpression_in_ruleXPrimaryExpression7233);
+                    pushFollow(FOLLOW_2);
                     this_XDoWhileExpression_10=ruleXDoWhileExpression();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_XDoWhileExpression_10; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_XDoWhileExpression_10;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 12 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3048:5: this_XThrowExpression_11= ruleXThrowExpression
+                    // InternalUISemanticsGrammar.g:3225:3: this_XThrowExpression_11= ruleXThrowExpression
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXThrowExpressionParserRuleCall_11()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXThrowExpressionParserRuleCall_11());
+                      		
                     }
-                    pushFollow(FOLLOW_ruleXThrowExpression_in_ruleXPrimaryExpression7260);
+                    pushFollow(FOLLOW_2);
                     this_XThrowExpression_11=ruleXThrowExpression();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_XThrowExpression_11; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_XThrowExpression_11;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 13 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3058:5: this_XReturnExpression_12= ruleXReturnExpression
+                    // InternalUISemanticsGrammar.g:3234:3: this_XReturnExpression_12= ruleXReturnExpression
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXReturnExpressionParserRuleCall_12()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXReturnExpressionParserRuleCall_12());
+                      		
                     }
-                    pushFollow(FOLLOW_ruleXReturnExpression_in_ruleXPrimaryExpression7287);
+                    pushFollow(FOLLOW_2);
                     this_XReturnExpression_12=ruleXReturnExpression();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_XReturnExpression_12; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_XReturnExpression_12;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 14 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3068:5: this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression
+                    // InternalUISemanticsGrammar.g:3243:3: this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXTryCatchFinallyExpressionParserRuleCall_13()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXTryCatchFinallyExpressionParserRuleCall_13());
+                      		
                     }
-                    pushFollow(FOLLOW_ruleXTryCatchFinallyExpression_in_ruleXPrimaryExpression7314);
+                    pushFollow(FOLLOW_2);
                     this_XTryCatchFinallyExpression_13=ruleXTryCatchFinallyExpression();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_XTryCatchFinallyExpression_13; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_XTryCatchFinallyExpression_13;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 15 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3078:5: this_XParenthesizedExpression_14= ruleXParenthesizedExpression
+                    // InternalUISemanticsGrammar.g:3252:3: this_XParenthesizedExpression_14= ruleXParenthesizedExpression
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXParenthesizedExpressionParserRuleCall_14()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXParenthesizedExpressionParserRuleCall_14());
+                      		
                     }
-                    pushFollow(FOLLOW_ruleXParenthesizedExpression_in_ruleXPrimaryExpression7341);
+                    pushFollow(FOLLOW_2);
                     this_XParenthesizedExpression_14=ruleXParenthesizedExpression();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_XParenthesizedExpression_14; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_XParenthesizedExpression_14;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
@@ -9045,14 +9210,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -9061,7 +9228,7 @@
 
 
     // $ANTLR start "entryRuleXLiteral"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3094:1: entryRuleXLiteral returns [EObject current=null] : iv_ruleXLiteral= ruleXLiteral EOF ;
+    // InternalUISemanticsGrammar.g:3264:1: entryRuleXLiteral returns [EObject current=null] : iv_ruleXLiteral= ruleXLiteral EOF ;
     public final EObject entryRuleXLiteral() throws RecognitionException {
         EObject current = null;
 
@@ -9069,13 +9236,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3095:2: (iv_ruleXLiteral= ruleXLiteral EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3096:2: iv_ruleXLiteral= ruleXLiteral EOF
+            // InternalUISemanticsGrammar.g:3264:49: (iv_ruleXLiteral= ruleXLiteral EOF )
+            // InternalUISemanticsGrammar.g:3265:2: iv_ruleXLiteral= ruleXLiteral EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXLiteralRule()); 
             }
-            pushFollow(FOLLOW_ruleXLiteral_in_entryRuleXLiteral7376);
+            pushFollow(FOLLOW_1);
             iv_ruleXLiteral=ruleXLiteral();
 
             state._fsp--;
@@ -9083,16 +9250,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleXLiteral; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXLiteral7386); 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;
@@ -9101,7 +9268,7 @@
 
 
     // $ANTLR start "ruleXLiteral"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3103: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 ) ;
+    // InternalUISemanticsGrammar.g:3271: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;
 
@@ -9120,303 +9287,37 @@
         EObject this_XTypeLiteral_6 = null;
 
 
-         enterRule(); 
-            
-        try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3106:28: ( (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 ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3107:1: (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 )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3107:1: (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 alt57=7;
-            int LA57_0 = input.LA(1);
 
-            if ( (LA57_0==73) ) {
-                alt57=1;
-            }
-            else if ( (LA57_0==74) && (synpred21_InternalUISemanticsGrammar())) {
-                alt57=2;
-            }
-            else if ( ((LA57_0>=90 && LA57_0<=91)) ) {
-                alt57=3;
-            }
-            else if ( ((LA57_0>=RULE_HEX && LA57_0<=RULE_DECIMAL)) ) {
-                alt57=4;
-            }
-            else if ( (LA57_0==92) ) {
-                alt57=5;
-            }
-            else if ( (LA57_0==RULE_STRING) ) {
-                alt57=6;
-            }
-            else if ( (LA57_0==93) ) {
-                alt57=7;
-            }
-            else {
-                if (state.backtracking>0) {state.failed=true; return current;}
-                NoViableAltException nvae =
-                    new NoViableAltException("", 57, 0, input);
-
-                throw nvae;
-            }
-            switch (alt57) {
-                case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3108:5: this_XCollectionLiteral_0= ruleXCollectionLiteral
-                    {
-                    if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getXLiteralAccess().getXCollectionLiteralParserRuleCall_0()); 
-                          
-                    }
-                    pushFollow(FOLLOW_ruleXCollectionLiteral_in_ruleXLiteral7433);
-                    this_XCollectionLiteral_0=ruleXCollectionLiteral();
-
-                    state._fsp--;
-                    if (state.failed) return current;
-                    if ( state.backtracking==0 ) {
-                       
-                              current = this_XCollectionLiteral_0; 
-                              afterParserOrEnumRuleCall();
-                          
-                    }
-
-                    }
-                    break;
-                case 2 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3117:6: ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure )
-                    {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3117:6: ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3117:7: ( ( () '[' ) )=>this_XClosure_1= ruleXClosure
-                    {
-                    if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getXLiteralAccess().getXClosureParserRuleCall_1()); 
-                          
-                    }
-                    pushFollow(FOLLOW_ruleXClosure_in_ruleXLiteral7473);
-                    this_XClosure_1=ruleXClosure();
-
-                    state._fsp--;
-                    if (state.failed) return current;
-                    if ( state.backtracking==0 ) {
-                       
-                              current = this_XClosure_1; 
-                              afterParserOrEnumRuleCall();
-                          
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 3 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3130:5: this_XBooleanLiteral_2= ruleXBooleanLiteral
-                    {
-                    if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getXLiteralAccess().getXBooleanLiteralParserRuleCall_2()); 
-                          
-                    }
-                    pushFollow(FOLLOW_ruleXBooleanLiteral_in_ruleXLiteral7501);
-                    this_XBooleanLiteral_2=ruleXBooleanLiteral();
-
-                    state._fsp--;
-                    if (state.failed) return current;
-                    if ( state.backtracking==0 ) {
-                       
-                              current = this_XBooleanLiteral_2; 
-                              afterParserOrEnumRuleCall();
-                          
-                    }
-
-                    }
-                    break;
-                case 4 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3140:5: this_XNumberLiteral_3= ruleXNumberLiteral
-                    {
-                    if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getXLiteralAccess().getXNumberLiteralParserRuleCall_3()); 
-                          
-                    }
-                    pushFollow(FOLLOW_ruleXNumberLiteral_in_ruleXLiteral7528);
-                    this_XNumberLiteral_3=ruleXNumberLiteral();
-
-                    state._fsp--;
-                    if (state.failed) return current;
-                    if ( state.backtracking==0 ) {
-                       
-                              current = this_XNumberLiteral_3; 
-                              afterParserOrEnumRuleCall();
-                          
-                    }
-
-                    }
-                    break;
-                case 5 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3150:5: this_XNullLiteral_4= ruleXNullLiteral
-                    {
-                    if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getXLiteralAccess().getXNullLiteralParserRuleCall_4()); 
-                          
-                    }
-                    pushFollow(FOLLOW_ruleXNullLiteral_in_ruleXLiteral7555);
-                    this_XNullLiteral_4=ruleXNullLiteral();
-
-                    state._fsp--;
-                    if (state.failed) return current;
-                    if ( state.backtracking==0 ) {
-                       
-                              current = this_XNullLiteral_4; 
-                              afterParserOrEnumRuleCall();
-                          
-                    }
-
-                    }
-                    break;
-                case 6 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3160:5: this_XStringLiteral_5= ruleXStringLiteral
-                    {
-                    if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getXLiteralAccess().getXStringLiteralParserRuleCall_5()); 
-                          
-                    }
-                    pushFollow(FOLLOW_ruleXStringLiteral_in_ruleXLiteral7582);
-                    this_XStringLiteral_5=ruleXStringLiteral();
-
-                    state._fsp--;
-                    if (state.failed) return current;
-                    if ( state.backtracking==0 ) {
-                       
-                              current = this_XStringLiteral_5; 
-                              afterParserOrEnumRuleCall();
-                          
-                    }
-
-                    }
-                    break;
-                case 7 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3170:5: this_XTypeLiteral_6= ruleXTypeLiteral
-                    {
-                    if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getXLiteralAccess().getXTypeLiteralParserRuleCall_6()); 
-                          
-                    }
-                    pushFollow(FOLLOW_ruleXTypeLiteral_in_ruleXLiteral7609);
-                    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"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3186:1: entryRuleXCollectionLiteral returns [EObject current=null] : iv_ruleXCollectionLiteral= ruleXCollectionLiteral EOF ;
-    public final EObject entryRuleXCollectionLiteral() throws RecognitionException {
-        EObject current = null;
-
-        EObject iv_ruleXCollectionLiteral = null;
-
+        	enterRule();
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3187:2: (iv_ruleXCollectionLiteral= ruleXCollectionLiteral EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3188:2: iv_ruleXCollectionLiteral= ruleXCollectionLiteral EOF
+            // InternalUISemanticsGrammar.g:3277: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 ) )
+            // InternalUISemanticsGrammar.g:3278: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 )
             {
-            if ( state.backtracking==0 ) {
-               newCompositeNode(grammarAccess.getXCollectionLiteralRule()); 
-            }
-            pushFollow(FOLLOW_ruleXCollectionLiteral_in_entryRuleXCollectionLiteral7644);
-            iv_ruleXCollectionLiteral=ruleXCollectionLiteral();
-
-            state._fsp--;
-            if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-               current =iv_ruleXCollectionLiteral; 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXCollectionLiteral7654); if (state.failed) return current;
-
-            }
-
-        }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
-                appendSkippedTokens();
-            } 
-        finally {
-        }
-        return current;
-    }
-    // $ANTLR end "entryRuleXCollectionLiteral"
-
-
-    // $ANTLR start "ruleXCollectionLiteral"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3195: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 {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3198:28: ( (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3199:1: (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral )
-            {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3199:1: (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral )
-            int alt58=2;
+            // InternalUISemanticsGrammar.g:3278: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 alt58=7;
             int LA58_0 = input.LA(1);
 
-            if ( (LA58_0==73) ) {
-                int LA58_1 = input.LA(2);
-
-                if ( (LA58_1==14) ) {
-                    alt58=1;
-                }
-                else if ( (LA58_1==74) ) {
-                    alt58=2;
-                }
-                else {
-                    if (state.backtracking>0) {state.failed=true; return current;}
-                    NoViableAltException nvae =
-                        new NoViableAltException("", 58, 1, input);
-
-                    throw nvae;
-                }
+            if ( (LA58_0==74) ) {
+                alt58=1;
+            }
+            else if ( (LA58_0==75) && (synpred21_InternalUISemanticsGrammar())) {
+                alt58=2;
+            }
+            else if ( ((LA58_0>=90 && LA58_0<=91)) ) {
+                alt58=3;
+            }
+            else if ( ((LA58_0>=RULE_HEX && LA58_0<=RULE_DECIMAL)) ) {
+                alt58=4;
+            }
+            else if ( (LA58_0==92) ) {
+                alt58=5;
+            }
+            else if ( (LA58_0==RULE_STRING) ) {
+                alt58=6;
+            }
+            else if ( (LA58_0==93) ) {
+                alt58=7;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return current;}
@@ -9427,45 +9328,161 @@
             }
             switch (alt58) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3200:5: this_XSetLiteral_0= ruleXSetLiteral
+                    // InternalUISemanticsGrammar.g:3279:3: this_XCollectionLiteral_0= ruleXCollectionLiteral
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getXCollectionLiteralAccess().getXSetLiteralParserRuleCall_0()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getXLiteralAccess().getXCollectionLiteralParserRuleCall_0());
+                      		
                     }
-                    pushFollow(FOLLOW_ruleXSetLiteral_in_ruleXCollectionLiteral7701);
-                    this_XSetLiteral_0=ruleXSetLiteral();
+                    pushFollow(FOLLOW_2);
+                    this_XCollectionLiteral_0=ruleXCollectionLiteral();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_XSetLiteral_0; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_XCollectionLiteral_0;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3210:5: this_XListLiteral_1= ruleXListLiteral
+                    // InternalUISemanticsGrammar.g:3288:3: ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure )
+                    {
+                    // InternalUISemanticsGrammar.g:3288:3: ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure )
+                    // InternalUISemanticsGrammar.g:3289:4: ( ( () '[' ) )=>this_XClosure_1= ruleXClosure
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getXCollectionLiteralAccess().getXListLiteralParserRuleCall_1()); 
-                          
+
+                      				newCompositeNode(grammarAccess.getXLiteralAccess().getXClosureParserRuleCall_1());
+                      			
                     }
-                    pushFollow(FOLLOW_ruleXListLiteral_in_ruleXCollectionLiteral7728);
-                    this_XListLiteral_1=ruleXListLiteral();
+                    pushFollow(FOLLOW_2);
+                    this_XClosure_1=ruleXClosure();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_XListLiteral_1; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      				current = this_XClosure_1;
+                      				afterParserOrEnumRuleCall();
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalUISemanticsGrammar.g:3305: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 :
+                    // InternalUISemanticsGrammar.g:3314: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 :
+                    // InternalUISemanticsGrammar.g:3323: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 :
+                    // InternalUISemanticsGrammar.g:3332: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 :
+                    // InternalUISemanticsGrammar.g:3341: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();
+                      		
                     }
 
                     }
@@ -9477,14 +9494,170 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXLiteral"
+
+
+    // $ANTLR start "entryRuleXCollectionLiteral"
+    // InternalUISemanticsGrammar.g:3353:1: entryRuleXCollectionLiteral returns [EObject current=null] : iv_ruleXCollectionLiteral= ruleXCollectionLiteral EOF ;
+    public final EObject entryRuleXCollectionLiteral() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXCollectionLiteral = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:3353:59: (iv_ruleXCollectionLiteral= ruleXCollectionLiteral EOF )
+            // InternalUISemanticsGrammar.g:3354: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"
+    // InternalUISemanticsGrammar.g:3360: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 {
+            // InternalUISemanticsGrammar.g:3366:2: ( (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral ) )
+            // InternalUISemanticsGrammar.g:3367:2: (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral )
+            {
+            // InternalUISemanticsGrammar.g:3367:2: (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral )
+            int alt59=2;
+            int LA59_0 = input.LA(1);
+
+            if ( (LA59_0==74) ) {
+                int LA59_1 = input.LA(2);
+
+                if ( (LA59_1==75) ) {
+                    alt59=2;
+                }
+                else if ( (LA59_1==14) ) {
+                    alt59=1;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return current;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 59, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 59, 0, input);
+
+                throw nvae;
+            }
+            switch (alt59) {
+                case 1 :
+                    // InternalUISemanticsGrammar.g:3368: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 :
+                    // InternalUISemanticsGrammar.g:3377: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;
@@ -9493,7 +9666,7 @@
 
 
     // $ANTLR start "entryRuleXSetLiteral"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3226:1: entryRuleXSetLiteral returns [EObject current=null] : iv_ruleXSetLiteral= ruleXSetLiteral EOF ;
+    // InternalUISemanticsGrammar.g:3389:1: entryRuleXSetLiteral returns [EObject current=null] : iv_ruleXSetLiteral= ruleXSetLiteral EOF ;
     public final EObject entryRuleXSetLiteral() throws RecognitionException {
         EObject current = null;
 
@@ -9501,13 +9674,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3227:2: (iv_ruleXSetLiteral= ruleXSetLiteral EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3228:2: iv_ruleXSetLiteral= ruleXSetLiteral EOF
+            // InternalUISemanticsGrammar.g:3389:52: (iv_ruleXSetLiteral= ruleXSetLiteral EOF )
+            // InternalUISemanticsGrammar.g:3390:2: iv_ruleXSetLiteral= ruleXSetLiteral EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXSetLiteralRule()); 
             }
-            pushFollow(FOLLOW_ruleXSetLiteral_in_entryRuleXSetLiteral7763);
+            pushFollow(FOLLOW_1);
             iv_ruleXSetLiteral=ruleXSetLiteral();
 
             state._fsp--;
@@ -9515,16 +9688,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleXSetLiteral; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXSetLiteral7773); 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;
@@ -9533,7 +9706,7 @@
 
 
     // $ANTLR start "ruleXSetLiteral"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3235:1: ruleXSetLiteral returns [EObject current=null] : ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' ) ;
+    // InternalUISemanticsGrammar.g:3396: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;
 
@@ -9546,79 +9719,80 @@
         EObject lv_elements_5_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3238:28: ( ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3239:1: ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' )
+            // InternalUISemanticsGrammar.g:3402:2: ( ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' ) )
+            // InternalUISemanticsGrammar.g:3403:2: ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' )
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3239:1: ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3239:2: () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}'
+            // InternalUISemanticsGrammar.g:3403:2: ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' )
+            // InternalUISemanticsGrammar.g:3404:3: () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}'
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3239:2: ()
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3240:5: 
+            // InternalUISemanticsGrammar.g:3404:3: ()
+            // InternalUISemanticsGrammar.g:3405:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getXSetLiteralAccess().getXSetLiteralAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getXSetLiteralAccess().getXSetLiteralAction_0(),
+              					current);
+              			
             }
 
             }
 
-            otherlv_1=(Token)match(input,73,FOLLOW_73_in_ruleXSetLiteral7819); if (state.failed) return current;
+            otherlv_1=(Token)match(input,74,FOLLOW_4); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getXSetLiteralAccess().getNumberSignKeyword_1());
-                  
+              			newLeafNode(otherlv_1, grammarAccess.getXSetLiteralAccess().getNumberSignKeyword_1());
+              		
             }
-            otherlv_2=(Token)match(input,14,FOLLOW_14_in_ruleXSetLiteral7831); if (state.failed) return current;
+            otherlv_2=(Token)match(input,14,FOLLOW_61); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_2, grammarAccess.getXSetLiteralAccess().getLeftCurlyBracketKeyword_2());
-                  
+              			newLeafNode(otherlv_2, grammarAccess.getXSetLiteralAccess().getLeftCurlyBracketKeyword_2());
+              		
             }
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3253:1: ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )?
-            int alt60=2;
-            int LA60_0 = input.LA(1);
+            // InternalUISemanticsGrammar.g:3419:3: ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )?
+            int alt61=2;
+            int LA61_0 = input.LA(1);
 
-            if ( ((LA60_0>=RULE_STRING && LA60_0<=RULE_DECIMAL)||LA60_0==14||(LA60_0>=19 && LA60_0<=21)||LA60_0==43||(LA60_0>=59 && LA60_0<=60)||LA60_0==64||LA60_0==71||(LA60_0>=73 && LA60_0<=74)||LA60_0==77||LA60_0==79||(LA60_0>=82 && LA60_0<=84)||(LA60_0>=87 && LA60_0<=96)||LA60_0==98) ) {
-                alt60=1;
+            if ( ((LA61_0>=RULE_STRING && LA61_0<=RULE_DECIMAL)||LA61_0==14||(LA61_0>=19 && LA61_0<=21)||LA61_0==33||LA61_0==44||(LA61_0>=60 && LA61_0<=61)||LA61_0==65||LA61_0==72||(LA61_0>=74 && LA61_0<=75)||LA61_0==78||LA61_0==80||(LA61_0>=83 && LA61_0<=85)||(LA61_0>=88 && LA61_0<=96)||LA61_0==98) ) {
+                alt61=1;
             }
-            switch (alt60) {
+            switch (alt61) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3253:2: ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
+                    // InternalUISemanticsGrammar.g:3420:4: ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
                     {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3253:2: ( (lv_elements_3_0= ruleXExpression ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3254:1: (lv_elements_3_0= ruleXExpression )
+                    // InternalUISemanticsGrammar.g:3420:4: ( (lv_elements_3_0= ruleXExpression ) )
+                    // InternalUISemanticsGrammar.g:3421:5: (lv_elements_3_0= ruleXExpression )
                     {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3254:1: (lv_elements_3_0= ruleXExpression )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3255:3: lv_elements_3_0= ruleXExpression
+                    // InternalUISemanticsGrammar.g:3421:5: (lv_elements_3_0= ruleXExpression )
+                    // InternalUISemanticsGrammar.g:3422:6: lv_elements_3_0= ruleXExpression
                     {
                     if ( state.backtracking==0 ) {
-                       
-                      	        newCompositeNode(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0()); 
-                      	    
+
+                      						newCompositeNode(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0());
+                      					
                     }
-                    pushFollow(FOLLOW_ruleXExpression_in_ruleXSetLiteral7853);
+                    pushFollow(FOLLOW_62);
                     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, 
-                              		"XExpression");
-                      	        afterParserOrEnumRuleCall();
-                      	    
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getXSetLiteralRule());
+                      						}
+                      						add(
+                      							current,
+                      							"elements",
+                      							lv_elements_3_0,
+                      							"org.eclipse.xtext.xbase.Xbase.XExpression");
+                      						afterParserOrEnumRuleCall();
+                      					
                     }
 
                     }
@@ -9626,55 +9800,55 @@
 
                     }
 
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3271:2: (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
-                    loop59:
+                    // InternalUISemanticsGrammar.g:3439:4: (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
+                    loop60:
                     do {
-                        int alt59=2;
-                        int LA59_0 = input.LA(1);
+                        int alt60=2;
+                        int LA60_0 = input.LA(1);
 
-                        if ( (LA59_0==70) ) {
-                            alt59=1;
+                        if ( (LA60_0==71) ) {
+                            alt60=1;
                         }
 
 
-                        switch (alt59) {
+                        switch (alt60) {
                     	case 1 :
-                    	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3271:4: otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) )
+                    	    // InternalUISemanticsGrammar.g:3440:5: otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) )
                     	    {
-                    	    otherlv_4=(Token)match(input,70,FOLLOW_70_in_ruleXSetLiteral7866); if (state.failed) return current;
+                    	    otherlv_4=(Token)match(input,71,FOLLOW_34); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
-                    	          	newLeafNode(otherlv_4, grammarAccess.getXSetLiteralAccess().getCommaKeyword_3_1_0());
-                    	          
+                    	      					newLeafNode(otherlv_4, grammarAccess.getXSetLiteralAccess().getCommaKeyword_3_1_0());
+                    	      				
                     	    }
-                    	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3275:1: ( (lv_elements_5_0= ruleXExpression ) )
-                    	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3276:1: (lv_elements_5_0= ruleXExpression )
+                    	    // InternalUISemanticsGrammar.g:3444:5: ( (lv_elements_5_0= ruleXExpression ) )
+                    	    // InternalUISemanticsGrammar.g:3445:6: (lv_elements_5_0= ruleXExpression )
                     	    {
-                    	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3276:1: (lv_elements_5_0= ruleXExpression )
-                    	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3277:3: lv_elements_5_0= ruleXExpression
+                    	    // InternalUISemanticsGrammar.g:3445:6: (lv_elements_5_0= ruleXExpression )
+                    	    // InternalUISemanticsGrammar.g:3446:7: lv_elements_5_0= ruleXExpression
                     	    {
                     	    if ( state.backtracking==0 ) {
-                    	       
-                    	      	        newCompositeNode(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0()); 
-                    	      	    
+
+                    	      							newCompositeNode(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0());
+                    	      						
                     	    }
-                    	    pushFollow(FOLLOW_ruleXExpression_in_ruleXSetLiteral7887);
+                    	    pushFollow(FOLLOW_62);
                     	    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, 
-                    	              		"XExpression");
-                    	      	        afterParserOrEnumRuleCall();
-                    	      	    
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getXSetLiteralRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"elements",
+                    	      								lv_elements_5_0,
+                    	      								"org.eclipse.xtext.xbase.Xbase.XExpression");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
                     	    }
 
                     	    }
@@ -9687,7 +9861,7 @@
                     	    break;
 
                     	default :
-                    	    break loop59;
+                    	    break loop60;
                         }
                     } while (true);
 
@@ -9697,11 +9871,11 @@
 
             }
 
-            otherlv_6=(Token)match(input,15,FOLLOW_15_in_ruleXSetLiteral7903); 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.getXSetLiteralAccess().getRightCurlyBracketKeyword_4());
-                  
+              			newLeafNode(otherlv_6, grammarAccess.getXSetLiteralAccess().getRightCurlyBracketKeyword_4());
+              		
             }
 
             }
@@ -9710,14 +9884,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -9726,7 +9902,7 @@
 
 
     // $ANTLR start "entryRuleXListLiteral"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3305:1: entryRuleXListLiteral returns [EObject current=null] : iv_ruleXListLiteral= ruleXListLiteral EOF ;
+    // InternalUISemanticsGrammar.g:3473:1: entryRuleXListLiteral returns [EObject current=null] : iv_ruleXListLiteral= ruleXListLiteral EOF ;
     public final EObject entryRuleXListLiteral() throws RecognitionException {
         EObject current = null;
 
@@ -9734,13 +9910,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3306:2: (iv_ruleXListLiteral= ruleXListLiteral EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3307:2: iv_ruleXListLiteral= ruleXListLiteral EOF
+            // InternalUISemanticsGrammar.g:3473:53: (iv_ruleXListLiteral= ruleXListLiteral EOF )
+            // InternalUISemanticsGrammar.g:3474:2: iv_ruleXListLiteral= ruleXListLiteral EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXListLiteralRule()); 
             }
-            pushFollow(FOLLOW_ruleXListLiteral_in_entryRuleXListLiteral7939);
+            pushFollow(FOLLOW_1);
             iv_ruleXListLiteral=ruleXListLiteral();
 
             state._fsp--;
@@ -9748,16 +9924,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleXListLiteral; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXListLiteral7949); 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;
@@ -9766,7 +9942,7 @@
 
 
     // $ANTLR start "ruleXListLiteral"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3314:1: ruleXListLiteral returns [EObject current=null] : ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' ) ;
+    // InternalUISemanticsGrammar.g:3480: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;
 
@@ -9779,79 +9955,80 @@
         EObject lv_elements_5_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3317:28: ( ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' ) )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3318:1: ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' )
+            // InternalUISemanticsGrammar.g:3486:2: ( ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' ) )
+            // InternalUISemanticsGrammar.g:3487:2: ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' )
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3318:1: ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3318:2: () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']'
+            // InternalUISemanticsGrammar.g:3487:2: ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' )
+            // InternalUISemanticsGrammar.g:3488:3: () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']'
             {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3318:2: ()
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3319:5: 
+            // InternalUISemanticsGrammar.g:3488:3: ()
+            // InternalUISemanticsGrammar.g:3489:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getXListLiteralAccess().getXListLiteralAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getXListLiteralAccess().getXListLiteralAction_0(),
+              					current);
+              			
             }
 
             }
 
-            otherlv_1=(Token)match(input,73,FOLLOW_73_in_ruleXListLiteral7995); if (state.failed) return current;
+            otherlv_1=(Token)match(input,74,FOLLOW_63); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getXListLiteralAccess().getNumberSignKeyword_1());
-                  
+              			newLeafNode(otherlv_1, grammarAccess.getXListLiteralAccess().getNumberSignKeyword_1());
+              		
             }
-            otherlv_2=(Token)match(input,74,FOLLOW_74_in_ruleXListLiteral8007); if (state.failed) return current;
+            otherlv_2=(Token)match(input,75,FOLLOW_64); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_2, grammarAccess.getXListLiteralAccess().getLeftSquareBracketKeyword_2());
-                  
+              			newLeafNode(otherlv_2, grammarAccess.getXListLiteralAccess().getLeftSquareBracketKeyword_2());
+              		
             }
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3332:1: ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )?
-            int alt62=2;
-            int LA62_0 = input.LA(1);
+            // InternalUISemanticsGrammar.g:3503:3: ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )?
+            int alt63=2;
+            int LA63_0 = input.LA(1);
 
-            if ( ((LA62_0>=RULE_STRING && LA62_0<=RULE_DECIMAL)||LA62_0==14||(LA62_0>=19 && LA62_0<=21)||LA62_0==43||(LA62_0>=59 && LA62_0<=60)||LA62_0==64||LA62_0==71||(LA62_0>=73 && LA62_0<=74)||LA62_0==77||LA62_0==79||(LA62_0>=82 && LA62_0<=84)||(LA62_0>=87 && LA62_0<=96)||LA62_0==98) ) {
-                alt62=1;
+            if ( ((LA63_0>=RULE_STRING && LA63_0<=RULE_DECIMAL)||LA63_0==14||(LA63_0>=19 && LA63_0<=21)||LA63_0==33||LA63_0==44||(LA63_0>=60 && LA63_0<=61)||LA63_0==65||LA63_0==72||(LA63_0>=74 && LA63_0<=75)||LA63_0==78||LA63_0==80||(LA63_0>=83 && LA63_0<=85)||(LA63_0>=88 && LA63_0<=96)||LA63_0==98) ) {
+                alt63=1;
             }
-            switch (alt62) {
+            switch (alt63) {
                 case 1 :
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3332:2: ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
+                    // InternalUISemanticsGrammar.g:3504:4: ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
                     {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3332:2: ( (lv_elements_3_0= ruleXExpression ) )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3333:1: (lv_elements_3_0= ruleXExpression )
+                    // InternalUISemanticsGrammar.g:3504:4: ( (lv_elements_3_0= ruleXExpression ) )
+                    // InternalUISemanticsGrammar.g:3505:5: (lv_elements_3_0= ruleXExpression )
                     {
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3333:1: (lv_elements_3_0= ruleXExpression )
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3334:3: lv_elements_3_0= ruleXExpression
+                    // InternalUISemanticsGrammar.g:3505:5: (lv_elements_3_0= ruleXExpression )
+                    // InternalUISemanticsGrammar.g:3506:6: lv_elements_3_0= ruleXExpression
                     {
                     if ( state.backtracking==0 ) {
-                       
-                      	        newCompositeNode(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0()); 
-                      	    
+
+                      						newCompositeNode(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0());
+                      					
                     }
-                    pushFollow(FOLLOW_ruleXExpression_in_ruleXListLiteral8029);
+                    pushFollow(FOLLOW_65);
                     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, 
-                              		"XExpression");
-                      	        afterParserOrEnumRuleCall();
-                      	    
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getXListLiteralRule());
+                      						}
+                      						add(
+                      							current,
+                      							"elements",
+                      							lv_elements_3_0,
+                      							"org.eclipse.xtext.xbase.Xbase.XExpression");
+                      						afterParserOrEnumRuleCall();
+                      					
                     }
 
                     }
@@ -9859,55 +10036,55 @@
 
                     }
 
-                    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3350:2: (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
-                    loop61:
+                    // InternalUISemanticsGrammar.g:3523:4: (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
+                    loop62:
                     do {
-                        int alt61=2;
-                        int LA61_0 = input.LA(1);
+                        int alt62=2;
+                        int LA62_0 = input.LA(1);
 
-                        if ( (LA61_0==70) ) {
-                            alt61=1;
+                        if ( (LA62_0==71) ) {
+                            alt62=1;
                         }
 
 
-                        switch (alt61) {
+                        switch (alt62) {
                     	case 1 :
-                    	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3350:4: otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) )
+                    	    // InternalUISemanticsGrammar.g:3524:5: otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) )
                     	    {
-                    	    otherlv_4=(Token)match(input,70,FOLLOW_70_in_ruleXListLiteral8042); if (state.failed) return current;
+                    	    otherlv_4=(Token)match(input,71,FOLLOW_34); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
-                    	          	newLeafNode(otherlv_4, grammarAccess.getXListLiteralAccess().getCommaKeyword_3_1_0());
-                    	          
+                    	      					newLeafNode(otherlv_4, grammarAccess.getXListLiteralAccess().getCommaKeyword_3_1_0());
+                    	      				
                     	    }
-                    	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3354:1: ( (lv_elements_5_0= ruleXExpression ) )
-                    	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3355:1: (lv_elements_5_0= ruleXExpression )
+                    	    // InternalUISemanticsGrammar.g:3528:5: ( (lv_elements_5_0= ruleXExpression ) )
+                    	    // InternalUISemanticsGrammar.g:3529:6: (lv_elements_5_0= ruleXExpression )
                     	    {
-                    	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3355:1: (lv_elements_5_0= ruleXExpression )
-                    	    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3356:3: lv_elements_5_0= ruleXExpression
+                    	    // InternalUISemanticsGrammar.g:3529:6: (lv_elements_5_0= ruleXExpression )
+                    	    // InternalUISemanticsGrammar.g:3530:7: lv_elements_5_0= ruleXExpression
                     	    {
                     	    if ( state.backtracking==0 ) {
-                    	       
-                    	      	        newCompositeNode(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0()); 
-                    	      	    
+
+                    	      							newCompositeNode(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0());
+                    	      						
                     	    }
-                    	    pushFollow(FOLLOW_ruleXExpression_in_ruleXListLiteral8063);
+                    	    pushFollow(FOLLOW_65);
                     	    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, 
-                    	              		"XExpression");
-                    	      	        afterParserOrEnumRuleCall();
-                    	      	    
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getXListLiteralRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"elements",
+                    	      								lv_elements_5_0,
+                    	      								"org.eclipse.xtext.xbase.Xbase.XExpression");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
                     	    }
 
                     	    }
@@ -9920,7 +10097,7 @@
                     	    break;
 
                     	default :
-                    	    break loop61;
+                    	    break loop62;
                         }
                     } while (true);
 
@@ -9930,11 +10107,11 @@
 
             }
 
-            otherlv_6=(Token)match(input,75,FOLLOW_75_in_ruleXListLiteral8079); if (state.failed) return current;
+            otherlv_6=(Token)match(input,76,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_6, grammarAccess.getXListLiteralAccess().getRightSquareBracketKeyword_4());
-                  
+              			newLeafNode(otherlv_6, grammarAccess.getXListLiteralAccess().getRightSquareBracketKeyword_4());
+              		
             }
 
             }
@@ -9943,14 +10120,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -9959,7 +10138,7 @@
 
 
     // $ANTLR start "entryRuleXClosure"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3384:1: entryRuleXClosure returns [EObject current=null] : iv_ruleXClosure= ruleXClosure EOF ;
+    // InternalUISemanticsGrammar.g:3557:1: entryRuleXClosure returns [EObject current=null] : iv_ruleXClosure= ruleXClosure EOF ;
     public final EObject entryRuleXClosure() throws RecognitionException {
         EObject current = null;
 
@@ -9967,13 +10146,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3385:2: (iv_ruleXClosure= ruleXClosure EOF )
-            // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3386:2: iv_ruleXClosure= ruleXClosure EOF
+            // InternalUISemanticsGrammar.g:3557:49: (iv_ruleXClosure= ruleXClosure EOF )
+            // InternalUISemanticsGrammar.g:3558:2: iv_ruleXClosure= ruleXClosure EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXClosureRule()); 
             }
-            pushFollow(FOLLOW_ruleXClosure_in_entryRuleXClosure8115);
+            pushFollow(FOLLOW_1);
             iv_ruleXClosure=ruleXClosure();
 
             state._fsp--;
@@ -9981,16 +10160,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleXClosure; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXClosure8125); 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;
@@ -9999,7 +10178,7 @@
 
 
     // $ANTLR start "ruleXClosure"
-    // ../org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/parser/antlr/internal/InternalUISemanticsGrammar.g:3393: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= ']' ) ;
+    // InternalUISemanticsGrammar.g:3564: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;
 
@@ -10010,3 +10189,14903 @@
         EObject lv_declaredFormalParameters_2_0 = null;
 
         EObject lv_declaredFormalParameters_4_0 = null;
+
+        EObject lv_expression_6_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalUISemanticsGrammar.g:3570: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= ']' ) )
+            // InternalUISemanticsGrammar.g:3571: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= ']' )
+            {
+            // InternalUISemanticsGrammar.g:3571: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= ']' )
+            // InternalUISemanticsGrammar.g:3572: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= ']'
+            {
+            // InternalUISemanticsGrammar.g:3572:3: ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) )
+            // InternalUISemanticsGrammar.g:3573:4: ( ( () '[' ) )=> ( () otherlv_1= '[' )
+            {
+            // InternalUISemanticsGrammar.g:3579:4: ( () otherlv_1= '[' )
+            // InternalUISemanticsGrammar.g:3580:5: () otherlv_1= '['
+            {
+            // InternalUISemanticsGrammar.g:3580:5: ()
+            // InternalUISemanticsGrammar.g:3581:6: 
+            {
+            if ( state.backtracking==0 ) {
+
+              						current = forceCreateModelElement(
+              							grammarAccess.getXClosureAccess().getXClosureAction_0_0_0(),
+              							current);
+              					
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,75,FOLLOW_66); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(otherlv_1, grammarAccess.getXClosureAccess().getLeftSquareBracketKeyword_0_0_1());
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalUISemanticsGrammar.g:3593:3: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )?
+            int alt66=2;
+            alt66 = dfa66.predict(input);
+            switch (alt66) {
+                case 1 :
+                    // InternalUISemanticsGrammar.g:3594:4: ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) )
+                    {
+                    // InternalUISemanticsGrammar.g:3617:4: ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) )
+                    // InternalUISemanticsGrammar.g:3618:5: ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) )
+                    {
+                    // InternalUISemanticsGrammar.g:3618:5: ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )?
+                    int alt65=2;
+                    int LA65_0 = input.LA(1);
+
+                    if ( (LA65_0==RULE_ID||LA65_0==57||LA65_0==72) ) {
+                        alt65=1;
+                    }
+                    switch (alt65) {
+                        case 1 :
+                            // InternalUISemanticsGrammar.g:3619:6: ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )*
+                            {
+                            // InternalUISemanticsGrammar.g:3619:6: ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) )
+                            // InternalUISemanticsGrammar.g:3620:7: (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter )
+                            {
+                            // InternalUISemanticsGrammar.g:3620:7: (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter )
+                            // InternalUISemanticsGrammar.g:3621:8: lv_declaredFormalParameters_2_0= ruleJvmFormalParameter
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              								newCompositeNode(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_0_0());
+                              							
+                            }
+                            pushFollow(FOLLOW_67);
+                            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();
+                              							
+                            }
+
+                            }
+
+
+                            }
+
+                            // InternalUISemanticsGrammar.g:3638:6: (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )*
+                            loop64:
+                            do {
+                                int alt64=2;
+                                int LA64_0 = input.LA(1);
+
+                                if ( (LA64_0==71) ) {
+                                    alt64=1;
+                                }
+
+
+                                switch (alt64) {
+                            	case 1 :
+                            	    // InternalUISemanticsGrammar.g:3639:7: otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) )
+                            	    {
+                            	    otherlv_3=(Token)match(input,71,FOLLOW_31); if (state.failed) return current;
+                            	    if ( state.backtracking==0 ) {
+
+                            	      							newLeafNode(otherlv_3, grammarAccess.getXClosureAccess().getCommaKeyword_1_0_0_1_0());
+                            	      						
+                            	    }
+                            	    // InternalUISemanticsGrammar.g:3643:7: ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) )
+                            	    // InternalUISemanticsGrammar.g:3644:8: (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter )
+                            	    {
+                            	    // InternalUISemanticsGrammar.g:3644:8: (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter )
+                            	    // InternalUISemanticsGrammar.g:3645:9: lv_declaredFormalParameters_4_0= ruleJvmFormalParameter
+                            	    {
+                            	    if ( state.backtracking==0 ) {
+
+                            	      									newCompositeNode(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_1_1_0());
+                            	      								
+                            	    }
+                            	    pushFollow(FOLLOW_67);
+                            	    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 loop64;
+                                }
+                            } while (true);
+
+
+                            }
+                            break;
+
+                    }
+
+                    // InternalUISemanticsGrammar.g:3664:5: ( (lv_explicitSyntax_5_0= '|' ) )
+                    // InternalUISemanticsGrammar.g:3665:6: (lv_explicitSyntax_5_0= '|' )
+                    {
+                    // InternalUISemanticsGrammar.g:3665:6: (lv_explicitSyntax_5_0= '|' )
+                    // InternalUISemanticsGrammar.g:3666:7: lv_explicitSyntax_5_0= '|'
+                    {
+                    lv_explicitSyntax_5_0=(Token)match(input,77,FOLLOW_68); 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;
+
+            }
+
+            // InternalUISemanticsGrammar.g:3680:3: ( (lv_expression_6_0= ruleXExpressionInClosure ) )
+            // InternalUISemanticsGrammar.g:3681:4: (lv_expression_6_0= ruleXExpressionInClosure )
+            {
+            // InternalUISemanticsGrammar.g:3681:4: (lv_expression_6_0= ruleXExpressionInClosure )
+            // InternalUISemanticsGrammar.g:3682:5: lv_expression_6_0= ruleXExpressionInClosure
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXClosureAccess().getExpressionXExpressionInClosureParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FOLLOW_69);
+            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,76,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"
+    // InternalUISemanticsGrammar.g:3707:1: entryRuleXExpressionInClosure returns [EObject current=null] : iv_ruleXExpressionInClosure= ruleXExpressionInClosure EOF ;
+    public final EObject entryRuleXExpressionInClosure() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXExpressionInClosure = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:3707:61: (iv_ruleXExpressionInClosure= ruleXExpressionInClosure EOF )
+            // InternalUISemanticsGrammar.g:3708: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"
+    // InternalUISemanticsGrammar.g:3714: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 {
+            // InternalUISemanticsGrammar.g:3720:2: ( ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* ) )
+            // InternalUISemanticsGrammar.g:3721:2: ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* )
+            {
+            // InternalUISemanticsGrammar.g:3721:2: ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* )
+            // InternalUISemanticsGrammar.g:3722:3: () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )*
+            {
+            // InternalUISemanticsGrammar.g:3722:3: ()
+            // InternalUISemanticsGrammar.g:3723:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXExpressionInClosureAccess().getXBlockExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalUISemanticsGrammar.g:3729:3: ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )*
+            loop68:
+            do {
+                int alt68=2;
+                int LA68_0 = input.LA(1);
+
+                if ( ((LA68_0>=RULE_STRING && LA68_0<=RULE_DECIMAL)||LA68_0==14||(LA68_0>=19 && LA68_0<=21)||LA68_0==33||LA68_0==44||(LA68_0>=60 && LA68_0<=61)||LA68_0==65||LA68_0==72||(LA68_0>=74 && LA68_0<=75)||LA68_0==78||LA68_0==80||(LA68_0>=83 && LA68_0<=96)||LA68_0==98) ) {
+                    alt68=1;
+                }
+
+
+                switch (alt68) {
+            	case 1 :
+            	    // InternalUISemanticsGrammar.g:3730:4: ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )?
+            	    {
+            	    // InternalUISemanticsGrammar.g:3730:4: ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) )
+            	    // InternalUISemanticsGrammar.g:3731:5: (lv_expressions_1_0= ruleXExpressionOrVarDeclaration )
+            	    {
+            	    // InternalUISemanticsGrammar.g:3731:5: (lv_expressions_1_0= ruleXExpressionOrVarDeclaration )
+            	    // InternalUISemanticsGrammar.g:3732:6: lv_expressions_1_0= ruleXExpressionOrVarDeclaration
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getXExpressionInClosureAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_1_0_0());
+            	      					
+            	    }
+            	    pushFollow(FOLLOW_70);
+            	    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();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+            	    // InternalUISemanticsGrammar.g:3749:4: (otherlv_2= ';' )?
+            	    int alt67=2;
+            	    int LA67_0 = input.LA(1);
+
+            	    if ( (LA67_0==24) ) {
+            	        alt67=1;
+            	    }
+            	    switch (alt67) {
+            	        case 1 :
+            	            // InternalUISemanticsGrammar.g:3750:5: otherlv_2= ';'
+            	            {
+            	            otherlv_2=(Token)match(input,24,FOLLOW_71); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              					newLeafNode(otherlv_2, grammarAccess.getXExpressionInClosureAccess().getSemicolonKeyword_1_1());
+            	              				
+            	            }
+
+            	            }
+            	            break;
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop68;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXExpressionInClosure"
+
+
+    // $ANTLR start "entryRuleXShortClosure"
+    // InternalUISemanticsGrammar.g:3760:1: entryRuleXShortClosure returns [EObject current=null] : iv_ruleXShortClosure= ruleXShortClosure EOF ;
+    public final EObject entryRuleXShortClosure() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXShortClosure = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:3760:54: (iv_ruleXShortClosure= ruleXShortClosure EOF )
+            // InternalUISemanticsGrammar.g:3761: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"
+    // InternalUISemanticsGrammar.g:3767: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 {
+            // InternalUISemanticsGrammar.g:3773:2: ( ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) ) )
+            // InternalUISemanticsGrammar.g:3774:2: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) )
+            {
+            // InternalUISemanticsGrammar.g:3774:2: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) )
+            // InternalUISemanticsGrammar.g:3775:3: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) )
+            {
+            // InternalUISemanticsGrammar.g:3775:3: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) )
+            // InternalUISemanticsGrammar.g:3776:4: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) )
+            {
+            // InternalUISemanticsGrammar.g:3801:4: ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) )
+            // InternalUISemanticsGrammar.g:3802:5: () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) )
+            {
+            // InternalUISemanticsGrammar.g:3802:5: ()
+            // InternalUISemanticsGrammar.g:3803:6: 
+            {
+            if ( state.backtracking==0 ) {
+
+              						current = forceCreateModelElement(
+              							grammarAccess.getXShortClosureAccess().getXClosureAction_0_0_0(),
+              							current);
+              					
+            }
+
+            }
+
+            // InternalUISemanticsGrammar.g:3809:5: ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )?
+            int alt70=2;
+            int LA70_0 = input.LA(1);
+
+            if ( (LA70_0==RULE_ID||LA70_0==57||LA70_0==72) ) {
+                alt70=1;
+            }
+            switch (alt70) {
+                case 1 :
+                    // InternalUISemanticsGrammar.g:3810:6: ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )*
+                    {
+                    // InternalUISemanticsGrammar.g:3810:6: ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) )
+                    // InternalUISemanticsGrammar.g:3811:7: (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter )
+                    {
+                    // InternalUISemanticsGrammar.g:3811:7: (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter )
+                    // InternalUISemanticsGrammar.g:3812:8: lv_declaredFormalParameters_1_0= ruleJvmFormalParameter
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      								newCompositeNode(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_0_0());
+                      							
+                    }
+                    pushFollow(FOLLOW_67);
+                    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();
+                      							
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalUISemanticsGrammar.g:3829:6: (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )*
+                    loop69:
+                    do {
+                        int alt69=2;
+                        int LA69_0 = input.LA(1);
+
+                        if ( (LA69_0==71) ) {
+                            alt69=1;
+                        }
+
+
+                        switch (alt69) {
+                    	case 1 :
+                    	    // InternalUISemanticsGrammar.g:3830:7: otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) )
+                    	    {
+                    	    otherlv_2=(Token)match(input,71,FOLLOW_31); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newLeafNode(otherlv_2, grammarAccess.getXShortClosureAccess().getCommaKeyword_0_0_1_1_0());
+                    	      						
+                    	    }
+                    	    // InternalUISemanticsGrammar.g:3834:7: ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) )
+                    	    // InternalUISemanticsGrammar.g:3835:8: (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter )
+                    	    {
+                    	    // InternalUISemanticsGrammar.g:3835:8: (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter )
+                    	    // InternalUISemanticsGrammar.g:3836:9: lv_declaredFormalParameters_3_0= ruleJvmFormalParameter
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      									newCompositeNode(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_1_1_0());
+                    	      								
+                    	    }
+                    	    pushFollow(FOLLOW_67);
+                    	    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 loop69;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalUISemanticsGrammar.g:3855:5: ( (lv_explicitSyntax_4_0= '|' ) )
+            // InternalUISemanticsGrammar.g:3856:6: (lv_explicitSyntax_4_0= '|' )
+            {
+            // InternalUISemanticsGrammar.g:3856:6: (lv_explicitSyntax_4_0= '|' )
+            // InternalUISemanticsGrammar.g:3857:7: lv_explicitSyntax_4_0= '|'
+            {
+            lv_explicitSyntax_4_0=(Token)match(input,77,FOLLOW_34); 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, "|");
+              						
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            // InternalUISemanticsGrammar.g:3871:3: ( (lv_expression_5_0= ruleXExpression ) )
+            // InternalUISemanticsGrammar.g:3872:4: (lv_expression_5_0= ruleXExpression )
+            {
+            // InternalUISemanticsGrammar.g:3872:4: (lv_expression_5_0= ruleXExpression )
+            // InternalUISemanticsGrammar.g:3873: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"
+    // InternalUISemanticsGrammar.g:3894:1: entryRuleXParenthesizedExpression returns [EObject current=null] : iv_ruleXParenthesizedExpression= ruleXParenthesizedExpression EOF ;
+    public final EObject entryRuleXParenthesizedExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXParenthesizedExpression = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:3894:65: (iv_ruleXParenthesizedExpression= ruleXParenthesizedExpression EOF )
+            // InternalUISemanticsGrammar.g:3895: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"
+    // InternalUISemanticsGrammar.g:3901: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 {
+            // InternalUISemanticsGrammar.g:3907:2: ( (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' ) )
+            // InternalUISemanticsGrammar.g:3908:2: (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' )
+            {
+            // InternalUISemanticsGrammar.g:3908:2: (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' )
+            // InternalUISemanticsGrammar.g:3909:3: otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')'
+            {
+            otherlv_0=(Token)match(input,72,FOLLOW_34); 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_58);
+            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,73,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"
+    // InternalUISemanticsGrammar.g:3929:1: entryRuleXIfExpression returns [EObject current=null] : iv_ruleXIfExpression= ruleXIfExpression EOF ;
+    public final EObject entryRuleXIfExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXIfExpression = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:3929:54: (iv_ruleXIfExpression= ruleXIfExpression EOF )
+            // InternalUISemanticsGrammar.g:3930: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"
+    // InternalUISemanticsGrammar.g:3936: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 {
+            // InternalUISemanticsGrammar.g:3942: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 ) ) )? ) )
+            // InternalUISemanticsGrammar.g:3943: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 ) ) )? )
+            {
+            // InternalUISemanticsGrammar.g:3943: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 ) ) )? )
+            // InternalUISemanticsGrammar.g:3944: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 ) ) )?
+            {
+            // InternalUISemanticsGrammar.g:3944:3: ()
+            // InternalUISemanticsGrammar.g:3945:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXIfExpressionAccess().getXIfExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,78,FOLLOW_72); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXIfExpressionAccess().getIfKeyword_1());
+              		
+            }
+            otherlv_2=(Token)match(input,72,FOLLOW_34); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getXIfExpressionAccess().getLeftParenthesisKeyword_2());
+              		
+            }
+            // InternalUISemanticsGrammar.g:3959:3: ( (lv_if_3_0= ruleXExpression ) )
+            // InternalUISemanticsGrammar.g:3960:4: (lv_if_3_0= ruleXExpression )
+            {
+            // InternalUISemanticsGrammar.g:3960:4: (lv_if_3_0= ruleXExpression )
+            // InternalUISemanticsGrammar.g:3961:5: lv_if_3_0= ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXIfExpressionAccess().getIfXExpressionParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FOLLOW_58);
+            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,73,FOLLOW_34); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_4, grammarAccess.getXIfExpressionAccess().getRightParenthesisKeyword_4());
+              		
+            }
+            // InternalUISemanticsGrammar.g:3982:3: ( (lv_then_5_0= ruleXExpression ) )
+            // InternalUISemanticsGrammar.g:3983:4: (lv_then_5_0= ruleXExpression )
+            {
+            // InternalUISemanticsGrammar.g:3983:4: (lv_then_5_0= ruleXExpression )
+            // InternalUISemanticsGrammar.g:3984:5: lv_then_5_0= ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXIfExpressionAccess().getThenXExpressionParserRuleCall_5_0());
+              				
+            }
+            pushFollow(FOLLOW_73);
+            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();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalUISemanticsGrammar.g:4001:3: ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )?
+            int alt71=2;
+            int LA71_0 = input.LA(1);
+
+            if ( (LA71_0==79) ) {
+                int LA71_1 = input.LA(2);
+
+                if ( (synpred25_InternalUISemanticsGrammar()) ) {
+                    alt71=1;
+                }
+            }
+            switch (alt71) {
+                case 1 :
+                    // InternalUISemanticsGrammar.g:4002:4: ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) )
+                    {
+                    // InternalUISemanticsGrammar.g:4002:4: ( ( 'else' )=>otherlv_6= 'else' )
+                    // InternalUISemanticsGrammar.g:4003:5: ( 'else' )=>otherlv_6= 'else'
+                    {
+                    otherlv_6=(Token)match(input,79,FOLLOW_34); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_6, grammarAccess.getXIfExpressionAccess().getElseKeyword_6_0());
+                      				
+                    }
+
+                    }
+
+                    // InternalUISemanticsGrammar.g:4009:4: ( (lv_else_7_0= ruleXExpression ) )
+                    // InternalUISemanticsGrammar.g:4010:5: (lv_else_7_0= ruleXExpression )
+                    {
+                    // InternalUISemanticsGrammar.g:4010:5: (lv_else_7_0= ruleXExpression )
+                    // InternalUISemanticsGrammar.g:4011: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"
+    // InternalUISemanticsGrammar.g:4033:1: entryRuleXSwitchExpression returns [EObject current=null] : iv_ruleXSwitchExpression= ruleXSwitchExpression EOF ;
+    public final EObject entryRuleXSwitchExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXSwitchExpression = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:4033:58: (iv_ruleXSwitchExpression= ruleXSwitchExpression EOF )
+            // InternalUISemanticsGrammar.g:4034: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"
+    // InternalUISemanticsGrammar.g:4040: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 {
+            // InternalUISemanticsGrammar.g:4046: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= '}' ) )
+            // InternalUISemanticsGrammar.g:4047: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= '}' )
+            {
+            // InternalUISemanticsGrammar.g:4047: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= '}' )
+            // InternalUISemanticsGrammar.g:4048: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= '}'
+            {
+            // InternalUISemanticsGrammar.g:4048:3: ()
+            // InternalUISemanticsGrammar.g:4049:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXSwitchExpressionAccess().getXSwitchExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,80,FOLLOW_74); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXSwitchExpressionAccess().getSwitchKeyword_1());
+              		
+            }
+            // InternalUISemanticsGrammar.g:4059: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 alt73=2;
+            alt73 = dfa73.predict(input);
+            switch (alt73) {
+                case 1 :
+                    // InternalUISemanticsGrammar.g:4060:4: ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' )
+                    {
+                    // InternalUISemanticsGrammar.g:4060:4: ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' )
+                    // InternalUISemanticsGrammar.g:4061:5: ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')'
+                    {
+                    // InternalUISemanticsGrammar.g:4061:5: ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) )
+                    // InternalUISemanticsGrammar.g:4062:6: ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
+                    {
+                    // InternalUISemanticsGrammar.g:4072:6: (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
+                    // InternalUISemanticsGrammar.g:4073:7: otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':'
+                    {
+                    otherlv_2=(Token)match(input,72,FOLLOW_31); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							newLeafNode(otherlv_2, grammarAccess.getXSwitchExpressionAccess().getLeftParenthesisKeyword_2_0_0_0_0());
+                      						
+                    }
+                    // InternalUISemanticsGrammar.g:4077:7: ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) )
+                    // InternalUISemanticsGrammar.g:4078:8: (lv_declaredParam_3_0= ruleJvmFormalParameter )
+                    {
+                    // InternalUISemanticsGrammar.g:4078:8: (lv_declaredParam_3_0= ruleJvmFormalParameter )
+                    // InternalUISemanticsGrammar.g:4079:9: lv_declaredParam_3_0= ruleJvmFormalParameter
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      									newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_0_0_0_1_0());
+                      								
+                    }
+                    pushFollow(FOLLOW_26);
+                    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,32,FOLLOW_34); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							newLeafNode(otherlv_4, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_0_0_0_2());
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalUISemanticsGrammar.g:4102:5: ( (lv_switch_5_0= ruleXExpression ) )
+                    // InternalUISemanticsGrammar.g:4103:6: (lv_switch_5_0= ruleXExpression )
+                    {
+                    // InternalUISemanticsGrammar.g:4103:6: (lv_switch_5_0= ruleXExpression )
+                    // InternalUISemanticsGrammar.g:4104:7: lv_switch_5_0= ruleXExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_0_1_0());
+                      						
+                    }
+                    pushFollow(FOLLOW_58);
+                    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,73,FOLLOW_4); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_6, grammarAccess.getXSwitchExpressionAccess().getRightParenthesisKeyword_2_0_2());
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalUISemanticsGrammar.g:4127:4: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) )
+                    {
+                    // InternalUISemanticsGrammar.g:4127:4: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) )
+                    // InternalUISemanticsGrammar.g:4128:5: ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) )
+                    {
+                    // InternalUISemanticsGrammar.g:4128:5: ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )?
+                    int alt72=2;
+                    alt72 = dfa72.predict(input);
+                    switch (alt72) {
+                        case 1 :
+                            // InternalUISemanticsGrammar.g:4129:6: ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' )
+                            {
+                            // InternalUISemanticsGrammar.g:4138:6: ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' )
+                            // InternalUISemanticsGrammar.g:4139:7: ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':'
+                            {
+                            // InternalUISemanticsGrammar.g:4139:7: ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) )
+                            // InternalUISemanticsGrammar.g:4140:8: (lv_declaredParam_7_0= ruleJvmFormalParameter )
+                            {
+                            // InternalUISemanticsGrammar.g:4140:8: (lv_declaredParam_7_0= ruleJvmFormalParameter )
+                            // InternalUISemanticsGrammar.g:4141:9: lv_declaredParam_7_0= ruleJvmFormalParameter
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              									newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_1_0_0_0_0());
+                              								
+                            }
+                            pushFollow(FOLLOW_26);
+                            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,32,FOLLOW_34); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							newLeafNode(otherlv_8, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_1_0_0_1());
+                              						
+                            }
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    // InternalUISemanticsGrammar.g:4164:5: ( (lv_switch_9_0= ruleXExpression ) )
+                    // InternalUISemanticsGrammar.g:4165:6: (lv_switch_9_0= ruleXExpression )
+                    {
+                    // InternalUISemanticsGrammar.g:4165:6: (lv_switch_9_0= ruleXExpression )
+                    // InternalUISemanticsGrammar.g:4166:7: lv_switch_9_0= ruleXExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_1_1_0());
+                      						
+                    }
+                    pushFollow(FOLLOW_4);
+                    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_75); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_10, grammarAccess.getXSwitchExpressionAccess().getLeftCurlyBracketKeyword_3());
+              		
+            }
+            // InternalUISemanticsGrammar.g:4189:3: ( (lv_cases_11_0= ruleXCasePart ) )*
+            loop74:
+            do {
+                int alt74=2;
+                int LA74_0 = input.LA(1);
+
+                if ( (LA74_0==RULE_ID||LA74_0==32||LA74_0==57||(LA74_0>=71 && LA74_0<=72)||LA74_0==82) ) {
+                    alt74=1;
+                }
+
+
+                switch (alt74) {
+            	case 1 :
+            	    // InternalUISemanticsGrammar.g:4190:4: (lv_cases_11_0= ruleXCasePart )
+            	    {
+            	    // InternalUISemanticsGrammar.g:4190:4: (lv_cases_11_0= ruleXCasePart )
+            	    // InternalUISemanticsGrammar.g:4191:5: lv_cases_11_0= ruleXCasePart
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getCasesXCasePartParserRuleCall_4_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_75);
+            	    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 loop74;
+                }
+            } while (true);
+
+            // InternalUISemanticsGrammar.g:4208:3: (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )?
+            int alt75=2;
+            int LA75_0 = input.LA(1);
+
+            if ( (LA75_0==81) ) {
+                alt75=1;
+            }
+            switch (alt75) {
+                case 1 :
+                    // InternalUISemanticsGrammar.g:4209:4: otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) )
+                    {
+                    otherlv_12=(Token)match(input,81,FOLLOW_26); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_12, grammarAccess.getXSwitchExpressionAccess().getDefaultKeyword_5_0());
+                      			
+                    }
+                    otherlv_13=(Token)match(input,32,FOLLOW_34); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_13, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_5_1());
+                      			
+                    }
+                    // InternalUISemanticsGrammar.g:4217:4: ( (lv_default_14_0= ruleXExpression ) )
+                    // InternalUISemanticsGrammar.g:4218:5: (lv_default_14_0= ruleXExpression )
+                    {
+                    // InternalUISemanticsGrammar.g:4218:5: (lv_default_14_0= ruleXExpression )
+                    // InternalUISemanticsGrammar.g:4219:6: lv_default_14_0= ruleXExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDefaultXExpressionParserRuleCall_5_2_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_20);
+                    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"
+    // InternalUISemanticsGrammar.g:4245:1: entryRuleXCasePart returns [EObject current=null] : iv_ruleXCasePart= ruleXCasePart EOF ;
+    public final EObject entryRuleXCasePart() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXCasePart = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:4245:50: (iv_ruleXCasePart= ruleXCasePart EOF )
+            // InternalUISemanticsGrammar.g:4246: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"
+    // InternalUISemanticsGrammar.g:4252: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 {
+            // InternalUISemanticsGrammar.g:4258: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= ',' ) ) ) ) )
+            // InternalUISemanticsGrammar.g:4259: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= ',' ) ) ) )
+            {
+            // InternalUISemanticsGrammar.g:4259: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= ',' ) ) ) )
+            // InternalUISemanticsGrammar.g:4260: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= ',' ) ) )
+            {
+            // InternalUISemanticsGrammar.g:4260:3: ()
+            // InternalUISemanticsGrammar.g:4261:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXCasePartAccess().getXCasePartAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalUISemanticsGrammar.g:4267:3: ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )?
+            int alt76=2;
+            int LA76_0 = input.LA(1);
+
+            if ( (LA76_0==RULE_ID||LA76_0==57||LA76_0==72) ) {
+                alt76=1;
+            }
+            switch (alt76) {
+                case 1 :
+                    // InternalUISemanticsGrammar.g:4268:4: (lv_typeGuard_1_0= ruleJvmTypeReference )
+                    {
+                    // InternalUISemanticsGrammar.g:4268:4: (lv_typeGuard_1_0= ruleJvmTypeReference )
+                    // InternalUISemanticsGrammar.g:4269:5: lv_typeGuard_1_0= ruleJvmTypeReference
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getXCasePartAccess().getTypeGuardJvmTypeReferenceParserRuleCall_1_0());
+                      				
+                    }
+                    pushFollow(FOLLOW_76);
+                    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;
+
+            }
+
+            // InternalUISemanticsGrammar.g:4286:3: (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )?
+            int alt77=2;
+            int LA77_0 = input.LA(1);
+
+            if ( (LA77_0==82) ) {
+                alt77=1;
+            }
+            switch (alt77) {
+                case 1 :
+                    // InternalUISemanticsGrammar.g:4287:4: otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) )
+                    {
+                    otherlv_2=(Token)match(input,82,FOLLOW_34); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getXCasePartAccess().getCaseKeyword_2_0());
+                      			
+                    }
+                    // InternalUISemanticsGrammar.g:4291:4: ( (lv_case_3_0= ruleXExpression ) )
+                    // InternalUISemanticsGrammar.g:4292:5: (lv_case_3_0= ruleXExpression )
+                    {
+                    // InternalUISemanticsGrammar.g:4292:5: (lv_case_3_0= ruleXExpression )
+                    // InternalUISemanticsGrammar.g:4293:6: lv_case_3_0= ruleXExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getXCasePartAccess().getCaseXExpressionParserRuleCall_2_1_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_77);
+                    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;
+
+            }
+
+            // InternalUISemanticsGrammar.g:4311:3: ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) )
+            int alt78=2;
+            int LA78_0 = input.LA(1);
+
+            if ( (LA78_0==32) ) {
+                alt78=1;
+            }
+            else if ( (LA78_0==71) ) {
+                alt78=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 78, 0, input);
+
+                throw nvae;
+            }
+            switch (alt78) {
+                case 1 :
+                    // InternalUISemanticsGrammar.g:4312:4: (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) )
+                    {
+                    // InternalUISemanticsGrammar.g:4312:4: (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) )
+                    // InternalUISemanticsGrammar.g:4313:5: otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) )
+                    {
+                    otherlv_4=(Token)match(input,32,FOLLOW_34); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_4, grammarAccess.getXCasePartAccess().getColonKeyword_3_0_0());
+                      				
+                    }
+                    // InternalUISemanticsGrammar.g:4317:5: ( (lv_then_5_0= ruleXExpression ) )
+                    // InternalUISemanticsGrammar.g:4318:6: (lv_then_5_0= ruleXExpression )
+                    {
+                    // InternalUISemanticsGrammar.g:4318:6: (lv_then_5_0= ruleXExpression )
+                    // InternalUISemanticsGrammar.g:4319: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 :
+                    // InternalUISemanticsGrammar.g:4338:4: ( (lv_fallThrough_6_0= ',' ) )
+                    {
+                    // InternalUISemanticsGrammar.g:4338:4: ( (lv_fallThrough_6_0= ',' ) )
+                    // InternalUISemanticsGrammar.g:4339:5: (lv_fallThrough_6_0= ',' )
+                    {
+                    // InternalUISemanticsGrammar.g:4339:5: (lv_fallThrough_6_0= ',' )
+                    // InternalUISemanticsGrammar.g:4340:6: lv_fallThrough_6_0= ','
+                    {
+                    lv_fallThrough_6_0=(Token)match(input,71,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"
+    // InternalUISemanticsGrammar.g:4357:1: entryRuleXForLoopExpression returns [EObject current=null] : iv_ruleXForLoopExpression= ruleXForLoopExpression EOF ;
+    public final EObject entryRuleXForLoopExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXForLoopExpression = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:4357:59: (iv_ruleXForLoopExpression= ruleXForLoopExpression EOF )
+            // InternalUISemanticsGrammar.g:4358: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"
+    // InternalUISemanticsGrammar.g:4364: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 {
+            // InternalUISemanticsGrammar.g:4370: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 ) ) ) )
+            // InternalUISemanticsGrammar.g:4371: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 ) ) )
+            {
+            // InternalUISemanticsGrammar.g:4371: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 ) ) )
+            // InternalUISemanticsGrammar.g:4372: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 ) )
+            {
+            // InternalUISemanticsGrammar.g:4372:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) )
+            // InternalUISemanticsGrammar.g:4373:4: ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
+            {
+            // InternalUISemanticsGrammar.g:4386:4: ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
+            // InternalUISemanticsGrammar.g:4387:5: () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':'
+            {
+            // InternalUISemanticsGrammar.g:4387:5: ()
+            // InternalUISemanticsGrammar.g:4388:6: 
+            {
+            if ( state.backtracking==0 ) {
+
+              						current = forceCreateModelElement(
+              							grammarAccess.getXForLoopExpressionAccess().getXForLoopExpressionAction_0_0_0(),
+              							current);
+              					
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,83,FOLLOW_72); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(otherlv_1, grammarAccess.getXForLoopExpressionAccess().getForKeyword_0_0_1());
+              				
+            }
+            otherlv_2=(Token)match(input,72,FOLLOW_31); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(otherlv_2, grammarAccess.getXForLoopExpressionAccess().getLeftParenthesisKeyword_0_0_2());
+              				
+            }
+            // InternalUISemanticsGrammar.g:4402:5: ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) )
+            // InternalUISemanticsGrammar.g:4403:6: (lv_declaredParam_3_0= ruleJvmFormalParameter )
+            {
+            // InternalUISemanticsGrammar.g:4403:6: (lv_declaredParam_3_0= ruleJvmFormalParameter )
+            // InternalUISemanticsGrammar.g:4404:7: lv_declaredParam_3_0= ruleJvmFormalParameter
+            {
+            if ( state.backtracking==0 ) {
+
+              							newCompositeNode(grammarAccess.getXForLoopExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_0_0_3_0());
+              						
+            }
+            pushFollow(FOLLOW_26);
+            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,32,FOLLOW_34); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(otherlv_4, grammarAccess.getXForLoopExpressionAccess().getColonKeyword_0_0_4());
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalUISemanticsGrammar.g:4427:3: ( (lv_forExpression_5_0= ruleXExpression ) )
+            // InternalUISemanticsGrammar.g:4428:4: (lv_forExpression_5_0= ruleXExpression )
+            {
+            // InternalUISemanticsGrammar.g:4428:4: (lv_forExpression_5_0= ruleXExpression )
+            // InternalUISemanticsGrammar.g:4429:5: lv_forExpression_5_0= ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXForLoopExpressionAccess().getForExpressionXExpressionParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FOLLOW_58);
+            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,73,FOLLOW_34); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_6, grammarAccess.getXForLoopExpressionAccess().getRightParenthesisKeyword_2());
+              		
+            }
+            // InternalUISemanticsGrammar.g:4450:3: ( (lv_eachExpression_7_0= ruleXExpression ) )
+            // InternalUISemanticsGrammar.g:4451:4: (lv_eachExpression_7_0= ruleXExpression )
+            {
+            // InternalUISemanticsGrammar.g:4451:4: (lv_eachExpression_7_0= ruleXExpression )
+            // InternalUISemanticsGrammar.g:4452: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"
+    // InternalUISemanticsGrammar.g:4473:1: entryRuleXBasicForLoopExpression returns [EObject current=null] : iv_ruleXBasicForLoopExpression= ruleXBasicForLoopExpression EOF ;
+    public final EObject entryRuleXBasicForLoopExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXBasicForLoopExpression = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:4473:64: (iv_ruleXBasicForLoopExpression= ruleXBasicForLoopExpression EOF )
+            // InternalUISemanticsGrammar.g:4474: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"
+    // InternalUISemanticsGrammar.g:4480: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 {
+            // InternalUISemanticsGrammar.g:4486: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 ) ) ) )
+            // InternalUISemanticsGrammar.g:4487: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 ) ) )
+            {
+            // InternalUISemanticsGrammar.g:4487: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 ) ) )
+            // InternalUISemanticsGrammar.g:4488: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 ) )
+            {
+            // InternalUISemanticsGrammar.g:4488:3: ()
+            // InternalUISemanticsGrammar.g:4489:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXBasicForLoopExpressionAccess().getXBasicForLoopExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,83,FOLLOW_72); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXBasicForLoopExpressionAccess().getForKeyword_1());
+              		
+            }
+            otherlv_2=(Token)match(input,72,FOLLOW_78); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getXBasicForLoopExpressionAccess().getLeftParenthesisKeyword_2());
+              		
+            }
+            // InternalUISemanticsGrammar.g:4503:3: ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )?
+            int alt80=2;
+            int LA80_0 = input.LA(1);
+
+            if ( ((LA80_0>=RULE_STRING && LA80_0<=RULE_DECIMAL)||LA80_0==14||(LA80_0>=19 && LA80_0<=21)||LA80_0==33||LA80_0==44||(LA80_0>=60 && LA80_0<=61)||LA80_0==65||LA80_0==72||(LA80_0>=74 && LA80_0<=75)||LA80_0==78||LA80_0==80||(LA80_0>=83 && LA80_0<=96)||LA80_0==98) ) {
+                alt80=1;
+            }
+            switch (alt80) {
+                case 1 :
+                    // InternalUISemanticsGrammar.g:4504:4: ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )*
+                    {
+                    // InternalUISemanticsGrammar.g:4504:4: ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) )
+                    // InternalUISemanticsGrammar.g:4505:5: (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration )
+                    {
+                    // InternalUISemanticsGrammar.g:4505:5: (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration )
+                    // InternalUISemanticsGrammar.g:4506:6: lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsXExpressionOrVarDeclarationParserRuleCall_3_0_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_79);
+                    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();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalUISemanticsGrammar.g:4523:4: (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )*
+                    loop79:
+                    do {
+                        int alt79=2;
+                        int LA79_0 = input.LA(1);
+
+                        if ( (LA79_0==71) ) {
+                            alt79=1;
+                        }
+
+
+                        switch (alt79) {
+                    	case 1 :
+                    	    // InternalUISemanticsGrammar.g:4524:5: otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) )
+                    	    {
+                    	    otherlv_4=(Token)match(input,71,FOLLOW_80); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      					newLeafNode(otherlv_4, grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_3_1_0());
+                    	      				
+                    	    }
+                    	    // InternalUISemanticsGrammar.g:4528:5: ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) )
+                    	    // InternalUISemanticsGrammar.g:4529:6: (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration )
+                    	    {
+                    	    // InternalUISemanticsGrammar.g:4529:6: (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration )
+                    	    // InternalUISemanticsGrammar.g:4530:7: lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsXExpressionOrVarDeclarationParserRuleCall_3_1_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_79);
+                    	    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 loop79;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_6=(Token)match(input,24,FOLLOW_81); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_6, grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_4());
+              		
+            }
+            // InternalUISemanticsGrammar.g:4553:3: ( (lv_expression_7_0= ruleXExpression ) )?
+            int alt81=2;
+            int LA81_0 = input.LA(1);
+
+            if ( ((LA81_0>=RULE_STRING && LA81_0<=RULE_DECIMAL)||LA81_0==14||(LA81_0>=19 && LA81_0<=21)||LA81_0==33||LA81_0==44||(LA81_0>=60 && LA81_0<=61)||LA81_0==65||LA81_0==72||(LA81_0>=74 && LA81_0<=75)||LA81_0==78||LA81_0==80||(LA81_0>=83 && LA81_0<=85)||(LA81_0>=88 && LA81_0<=96)||LA81_0==98) ) {
+                alt81=1;
+            }
+            switch (alt81) {
+                case 1 :
+                    // InternalUISemanticsGrammar.g:4554:4: (lv_expression_7_0= ruleXExpression )
+                    {
+                    // InternalUISemanticsGrammar.g:4554:4: (lv_expression_7_0= ruleXExpression )
+                    // InternalUISemanticsGrammar.g:4555:5: lv_expression_7_0= ruleXExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getExpressionXExpressionParserRuleCall_5_0());
+                      				
+                    }
+                    pushFollow(FOLLOW_82);
+                    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,24,FOLLOW_83); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_8, grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_6());
+              		
+            }
+            // InternalUISemanticsGrammar.g:4576:3: ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )?
+            int alt83=2;
+            int LA83_0 = input.LA(1);
+
+            if ( ((LA83_0>=RULE_STRING && LA83_0<=RULE_DECIMAL)||LA83_0==14||(LA83_0>=19 && LA83_0<=21)||LA83_0==33||LA83_0==44||(LA83_0>=60 && LA83_0<=61)||LA83_0==65||LA83_0==72||(LA83_0>=74 && LA83_0<=75)||LA83_0==78||LA83_0==80||(LA83_0>=83 && LA83_0<=85)||(LA83_0>=88 && LA83_0<=96)||LA83_0==98) ) {
+                alt83=1;
+            }
+            switch (alt83) {
+                case 1 :
+                    // InternalUISemanticsGrammar.g:4577:4: ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )*
+                    {
+                    // InternalUISemanticsGrammar.g:4577:4: ( (lv_updateExpressions_9_0= ruleXExpression ) )
+                    // InternalUISemanticsGrammar.g:4578:5: (lv_updateExpressions_9_0= ruleXExpression )
+                    {
+                    // InternalUISemanticsGrammar.g:4578:5: (lv_updateExpressions_9_0= ruleXExpression )
+                    // InternalUISemanticsGrammar.g:4579:6: lv_updateExpressions_9_0= ruleXExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsXExpressionParserRuleCall_7_0_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_59);
+                    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();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalUISemanticsGrammar.g:4596:4: (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )*
+                    loop82:
+                    do {
+                        int alt82=2;
+                        int LA82_0 = input.LA(1);
+
+                        if ( (LA82_0==71) ) {
+                            alt82=1;
+                        }
+
+
+                        switch (alt82) {
+                    	case 1 :
+                    	    // InternalUISemanticsGrammar.g:4597:5: otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) )
+                    	    {
+                    	    otherlv_10=(Token)match(input,71,FOLLOW_34); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      					newLeafNode(otherlv_10, grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_7_1_0());
+                    	      				
+                    	    }
+                    	    // InternalUISemanticsGrammar.g:4601:5: ( (lv_updateExpressions_11_0= ruleXExpression ) )
+                    	    // InternalUISemanticsGrammar.g:4602:6: (lv_updateExpressions_11_0= ruleXExpression )
+                    	    {
+                    	    // InternalUISemanticsGrammar.g:4602:6: (lv_updateExpressions_11_0= ruleXExpression )
+                    	    // InternalUISemanticsGrammar.g:4603:7: lv_updateExpressions_11_0= ruleXExpression
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsXExpressionParserRuleCall_7_1_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_59);
+                    	    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 loop82;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_12=(Token)match(input,73,FOLLOW_34); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_12, grammarAccess.getXBasicForLoopExpressionAccess().getRightParenthesisKeyword_8());
+              		
+            }
+            // InternalUISemanticsGrammar.g:4626:3: ( (lv_eachExpression_13_0= ruleXExpression ) )
+            // InternalUISemanticsGrammar.g:4627:4: (lv_eachExpression_13_0= ruleXExpression )
+            {
+            // InternalUISemanticsGrammar.g:4627:4: (lv_eachExpression_13_0= ruleXExpression )
+            // InternalUISemanticsGrammar.g:4628: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"
+    // InternalUISemanticsGrammar.g:4649:1: entryRuleXWhileExpression returns [EObject current=null] : iv_ruleXWhileExpression= ruleXWhileExpression EOF ;
+    public final EObject entryRuleXWhileExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXWhileExpression = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:4649:57: (iv_ruleXWhileExpression= ruleXWhileExpression EOF )
+            // InternalUISemanticsGrammar.g:4650: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"
+    // InternalUISemanticsGrammar.g:4656: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 {
+            // InternalUISemanticsGrammar.g:4662:2: ( ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) ) )
+            // InternalUISemanticsGrammar.g:4663:2: ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) )
+            {
+            // InternalUISemanticsGrammar.g:4663:2: ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) )
+            // InternalUISemanticsGrammar.g:4664:3: () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) )
+            {
+            // InternalUISemanticsGrammar.g:4664:3: ()
+            // InternalUISemanticsGrammar.g:4665:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXWhileExpressionAccess().getXWhileExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,84,FOLLOW_72); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXWhileExpressionAccess().getWhileKeyword_1());
+              		
+            }
+            otherlv_2=(Token)match(input,72,FOLLOW_34); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getXWhileExpressionAccess().getLeftParenthesisKeyword_2());
+              		
+            }
+            // InternalUISemanticsGrammar.g:4679:3: ( (lv_predicate_3_0= ruleXExpression ) )
+            // InternalUISemanticsGrammar.g:4680:4: (lv_predicate_3_0= ruleXExpression )
+            {
+            // InternalUISemanticsGrammar.g:4680:4: (lv_predicate_3_0= ruleXExpression )
+            // InternalUISemanticsGrammar.g:4681:5: lv_predicate_3_0= ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXWhileExpressionAccess().getPredicateXExpressionParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FOLLOW_58);
+            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,73,FOLLOW_34); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_4, grammarAccess.getXWhileExpressionAccess().getRightParenthesisKeyword_4());
+              		
+            }
+            // InternalUISemanticsGrammar.g:4702:3: ( (lv_body_5_0= ruleXExpression ) )
+            // InternalUISemanticsGrammar.g:4703:4: (lv_body_5_0= ruleXExpression )
+            {
+            // InternalUISemanticsGrammar.g:4703:4: (lv_body_5_0= ruleXExpression )
+            // InternalUISemanticsGrammar.g:4704: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"
+    // InternalUISemanticsGrammar.g:4725:1: entryRuleXDoWhileExpression returns [EObject current=null] : iv_ruleXDoWhileExpression= ruleXDoWhileExpression EOF ;
+    public final EObject entryRuleXDoWhileExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXDoWhileExpression = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:4725:59: (iv_ruleXDoWhileExpression= ruleXDoWhileExpression EOF )
+            // InternalUISemanticsGrammar.g:4726: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"
+    // InternalUISemanticsGrammar.g:4732: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 {
+            // InternalUISemanticsGrammar.g:4738:2: ( ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' ) )
+            // InternalUISemanticsGrammar.g:4739:2: ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' )
+            {
+            // InternalUISemanticsGrammar.g:4739:2: ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' )
+            // InternalUISemanticsGrammar.g:4740:3: () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')'
+            {
+            // InternalUISemanticsGrammar.g:4740:3: ()
+            // InternalUISemanticsGrammar.g:4741:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXDoWhileExpressionAccess().getXDoWhileExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,85,FOLLOW_34); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXDoWhileExpressionAccess().getDoKeyword_1());
+              		
+            }
+            // InternalUISemanticsGrammar.g:4751:3: ( (lv_body_2_0= ruleXExpression ) )
+            // InternalUISemanticsGrammar.g:4752:4: (lv_body_2_0= ruleXExpression )
+            {
+            // InternalUISemanticsGrammar.g:4752:4: (lv_body_2_0= ruleXExpression )
+            // InternalUISemanticsGrammar.g:4753:5: lv_body_2_0= ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXDoWhileExpressionAccess().getBodyXExpressionParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FOLLOW_84);
+            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,84,FOLLOW_72); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_3, grammarAccess.getXDoWhileExpressionAccess().getWhileKeyword_3());
+              		
+            }
+            otherlv_4=(Token)match(input,72,FOLLOW_34); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_4, grammarAccess.getXDoWhileExpressionAccess().getLeftParenthesisKeyword_4());
+              		
+            }
+            // InternalUISemanticsGrammar.g:4778:3: ( (lv_predicate_5_0= ruleXExpression ) )
+            // InternalUISemanticsGrammar.g:4779:4: (lv_predicate_5_0= ruleXExpression )
+            {
+            // InternalUISemanticsGrammar.g:4779:4: (lv_predicate_5_0= ruleXExpression )
+            // InternalUISemanticsGrammar.g:4780:5: lv_predicate_5_0= ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXDoWhileExpressionAccess().getPredicateXExpressionParserRuleCall_5_0());
+              				
+            }
+            pushFollow(FOLLOW_58);
+            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,73,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"
+    // InternalUISemanticsGrammar.g:4805:1: entryRuleXBlockExpression returns [EObject current=null] : iv_ruleXBlockExpression= ruleXBlockExpression EOF ;
+    public final EObject entryRuleXBlockExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXBlockExpression = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:4805:57: (iv_ruleXBlockExpression= ruleXBlockExpression EOF )
+            // InternalUISemanticsGrammar.g:4806: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"
+    // InternalUISemanticsGrammar.g:4812: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 {
+            // InternalUISemanticsGrammar.g:4818:2: ( ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' ) )
+            // InternalUISemanticsGrammar.g:4819:2: ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' )
+            {
+            // InternalUISemanticsGrammar.g:4819:2: ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' )
+            // InternalUISemanticsGrammar.g:4820:3: () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}'
+            {
+            // InternalUISemanticsGrammar.g:4820:3: ()
+            // InternalUISemanticsGrammar.g:4821:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXBlockExpressionAccess().getXBlockExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,14,FOLLOW_85); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXBlockExpressionAccess().getLeftCurlyBracketKeyword_1());
+              		
+            }
+            // InternalUISemanticsGrammar.g:4831:3: ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )*
+            loop85:
+            do {
+                int alt85=2;
+                int LA85_0 = input.LA(1);
+
+                if ( ((LA85_0>=RULE_STRING && LA85_0<=RULE_DECIMAL)||LA85_0==14||(LA85_0>=19 && LA85_0<=21)||LA85_0==33||LA85_0==44||(LA85_0>=60 && LA85_0<=61)||LA85_0==65||LA85_0==72||(LA85_0>=74 && LA85_0<=75)||LA85_0==78||LA85_0==80||(LA85_0>=83 && LA85_0<=96)||LA85_0==98) ) {
+                    alt85=1;
+                }
+
+
+                switch (alt85) {
+            	case 1 :
+            	    // InternalUISemanticsGrammar.g:4832:4: ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )?
+            	    {
+            	    // InternalUISemanticsGrammar.g:4832:4: ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) )
+            	    // InternalUISemanticsGrammar.g:4833:5: (lv_expressions_2_0= ruleXExpressionOrVarDeclaration )
+            	    {
+            	    // InternalUISemanticsGrammar.g:4833:5: (lv_expressions_2_0= ruleXExpressionOrVarDeclaration )
+            	    // InternalUISemanticsGrammar.g:4834:6: lv_expressions_2_0= ruleXExpressionOrVarDeclaration
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getXBlockExpressionAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_2_0_0());
+            	      					
+            	    }
+            	    pushFollow(FOLLOW_86);
+            	    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();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+            	    // InternalUISemanticsGrammar.g:4851:4: (otherlv_3= ';' )?
+            	    int alt84=2;
+            	    int LA84_0 = input.LA(1);
+
+            	    if ( (LA84_0==24) ) {
+            	        alt84=1;
+            	    }
+            	    switch (alt84) {
+            	        case 1 :
+            	            // InternalUISemanticsGrammar.g:4852:5: otherlv_3= ';'
+            	            {
+            	            otherlv_3=(Token)match(input,24,FOLLOW_85); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              					newLeafNode(otherlv_3, grammarAccess.getXBlockExpressionAccess().getSemicolonKeyword_2_1());
+            	              				
+            	            }
+
+            	            }
+            	            break;
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop85;
+                }
+            } 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"
+    // InternalUISemanticsGrammar.g:4866:1: entryRuleXExpressionOrVarDeclaration returns [EObject current=null] : iv_ruleXExpressionOrVarDeclaration= ruleXExpressionOrVarDeclaration EOF ;
+    public final EObject entryRuleXExpressionOrVarDeclaration() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXExpressionOrVarDeclaration = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:4866:68: (iv_ruleXExpressionOrVarDeclaration= ruleXExpressionOrVarDeclaration EOF )
+            // InternalUISemanticsGrammar.g:4867: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"
+    // InternalUISemanticsGrammar.g:4873: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 {
+            // InternalUISemanticsGrammar.g:4879:2: ( (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression ) )
+            // InternalUISemanticsGrammar.g:4880:2: (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression )
+            {
+            // InternalUISemanticsGrammar.g:4880:2: (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression )
+            int alt86=2;
+            int LA86_0 = input.LA(1);
+
+            if ( ((LA86_0>=86 && LA86_0<=87)) ) {
+                alt86=1;
+            }
+            else if ( ((LA86_0>=RULE_STRING && LA86_0<=RULE_DECIMAL)||LA86_0==14||(LA86_0>=19 && LA86_0<=21)||LA86_0==33||LA86_0==44||(LA86_0>=60 && LA86_0<=61)||LA86_0==65||LA86_0==72||(LA86_0>=74 && LA86_0<=75)||LA86_0==78||LA86_0==80||(LA86_0>=83 && LA86_0<=85)||(LA86_0>=88 && LA86_0<=96)||LA86_0==98) ) {
+                alt86=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 86, 0, input);
+
+                throw nvae;
+            }
+            switch (alt86) {
+                case 1 :
+                    // InternalUISemanticsGrammar.g:4881: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 :
+                    // InternalUISemanticsGrammar.g:4890: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"
+    // InternalUISemanticsGrammar.g:4902:1: entryRuleXVariableDeclaration returns [EObject current=null] : iv_ruleXVariableDeclaration= ruleXVariableDeclaration EOF ;
+    public final EObject entryRuleXVariableDeclaration() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXVariableDeclaration = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:4902:61: (iv_ruleXVariableDeclaration= ruleXVariableDeclaration EOF )
+            // InternalUISemanticsGrammar.g:4903: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"
+    // InternalUISemanticsGrammar.g:4909: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 {
+            // InternalUISemanticsGrammar.g:4915: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 ) ) )? ) )
+            // InternalUISemanticsGrammar.g:4916: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 ) ) )? )
+            {
+            // InternalUISemanticsGrammar.g:4916: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 ) ) )? )
+            // InternalUISemanticsGrammar.g:4917: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 ) ) )?
+            {
+            // InternalUISemanticsGrammar.g:4917:3: ()
+            // InternalUISemanticsGrammar.g:4918:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXVariableDeclarationAccess().getXVariableDeclarationAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalUISemanticsGrammar.g:4924:3: ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' )
+            int alt87=2;
+            int LA87_0 = input.LA(1);
+
+            if ( (LA87_0==86) ) {
+                alt87=1;
+            }
+            else if ( (LA87_0==87) ) {
+                alt87=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 87, 0, input);
+
+                throw nvae;
+            }
+            switch (alt87) {
+                case 1 :
+                    // InternalUISemanticsGrammar.g:4925:4: ( (lv_writeable_1_0= 'var' ) )
+                    {
+                    // InternalUISemanticsGrammar.g:4925:4: ( (lv_writeable_1_0= 'var' ) )
+                    // InternalUISemanticsGrammar.g:4926:5: (lv_writeable_1_0= 'var' )
+                    {
+                    // InternalUISemanticsGrammar.g:4926:5: (lv_writeable_1_0= 'var' )
+                    // InternalUISemanticsGrammar.g:4927:6: lv_writeable_1_0= 'var'
+                    {
+                    lv_writeable_1_0=(Token)match(input,86,FOLLOW_31); 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 :
+                    // InternalUISemanticsGrammar.g:4940:4: otherlv_2= 'val'
+                    {
+                    otherlv_2=(Token)match(input,87,FOLLOW_31); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getXVariableDeclarationAccess().getValKeyword_1_1());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUISemanticsGrammar.g:4945:3: ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) )
+            int alt88=2;
+            int LA88_0 = input.LA(1);
+
+            if ( (LA88_0==RULE_ID) ) {
+                int LA88_1 = input.LA(2);
+
+                if ( (synpred29_InternalUISemanticsGrammar()) ) {
+                    alt88=1;
+                }
+                else if ( (true) ) {
+                    alt88=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return current;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 88, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else if ( (LA88_0==72) && (synpred29_InternalUISemanticsGrammar())) {
+                alt88=1;
+            }
+            else if ( (LA88_0==57) && (synpred29_InternalUISemanticsGrammar())) {
+                alt88=1;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 88, 0, input);
+
+                throw nvae;
+            }
+            switch (alt88) {
+                case 1 :
+                    // InternalUISemanticsGrammar.g:4946:4: ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) )
+                    {
+                    // InternalUISemanticsGrammar.g:4946:4: ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) )
+                    // InternalUISemanticsGrammar.g:4947:5: ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) )
+                    {
+                    // InternalUISemanticsGrammar.g:4960:5: ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) )
+                    // InternalUISemanticsGrammar.g:4961:6: ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) )
+                    {
+                    // InternalUISemanticsGrammar.g:4961:6: ( (lv_type_3_0= ruleJvmTypeReference ) )
+                    // InternalUISemanticsGrammar.g:4962:7: (lv_type_3_0= ruleJvmTypeReference )
+                    {
+                    // InternalUISemanticsGrammar.g:4962:7: (lv_type_3_0= ruleJvmTypeReference )
+                    // InternalUISemanticsGrammar.g:4963:8: lv_type_3_0= ruleJvmTypeReference
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      								newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getTypeJvmTypeReferenceParserRuleCall_2_0_0_0_0());
+                      							
+                    }
+                    pushFollow(FOLLOW_16);
+                    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();
+                      							
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalUISemanticsGrammar.g:4980:6: ( (lv_name_4_0= ruleValidID ) )
+                    // InternalUISemanticsGrammar.g:4981:7: (lv_name_4_0= ruleValidID )
+                    {
+                    // InternalUISemanticsGrammar.g:4981:7: (lv_name_4_0= ruleValidID )
+                    // InternalUISemanticsGrammar.g:4982:8: lv_name_4_0= ruleValidID
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      								newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getNameValidIDParserRuleCall_2_0_0_1_0());
+                      							
+                    }
+                    pushFollow(FOLLOW_87);
+                    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 :
+                    // InternalUISemanticsGrammar.g:5002:4: ( (lv_name_5_0= ruleValidID ) )
+                    {
+                    // InternalUISemanticsGrammar.g:5002:4: ( (lv_name_5_0= ruleValidID ) )
+                    // InternalUISemanticsGrammar.g:5003:5: (lv_name_5_0= ruleValidID )
+                    {
+                    // InternalUISemanticsGrammar.g:5003:5: (lv_name_5_0= ruleValidID )
+                    // InternalUISemanticsGrammar.g:5004:6: lv_name_5_0= ruleValidID
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getNameValidIDParserRuleCall_2_1_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_87);
+                    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;
+
+            }
+
+            // InternalUISemanticsGrammar.g:5022:3: (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )?
+            int alt89=2;
+            int LA89_0 = input.LA(1);
+
+            if ( (LA89_0==38) ) {
+                alt89=1;
+            }
+            switch (alt89) {
+                case 1 :
+                    // InternalUISemanticsGrammar.g:5023:4: otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) )
+                    {
+                    otherlv_6=(Token)match(input,38,FOLLOW_34); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_6, grammarAccess.getXVariableDeclarationAccess().getEqualsSignKeyword_3_0());
+                      			
+                    }
+                    // InternalUISemanticsGrammar.g:5027:4: ( (lv_right_7_0= ruleXExpression ) )
+                    // InternalUISemanticsGrammar.g:5028:5: (lv_right_7_0= ruleXExpression )
+                    {
+                    // InternalUISemanticsGrammar.g:5028:5: (lv_right_7_0= ruleXExpression )
+                    // InternalUISemanticsGrammar.g:5029: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"
+    // InternalUISemanticsGrammar.g:5051:1: entryRuleJvmFormalParameter returns [EObject current=null] : iv_ruleJvmFormalParameter= ruleJvmFormalParameter EOF ;
+    public final EObject entryRuleJvmFormalParameter() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleJvmFormalParameter = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:5051:59: (iv_ruleJvmFormalParameter= ruleJvmFormalParameter EOF )
+            // InternalUISemanticsGrammar.g:5052: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"
+    // InternalUISemanticsGrammar.g:5058: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 {
+            // InternalUISemanticsGrammar.g:5064:2: ( ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) ) )
+            // InternalUISemanticsGrammar.g:5065:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) )
+            {
+            // InternalUISemanticsGrammar.g:5065:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) )
+            // InternalUISemanticsGrammar.g:5066:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) )
+            {
+            // InternalUISemanticsGrammar.g:5066:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) )?
+            int alt90=2;
+            int LA90_0 = input.LA(1);
+
+            if ( (LA90_0==RULE_ID) ) {
+                int LA90_1 = input.LA(2);
+
+                if ( (LA90_1==RULE_ID||LA90_1==44||LA90_1==68||LA90_1==75) ) {
+                    alt90=1;
+                }
+            }
+            else if ( (LA90_0==57||LA90_0==72) ) {
+                alt90=1;
+            }
+            switch (alt90) {
+                case 1 :
+                    // InternalUISemanticsGrammar.g:5067:4: (lv_parameterType_0_0= ruleJvmTypeReference )
+                    {
+                    // InternalUISemanticsGrammar.g:5067:4: (lv_parameterType_0_0= ruleJvmTypeReference )
+                    // InternalUISemanticsGrammar.g:5068:5: lv_parameterType_0_0= ruleJvmTypeReference
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getJvmFormalParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0());
+                      				
+                    }
+                    pushFollow(FOLLOW_16);
+                    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;
+
+            }
+
+            // InternalUISemanticsGrammar.g:5085:3: ( (lv_name_1_0= ruleValidID ) )
+            // InternalUISemanticsGrammar.g:5086:4: (lv_name_1_0= ruleValidID )
+            {
+            // InternalUISemanticsGrammar.g:5086:4: (lv_name_1_0= ruleValidID )
+            // InternalUISemanticsGrammar.g:5087: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"
+    // InternalUISemanticsGrammar.g:5108:1: entryRuleFullJvmFormalParameter returns [EObject current=null] : iv_ruleFullJvmFormalParameter= ruleFullJvmFormalParameter EOF ;
+    public final EObject entryRuleFullJvmFormalParameter() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleFullJvmFormalParameter = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:5108:63: (iv_ruleFullJvmFormalParameter= ruleFullJvmFormalParameter EOF )
+            // InternalUISemanticsGrammar.g:5109: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"
+    // InternalUISemanticsGrammar.g:5115: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 {
+            // InternalUISemanticsGrammar.g:5121:2: ( ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) ) )
+            // InternalUISemanticsGrammar.g:5122:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) )
+            {
+            // InternalUISemanticsGrammar.g:5122:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) )
+            // InternalUISemanticsGrammar.g:5123:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) )
+            {
+            // InternalUISemanticsGrammar.g:5123:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) )
+            // InternalUISemanticsGrammar.g:5124:4: (lv_parameterType_0_0= ruleJvmTypeReference )
+            {
+            // InternalUISemanticsGrammar.g:5124:4: (lv_parameterType_0_0= ruleJvmTypeReference )
+            // InternalUISemanticsGrammar.g:5125:5: lv_parameterType_0_0= ruleJvmTypeReference
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getFullJvmFormalParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0());
+              				
+            }
+            pushFollow(FOLLOW_16);
+            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();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalUISemanticsGrammar.g:5142:3: ( (lv_name_1_0= ruleValidID ) )
+            // InternalUISemanticsGrammar.g:5143:4: (lv_name_1_0= ruleValidID )
+            {
+            // InternalUISemanticsGrammar.g:5143:4: (lv_name_1_0= ruleValidID )
+            // InternalUISemanticsGrammar.g:5144: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"
+    // InternalUISemanticsGrammar.g:5165:1: entryRuleXFeatureCall returns [EObject current=null] : iv_ruleXFeatureCall= ruleXFeatureCall EOF ;
+    public final EObject entryRuleXFeatureCall() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXFeatureCall = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:5165:53: (iv_ruleXFeatureCall= ruleXFeatureCall EOF )
+            // InternalUISemanticsGrammar.g:5166: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"
+    // InternalUISemanticsGrammar.g:5172: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 {
+            // InternalUISemanticsGrammar.g:5178: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 ) )? ) )
+            // InternalUISemanticsGrammar.g:5179: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 ) )? )
+            {
+            // InternalUISemanticsGrammar.g:5179: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 ) )? )
+            // InternalUISemanticsGrammar.g:5180: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 ) )?
+            {
+            // InternalUISemanticsGrammar.g:5180:3: ()
+            // InternalUISemanticsGrammar.g:5181:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXFeatureCallAccess().getXFeatureCallAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalUISemanticsGrammar.g:5187:3: (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )?
+            int alt92=2;
+            int LA92_0 = input.LA(1);
+
+            if ( (LA92_0==44) ) {
+                alt92=1;
+            }
+            switch (alt92) {
+                case 1 :
+                    // InternalUISemanticsGrammar.g:5188:4: otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>'
+                    {
+                    otherlv_1=(Token)match(input,44,FOLLOW_54); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_1, grammarAccess.getXFeatureCallAccess().getLessThanSignKeyword_1_0());
+                      			
+                    }
+                    // InternalUISemanticsGrammar.g:5192:4: ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) )
+                    // InternalUISemanticsGrammar.g:5193:5: (lv_typeArguments_2_0= ruleJvmArgumentTypeReference )
+                    {
+                    // InternalUISemanticsGrammar.g:5193:5: (lv_typeArguments_2_0= ruleJvmArgumentTypeReference )
+                    // InternalUISemanticsGrammar.g:5194:6: lv_typeArguments_2_0= ruleJvmArgumentTypeReference
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_55);
+                    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();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalUISemanticsGrammar.g:5211:4: (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )*
+                    loop91:
+                    do {
+                        int alt91=2;
+                        int LA91_0 = input.LA(1);
+
+                        if ( (LA91_0==71) ) {
+                            alt91=1;
+                        }
+
+
+                        switch (alt91) {
+                    	case 1 :
+                    	    // InternalUISemanticsGrammar.g:5212:5: otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) )
+                    	    {
+                    	    otherlv_3=(Token)match(input,71,FOLLOW_54); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      					newLeafNode(otherlv_3, grammarAccess.getXFeatureCallAccess().getCommaKeyword_1_2_0());
+                    	      				
+                    	    }
+                    	    // InternalUISemanticsGrammar.g:5216:5: ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) )
+                    	    // InternalUISemanticsGrammar.g:5217:6: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
+                    	    {
+                    	    // InternalUISemanticsGrammar.g:5217:6: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
+                    	    // InternalUISemanticsGrammar.g:5218:7: lv_typeArguments_4_0= ruleJvmArgumentTypeReference
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_55);
+                    	    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 loop91;
+                        }
+                    } while (true);
+
+                    otherlv_5=(Token)match(input,45,FOLLOW_53); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_5, grammarAccess.getXFeatureCallAccess().getGreaterThanSignKeyword_1_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUISemanticsGrammar.g:5241:3: ( ( ruleIdOrSuper ) )
+            // InternalUISemanticsGrammar.g:5242:4: ( ruleIdOrSuper )
+            {
+            // InternalUISemanticsGrammar.g:5242:4: ( ruleIdOrSuper )
+            // InternalUISemanticsGrammar.g:5243: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_88);
+            ruleIdOrSuper();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalUISemanticsGrammar.g:5257: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 alt95=2;
+            alt95 = dfa95.predict(input);
+            switch (alt95) {
+                case 1 :
+                    // InternalUISemanticsGrammar.g:5258: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= ')'
+                    {
+                    // InternalUISemanticsGrammar.g:5258:4: ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) )
+                    // InternalUISemanticsGrammar.g:5259:5: ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' )
+                    {
+                    // InternalUISemanticsGrammar.g:5263:5: (lv_explicitOperationCall_7_0= '(' )
+                    // InternalUISemanticsGrammar.g:5264:6: lv_explicitOperationCall_7_0= '('
+                    {
+                    lv_explicitOperationCall_7_0=(Token)match(input,72,FOLLOW_57); 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, "(");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalUISemanticsGrammar.g:5276:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )?
+                    int alt94=3;
+                    alt94 = dfa94.predict(input);
+                    switch (alt94) {
+                        case 1 :
+                            // InternalUISemanticsGrammar.g:5277:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) )
+                            {
+                            // InternalUISemanticsGrammar.g:5277:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) )
+                            // InternalUISemanticsGrammar.g:5278:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure )
+                            {
+                            // InternalUISemanticsGrammar.g:5303:6: (lv_featureCallArguments_8_0= ruleXShortClosure )
+                            // InternalUISemanticsGrammar.g:5304:7: lv_featureCallArguments_8_0= ruleXShortClosure
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXShortClosureParserRuleCall_3_1_0_0());
+                              						
+                            }
+                            pushFollow(FOLLOW_58);
+                            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 :
+                            // InternalUISemanticsGrammar.g:5322:5: ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* )
+                            {
+                            // InternalUISemanticsGrammar.g:5322:5: ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* )
+                            // InternalUISemanticsGrammar.g:5323:6: ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )*
+                            {
+                            // InternalUISemanticsGrammar.g:5323:6: ( (lv_featureCallArguments_9_0= ruleXExpression ) )
+                            // InternalUISemanticsGrammar.g:5324:7: (lv_featureCallArguments_9_0= ruleXExpression )
+                            {
+                            // InternalUISemanticsGrammar.g:5324:7: (lv_featureCallArguments_9_0= ruleXExpression )
+                            // InternalUISemanticsGrammar.g:5325:8: lv_featureCallArguments_9_0= ruleXExpression
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              								newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_0_0());
+                              							
+                            }
+                            pushFollow(FOLLOW_59);
+                            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();
+                              							
+                            }
+
+                            }
+
+
+                            }
+
+                            // InternalUISemanticsGrammar.g:5342:6: (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )*
+                            loop93:
+                            do {
+                                int alt93=2;
+                                int LA93_0 = input.LA(1);
+
+                                if ( (LA93_0==71) ) {
+                                    alt93=1;
+                                }
+
+
+                                switch (alt93) {
+                            	case 1 :
+                            	    // InternalUISemanticsGrammar.g:5343:7: otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) )
+                            	    {
+                            	    otherlv_10=(Token)match(input,71,FOLLOW_34); if (state.failed) return current;
+                            	    if ( state.backtracking==0 ) {
+
+                            	      							newLeafNode(otherlv_10, grammarAccess.getXFeatureCallAccess().getCommaKeyword_3_1_1_1_0());
+                            	      						
+                            	    }
+                            	    // InternalUISemanticsGrammar.g:5347:7: ( (lv_featureCallArguments_11_0= ruleXExpression ) )
+                            	    // InternalUISemanticsGrammar.g:5348:8: (lv_featureCallArguments_11_0= ruleXExpression )
+                            	    {
+                            	    // InternalUISemanticsGrammar.g:5348:8: (lv_featureCallArguments_11_0= ruleXExpression )
+                            	    // InternalUISemanticsGrammar.g:5349:9: lv_featureCallArguments_11_0= ruleXExpression
+                            	    {
+                            	    if ( state.backtracking==0 ) {
+
+                            	      									newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_1_1_0());
+                            	      								
+                            	    }
+                            	    pushFollow(FOLLOW_59);
+                            	    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 loop93;
+                                }
+                            } while (true);
+
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_12=(Token)match(input,73,FOLLOW_89); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_12, grammarAccess.getXFeatureCallAccess().getRightParenthesisKeyword_3_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUISemanticsGrammar.g:5374:3: ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )?
+            int alt96=2;
+            alt96 = dfa96.predict(input);
+            switch (alt96) {
+                case 1 :
+                    // InternalUISemanticsGrammar.g:5375:4: ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure )
+                    {
+                    // InternalUISemanticsGrammar.g:5381:4: (lv_featureCallArguments_13_0= ruleXClosure )
+                    // InternalUISemanticsGrammar.g:5382: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"
+    // InternalUISemanticsGrammar.g:5403:1: entryRuleFeatureCallID returns [String current=null] : iv_ruleFeatureCallID= ruleFeatureCallID EOF ;
+    public final String entryRuleFeatureCallID() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleFeatureCallID = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:5403:53: (iv_ruleFeatureCallID= ruleFeatureCallID EOF )
+            // InternalUISemanticsGrammar.g:5404: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"
+    // InternalUISemanticsGrammar.g:5410: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 {
+            // InternalUISemanticsGrammar.g:5416:2: ( (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' ) )
+            // InternalUISemanticsGrammar.g:5417:2: (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' )
+            {
+            // InternalUISemanticsGrammar.g:5417:2: (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' )
+            int alt97=5;
+            switch ( input.LA(1) ) {
+            case RULE_ID:
+                {
+                alt97=1;
+                }
+                break;
+            case 33:
+                {
+                alt97=2;
+                }
+                break;
+            case 20:
+                {
+                alt97=3;
+                }
+                break;
+            case 19:
+                {
+                alt97=4;
+                }
+                break;
+            case 21:
+                {
+                alt97=5;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 97, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt97) {
+                case 1 :
+                    // InternalUISemanticsGrammar.g:5418: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 :
+                    // InternalUISemanticsGrammar.g:5429:3: kw= 'extends'
+                    {
+                    kw=(Token)match(input,33,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getExtendsKeyword_1());
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalUISemanticsGrammar.g:5435:3: kw= 'static'
+                    {
+                    kw=(Token)match(input,20,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getStaticKeyword_2());
+                      		
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalUISemanticsGrammar.g:5441:3: kw= 'import'
+                    {
+                    kw=(Token)match(input,19,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getImportKeyword_3());
+                      		
+                    }
+
+                    }
+                    break;
+                case 5 :
+                    // InternalUISemanticsGrammar.g:5447:3: kw= 'extension'
+                    {
+                    kw=(Token)match(input,21,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"
+    // InternalUISemanticsGrammar.g:5456:1: entryRuleIdOrSuper returns [String current=null] : iv_ruleIdOrSuper= ruleIdOrSuper EOF ;
+    public final String entryRuleIdOrSuper() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleIdOrSuper = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:5456:49: (iv_ruleIdOrSuper= ruleIdOrSuper EOF )
+            // InternalUISemanticsGrammar.g:5457: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"
+    // InternalUISemanticsGrammar.g:5463: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 {
+            // InternalUISemanticsGrammar.g:5469:2: ( (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' ) )
+            // InternalUISemanticsGrammar.g:5470:2: (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' )
+            {
+            // InternalUISemanticsGrammar.g:5470:2: (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' )
+            int alt98=2;
+            int LA98_0 = input.LA(1);
+
+            if ( (LA98_0==RULE_ID||(LA98_0>=19 && LA98_0<=21)||LA98_0==33) ) {
+                alt98=1;
+            }
+            else if ( (LA98_0==88) ) {
+                alt98=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 98, 0, input);
+
+                throw nvae;
+            }
+            switch (alt98) {
+                case 1 :
+                    // InternalUISemanticsGrammar.g:5471: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 :
+                    // InternalUISemanticsGrammar.g:5482:3: kw= 'super'
+                    {
+                    kw=(Token)match(input,88,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"
+    // InternalUISemanticsGrammar.g:5491:1: entryRuleXConstructorCall returns [EObject current=null] : iv_ruleXConstructorCall= ruleXConstructorCall EOF ;
+    public final EObject entryRuleXConstructorCall() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXConstructorCall = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:5491:57: (iv_ruleXConstructorCall= ruleXConstructorCall EOF )
+            // InternalUISemanticsGrammar.g:5492: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"
+    // InternalUISemanticsGrammar.g:5498: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 {
+            // InternalUISemanticsGrammar.g:5504: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 ) )? ) )
+            // InternalUISemanticsGrammar.g:5505: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 ) )? )
+            {
+            // InternalUISemanticsGrammar.g:5505: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 ) )? )
+            // InternalUISemanticsGrammar.g:5506: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 ) )?
+            {
+            // InternalUISemanticsGrammar.g:5506:3: ()
+            // InternalUISemanticsGrammar.g:5507:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXConstructorCallAccess().getXConstructorCallAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,89,FOLLOW_16); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXConstructorCallAccess().getNewKeyword_1());
+              		
+            }
+            // InternalUISemanticsGrammar.g:5517:3: ( ( ruleQualifiedName ) )
+            // InternalUISemanticsGrammar.g:5518:4: ( ruleQualifiedName )
+            {
+            // InternalUISemanticsGrammar.g:5518:4: ( ruleQualifiedName )
+            // InternalUISemanticsGrammar.g:5519: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_90);
+            ruleQualifiedName();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalUISemanticsGrammar.g:5533:3: ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )?
+            int alt100=2;
+            alt100 = dfa100.predict(input);
+            switch (alt100) {
+                case 1 :
+                    // InternalUISemanticsGrammar.g:5534:4: ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>'
+                    {
+                    // InternalUISemanticsGrammar.g:5534:4: ( ( '<' )=>otherlv_3= '<' )
+                    // InternalUISemanticsGrammar.g:5535:5: ( '<' )=>otherlv_3= '<'
+                    {
+                    otherlv_3=(Token)match(input,44,FOLLOW_54); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_3, grammarAccess.getXConstructorCallAccess().getLessThanSignKeyword_3_0());
+                      				
+                    }
+
+                    }
+
+                    // InternalUISemanticsGrammar.g:5541:4: ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) )
+                    // InternalUISemanticsGrammar.g:5542:5: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
+                    {
+                    // InternalUISemanticsGrammar.g:5542:5: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
+                    // InternalUISemanticsGrammar.g:5543:6: lv_typeArguments_4_0= ruleJvmArgumentTypeReference
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getXConstructorCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_3_1_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_55);
+                    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();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalUISemanticsGrammar.g:5560:4: (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )*
+                    loop99:
+                    do {
+                        int alt99=2;
+                        int LA99_0 = input.LA(1);
+
+                        if ( (LA99_0==71) ) {
+                            alt99=1;
+                        }
+
+
+                        switch (alt99) {
+                    	case 1 :
+                    	    // InternalUISemanticsGrammar.g:5561:5: otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) )
+                    	    {
+                    	    otherlv_5=(Token)match(input,71,FOLLOW_54); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      					newLeafNode(otherlv_5, grammarAccess.getXConstructorCallAccess().getCommaKeyword_3_2_0());
+                    	      				
+                    	    }
+                    	    // InternalUISemanticsGrammar.g:5565:5: ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) )
+                    	    // InternalUISemanticsGrammar.g:5566:6: (lv_typeArguments_6_0= ruleJvmArgumentTypeReference )
+                    	    {
+                    	    // InternalUISemanticsGrammar.g:5566:6: (lv_typeArguments_6_0= ruleJvmArgumentTypeReference )
+                    	    // InternalUISemanticsGrammar.g:5567:7: lv_typeArguments_6_0= ruleJvmArgumentTypeReference
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getXConstructorCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_3_2_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_55);
+                    	    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 loop99;
+                        }
+                    } while (true);
+
+                    otherlv_7=(Token)match(input,45,FOLLOW_88); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_7, grammarAccess.getXConstructorCallAccess().getGreaterThanSignKeyword_3_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUISemanticsGrammar.g:5590: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 alt103=2;
+            alt103 = dfa103.predict(input);
+            switch (alt103) {
+                case 1 :
+                    // InternalUISemanticsGrammar.g:5591: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= ')'
+                    {
+                    // InternalUISemanticsGrammar.g:5591:4: ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) )
+                    // InternalUISemanticsGrammar.g:5592:5: ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' )
+                    {
+                    // InternalUISemanticsGrammar.g:5596:5: (lv_explicitConstructorCall_8_0= '(' )
+                    // InternalUISemanticsGrammar.g:5597:6: lv_explicitConstructorCall_8_0= '('
+                    {
+                    lv_explicitConstructorCall_8_0=(Token)match(input,72,FOLLOW_57); 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, "(");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalUISemanticsGrammar.g:5609:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )?
+                    int alt102=3;
+                    alt102 = dfa102.predict(input);
+                    switch (alt102) {
+                        case 1 :
+                            // InternalUISemanticsGrammar.g:5610:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) )
+                            {
+                            // InternalUISemanticsGrammar.g:5610:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) )
+                            // InternalUISemanticsGrammar.g:5611:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure )
+                            {
+                            // InternalUISemanticsGrammar.g:5636:6: (lv_arguments_9_0= ruleXShortClosure )
+                            // InternalUISemanticsGrammar.g:5637:7: lv_arguments_9_0= ruleXShortClosure
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXShortClosureParserRuleCall_4_1_0_0());
+                              						
+                            }
+                            pushFollow(FOLLOW_58);
+                            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 :
+                            // InternalUISemanticsGrammar.g:5655:5: ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* )
+                            {
+                            // InternalUISemanticsGrammar.g:5655:5: ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* )
+                            // InternalUISemanticsGrammar.g:5656:6: ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )*
+                            {
+                            // InternalUISemanticsGrammar.g:5656:6: ( (lv_arguments_10_0= ruleXExpression ) )
+                            // InternalUISemanticsGrammar.g:5657:7: (lv_arguments_10_0= ruleXExpression )
+                            {
+                            // InternalUISemanticsGrammar.g:5657:7: (lv_arguments_10_0= ruleXExpression )
+                            // InternalUISemanticsGrammar.g:5658:8: lv_arguments_10_0= ruleXExpression
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              								newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXExpressionParserRuleCall_4_1_1_0_0());
+                              							
+                            }
+                            pushFollow(FOLLOW_59);
+                            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();
+                              							
+                            }
+
+                            }
+
+
+                            }
+
+                            // InternalUISemanticsGrammar.g:5675:6: (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )*
+                            loop101:
+                            do {
+                                int alt101=2;
+                                int LA101_0 = input.LA(1);
+
+                                if ( (LA101_0==71) ) {
+                                    alt101=1;
+                                }
+
+
+                                switch (alt101) {
+                            	case 1 :
+                            	    // InternalUISemanticsGrammar.g:5676:7: otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) )
+                            	    {
+                            	    otherlv_11=(Token)match(input,71,FOLLOW_34); if (state.failed) return current;
+                            	    if ( state.backtracking==0 ) {
+
+                            	      							newLeafNode(otherlv_11, grammarAccess.getXConstructorCallAccess().getCommaKeyword_4_1_1_1_0());
+                            	      						
+                            	    }
+                            	    // InternalUISemanticsGrammar.g:5680:7: ( (lv_arguments_12_0= ruleXExpression ) )
+                            	    // InternalUISemanticsGrammar.g:5681:8: (lv_arguments_12_0= ruleXExpression )
+                            	    {
+                            	    // InternalUISemanticsGrammar.g:5681:8: (lv_arguments_12_0= ruleXExpression )
+                            	    // InternalUISemanticsGrammar.g:5682:9: lv_arguments_12_0= ruleXExpression
+                            	    {
+                            	    if ( state.backtracking==0 ) {
+
+                            	      									newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXExpressionParserRuleCall_4_1_1_1_1_0());
+                            	      								
+                            	    }
+                            	    pushFollow(FOLLOW_59);
+                            	    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 loop101;
+                                }
+                            } while (true);
+
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_13=(Token)match(input,73,FOLLOW_89); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_13, grammarAccess.getXConstructorCallAccess().getRightParenthesisKeyword_4_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalUISemanticsGrammar.g:5707:3: ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )?
+            int alt104=2;
+            alt104 = dfa104.predict(input);
+            switch (alt104) {
+                case 1 :
+                    // InternalUISemanticsGrammar.g:5708:4: ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure )
+                    {
+                    // InternalUISemanticsGrammar.g:5714:4: (lv_arguments_14_0= ruleXClosure )
+                    // InternalUISemanticsGrammar.g:5715: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"
+    // InternalUISemanticsGrammar.g:5736:1: entryRuleXBooleanLiteral returns [EObject current=null] : iv_ruleXBooleanLiteral= ruleXBooleanLiteral EOF ;
+    public final EObject entryRuleXBooleanLiteral() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXBooleanLiteral = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:5736:56: (iv_ruleXBooleanLiteral= ruleXBooleanLiteral EOF )
+            // InternalUISemanticsGrammar.g:5737: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"
+    // InternalUISemanticsGrammar.g:5743: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 {
+            // InternalUISemanticsGrammar.g:5749:2: ( ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) ) )
+            // InternalUISemanticsGrammar.g:5750:2: ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) )
+            {
+            // InternalUISemanticsGrammar.g:5750:2: ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) )
+            // InternalUISemanticsGrammar.g:5751:3: () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) )
+            {
+            // InternalUISemanticsGrammar.g:5751:3: ()
+            // InternalUISemanticsGrammar.g:5752:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXBooleanLiteralAccess().getXBooleanLiteralAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalUISemanticsGrammar.g:5758:3: (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) )
+            int alt105=2;
+            int LA105_0 = input.LA(1);
+
+            if ( (LA105_0==90) ) {
+                alt105=1;
+            }
+            else if ( (LA105_0==91) ) {
+                alt105=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 105, 0, input);
+
+                throw nvae;
+            }
+            switch (alt105) {
+                case 1 :
+                    // InternalUISemanticsGrammar.g:5759:4: otherlv_1= 'false'
+                    {
+                    otherlv_1=(Token)match(input,90,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_1, grammarAccess.getXBooleanLiteralAccess().getFalseKeyword_1_0());
+                      			
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalUISemanticsGrammar.g:5764:4: ( (lv_isTrue_2_0= 'true' ) )
+                    {
+                    // InternalUISemanticsGrammar.g:5764:4: ( (lv_isTrue_2_0= 'true' ) )
+                    // InternalUISemanticsGrammar.g:5765:5: (lv_isTrue_2_0= 'true' )
+                    {
+                    // InternalUISemanticsGrammar.g:5765:5: (lv_isTrue_2_0= 'true' )
+                    // InternalUISemanticsGrammar.g:5766:6: lv_isTrue_2_0= 'true'
+                    {
+                    lv_isTrue_2_0=(Token)match(input,91,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"
+    // InternalUISemanticsGrammar.g:5783:1: entryRuleXNullLiteral returns [EObject current=null] : iv_ruleXNullLiteral= ruleXNullLiteral EOF ;
+    public final EObject entryRuleXNullLiteral() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXNullLiteral = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:5783:53: (iv_ruleXNullLiteral= ruleXNullLiteral EOF )
+            // InternalUISemanticsGrammar.g:5784: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"
+    // InternalUISemanticsGrammar.g:5790:1: ruleXNullLiteral returns [EObject current=null] : ( () otherlv_1= 'null' ) ;
+    public final EObject ruleXNullLiteral() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalUISemanticsGrammar.g:5796:2: ( ( () otherlv_1= 'null' ) )
+            // InternalUISemanticsGrammar.g:5797:2: ( () otherlv_1= 'null' )
+            {
+            // InternalUISemanticsGrammar.g:5797:2: ( () otherlv_1= 'null' )
+            // InternalUISemanticsGrammar.g:5798:3: () otherlv_1= 'null'
+            {
+            // InternalUISemanticsGrammar.g:5798:3: ()
+            // InternalUISemanticsGrammar.g:5799:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXNullLiteralAccess().getXNullLiteralAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,92,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"
+    // InternalUISemanticsGrammar.g:5813:1: entryRuleXNumberLiteral returns [EObject current=null] : iv_ruleXNumberLiteral= ruleXNumberLiteral EOF ;
+    public final EObject entryRuleXNumberLiteral() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXNumberLiteral = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:5813:55: (iv_ruleXNumberLiteral= ruleXNumberLiteral EOF )
+            // InternalUISemanticsGrammar.g:5814: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"
+    // InternalUISemanticsGrammar.g:5820: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 {
+            // InternalUISemanticsGrammar.g:5826:2: ( ( () ( (lv_value_1_0= ruleNumber ) ) ) )
+            // InternalUISemanticsGrammar.g:5827:2: ( () ( (lv_value_1_0= ruleNumber ) ) )
+            {
+            // InternalUISemanticsGrammar.g:5827:2: ( () ( (lv_value_1_0= ruleNumber ) ) )
+            // InternalUISemanticsGrammar.g:5828:3: () ( (lv_value_1_0= ruleNumber ) )
+            {
+            // InternalUISemanticsGrammar.g:5828:3: ()
+            // InternalUISemanticsGrammar.g:5829:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXNumberLiteralAccess().getXNumberLiteralAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalUISemanticsGrammar.g:5835:3: ( (lv_value_1_0= ruleNumber ) )
+            // InternalUISemanticsGrammar.g:5836:4: (lv_value_1_0= ruleNumber )
+            {
+            // InternalUISemanticsGrammar.g:5836:4: (lv_value_1_0= ruleNumber )
+            // InternalUISemanticsGrammar.g:5837: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"
+    // InternalUISemanticsGrammar.g:5858:1: entryRuleXStringLiteral returns [EObject current=null] : iv_ruleXStringLiteral= ruleXStringLiteral EOF ;
+    public final EObject entryRuleXStringLiteral() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXStringLiteral = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:5858:55: (iv_ruleXStringLiteral= ruleXStringLiteral EOF )
+            // InternalUISemanticsGrammar.g:5859: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"
+    // InternalUISemanticsGrammar.g:5865: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 {
+            // InternalUISemanticsGrammar.g:5871:2: ( ( () ( (lv_value_1_0= RULE_STRING ) ) ) )
+            // InternalUISemanticsGrammar.g:5872:2: ( () ( (lv_value_1_0= RULE_STRING ) ) )
+            {
+            // InternalUISemanticsGrammar.g:5872:2: ( () ( (lv_value_1_0= RULE_STRING ) ) )
+            // InternalUISemanticsGrammar.g:5873:3: () ( (lv_value_1_0= RULE_STRING ) )
+            {
+            // InternalUISemanticsGrammar.g:5873:3: ()
+            // InternalUISemanticsGrammar.g:5874:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXStringLiteralAccess().getXStringLiteralAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalUISemanticsGrammar.g:5880:3: ( (lv_value_1_0= RULE_STRING ) )
+            // InternalUISemanticsGrammar.g:5881:4: (lv_value_1_0= RULE_STRING )
+            {
+            // InternalUISemanticsGrammar.g:5881:4: (lv_value_1_0= RULE_STRING )
+            // InternalUISemanticsGrammar.g:5882: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"
+    // InternalUISemanticsGrammar.g:5902:1: entryRuleXTypeLiteral returns [EObject current=null] : iv_ruleXTypeLiteral= ruleXTypeLiteral EOF ;
+    public final EObject entryRuleXTypeLiteral() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXTypeLiteral = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:5902:53: (iv_ruleXTypeLiteral= ruleXTypeLiteral EOF )
+            // InternalUISemanticsGrammar.g:5903: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"
+    // InternalUISemanticsGrammar.g:5909: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 {
+            // InternalUISemanticsGrammar.g:5915:2: ( ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' ) )
+            // InternalUISemanticsGrammar.g:5916:2: ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' )
+            {
+            // InternalUISemanticsGrammar.g:5916:2: ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' )
+            // InternalUISemanticsGrammar.g:5917:3: () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')'
+            {
+            // InternalUISemanticsGrammar.g:5917:3: ()
+            // InternalUISemanticsGrammar.g:5918:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXTypeLiteralAccess().getXTypeLiteralAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,93,FOLLOW_72); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXTypeLiteralAccess().getTypeofKeyword_1());
+              		
+            }
+            otherlv_2=(Token)match(input,72,FOLLOW_16); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getXTypeLiteralAccess().getLeftParenthesisKeyword_2());
+              		
+            }
+            // InternalUISemanticsGrammar.g:5932:3: ( ( ruleQualifiedName ) )
+            // InternalUISemanticsGrammar.g:5933:4: ( ruleQualifiedName )
+            {
+            // InternalUISemanticsGrammar.g:5933:4: ( ruleQualifiedName )
+            // InternalUISemanticsGrammar.g:5934: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_91);
+            ruleQualifiedName();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalUISemanticsGrammar.g:5948:3: ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )*
+            loop106:
+            do {
+                int alt106=2;
+                int LA106_0 = input.LA(1);
+
+                if ( (LA106_0==75) ) {
+                    alt106=1;
+                }
+
+
+                switch (alt106) {
+            	case 1 :
+            	    // InternalUISemanticsGrammar.g:5949:4: (lv_arrayDimensions_4_0= ruleArrayBrackets )
+            	    {
+            	    // InternalUISemanticsGrammar.g:5949:4: (lv_arrayDimensions_4_0= ruleArrayBrackets )
+            	    // InternalUISemanticsGrammar.g:5950:5: lv_arrayDimensions_4_0= ruleArrayBrackets
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getXTypeLiteralAccess().getArrayDimensionsArrayBracketsParserRuleCall_4_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_91);
+            	    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 loop106;
+                }
+            } while (true);
+
+            otherlv_5=(Token)match(input,73,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"
+    // InternalUISemanticsGrammar.g:5975:1: entryRuleXThrowExpression returns [EObject current=null] : iv_ruleXThrowExpression= ruleXThrowExpression EOF ;
+    public final EObject entryRuleXThrowExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXThrowExpression = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:5975:57: (iv_ruleXThrowExpression= ruleXThrowExpression EOF )
+            // InternalUISemanticsGrammar.g:5976: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"
+    // InternalUISemanticsGrammar.g:5982: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 {
+            // InternalUISemanticsGrammar.g:5988:2: ( ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) ) )
+            // InternalUISemanticsGrammar.g:5989:2: ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) )
+            {
+            // InternalUISemanticsGrammar.g:5989:2: ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) )
+            // InternalUISemanticsGrammar.g:5990:3: () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) )
+            {
+            // InternalUISemanticsGrammar.g:5990:3: ()
+            // InternalUISemanticsGrammar.g:5991:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXThrowExpressionAccess().getXThrowExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,94,FOLLOW_34); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXThrowExpressionAccess().getThrowKeyword_1());
+              		
+            }
+            // InternalUISemanticsGrammar.g:6001:3: ( (lv_expression_2_0= ruleXExpression ) )
+            // InternalUISemanticsGrammar.g:6002:4: (lv_expression_2_0= ruleXExpression )
+            {
+            // InternalUISemanticsGrammar.g:6002:4: (lv_expression_2_0= ruleXExpression )
+            // InternalUISemanticsGrammar.g:6003: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"
+    // InternalUISemanticsGrammar.g:6024:1: entryRuleXReturnExpression returns [EObject current=null] : iv_ruleXReturnExpression= ruleXReturnExpression EOF ;
+    public final EObject entryRuleXReturnExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXReturnExpression = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:6024:58: (iv_ruleXReturnExpression= ruleXReturnExpression EOF )
+            // InternalUISemanticsGrammar.g:6025: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"
+    // InternalUISemanticsGrammar.g:6031: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 {
+            // InternalUISemanticsGrammar.g:6037: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 ) )? ) )
+            // InternalUISemanticsGrammar.g:6038: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 ) )? )
+            {
+            // InternalUISemanticsGrammar.g:6038: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 ) )? )
+            // InternalUISemanticsGrammar.g:6039: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 ) )?
+            {
+            // InternalUISemanticsGrammar.g:6039:3: ()
+            // InternalUISemanticsGrammar.g:6040:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXReturnExpressionAccess().getXReturnExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,95,FOLLOW_92); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXReturnExpressionAccess().getReturnKeyword_1());
+              		
+            }
+            // InternalUISemanticsGrammar.g:6050: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 alt107=2;
+            alt107 = dfa107.predict(input);
+            switch (alt107) {
+                case 1 :
+                    // InternalUISemanticsGrammar.g:6051: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 )
+                    {
+                    // InternalUISemanticsGrammar.g:6052:4: (lv_expression_2_0= ruleXExpression )
+                    // InternalUISemanticsGrammar.g:6053: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"
+    // InternalUISemanticsGrammar.g:6074:1: entryRuleXTryCatchFinallyExpression returns [EObject current=null] : iv_ruleXTryCatchFinallyExpression= ruleXTryCatchFinallyExpression EOF ;
+    public final EObject entryRuleXTryCatchFinallyExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXTryCatchFinallyExpression = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:6074:67: (iv_ruleXTryCatchFinallyExpression= ruleXTryCatchFinallyExpression EOF )
+            // InternalUISemanticsGrammar.g:6075: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"
+    // InternalUISemanticsGrammar.g:6081: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 {
+            // InternalUISemanticsGrammar.g:6087: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 ) ) ) ) ) )
+            // InternalUISemanticsGrammar.g:6088: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 ) ) ) ) )
+            {
+            // InternalUISemanticsGrammar.g:6088: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 ) ) ) ) )
+            // InternalUISemanticsGrammar.g:6089: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 ) ) ) )
+            {
+            // InternalUISemanticsGrammar.g:6089:3: ()
+            // InternalUISemanticsGrammar.g:6090:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXTryCatchFinallyExpressionAccess().getXTryCatchFinallyExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,96,FOLLOW_34); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXTryCatchFinallyExpressionAccess().getTryKeyword_1());
+              		
+            }
+            // InternalUISemanticsGrammar.g:6100:3: ( (lv_expression_2_0= ruleXExpression ) )
+            // InternalUISemanticsGrammar.g:6101:4: (lv_expression_2_0= ruleXExpression )
+            {
+            // InternalUISemanticsGrammar.g:6101:4: (lv_expression_2_0= ruleXExpression )
+            // InternalUISemanticsGrammar.g:6102:5: lv_expression_2_0= ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getExpressionXExpressionParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FOLLOW_93);
+            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();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalUISemanticsGrammar.g:6119: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 alt110=2;
+            int LA110_0 = input.LA(1);
+
+            if ( (LA110_0==99) ) {
+                alt110=1;
+            }
+            else if ( (LA110_0==97) ) {
+                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 :
+                    // InternalUISemanticsGrammar.g:6120:4: ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? )
+                    {
+                    // InternalUISemanticsGrammar.g:6120:4: ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? )
+                    // InternalUISemanticsGrammar.g:6121:5: ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )?
+                    {
+                    // InternalUISemanticsGrammar.g:6121:5: ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+
+                    int cnt108=0;
+                    loop108:
+                    do {
+                        int alt108=2;
+                        int LA108_0 = input.LA(1);
+
+                        if ( (LA108_0==99) ) {
+                            int LA108_2 = input.LA(2);
+
+                            if ( (synpred38_InternalUISemanticsGrammar()) ) {
+                                alt108=1;
+                            }
+
+
+                        }
+
+
+                        switch (alt108) {
+                    	case 1 :
+                    	    // InternalUISemanticsGrammar.g:6122:6: ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause )
+                    	    {
+                    	    // InternalUISemanticsGrammar.g:6123:6: (lv_catchClauses_3_0= ruleXCatchClause )
+                    	    // InternalUISemanticsGrammar.g:6124:7: lv_catchClauses_3_0= ruleXCatchClause
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getCatchClausesXCatchClauseParserRuleCall_3_0_0_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_94);
+                    	    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 ( cnt108 >= 1 ) break loop108;
+                    	    if (state.backtracking>0) {state.failed=true; return current;}
+                                EarlyExitException eee =
+                                    new EarlyExitException(108, input);
+                                throw eee;
+                        }
+                        cnt108++;
+                    } while (true);
+
+                    // InternalUISemanticsGrammar.g:6141:5: ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )?
+                    int alt109=2;
+                    int LA109_0 = input.LA(1);
+
+                    if ( (LA109_0==97) ) {
+                        int LA109_1 = input.LA(2);
+
+                        if ( (synpred39_InternalUISemanticsGrammar()) ) {
+                            alt109=1;
+                        }
+                    }
+                    switch (alt109) {
+                        case 1 :
+                            // InternalUISemanticsGrammar.g:6142:6: ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) )
+                            {
+                            // InternalUISemanticsGrammar.g:6142:6: ( ( 'finally' )=>otherlv_4= 'finally' )
+                            // InternalUISemanticsGrammar.g:6143:7: ( 'finally' )=>otherlv_4= 'finally'
+                            {
+                            otherlv_4=(Token)match(input,97,FOLLOW_34); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							newLeafNode(otherlv_4, grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_0_1_0());
+                              						
+                            }
+
+                            }
+
+                            // InternalUISemanticsGrammar.g:6149:6: ( (lv_finallyExpression_5_0= ruleXExpression ) )
+                            // InternalUISemanticsGrammar.g:6150:7: (lv_finallyExpression_5_0= ruleXExpression )
+                            {
+                            // InternalUISemanticsGrammar.g:6150:7: (lv_finallyExpression_5_0= ruleXExpression )
+                            // InternalUISemanticsGrammar.g:6151: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 :
+                    // InternalUISemanticsGrammar.g:6171:4: (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) )
+                    {
+                    // InternalUISemanticsGrammar.g:6171:4: (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) )
+                    // InternalUISemanticsGrammar.g:6172:5: otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) )
+                    {
+                    otherlv_6=(Token)match(input,97,FOLLOW_34); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_6, grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_1_0());
+                      				
+                    }
+                    // InternalUISemanticsGrammar.g:6176:5: ( (lv_finallyExpression_7_0= ruleXExpression ) )
+                    // InternalUISemanticsGrammar.g:6177:6: (lv_finallyExpression_7_0= ruleXExpression )
+                    {
+                    // InternalUISemanticsGrammar.g:6177:6: (lv_finallyExpression_7_0= ruleXExpression )
+                    // InternalUISemanticsGrammar.g:6178: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"
+    // InternalUISemanticsGrammar.g:6201:1: entryRuleXSynchronizedExpression returns [EObject current=null] : iv_ruleXSynchronizedExpression= ruleXSynchronizedExpression EOF ;
+    public final EObject entryRuleXSynchronizedExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXSynchronizedExpression = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:6201:64: (iv_ruleXSynchronizedExpression= ruleXSynchronizedExpression EOF )
+            // InternalUISemanticsGrammar.g:6202: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"
+    // InternalUISemanticsGrammar.g:6208: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 {
+            // InternalUISemanticsGrammar.g:6214:2: ( ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) ) )
+            // InternalUISemanticsGrammar.g:6215:2: ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) )
+            {
+            // InternalUISemanticsGrammar.g:6215:2: ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) )
+            // InternalUISemanticsGrammar.g:6216:3: ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) )
+            {
+            // InternalUISemanticsGrammar.g:6216:3: ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) )
+            // InternalUISemanticsGrammar.g:6217:4: ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' )
+            {
+            // InternalUISemanticsGrammar.g:6224:4: ( () otherlv_1= 'synchronized' otherlv_2= '(' )
+            // InternalUISemanticsGrammar.g:6225:5: () otherlv_1= 'synchronized' otherlv_2= '('
+            {
+            // InternalUISemanticsGrammar.g:6225:5: ()
+            // InternalUISemanticsGrammar.g:6226:6: 
+            {
+            if ( state.backtracking==0 ) {
+
+              						current = forceCreateModelElement(
+              							grammarAccess.getXSynchronizedExpressionAccess().getXSynchronizedExpressionAction_0_0_0(),
+              							current);
+              					
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,98,FOLLOW_72); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(otherlv_1, grammarAccess.getXSynchronizedExpressionAccess().getSynchronizedKeyword_0_0_1());
+              				
+            }
+            otherlv_2=(Token)match(input,72,FOLLOW_34); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(otherlv_2, grammarAccess.getXSynchronizedExpressionAccess().getLeftParenthesisKeyword_0_0_2());
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalUISemanticsGrammar.g:6242:3: ( (lv_param_3_0= ruleXExpression ) )
+            // InternalUISemanticsGrammar.g:6243:4: (lv_param_3_0= ruleXExpression )
+            {
+            // InternalUISemanticsGrammar.g:6243:4: (lv_param_3_0= ruleXExpression )
+            // InternalUISemanticsGrammar.g:6244:5: lv_param_3_0= ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXSynchronizedExpressionAccess().getParamXExpressionParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FOLLOW_58);
+            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,73,FOLLOW_34); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_4, grammarAccess.getXSynchronizedExpressionAccess().getRightParenthesisKeyword_2());
+              		
+            }
+            // InternalUISemanticsGrammar.g:6265:3: ( (lv_expression_5_0= ruleXExpression ) )
+            // InternalUISemanticsGrammar.g:6266:4: (lv_expression_5_0= ruleXExpression )
+            {
+            // InternalUISemanticsGrammar.g:6266:4: (lv_expression_5_0= ruleXExpression )
+            // InternalUISemanticsGrammar.g:6267: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"
+    // InternalUISemanticsGrammar.g:6288:1: entryRuleXCatchClause returns [EObject current=null] : iv_ruleXCatchClause= ruleXCatchClause EOF ;
+    public final EObject entryRuleXCatchClause() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXCatchClause = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:6288:53: (iv_ruleXCatchClause= ruleXCatchClause EOF )
+            // InternalUISemanticsGrammar.g:6289: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"
+    // InternalUISemanticsGrammar.g:6295: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 {
+            // InternalUISemanticsGrammar.g:6301:2: ( ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) ) )
+            // InternalUISemanticsGrammar.g:6302:2: ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) )
+            {
+            // InternalUISemanticsGrammar.g:6302:2: ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) )
+            // InternalUISemanticsGrammar.g:6303:3: ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) )
+            {
+            // InternalUISemanticsGrammar.g:6303:3: ( ( 'catch' )=>otherlv_0= 'catch' )
+            // InternalUISemanticsGrammar.g:6304:4: ( 'catch' )=>otherlv_0= 'catch'
+            {
+            otherlv_0=(Token)match(input,99,FOLLOW_72); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              				newLeafNode(otherlv_0, grammarAccess.getXCatchClauseAccess().getCatchKeyword_0());
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,72,FOLLOW_31); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXCatchClauseAccess().getLeftParenthesisKeyword_1());
+              		
+            }
+            // InternalUISemanticsGrammar.g:6314:3: ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) )
+            // InternalUISemanticsGrammar.g:6315:4: (lv_declaredParam_2_0= ruleFullJvmFormalParameter )
+            {
+            // InternalUISemanticsGrammar.g:6315:4: (lv_declaredParam_2_0= ruleFullJvmFormalParameter )
+            // InternalUISemanticsGrammar.g:6316:5: lv_declaredParam_2_0= ruleFullJvmFormalParameter
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXCatchClauseAccess().getDeclaredParamFullJvmFormalParameterParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FOLLOW_58);
+            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,73,FOLLOW_34); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_3, grammarAccess.getXCatchClauseAccess().getRightParenthesisKeyword_3());
+              		
+            }
+            // InternalUISemanticsGrammar.g:6337:3: ( (lv_expression_4_0= ruleXExpression ) )
+            // InternalUISemanticsGrammar.g:6338:4: (lv_expression_4_0= ruleXExpression )
+            {
+            // InternalUISemanticsGrammar.g:6338:4: (lv_expression_4_0= ruleXExpression )
+            // InternalUISemanticsGrammar.g:6339: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"
+    // InternalUISemanticsGrammar.g:6360:1: entryRuleQualifiedName returns [String current=null] : iv_ruleQualifiedName= ruleQualifiedName EOF ;
+    public final String entryRuleQualifiedName() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleQualifiedName = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:6360:53: (iv_ruleQualifiedName= ruleQualifiedName EOF )
+            // InternalUISemanticsGrammar.g:6361: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"
+    // InternalUISemanticsGrammar.g:6367: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 {
+            // InternalUISemanticsGrammar.g:6373:2: ( (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* ) )
+            // InternalUISemanticsGrammar.g:6374:2: (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* )
+            {
+            // InternalUISemanticsGrammar.g:6374:2: (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* )
+            // InternalUISemanticsGrammar.g:6375:3: this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )*
+            {
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_0());
+              		
+            }
+            pushFollow(FOLLOW_95);
+            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();
+              		
+            }
+            // InternalUISemanticsGrammar.g:6385:3: ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )*
+            loop111:
+            do {
+                int alt111=2;
+                int LA111_0 = input.LA(1);
+
+                if ( (LA111_0==68) ) {
+                    int LA111_2 = input.LA(2);
+
+                    if ( (LA111_2==RULE_ID) ) {
+                        int LA111_3 = input.LA(3);
+
+                        if ( (synpred42_InternalUISemanticsGrammar()) ) {
+                            alt111=1;
+                        }
+
+
+                    }
+
+
+                }
+
+
+                switch (alt111) {
+            	case 1 :
+            	    // InternalUISemanticsGrammar.g:6386:4: ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID
+            	    {
+            	    // InternalUISemanticsGrammar.g:6386:4: ( ( '.' )=>kw= '.' )
+            	    // InternalUISemanticsGrammar.g:6387:5: ( '.' )=>kw= '.'
+            	    {
+            	    kw=(Token)match(input,68,FOLLOW_16); 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_95);
+            	    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 loop111;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleQualifiedName"
+
+
+    // $ANTLR start "entryRuleNumber"
+    // InternalUISemanticsGrammar.g:6409: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 {
+            // InternalUISemanticsGrammar.g:6411:2: (iv_ruleNumber= ruleNumber EOF )
+            // InternalUISemanticsGrammar.g:6412: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"
+    // InternalUISemanticsGrammar.g:6421: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 {
+            // InternalUISemanticsGrammar.g:6428: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 ) )? ) ) )
+            // InternalUISemanticsGrammar.g:6429: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 ) )? ) )
+            {
+            // InternalUISemanticsGrammar.g:6429: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 alt115=2;
+            int LA115_0 = input.LA(1);
+
+            if ( (LA115_0==RULE_HEX) ) {
+                alt115=1;
+            }
+            else if ( ((LA115_0>=RULE_INT && LA115_0<=RULE_DECIMAL)) ) {
+                alt115=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 115, 0, input);
+
+                throw nvae;
+            }
+            switch (alt115) {
+                case 1 :
+                    // InternalUISemanticsGrammar.g:6430: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 :
+                    // InternalUISemanticsGrammar.g:6438:3: ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? )
+                    {
+                    // InternalUISemanticsGrammar.g:6438:3: ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? )
+                    // InternalUISemanticsGrammar.g:6439:4: (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )?
+                    {
+                    // InternalUISemanticsGrammar.g:6439:4: (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL )
+                    int alt112=2;
+                    int LA112_0 = input.LA(1);
+
+                    if ( (LA112_0==RULE_INT) ) {
+                        alt112=1;
+                    }
+                    else if ( (LA112_0==RULE_DECIMAL) ) {
+                        alt112=2;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 112, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt112) {
+                        case 1 :
+                            // InternalUISemanticsGrammar.g:6440:5: this_INT_1= RULE_INT
+                            {
+                            this_INT_1=(Token)match(input,RULE_INT,FOLLOW_95); 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 :
+                            // InternalUISemanticsGrammar.g:6448:5: this_DECIMAL_2= RULE_DECIMAL
+                            {
+                            this_DECIMAL_2=(Token)match(input,RULE_DECIMAL,FOLLOW_95); 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;
+
+                    }
+
+                    // InternalUISemanticsGrammar.g:6456:4: (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )?
+                    int alt114=2;
+                    int LA114_0 = input.LA(1);
+
+                    if ( (LA114_0==68) ) {
+                        int LA114_1 = input.LA(2);
+
+                        if ( ((LA114_1>=RULE_INT && LA114_1<=RULE_DECIMAL)) ) {
+                            alt114=1;
+                        }
+                    }
+                    switch (alt114) {
+                        case 1 :
+                            // InternalUISemanticsGrammar.g:6457:5: kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL )
+                            {
+                            kw=(Token)match(input,68,FOLLOW_96); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					current.merge(kw);
+                              					newLeafNode(kw, grammarAccess.getNumberAccess().getFullStopKeyword_1_1_0());
+                              				
+                            }
+                            // InternalUISemanticsGrammar.g:6462:5: (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL )
+                            int alt113=2;
+                            int LA113_0 = input.LA(1);
+
+                            if ( (LA113_0==RULE_INT) ) {
+                                alt113=1;
+                            }
+                            else if ( (LA113_0==RULE_DECIMAL) ) {
+                                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 :
+                                    // InternalUISemanticsGrammar.g:6463: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 :
+                                    // InternalUISemanticsGrammar.g:6471: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"
+    // InternalUISemanticsGrammar.g:6488:1: entryRuleJvmTypeReference returns [EObject current=null] : iv_ruleJvmTypeReference= ruleJvmTypeReference EOF ;
+    public final EObject entryRuleJvmTypeReference() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleJvmTypeReference = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:6488:57: (iv_ruleJvmTypeReference= ruleJvmTypeReference EOF )
+            // InternalUISemanticsGrammar.g:6489: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"
+    // InternalUISemanticsGrammar.g:6495: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 {
+            // InternalUISemanticsGrammar.g:6501:2: ( ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef ) )
+            // InternalUISemanticsGrammar.g:6502:2: ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef )
+            {
+            // InternalUISemanticsGrammar.g:6502:2: ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef )
+            int alt117=2;
+            int LA117_0 = input.LA(1);
+
+            if ( (LA117_0==RULE_ID) ) {
+                alt117=1;
+            }
+            else if ( (LA117_0==57||LA117_0==72) ) {
+                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 :
+                    // InternalUISemanticsGrammar.g:6503:3: (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* )
+                    {
+                    // InternalUISemanticsGrammar.g:6503:3: (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* )
+                    // InternalUISemanticsGrammar.g:6504:4: this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )*
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      				newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getJvmParameterizedTypeReferenceParserRuleCall_0_0());
+                      			
+                    }
+                    pushFollow(FOLLOW_89);
+                    this_JvmParameterizedTypeReference_0=ruleJvmParameterizedTypeReference();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = this_JvmParameterizedTypeReference_0;
+                      				afterParserOrEnumRuleCall();
+                      			
+                    }
+                    // InternalUISemanticsGrammar.g:6512:4: ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )*
+                    loop116:
+                    do {
+                        int alt116=2;
+                        int LA116_0 = input.LA(1);
+
+                        if ( (LA116_0==75) ) {
+                            int LA116_2 = input.LA(2);
+
+                            if ( (LA116_2==76) ) {
+                                int LA116_3 = input.LA(3);
+
+                                if ( (synpred43_InternalUISemanticsGrammar()) ) {
+                                    alt116=1;
+                                }
+
+
+                            }
+
+
+                        }
+
+
+                        switch (alt116) {
+                    	case 1 :
+                    	    // InternalUISemanticsGrammar.g:6513:5: ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets )
+                    	    {
+                    	    // InternalUISemanticsGrammar.g:6519:5: ( () ruleArrayBrackets )
+                    	    // InternalUISemanticsGrammar.g:6520:6: () ruleArrayBrackets
+                    	    {
+                    	    // InternalUISemanticsGrammar.g:6520:6: ()
+                    	    // InternalUISemanticsGrammar.g:6521: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_89);
+                    	    ruleArrayBrackets();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						afterParserOrEnumRuleCall();
+                    	      					
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop116;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalUISemanticsGrammar.g:6538: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"
+    // InternalUISemanticsGrammar.g:6550:1: entryRuleArrayBrackets returns [String current=null] : iv_ruleArrayBrackets= ruleArrayBrackets EOF ;
+    public final String entryRuleArrayBrackets() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleArrayBrackets = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:6550:53: (iv_ruleArrayBrackets= ruleArrayBrackets EOF )
+            // InternalUISemanticsGrammar.g:6551: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"
+    // InternalUISemanticsGrammar.g:6557:1: ruleArrayBrackets returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '[' kw= ']' ) ;
+    public final AntlrDatatypeRuleToken ruleArrayBrackets() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalUISemanticsGrammar.g:6563:2: ( (kw= '[' kw= ']' ) )
+            // InternalUISemanticsGrammar.g:6564:2: (kw= '[' kw= ']' )
+            {
+            // InternalUISemanticsGrammar.g:6564:2: (kw= '[' kw= ']' )
+            // InternalUISemanticsGrammar.g:6565:3: kw= '[' kw= ']'
+            {
+            kw=(Token)match(input,75,FOLLOW_69); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current.merge(kw);
+              			newLeafNode(kw, grammarAccess.getArrayBracketsAccess().getLeftSquareBracketKeyword_0());
+              		
+            }
+            kw=(Token)match(input,76,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"
+    // InternalUISemanticsGrammar.g:6579:1: entryRuleXFunctionTypeRef returns [EObject current=null] : iv_ruleXFunctionTypeRef= ruleXFunctionTypeRef EOF ;
+    public final EObject entryRuleXFunctionTypeRef() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXFunctionTypeRef = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:6579:57: (iv_ruleXFunctionTypeRef= ruleXFunctionTypeRef EOF )
+            // InternalUISemanticsGrammar.g:6580: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"
+    // InternalUISemanticsGrammar.g:6586: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 {
+            // InternalUISemanticsGrammar.g:6592:2: ( ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) ) )
+            // InternalUISemanticsGrammar.g:6593:2: ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) )
+            {
+            // InternalUISemanticsGrammar.g:6593:2: ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) )
+            // InternalUISemanticsGrammar.g:6594:3: (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) )
+            {
+            // InternalUISemanticsGrammar.g:6594:3: (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )?
+            int alt120=2;
+            int LA120_0 = input.LA(1);
+
+            if ( (LA120_0==72) ) {
+                alt120=1;
+            }
+            switch (alt120) {
+                case 1 :
+                    // InternalUISemanticsGrammar.g:6595:4: otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')'
+                    {
+                    otherlv_0=(Token)match(input,72,FOLLOW_97); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_0, grammarAccess.getXFunctionTypeRefAccess().getLeftParenthesisKeyword_0_0());
+                      			
+                    }
+                    // InternalUISemanticsGrammar.g:6599:4: ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )?
+                    int alt119=2;
+                    int LA119_0 = input.LA(1);
+
+                    if ( (LA119_0==RULE_ID||LA119_0==57||LA119_0==72) ) {
+                        alt119=1;
+                    }
+                    switch (alt119) {
+                        case 1 :
+                            // InternalUISemanticsGrammar.g:6600:5: ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )*
+                            {
+                            // InternalUISemanticsGrammar.g:6600:5: ( (lv_paramTypes_1_0= ruleJvmTypeReference ) )
+                            // InternalUISemanticsGrammar.g:6601:6: (lv_paramTypes_1_0= ruleJvmTypeReference )
+                            {
+                            // InternalUISemanticsGrammar.g:6601:6: (lv_paramTypes_1_0= ruleJvmTypeReference )
+                            // InternalUISemanticsGrammar.g:6602:7: lv_paramTypes_1_0= ruleJvmTypeReference
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_0_0());
+                              						
+                            }
+                            pushFollow(FOLLOW_59);
+                            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();
+                              						
+                            }
+
+                            }
+
+
+                            }
+
+                            // InternalUISemanticsGrammar.g:6619:5: (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )*
+                            loop118:
+                            do {
+                                int alt118=2;
+                                int LA118_0 = input.LA(1);
+
+                                if ( (LA118_0==71) ) {
+                                    alt118=1;
+                                }
+
+
+                                switch (alt118) {
+                            	case 1 :
+                            	    // InternalUISemanticsGrammar.g:6620:6: otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) )
+                            	    {
+                            	    otherlv_2=(Token)match(input,71,FOLLOW_31); if (state.failed) return current;
+                            	    if ( state.backtracking==0 ) {
+
+                            	      						newLeafNode(otherlv_2, grammarAccess.getXFunctionTypeRefAccess().getCommaKeyword_0_1_1_0());
+                            	      					
+                            	    }
+                            	    // InternalUISemanticsGrammar.g:6624:6: ( (lv_paramTypes_3_0= ruleJvmTypeReference ) )
+                            	    // InternalUISemanticsGrammar.g:6625:7: (lv_paramTypes_3_0= ruleJvmTypeReference )
+                            	    {
+                            	    // InternalUISemanticsGrammar.g:6625:7: (lv_paramTypes_3_0= ruleJvmTypeReference )
+                            	    // InternalUISemanticsGrammar.g:6626:8: lv_paramTypes_3_0= ruleJvmTypeReference
+                            	    {
+                            	    if ( state.backtracking==0 ) {
+
+                            	      								newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_1_1_0());
+                            	      							
+                            	    }
+                            	    pushFollow(FOLLOW_59);
+                            	    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 loop118;
+                                }
+                            } while (true);
+
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_4=(Token)match(input,73,FOLLOW_98); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getXFunctionTypeRefAccess().getRightParenthesisKeyword_0_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            otherlv_5=(Token)match(input,57,FOLLOW_31); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_5, grammarAccess.getXFunctionTypeRefAccess().getEqualsSignGreaterThanSignKeyword_1());
+              		
+            }
+            // InternalUISemanticsGrammar.g:6654:3: ( (lv_returnType_6_0= ruleJvmTypeReference ) )
+            // InternalUISemanticsGrammar.g:6655:4: (lv_returnType_6_0= ruleJvmTypeReference )
+            {
+            // InternalUISemanticsGrammar.g:6655:4: (lv_returnType_6_0= ruleJvmTypeReference )
+            // InternalUISemanticsGrammar.g:6656: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"
+    // InternalUISemanticsGrammar.g:6677:1: entryRuleJvmParameterizedTypeReference returns [EObject current=null] : iv_ruleJvmParameterizedTypeReference= ruleJvmParameterizedTypeReference EOF ;
+    public final EObject entryRuleJvmParameterizedTypeReference() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleJvmParameterizedTypeReference = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:6677:70: (iv_ruleJvmParameterizedTypeReference= ruleJvmParameterizedTypeReference EOF )
+            // InternalUISemanticsGrammar.g:6678: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"
+    // InternalUISemanticsGrammar.g:6684: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 {
+            // InternalUISemanticsGrammar.g:6690: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= '>' )? )* )? ) )
+            // InternalUISemanticsGrammar.g:6691: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= '>' )? )* )? )
+            {
+            // InternalUISemanticsGrammar.g:6691: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= '>' )? )* )? )
+            // InternalUISemanticsGrammar.g:6692: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= '>' )? )* )?
+            {
+            // InternalUISemanticsGrammar.g:6692:3: ( ( ruleQualifiedName ) )
+            // InternalUISemanticsGrammar.g:6693:4: ( ruleQualifiedName )
+            {
+            // InternalUISemanticsGrammar.g:6693:4: ( ruleQualifiedName )
+            // InternalUISemanticsGrammar.g:6694: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_99);
+            ruleQualifiedName();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalUISemanticsGrammar.g:6708: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 alt125=2;
+            alt125 = dfa125.predict(input);
+            switch (alt125) {
+                case 1 :
+                    // InternalUISemanticsGrammar.g:6709: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= '>' )? )*
+                    {
+                    // InternalUISemanticsGrammar.g:6709:4: ( ( '<' )=>otherlv_1= '<' )
+                    // InternalUISemanticsGrammar.g:6710:5: ( '<' )=>otherlv_1= '<'
+                    {
+                    otherlv_1=(Token)match(input,44,FOLLOW_54); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_1, grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_0());
+                      				
+                    }
+
+                    }
+
+                    // InternalUISemanticsGrammar.g:6716:4: ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) )
+                    // InternalUISemanticsGrammar.g:6717:5: (lv_arguments_2_0= ruleJvmArgumentTypeReference )
+                    {
+                    // InternalUISemanticsGrammar.g:6717:5: (lv_arguments_2_0= ruleJvmArgumentTypeReference )
+                    // InternalUISemanticsGrammar.g:6718:6: lv_arguments_2_0= ruleJvmArgumentTypeReference
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_55);
+                    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();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalUISemanticsGrammar.g:6735:4: (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )*
+                    loop121:
+                    do {
+                        int alt121=2;
+                        int LA121_0 = input.LA(1);
+
+                        if ( (LA121_0==71) ) {
+                            alt121=1;
+                        }
+
+
+                        switch (alt121) {
+                    	case 1 :
+                    	    // InternalUISemanticsGrammar.g:6736:5: otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) )
+                    	    {
+                    	    otherlv_3=(Token)match(input,71,FOLLOW_54); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      					newLeafNode(otherlv_3, grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_2_0());
+                    	      				
+                    	    }
+                    	    // InternalUISemanticsGrammar.g:6740:5: ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) )
+                    	    // InternalUISemanticsGrammar.g:6741:6: (lv_arguments_4_0= ruleJvmArgumentTypeReference )
+                    	    {
+                    	    // InternalUISemanticsGrammar.g:6741:6: (lv_arguments_4_0= ruleJvmArgumentTypeReference )
+                    	    // InternalUISemanticsGrammar.g:6742:7: lv_arguments_4_0= ruleJvmArgumentTypeReference
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_55);
+                    	    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 loop121;
+                        }
+                    } while (true);
+
+                    otherlv_5=(Token)match(input,45,FOLLOW_95); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_5, grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_3());
+                      			
+                    }
+                    // InternalUISemanticsGrammar.g:6764:4: ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )*
+                    loop124:
+                    do {
+                        int alt124=2;
+                        int LA124_0 = input.LA(1);
+
+                        if ( (LA124_0==68) ) {
+                            int LA124_2 = input.LA(2);
+
+                            if ( (LA124_2==RULE_ID) ) {
+                                int LA124_3 = input.LA(3);
+
+                                if ( (synpred45_InternalUISemanticsGrammar()) ) {
+                                    alt124=1;
+                                }
+
+
+                            }
+
+
+                        }
+
+
+                        switch (alt124) {
+                    	case 1 :
+                    	    // InternalUISemanticsGrammar.g:6765:5: ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )?
+                    	    {
+                    	    // InternalUISemanticsGrammar.g:6765:5: ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) )
+                    	    // InternalUISemanticsGrammar.g:6766:6: ( ( () '.' ) )=> ( () otherlv_7= '.' )
+                    	    {
+                    	    // InternalUISemanticsGrammar.g:6772:6: ( () otherlv_7= '.' )
+                    	    // InternalUISemanticsGrammar.g:6773:7: () otherlv_7= '.'
+                    	    {
+                    	    // InternalUISemanticsGrammar.g:6773:7: ()
+                    	    // InternalUISemanticsGrammar.g:6774:8: 
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      								current = forceCreateModelElementAndSet(
+                    	      									grammarAccess.getJvmParameterizedTypeReferenceAccess().getJvmInnerTypeReferenceOuterAction_1_4_0_0_0(),
+                    	      									current);
+                    	      							
+                    	    }
+
+                    	    }
+
+                    	    otherlv_7=(Token)match(input,68,FOLLOW_16); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newLeafNode(otherlv_7, grammarAccess.getJvmParameterizedTypeReferenceAccess().getFullStopKeyword_1_4_0_0_1());
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    // InternalUISemanticsGrammar.g:6786:5: ( ( ruleValidID ) )
+                    	    // InternalUISemanticsGrammar.g:6787:6: ( ruleValidID )
+                    	    {
+                    	    // InternalUISemanticsGrammar.g:6787:6: ( ruleValidID )
+                    	    // InternalUISemanticsGrammar.g:6788: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_100);
+                    	    ruleValidID();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    // InternalUISemanticsGrammar.g:6802:5: ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )?
+                    	    int alt123=2;
+                    	    alt123 = dfa123.predict(input);
+                    	    switch (alt123) {
+                    	        case 1 :
+                    	            // InternalUISemanticsGrammar.g:6803:6: ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>'
+                    	            {
+                    	            // InternalUISemanticsGrammar.g:6803:6: ( ( '<' )=>otherlv_9= '<' )
+                    	            // InternalUISemanticsGrammar.g:6804:7: ( '<' )=>otherlv_9= '<'
+                    	            {
+                    	            otherlv_9=(Token)match(input,44,FOLLOW_54); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              							newLeafNode(otherlv_9, grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_4_2_0());
+                    	              						
+                    	            }
+
+                    	            }
+
+                    	            // InternalUISemanticsGrammar.g:6810:6: ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) )
+                    	            // InternalUISemanticsGrammar.g:6811:7: (lv_arguments_10_0= ruleJvmArgumentTypeReference )
+                    	            {
+                    	            // InternalUISemanticsGrammar.g:6811:7: (lv_arguments_10_0= ruleJvmArgumentTypeReference )
+                    	            // InternalUISemanticsGrammar.g:6812:8: lv_arguments_10_0= ruleJvmArgumentTypeReference
+                    	            {
+                    	            if ( state.backtracking==0 ) {
+
+                    	              								newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_1_0());
+                    	              							
+                    	            }
+                    	            pushFollow(FOLLOW_55);
+                    	            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();
+                    	              							
+                    	            }
+
+                    	            }
+
+
+                    	            }
+
+                    	            // InternalUISemanticsGrammar.g:6829:6: (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )*
+                    	            loop122:
+                    	            do {
+                    	                int alt122=2;
+                    	                int LA122_0 = input.LA(1);
+
+                    	                if ( (LA122_0==71) ) {
+                    	                    alt122=1;
+                    	                }
+
+
+                    	                switch (alt122) {
+                    	            	case 1 :
+                    	            	    // InternalUISemanticsGrammar.g:6830:7: otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) )
+                    	            	    {
+                    	            	    otherlv_11=(Token)match(input,71,FOLLOW_54); if (state.failed) return current;
+                    	            	    if ( state.backtracking==0 ) {
+
+                    	            	      							newLeafNode(otherlv_11, grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_4_2_2_0());
+                    	            	      						
+                    	            	    }
+                    	            	    // InternalUISemanticsGrammar.g:6834:7: ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) )
+                    	            	    // InternalUISemanticsGrammar.g:6835:8: (lv_arguments_12_0= ruleJvmArgumentTypeReference )
+                    	            	    {
+                    	            	    // InternalUISemanticsGrammar.g:6835:8: (lv_arguments_12_0= ruleJvmArgumentTypeReference )
+                    	            	    // InternalUISemanticsGrammar.g:6836:9: lv_arguments_12_0= ruleJvmArgumentTypeReference
+                    	            	    {
+                    	            	    if ( state.backtracking==0 ) {
+
+                    	            	      									newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_2_1_0());
+                    	            	      								
+                    	            	    }
+                    	            	    pushFollow(FOLLOW_55);
+                    	            	    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 loop122;
+                    	                }
+                    	            } while (true);
+
+                    	            otherlv_13=(Token)match(input,45,FOLLOW_95); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              						newLeafNode(otherlv_13, grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_4_2_3());
+                    	              					
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop124;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleJvmParameterizedTypeReference"
+
+
+    // $ANTLR start "entryRuleJvmArgumentTypeReference"
+    // InternalUISemanticsGrammar.g:6865:1: entryRuleJvmArgumentTypeReference returns [EObject current=null] : iv_ruleJvmArgumentTypeReference= ruleJvmArgumentTypeReference EOF ;
+    public final EObject entryRuleJvmArgumentTypeReference() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleJvmArgumentTypeReference = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:6865:65: (iv_ruleJvmArgumentTypeReference= ruleJvmArgumentTypeReference EOF )
+            // InternalUISemanticsGrammar.g:6866: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"
+    // InternalUISemanticsGrammar.g:6872: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 {
+            // InternalUISemanticsGrammar.g:6878:2: ( (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference ) )
+            // InternalUISemanticsGrammar.g:6879:2: (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference )
+            {
+            // InternalUISemanticsGrammar.g:6879:2: (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference )
+            int alt126=2;
+            int LA126_0 = input.LA(1);
+
+            if ( (LA126_0==RULE_ID||LA126_0==57||LA126_0==72) ) {
+                alt126=1;
+            }
+            else if ( (LA126_0==100) ) {
+                alt126=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 126, 0, input);
+
+                throw nvae;
+            }
+            switch (alt126) {
+                case 1 :
+                    // InternalUISemanticsGrammar.g:6880: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 :
+                    // InternalUISemanticsGrammar.g:6889: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"
+    // InternalUISemanticsGrammar.g:6901:1: entryRuleJvmWildcardTypeReference returns [EObject current=null] : iv_ruleJvmWildcardTypeReference= ruleJvmWildcardTypeReference EOF ;
+    public final EObject entryRuleJvmWildcardTypeReference() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleJvmWildcardTypeReference = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:6901:65: (iv_ruleJvmWildcardTypeReference= ruleJvmWildcardTypeReference EOF )
+            // InternalUISemanticsGrammar.g:6902: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"
+    // InternalUISemanticsGrammar.g:6908: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 {
+            // InternalUISemanticsGrammar.g:6914:2: ( ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? ) )
+            // InternalUISemanticsGrammar.g:6915:2: ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? )
+            {
+            // InternalUISemanticsGrammar.g:6915:2: ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? )
+            // InternalUISemanticsGrammar.g:6916:3: () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )?
+            {
+            // InternalUISemanticsGrammar.g:6916:3: ()
+            // InternalUISemanticsGrammar.g:6917:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getJvmWildcardTypeReferenceAccess().getJvmWildcardTypeReferenceAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,100,FOLLOW_101); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getJvmWildcardTypeReferenceAccess().getQuestionMarkKeyword_1());
+              		
+            }
+            // InternalUISemanticsGrammar.g:6927:3: ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )?
+            int alt129=3;
+            int LA129_0 = input.LA(1);
+
+            if ( (LA129_0==33) ) {
+                alt129=1;
+            }
+            else if ( (LA129_0==88) ) {
+                alt129=2;
+            }
+            switch (alt129) {
+                case 1 :
+                    // InternalUISemanticsGrammar.g:6928:4: ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* )
+                    {
+                    // InternalUISemanticsGrammar.g:6928:4: ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* )
+                    // InternalUISemanticsGrammar.g:6929:5: ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )*
+                    {
+                    // InternalUISemanticsGrammar.g:6929:5: ( (lv_constraints_2_0= ruleJvmUpperBound ) )
+                    // InternalUISemanticsGrammar.g:6930:6: (lv_constraints_2_0= ruleJvmUpperBound )
+                    {
+                    // InternalUISemanticsGrammar.g:6930:6: (lv_constraints_2_0= ruleJvmUpperBound )
+                    // InternalUISemanticsGrammar.g:6931:7: lv_constraints_2_0= ruleJvmUpperBound
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundParserRuleCall_2_0_0_0());
+                      						
+                    }
+                    pushFollow(FOLLOW_102);
+                    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();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalUISemanticsGrammar.g:6948:5: ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )*
+                    loop127:
+                    do {
+                        int alt127=2;
+                        int LA127_0 = input.LA(1);
+
+                        if ( (LA127_0==101) ) {
+                            alt127=1;
+                        }
+
+
+                        switch (alt127) {
+                    	case 1 :
+                    	    // InternalUISemanticsGrammar.g:6949:6: (lv_constraints_3_0= ruleJvmUpperBoundAnded )
+                    	    {
+                    	    // InternalUISemanticsGrammar.g:6949:6: (lv_constraints_3_0= ruleJvmUpperBoundAnded )
+                    	    // InternalUISemanticsGrammar.g:6950:7: lv_constraints_3_0= ruleJvmUpperBoundAnded
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundAndedParserRuleCall_2_0_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_102);
+                    	    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 loop127;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalUISemanticsGrammar.g:6969:4: ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* )
+                    {
+                    // InternalUISemanticsGrammar.g:6969:4: ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* )
+                    // InternalUISemanticsGrammar.g:6970:5: ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )*
+                    {
+                    // InternalUISemanticsGrammar.g:6970:5: ( (lv_constraints_4_0= ruleJvmLowerBound ) )
+                    // InternalUISemanticsGrammar.g:6971:6: (lv_constraints_4_0= ruleJvmLowerBound )
+                    {
+                    // InternalUISemanticsGrammar.g:6971:6: (lv_constraints_4_0= ruleJvmLowerBound )
+                    // InternalUISemanticsGrammar.g:6972:7: lv_constraints_4_0= ruleJvmLowerBound
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundParserRuleCall_2_1_0_0());
+                      						
+                    }
+                    pushFollow(FOLLOW_102);
+                    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();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalUISemanticsGrammar.g:6989:5: ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )*
+                    loop128:
+                    do {
+                        int alt128=2;
+                        int LA128_0 = input.LA(1);
+
+                        if ( (LA128_0==101) ) {
+                            alt128=1;
+                        }
+
+
+                        switch (alt128) {
+                    	case 1 :
+                    	    // InternalUISemanticsGrammar.g:6990:6: (lv_constraints_5_0= ruleJvmLowerBoundAnded )
+                    	    {
+                    	    // InternalUISemanticsGrammar.g:6990:6: (lv_constraints_5_0= ruleJvmLowerBoundAnded )
+                    	    // InternalUISemanticsGrammar.g:6991:7: lv_constraints_5_0= ruleJvmLowerBoundAnded
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundAndedParserRuleCall_2_1_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_102);
+                    	    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 loop128;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleJvmWildcardTypeReference"
+
+
+    // $ANTLR start "entryRuleJvmUpperBound"
+    // InternalUISemanticsGrammar.g:7014:1: entryRuleJvmUpperBound returns [EObject current=null] : iv_ruleJvmUpperBound= ruleJvmUpperBound EOF ;
+    public final EObject entryRuleJvmUpperBound() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleJvmUpperBound = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:7014:54: (iv_ruleJvmUpperBound= ruleJvmUpperBound EOF )
+            // InternalUISemanticsGrammar.g:7015: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"
+    // InternalUISemanticsGrammar.g:7021: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 {
+            // InternalUISemanticsGrammar.g:7027:2: ( (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
+            // InternalUISemanticsGrammar.g:7028:2: (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            {
+            // InternalUISemanticsGrammar.g:7028:2: (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            // InternalUISemanticsGrammar.g:7029:3: otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            {
+            otherlv_0=(Token)match(input,33,FOLLOW_31); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getJvmUpperBoundAccess().getExtendsKeyword_0());
+              		
+            }
+            // InternalUISemanticsGrammar.g:7033:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            // InternalUISemanticsGrammar.g:7034:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            {
+            // InternalUISemanticsGrammar.g:7034:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            // InternalUISemanticsGrammar.g:7035: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"
+    // InternalUISemanticsGrammar.g:7056:1: entryRuleJvmUpperBoundAnded returns [EObject current=null] : iv_ruleJvmUpperBoundAnded= ruleJvmUpperBoundAnded EOF ;
+    public final EObject entryRuleJvmUpperBoundAnded() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleJvmUpperBoundAnded = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:7056:59: (iv_ruleJvmUpperBoundAnded= ruleJvmUpperBoundAnded EOF )
+            // InternalUISemanticsGrammar.g:7057: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"
+    // InternalUISemanticsGrammar.g:7063: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 {
+            // InternalUISemanticsGrammar.g:7069:2: ( (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
+            // InternalUISemanticsGrammar.g:7070:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            {
+            // InternalUISemanticsGrammar.g:7070:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            // InternalUISemanticsGrammar.g:7071:3: otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            {
+            otherlv_0=(Token)match(input,101,FOLLOW_31); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getJvmUpperBoundAndedAccess().getAmpersandKeyword_0());
+              		
+            }
+            // InternalUISemanticsGrammar.g:7075:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            // InternalUISemanticsGrammar.g:7076:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            {
+            // InternalUISemanticsGrammar.g:7076:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            // InternalUISemanticsGrammar.g:7077: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"
+    // InternalUISemanticsGrammar.g:7098:1: entryRuleJvmLowerBound returns [EObject current=null] : iv_ruleJvmLowerBound= ruleJvmLowerBound EOF ;
+    public final EObject entryRuleJvmLowerBound() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleJvmLowerBound = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:7098:54: (iv_ruleJvmLowerBound= ruleJvmLowerBound EOF )
+            // InternalUISemanticsGrammar.g:7099: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"
+    // InternalUISemanticsGrammar.g:7105: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 {
+            // InternalUISemanticsGrammar.g:7111:2: ( (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
+            // InternalUISemanticsGrammar.g:7112:2: (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            {
+            // InternalUISemanticsGrammar.g:7112:2: (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            // InternalUISemanticsGrammar.g:7113:3: otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            {
+            otherlv_0=(Token)match(input,88,FOLLOW_31); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getJvmLowerBoundAccess().getSuperKeyword_0());
+              		
+            }
+            // InternalUISemanticsGrammar.g:7117:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            // InternalUISemanticsGrammar.g:7118:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            {
+            // InternalUISemanticsGrammar.g:7118:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            // InternalUISemanticsGrammar.g:7119: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"
+    // InternalUISemanticsGrammar.g:7140:1: entryRuleJvmLowerBoundAnded returns [EObject current=null] : iv_ruleJvmLowerBoundAnded= ruleJvmLowerBoundAnded EOF ;
+    public final EObject entryRuleJvmLowerBoundAnded() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleJvmLowerBoundAnded = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:7140:59: (iv_ruleJvmLowerBoundAnded= ruleJvmLowerBoundAnded EOF )
+            // InternalUISemanticsGrammar.g:7141: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"
+    // InternalUISemanticsGrammar.g:7147: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 {
+            // InternalUISemanticsGrammar.g:7153:2: ( (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
+            // InternalUISemanticsGrammar.g:7154:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            {
+            // InternalUISemanticsGrammar.g:7154:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            // InternalUISemanticsGrammar.g:7155:3: otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            {
+            otherlv_0=(Token)match(input,101,FOLLOW_31); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getJvmLowerBoundAndedAccess().getAmpersandKeyword_0());
+              		
+            }
+            // InternalUISemanticsGrammar.g:7159:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            // InternalUISemanticsGrammar.g:7160:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            {
+            // InternalUISemanticsGrammar.g:7160:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            // InternalUISemanticsGrammar.g:7161: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"
+    // InternalUISemanticsGrammar.g:7182:1: entryRuleQualifiedNameWithWildcard returns [String current=null] : iv_ruleQualifiedNameWithWildcard= ruleQualifiedNameWithWildcard EOF ;
+    public final String entryRuleQualifiedNameWithWildcard() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleQualifiedNameWithWildcard = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:7182:65: (iv_ruleQualifiedNameWithWildcard= ruleQualifiedNameWithWildcard EOF )
+            // InternalUISemanticsGrammar.g:7183: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"
+    // InternalUISemanticsGrammar.g:7189: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 {
+            // InternalUISemanticsGrammar.g:7195:2: ( (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' ) )
+            // InternalUISemanticsGrammar.g:7196:2: (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' )
+            {
+            // InternalUISemanticsGrammar.g:7196:2: (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' )
+            // InternalUISemanticsGrammar.g:7197:3: this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*'
+            {
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getQualifiedNameWithWildcardAccess().getQualifiedNameParserRuleCall_0());
+              		
+            }
+            pushFollow(FOLLOW_103);
+            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,68,FOLLOW_104); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current.merge(kw);
+              			newLeafNode(kw, grammarAccess.getQualifiedNameWithWildcardAccess().getFullStopKeyword_1());
+              		
+            }
+            kw=(Token)match(input,22,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"
+    // InternalUISemanticsGrammar.g:7221:1: entryRuleValidID returns [String current=null] : iv_ruleValidID= ruleValidID EOF ;
+    public final String entryRuleValidID() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleValidID = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:7221:47: (iv_ruleValidID= ruleValidID EOF )
+            // InternalUISemanticsGrammar.g:7222: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"
+    // InternalUISemanticsGrammar.g:7228: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 {
+            // InternalUISemanticsGrammar.g:7234:2: (this_ID_0= RULE_ID )
+            // InternalUISemanticsGrammar.g:7235: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"
+    // InternalUISemanticsGrammar.g:7245:1: entryRuleXImportSection returns [EObject current=null] : iv_ruleXImportSection= ruleXImportSection EOF ;
+    public final EObject entryRuleXImportSection() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXImportSection = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:7245:55: (iv_ruleXImportSection= ruleXImportSection EOF )
+            // InternalUISemanticsGrammar.g:7246: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"
+    // InternalUISemanticsGrammar.g:7252: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 {
+            // InternalUISemanticsGrammar.g:7258:2: ( ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+ )
+            // InternalUISemanticsGrammar.g:7259:2: ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+
+            {
+            // InternalUISemanticsGrammar.g:7259:2: ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+
+            int cnt130=0;
+            loop130:
+            do {
+                int alt130=2;
+                int LA130_0 = input.LA(1);
+
+                if ( (LA130_0==19||LA130_0==23) ) {
+                    alt130=1;
+                }
+
+
+                switch (alt130) {
+            	case 1 :
+            	    // InternalUISemanticsGrammar.g:7260:3: (lv_importDeclarations_0_0= ruleXImportDeclaration )
+            	    {
+            	    // InternalUISemanticsGrammar.g:7260:3: (lv_importDeclarations_0_0= ruleXImportDeclaration )
+            	    // InternalUISemanticsGrammar.g:7261:4: lv_importDeclarations_0_0= ruleXImportDeclaration
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      				newCompositeNode(grammarAccess.getXImportSectionAccess().getImportDeclarationsXImportDeclarationParserRuleCall_0());
+            	      			
+            	    }
+            	    pushFollow(FOLLOW_105);
+            	    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.ecview.uisemantics.UISemanticsGrammar.XImportDeclaration");
+            	      				afterParserOrEnumRuleCall();
+            	      			
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt130 >= 1 ) break loop130;
+            	    if (state.backtracking>0) {state.failed=true; return current;}
+                        EarlyExitException eee =
+                            new EarlyExitException(130, input);
+                        throw eee;
+                }
+                cnt130++;
+            } while (true);
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXImportSection"
+
+
+    // $ANTLR start "entryRuleQualifiedNameInStaticImport"
+    // InternalUISemanticsGrammar.g:7281:1: entryRuleQualifiedNameInStaticImport returns [String current=null] : iv_ruleQualifiedNameInStaticImport= ruleQualifiedNameInStaticImport EOF ;
+    public final String entryRuleQualifiedNameInStaticImport() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleQualifiedNameInStaticImport = null;
+
+
+        try {
+            // InternalUISemanticsGrammar.g:7281:67: (iv_ruleQualifiedNameInStaticImport= ruleQualifiedNameInStaticImport EOF )
+            // InternalUISemanticsGrammar.g:7282: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"
+    // InternalUISemanticsGrammar.g:7288: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 {
+            // InternalUISemanticsGrammar.g:7294:2: ( (this_ValidID_0= ruleValidID kw= '.' )+ )
+            // InternalUISemanticsGrammar.g:7295:2: (this_ValidID_0= ruleValidID kw= '.' )+
+            {
+            // InternalUISemanticsGrammar.g:7295:2: (this_ValidID_0= ruleValidID kw= '.' )+
+            int cnt131=0;
+            loop131:
+            do {
+                int alt131=2;
+                int LA131_0 = input.LA(1);
+
+                if ( (LA131_0==RULE_ID) ) {
+                    int LA131_2 = input.LA(2);
+
+                    if ( (LA131_2==68) ) {
+                        alt131=1;
+                    }
+
+
+                }
+
+
+                switch (alt131) {
+            	case 1 :
+            	    // InternalUISemanticsGrammar.g:7296:3: this_ValidID_0= ruleValidID kw= '.'
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      			newCompositeNode(grammarAccess.getQualifiedNameInStaticImportAccess().getValidIDParserRuleCall_0());
+            	      		
+            	    }
+            	    pushFollow(FOLLOW_103);
+            	    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,68,FOLLOW_106); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      			current.merge(kw);
+            	      			newLeafNode(kw, grammarAccess.getQualifiedNameInStaticImportAccess().getFullStopKeyword_1());
+            	      		
+            	    }
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt131 >= 1 ) break loop131;
+            	    if (state.backtracking>0) {state.failed=true; return current;}
+                        EarlyExitException eee =
+                            new EarlyExitException(131, input);
+                        throw eee;
+                }
+                cnt131++;
+            } while (true);
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleQualifiedNameInStaticImport"
+
+    // $ANTLR start synpred1_InternalUISemanticsGrammar
+    public final void synpred1_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:1250:6: ( ( () ( ( ruleOpMultiAssign ) ) ) )
+        // InternalUISemanticsGrammar.g:1250:7: ( () ( ( ruleOpMultiAssign ) ) )
+        {
+        // InternalUISemanticsGrammar.g:1250:7: ( () ( ( ruleOpMultiAssign ) ) )
+        // InternalUISemanticsGrammar.g:1251:7: () ( ( ruleOpMultiAssign ) )
+        {
+        // InternalUISemanticsGrammar.g:1251:7: ()
+        // InternalUISemanticsGrammar.g:1252:7: 
+        {
+        }
+
+        // InternalUISemanticsGrammar.g:1253:7: ( ( ruleOpMultiAssign ) )
+        // InternalUISemanticsGrammar.g:1254:8: ( ruleOpMultiAssign )
+        {
+        // InternalUISemanticsGrammar.g:1254:8: ( ruleOpMultiAssign )
+        // InternalUISemanticsGrammar.g:1255:9: ruleOpMultiAssign
+        {
+        pushFollow(FOLLOW_2);
+        ruleOpMultiAssign();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred1_InternalUISemanticsGrammar
+
+    // $ANTLR start synpred2_InternalUISemanticsGrammar
+    public final void synpred2_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:1444:5: ( ( () ( ( ruleOpOr ) ) ) )
+        // InternalUISemanticsGrammar.g:1444:6: ( () ( ( ruleOpOr ) ) )
+        {
+        // InternalUISemanticsGrammar.g:1444:6: ( () ( ( ruleOpOr ) ) )
+        // InternalUISemanticsGrammar.g:1445:6: () ( ( ruleOpOr ) )
+        {
+        // InternalUISemanticsGrammar.g:1445:6: ()
+        // InternalUISemanticsGrammar.g:1446:6: 
+        {
+        }
+
+        // InternalUISemanticsGrammar.g:1447:6: ( ( ruleOpOr ) )
+        // InternalUISemanticsGrammar.g:1448:7: ( ruleOpOr )
+        {
+        // InternalUISemanticsGrammar.g:1448:7: ( ruleOpOr )
+        // InternalUISemanticsGrammar.g:1449:8: ruleOpOr
+        {
+        pushFollow(FOLLOW_2);
+        ruleOpOr();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred2_InternalUISemanticsGrammar
+
+    // $ANTLR start synpred3_InternalUISemanticsGrammar
+    public final void synpred3_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:1551:5: ( ( () ( ( ruleOpAnd ) ) ) )
+        // InternalUISemanticsGrammar.g:1551:6: ( () ( ( ruleOpAnd ) ) )
+        {
+        // InternalUISemanticsGrammar.g:1551:6: ( () ( ( ruleOpAnd ) ) )
+        // InternalUISemanticsGrammar.g:1552:6: () ( ( ruleOpAnd ) )
+        {
+        // InternalUISemanticsGrammar.g:1552:6: ()
+        // InternalUISemanticsGrammar.g:1553:6: 
+        {
+        }
+
+        // InternalUISemanticsGrammar.g:1554:6: ( ( ruleOpAnd ) )
+        // InternalUISemanticsGrammar.g:1555:7: ( ruleOpAnd )
+        {
+        // InternalUISemanticsGrammar.g:1555:7: ( ruleOpAnd )
+        // InternalUISemanticsGrammar.g:1556:8: ruleOpAnd
+        {
+        pushFollow(FOLLOW_2);
+        ruleOpAnd();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred3_InternalUISemanticsGrammar
+
+    // $ANTLR start synpred4_InternalUISemanticsGrammar
+    public final void synpred4_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:1658:5: ( ( () ( ( ruleOpEquality ) ) ) )
+        // InternalUISemanticsGrammar.g:1658:6: ( () ( ( ruleOpEquality ) ) )
+        {
+        // InternalUISemanticsGrammar.g:1658:6: ( () ( ( ruleOpEquality ) ) )
+        // InternalUISemanticsGrammar.g:1659:6: () ( ( ruleOpEquality ) )
+        {
+        // InternalUISemanticsGrammar.g:1659:6: ()
+        // InternalUISemanticsGrammar.g:1660:6: 
+        {
+        }
+
+        // InternalUISemanticsGrammar.g:1661:6: ( ( ruleOpEquality ) )
+        // InternalUISemanticsGrammar.g:1662:7: ( ruleOpEquality )
+        {
+        // InternalUISemanticsGrammar.g:1662:7: ( ruleOpEquality )
+        // InternalUISemanticsGrammar.g:1663:8: ruleOpEquality
+        {
+        pushFollow(FOLLOW_2);
+        ruleOpEquality();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred4_InternalUISemanticsGrammar
+
+    // $ANTLR start synpred5_InternalUISemanticsGrammar
+    public final void synpred5_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:1786:6: ( ( () 'instanceof' ) )
+        // InternalUISemanticsGrammar.g:1786:7: ( () 'instanceof' )
+        {
+        // InternalUISemanticsGrammar.g:1786:7: ( () 'instanceof' )
+        // InternalUISemanticsGrammar.g:1787:7: () 'instanceof'
+        {
+        // InternalUISemanticsGrammar.g:1787:7: ()
+        // InternalUISemanticsGrammar.g:1788:7: 
+        {
+        }
+
+        match(input,53,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred5_InternalUISemanticsGrammar
+
+    // $ANTLR start synpred6_InternalUISemanticsGrammar
+    public final void synpred6_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:1829:6: ( ( () ( ( ruleOpCompare ) ) ) )
+        // InternalUISemanticsGrammar.g:1829:7: ( () ( ( ruleOpCompare ) ) )
+        {
+        // InternalUISemanticsGrammar.g:1829:7: ( () ( ( ruleOpCompare ) ) )
+        // InternalUISemanticsGrammar.g:1830:7: () ( ( ruleOpCompare ) )
+        {
+        // InternalUISemanticsGrammar.g:1830:7: ()
+        // InternalUISemanticsGrammar.g:1831:7: 
+        {
+        }
+
+        // InternalUISemanticsGrammar.g:1832:7: ( ( ruleOpCompare ) )
+        // InternalUISemanticsGrammar.g:1833:8: ( ruleOpCompare )
+        {
+        // InternalUISemanticsGrammar.g:1833:8: ( ruleOpCompare )
+        // InternalUISemanticsGrammar.g:1834:9: ruleOpCompare
+        {
+        pushFollow(FOLLOW_2);
+        ruleOpCompare();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred6_InternalUISemanticsGrammar
+
+    // $ANTLR start synpred7_InternalUISemanticsGrammar
+    public final void synpred7_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:1964:5: ( ( () ( ( ruleOpOther ) ) ) )
+        // InternalUISemanticsGrammar.g:1964:6: ( () ( ( ruleOpOther ) ) )
+        {
+        // InternalUISemanticsGrammar.g:1964:6: ( () ( ( ruleOpOther ) ) )
+        // InternalUISemanticsGrammar.g:1965:6: () ( ( ruleOpOther ) )
+        {
+        // InternalUISemanticsGrammar.g:1965:6: ()
+        // InternalUISemanticsGrammar.g:1966:6: 
+        {
+        }
+
+        // InternalUISemanticsGrammar.g:1967:6: ( ( ruleOpOther ) )
+        // InternalUISemanticsGrammar.g:1968:7: ( ruleOpOther )
+        {
+        // InternalUISemanticsGrammar.g:1968:7: ( ruleOpOther )
+        // InternalUISemanticsGrammar.g:1969:8: ruleOpOther
+        {
+        pushFollow(FOLLOW_2);
+        ruleOpOther();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred7_InternalUISemanticsGrammar
+
+    // $ANTLR start synpred8_InternalUISemanticsGrammar
+    public final void synpred8_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:2084:6: ( ( '>' '>' ) )
+        // InternalUISemanticsGrammar.g:2084:7: ( '>' '>' )
+        {
+        // InternalUISemanticsGrammar.g:2084:7: ( '>' '>' )
+        // InternalUISemanticsGrammar.g:2085:7: '>' '>'
+        {
+        match(input,45,FOLLOW_45); if (state.failed) return ;
+        match(input,45,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred8_InternalUISemanticsGrammar
+
+    // $ANTLR start synpred9_InternalUISemanticsGrammar
+    public final void synpred9_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:2119:6: ( ( '<' '<' ) )
+        // InternalUISemanticsGrammar.g:2119:7: ( '<' '<' )
+        {
+        // InternalUISemanticsGrammar.g:2119:7: ( '<' '<' )
+        // InternalUISemanticsGrammar.g:2120:7: '<' '<'
+        {
+        match(input,44,FOLLOW_36); if (state.failed) return ;
+        match(input,44,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred9_InternalUISemanticsGrammar
+
+    // $ANTLR start synpred10_InternalUISemanticsGrammar
+    public final void synpred10_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:2192:5: ( ( () ( ( ruleOpAdd ) ) ) )
+        // InternalUISemanticsGrammar.g:2192:6: ( () ( ( ruleOpAdd ) ) )
+        {
+        // InternalUISemanticsGrammar.g:2192:6: ( () ( ( ruleOpAdd ) ) )
+        // InternalUISemanticsGrammar.g:2193:6: () ( ( ruleOpAdd ) )
+        {
+        // InternalUISemanticsGrammar.g:2193:6: ()
+        // InternalUISemanticsGrammar.g:2194:6: 
+        {
+        }
+
+        // InternalUISemanticsGrammar.g:2195:6: ( ( ruleOpAdd ) )
+        // InternalUISemanticsGrammar.g:2196:7: ( ruleOpAdd )
+        {
+        // InternalUISemanticsGrammar.g:2196:7: ( ruleOpAdd )
+        // InternalUISemanticsGrammar.g:2197:8: ruleOpAdd
+        {
+        pushFollow(FOLLOW_2);
+        ruleOpAdd();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred10_InternalUISemanticsGrammar
+
+    // $ANTLR start synpred11_InternalUISemanticsGrammar
+    public final void synpred11_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:2307:5: ( ( () ( ( ruleOpMulti ) ) ) )
+        // InternalUISemanticsGrammar.g:2307:6: ( () ( ( ruleOpMulti ) ) )
+        {
+        // InternalUISemanticsGrammar.g:2307:6: ( () ( ( ruleOpMulti ) ) )
+        // InternalUISemanticsGrammar.g:2308:6: () ( ( ruleOpMulti ) )
+        {
+        // InternalUISemanticsGrammar.g:2308:6: ()
+        // InternalUISemanticsGrammar.g:2309:6: 
+        {
+        }
+
+        // InternalUISemanticsGrammar.g:2310:6: ( ( ruleOpMulti ) )
+        // InternalUISemanticsGrammar.g:2311:7: ( ruleOpMulti )
+        {
+        // InternalUISemanticsGrammar.g:2311:7: ( ruleOpMulti )
+        // InternalUISemanticsGrammar.g:2312:8: ruleOpMulti
+        {
+        pushFollow(FOLLOW_2);
+        ruleOpMulti();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred11_InternalUISemanticsGrammar
+
+    // $ANTLR start synpred12_InternalUISemanticsGrammar
+    public final void synpred12_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:2542:5: ( ( () 'as' ) )
+        // InternalUISemanticsGrammar.g:2542:6: ( () 'as' )
+        {
+        // InternalUISemanticsGrammar.g:2542:6: ( () 'as' )
+        // InternalUISemanticsGrammar.g:2543:6: () 'as'
+        {
+        // InternalUISemanticsGrammar.g:2543:6: ()
+        // InternalUISemanticsGrammar.g:2544:6: 
+        {
+        }
+
+        match(input,25,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred12_InternalUISemanticsGrammar
+
+    // $ANTLR start synpred13_InternalUISemanticsGrammar
+    public final void synpred13_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:2610:4: ( ( () ( ( ruleOpPostfix ) ) ) )
+        // InternalUISemanticsGrammar.g:2610:5: ( () ( ( ruleOpPostfix ) ) )
+        {
+        // InternalUISemanticsGrammar.g:2610:5: ( () ( ( ruleOpPostfix ) ) )
+        // InternalUISemanticsGrammar.g:2611:5: () ( ( ruleOpPostfix ) )
+        {
+        // InternalUISemanticsGrammar.g:2611:5: ()
+        // InternalUISemanticsGrammar.g:2612:5: 
+        {
+        }
+
+        // InternalUISemanticsGrammar.g:2613:5: ( ( ruleOpPostfix ) )
+        // InternalUISemanticsGrammar.g:2614:6: ( ruleOpPostfix )
+        {
+        // InternalUISemanticsGrammar.g:2614:6: ( ruleOpPostfix )
+        // InternalUISemanticsGrammar.g:2615:7: ruleOpPostfix
+        {
+        pushFollow(FOLLOW_2);
+        ruleOpPostfix();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred13_InternalUISemanticsGrammar
+
+    // $ANTLR start synpred14_InternalUISemanticsGrammar
+    public final void synpred14_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:2706:6: ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )
+        // InternalUISemanticsGrammar.g:2706:7: ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
+        {
+        // InternalUISemanticsGrammar.g:2706:7: ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
+        // InternalUISemanticsGrammar.g:2707:7: () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign
+        {
+        // InternalUISemanticsGrammar.g:2707:7: ()
+        // InternalUISemanticsGrammar.g:2708:7: 
+        {
+        }
+
+        // InternalUISemanticsGrammar.g:2709:7: ( '.' | ( ( '::' ) ) )
+        int alt132=2;
+        int LA132_0 = input.LA(1);
+
+        if ( (LA132_0==68) ) {
+            alt132=1;
+        }
+        else if ( (LA132_0==69) ) {
+            alt132=2;
+        }
+        else {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            NoViableAltException nvae =
+                new NoViableAltException("", 132, 0, input);
+
+            throw nvae;
+        }
+        switch (alt132) {
+            case 1 :
+                // InternalUISemanticsGrammar.g:2710:8: '.'
+                {
+                match(input,68,FOLLOW_52); if (state.failed) return ;
+
+                }
+                break;
+            case 2 :
+                // InternalUISemanticsGrammar.g:2712:8: ( ( '::' ) )
+                {
+                // InternalUISemanticsGrammar.g:2712:8: ( ( '::' ) )
+                // InternalUISemanticsGrammar.g:2713:9: ( '::' )
+                {
+                // InternalUISemanticsGrammar.g:2713:9: ( '::' )
+                // InternalUISemanticsGrammar.g:2714:10: '::'
+                {
+                match(input,69,FOLLOW_52); if (state.failed) return ;
+
+                }
+
+
+                }
+
+
+                }
+                break;
+
+        }
+
+        // InternalUISemanticsGrammar.g:2718:7: ( ( ruleFeatureCallID ) )
+        // InternalUISemanticsGrammar.g:2719:8: ( ruleFeatureCallID )
+        {
+        // InternalUISemanticsGrammar.g:2719:8: ( ruleFeatureCallID )
+        // InternalUISemanticsGrammar.g:2720:9: ruleFeatureCallID
+        {
+        pushFollow(FOLLOW_33);
+        ruleFeatureCallID();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        pushFollow(FOLLOW_2);
+        ruleOpSingleAssign();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred14_InternalUISemanticsGrammar
+
+    // $ANTLR start synpred15_InternalUISemanticsGrammar
+    public final void synpred15_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:2803:6: ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )
+        // InternalUISemanticsGrammar.g:2803:7: ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) )
+        {
+        // InternalUISemanticsGrammar.g:2803:7: ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) )
+        // InternalUISemanticsGrammar.g:2804:7: () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) )
+        {
+        // InternalUISemanticsGrammar.g:2804:7: ()
+        // InternalUISemanticsGrammar.g:2805:7: 
+        {
+        }
+
+        // InternalUISemanticsGrammar.g:2806:7: ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) )
+        int alt133=3;
+        switch ( input.LA(1) ) {
+        case 68:
+            {
+            alt133=1;
+            }
+            break;
+        case 70:
+            {
+            alt133=2;
+            }
+            break;
+        case 69:
+            {
+            alt133=3;
+            }
+            break;
+        default:
+            if (state.backtracking>0) {state.failed=true; return ;}
+            NoViableAltException nvae =
+                new NoViableAltException("", 133, 0, input);
+
+            throw nvae;
+        }
+
+        switch (alt133) {
+            case 1 :
+                // InternalUISemanticsGrammar.g:2807:8: '.'
+                {
+                match(input,68,FOLLOW_2); if (state.failed) return ;
+
+                }
+                break;
+            case 2 :
+                // InternalUISemanticsGrammar.g:2809:8: ( ( '?.' ) )
+                {
+                // InternalUISemanticsGrammar.g:2809:8: ( ( '?.' ) )
+                // InternalUISemanticsGrammar.g:2810:9: ( '?.' )
+                {
+                // InternalUISemanticsGrammar.g:2810:9: ( '?.' )
+                // InternalUISemanticsGrammar.g:2811:10: '?.'
+                {
+                match(input,70,FOLLOW_2); if (state.failed) return ;
+
+                }
+
+
+                }
+
+
+                }
+                break;
+            case 3 :
+                // InternalUISemanticsGrammar.g:2815:8: ( ( '::' ) )
+                {
+                // InternalUISemanticsGrammar.g:2815:8: ( ( '::' ) )
+                // InternalUISemanticsGrammar.g:2816:9: ( '::' )
+                {
+                // InternalUISemanticsGrammar.g:2816:9: ( '::' )
+                // InternalUISemanticsGrammar.g:2817:10: '::'
+                {
+                match(input,69,FOLLOW_2); if (state.failed) return ;
+
+                }
+
+
+                }
+
+
+                }
+                break;
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred15_InternalUISemanticsGrammar
+
+    // $ANTLR start synpred16_InternalUISemanticsGrammar
+    public final void synpred16_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:2941:7: ( ( '(' ) )
+        // InternalUISemanticsGrammar.g:2941:8: ( '(' )
+        {
+        // InternalUISemanticsGrammar.g:2941:8: ( '(' )
+        // InternalUISemanticsGrammar.g:2942:8: '('
+        {
+        match(input,72,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred16_InternalUISemanticsGrammar
+
+    // $ANTLR start synpred17_InternalUISemanticsGrammar
+    public final void synpred17_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:2960:8: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
+        // InternalUISemanticsGrammar.g:2960:9: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
+        {
+        // InternalUISemanticsGrammar.g:2960:9: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
+        // InternalUISemanticsGrammar.g:2961:9: () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
+        {
+        // InternalUISemanticsGrammar.g:2961:9: ()
+        // InternalUISemanticsGrammar.g:2962:9: 
+        {
+        }
+
+        // InternalUISemanticsGrammar.g:2963:9: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
+        int alt135=2;
+        int LA135_0 = input.LA(1);
+
+        if ( (LA135_0==RULE_ID||LA135_0==57||LA135_0==72) ) {
+            alt135=1;
+        }
+        switch (alt135) {
+            case 1 :
+                // InternalUISemanticsGrammar.g:2964:10: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
+                {
+                // InternalUISemanticsGrammar.g:2964:10: ( ( ruleJvmFormalParameter ) )
+                // InternalUISemanticsGrammar.g:2965:11: ( ruleJvmFormalParameter )
+                {
+                // InternalUISemanticsGrammar.g:2965:11: ( ruleJvmFormalParameter )
+                // InternalUISemanticsGrammar.g:2966:12: ruleJvmFormalParameter
+                {
+                pushFollow(FOLLOW_67);
+                ruleJvmFormalParameter();
+
+                state._fsp--;
+                if (state.failed) return ;
+
+                }
+
+
+                }
+
+                // InternalUISemanticsGrammar.g:2969:10: ( ',' ( ( ruleJvmFormalParameter ) ) )*
+                loop134:
+                do {
+                    int alt134=2;
+                    int LA134_0 = input.LA(1);
+
+                    if ( (LA134_0==71) ) {
+                        alt134=1;
+                    }
+
+
+                    switch (alt134) {
+                	case 1 :
+                	    // InternalUISemanticsGrammar.g:2970:11: ',' ( ( ruleJvmFormalParameter ) )
+                	    {
+                	    match(input,71,FOLLOW_31); if (state.failed) return ;
+                	    // InternalUISemanticsGrammar.g:2971:11: ( ( ruleJvmFormalParameter ) )
+                	    // InternalUISemanticsGrammar.g:2972:12: ( ruleJvmFormalParameter )
+                	    {
+                	    // InternalUISemanticsGrammar.g:2972:12: ( ruleJvmFormalParameter )
+                	    // InternalUISemanticsGrammar.g:2973:13: ruleJvmFormalParameter
+                	    {
+                	    pushFollow(FOLLOW_67);
+                	    ruleJvmFormalParameter();
+
+                	    state._fsp--;
+                	    if (state.failed) return ;
+
+                	    }
+
+
+                	    }
+
+
+                	    }
+                	    break;
+
+                	default :
+                	    break loop134;
+                    }
+                } while (true);
+
+
+                }
+                break;
+
+        }
+
+        // InternalUISemanticsGrammar.g:2978:9: ( ( '|' ) )
+        // InternalUISemanticsGrammar.g:2979:10: ( '|' )
+        {
+        // InternalUISemanticsGrammar.g:2979:10: ( '|' )
+        // InternalUISemanticsGrammar.g:2980:11: '|'
+        {
+        match(input,77,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred17_InternalUISemanticsGrammar
+
+    // $ANTLR start synpred18_InternalUISemanticsGrammar
+    public final void synpred18_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:3057:6: ( ( () '[' ) )
+        // InternalUISemanticsGrammar.g:3057:7: ( () '[' )
+        {
+        // InternalUISemanticsGrammar.g:3057:7: ( () '[' )
+        // InternalUISemanticsGrammar.g:3058:7: () '['
+        {
+        // InternalUISemanticsGrammar.g:3058:7: ()
+        // InternalUISemanticsGrammar.g:3059:7: 
+        {
+        }
+
+        match(input,75,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred18_InternalUISemanticsGrammar
+
+    // $ANTLR start synpred19_InternalUISemanticsGrammar
+    public final void synpred19_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:3130:4: ( ( () 'synchronized' '(' ) )
+        // InternalUISemanticsGrammar.g:3130:5: ( () 'synchronized' '(' )
+        {
+        // InternalUISemanticsGrammar.g:3130:5: ( () 'synchronized' '(' )
+        // InternalUISemanticsGrammar.g:3131:5: () 'synchronized' '('
+        {
+        // InternalUISemanticsGrammar.g:3131:5: ()
+        // InternalUISemanticsGrammar.g:3132:5: 
+        {
+        }
+
+        match(input,98,FOLLOW_72); if (state.failed) return ;
+        match(input,72,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred19_InternalUISemanticsGrammar
+
+    // $ANTLR start synpred20_InternalUISemanticsGrammar
+    public final void synpred20_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:3175:4: ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )
+        // InternalUISemanticsGrammar.g:3175:5: ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' )
+        {
+        // InternalUISemanticsGrammar.g:3175:5: ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' )
+        // InternalUISemanticsGrammar.g:3176:5: () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':'
+        {
+        // InternalUISemanticsGrammar.g:3176:5: ()
+        // InternalUISemanticsGrammar.g:3177:5: 
+        {
+        }
+
+        match(input,83,FOLLOW_72); if (state.failed) return ;
+        match(input,72,FOLLOW_31); if (state.failed) return ;
+        // InternalUISemanticsGrammar.g:3180:5: ( ( ruleJvmFormalParameter ) )
+        // InternalUISemanticsGrammar.g:3181:6: ( ruleJvmFormalParameter )
+        {
+        // InternalUISemanticsGrammar.g:3181:6: ( ruleJvmFormalParameter )
+        // InternalUISemanticsGrammar.g:3182:7: ruleJvmFormalParameter
+        {
+        pushFollow(FOLLOW_26);
+        ruleJvmFormalParameter();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        match(input,32,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred20_InternalUISemanticsGrammar
+
+    // $ANTLR start synpred21_InternalUISemanticsGrammar
+    public final void synpred21_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:3289:4: ( ( () '[' ) )
+        // InternalUISemanticsGrammar.g:3289:5: ( () '[' )
+        {
+        // InternalUISemanticsGrammar.g:3289:5: ( () '[' )
+        // InternalUISemanticsGrammar.g:3290:5: () '['
+        {
+        // InternalUISemanticsGrammar.g:3290:5: ()
+        // InternalUISemanticsGrammar.g:3291:5: 
+        {
+        }
+
+        match(input,75,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred21_InternalUISemanticsGrammar
+
+    // $ANTLR start synpred23_InternalUISemanticsGrammar
+    public final void synpred23_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:3594:4: ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
+        // InternalUISemanticsGrammar.g:3594:5: ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
+        {
+        // InternalUISemanticsGrammar.g:3594:5: ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
+        // InternalUISemanticsGrammar.g:3595:5: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
+        {
+        // InternalUISemanticsGrammar.g:3595:5: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
+        int alt137=2;
+        int LA137_0 = input.LA(1);
+
+        if ( (LA137_0==RULE_ID||LA137_0==57||LA137_0==72) ) {
+            alt137=1;
+        }
+        switch (alt137) {
+            case 1 :
+                // InternalUISemanticsGrammar.g:3596:6: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
+                {
+                // InternalUISemanticsGrammar.g:3596:6: ( ( ruleJvmFormalParameter ) )
+                // InternalUISemanticsGrammar.g:3597:7: ( ruleJvmFormalParameter )
+                {
+                // InternalUISemanticsGrammar.g:3597:7: ( ruleJvmFormalParameter )
+                // InternalUISemanticsGrammar.g:3598:8: ruleJvmFormalParameter
+                {
+                pushFollow(FOLLOW_67);
+                ruleJvmFormalParameter();
+
+                state._fsp--;
+                if (state.failed) return ;
+
+                }
+
+
+                }
+
+                // InternalUISemanticsGrammar.g:3601:6: ( ',' ( ( ruleJvmFormalParameter ) ) )*
+                loop136:
+                do {
+                    int alt136=2;
+                    int LA136_0 = input.LA(1);
+
+                    if ( (LA136_0==71) ) {
+                        alt136=1;
+                    }
+
+
+                    switch (alt136) {
+                	case 1 :
+                	    // InternalUISemanticsGrammar.g:3602:7: ',' ( ( ruleJvmFormalParameter ) )
+                	    {
+                	    match(input,71,FOLLOW_31); if (state.failed) return ;
+                	    // InternalUISemanticsGrammar.g:3603:7: ( ( ruleJvmFormalParameter ) )
+                	    // InternalUISemanticsGrammar.g:3604:8: ( ruleJvmFormalParameter )
+                	    {
+                	    // InternalUISemanticsGrammar.g:3604:8: ( ruleJvmFormalParameter )
+                	    // InternalUISemanticsGrammar.g:3605:9: ruleJvmFormalParameter
+                	    {
+                	    pushFollow(FOLLOW_67);
+                	    ruleJvmFormalParameter();
+
+                	    state._fsp--;
+                	    if (state.failed) return ;
+
+                	    }
+
+
+                	    }
+
+
+                	    }
+                	    break;
+
+                	default :
+                	    break loop136;
+                    }
+                } while (true);
+
+
+                }
+                break;
+
+        }
+
+        // InternalUISemanticsGrammar.g:3610:5: ( ( '|' ) )
+        // InternalUISemanticsGrammar.g:3611:6: ( '|' )
+        {
+        // InternalUISemanticsGrammar.g:3611:6: ( '|' )
+        // InternalUISemanticsGrammar.g:3612:7: '|'
+        {
+        match(input,77,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred23_InternalUISemanticsGrammar
+
+    // $ANTLR start synpred25_InternalUISemanticsGrammar
+    public final void synpred25_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:4003:5: ( 'else' )
+        // InternalUISemanticsGrammar.g:4003:6: 'else'
+        {
+        match(input,79,FOLLOW_2); if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred25_InternalUISemanticsGrammar
+
+    // $ANTLR start synpred26_InternalUISemanticsGrammar
+    public final void synpred26_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:4062:6: ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )
+        // InternalUISemanticsGrammar.g:4062:7: ( '(' ( ( ruleJvmFormalParameter ) ) ':' )
+        {
+        // InternalUISemanticsGrammar.g:4062:7: ( '(' ( ( ruleJvmFormalParameter ) ) ':' )
+        // InternalUISemanticsGrammar.g:4063:7: '(' ( ( ruleJvmFormalParameter ) ) ':'
+        {
+        match(input,72,FOLLOW_31); if (state.failed) return ;
+        // InternalUISemanticsGrammar.g:4064:7: ( ( ruleJvmFormalParameter ) )
+        // InternalUISemanticsGrammar.g:4065:8: ( ruleJvmFormalParameter )
+        {
+        // InternalUISemanticsGrammar.g:4065:8: ( ruleJvmFormalParameter )
+        // InternalUISemanticsGrammar.g:4066:9: ruleJvmFormalParameter
+        {
+        pushFollow(FOLLOW_26);
+        ruleJvmFormalParameter();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        match(input,32,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred26_InternalUISemanticsGrammar
+
+    // $ANTLR start synpred27_InternalUISemanticsGrammar
+    public final void synpred27_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:4129:6: ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )
+        // InternalUISemanticsGrammar.g:4129:7: ( ( ( ruleJvmFormalParameter ) ) ':' )
+        {
+        // InternalUISemanticsGrammar.g:4129:7: ( ( ( ruleJvmFormalParameter ) ) ':' )
+        // InternalUISemanticsGrammar.g:4130:7: ( ( ruleJvmFormalParameter ) ) ':'
+        {
+        // InternalUISemanticsGrammar.g:4130:7: ( ( ruleJvmFormalParameter ) )
+        // InternalUISemanticsGrammar.g:4131:8: ( ruleJvmFormalParameter )
+        {
+        // InternalUISemanticsGrammar.g:4131:8: ( ruleJvmFormalParameter )
+        // InternalUISemanticsGrammar.g:4132:9: ruleJvmFormalParameter
+        {
+        pushFollow(FOLLOW_26);
+        ruleJvmFormalParameter();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        match(input,32,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred27_InternalUISemanticsGrammar
+
+    // $ANTLR start synpred29_InternalUISemanticsGrammar
+    public final void synpred29_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:4947:5: ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )
+        // InternalUISemanticsGrammar.g:4947:6: ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) )
+        {
+        // InternalUISemanticsGrammar.g:4947:6: ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) )
+        // InternalUISemanticsGrammar.g:4948:6: ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) )
+        {
+        // InternalUISemanticsGrammar.g:4948:6: ( ( ruleJvmTypeReference ) )
+        // InternalUISemanticsGrammar.g:4949:7: ( ruleJvmTypeReference )
+        {
+        // InternalUISemanticsGrammar.g:4949:7: ( ruleJvmTypeReference )
+        // InternalUISemanticsGrammar.g:4950:8: ruleJvmTypeReference
+        {
+        pushFollow(FOLLOW_16);
+        ruleJvmTypeReference();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        // InternalUISemanticsGrammar.g:4953:6: ( ( ruleValidID ) )
+        // InternalUISemanticsGrammar.g:4954:7: ( ruleValidID )
+        {
+        // InternalUISemanticsGrammar.g:4954:7: ( ruleValidID )
+        // InternalUISemanticsGrammar.g:4955:8: ruleValidID
+        {
+        pushFollow(FOLLOW_2);
+        ruleValidID();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred29_InternalUISemanticsGrammar
+
+    // $ANTLR start synpred30_InternalUISemanticsGrammar
+    public final void synpred30_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:5259:5: ( ( '(' ) )
+        // InternalUISemanticsGrammar.g:5259:6: ( '(' )
+        {
+        // InternalUISemanticsGrammar.g:5259:6: ( '(' )
+        // InternalUISemanticsGrammar.g:5260:6: '('
+        {
+        match(input,72,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred30_InternalUISemanticsGrammar
+
+    // $ANTLR start synpred31_InternalUISemanticsGrammar
+    public final void synpred31_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:5278:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
+        // InternalUISemanticsGrammar.g:5278:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
+        {
+        // InternalUISemanticsGrammar.g:5278:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
+        // InternalUISemanticsGrammar.g:5279:7: () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
+        {
+        // InternalUISemanticsGrammar.g:5279:7: ()
+        // InternalUISemanticsGrammar.g:5280:7: 
+        {
+        }
+
+        // InternalUISemanticsGrammar.g:5281:7: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
+        int alt141=2;
+        int LA141_0 = input.LA(1);
+
+        if ( (LA141_0==RULE_ID||LA141_0==57||LA141_0==72) ) {
+            alt141=1;
+        }
+        switch (alt141) {
+            case 1 :
+                // InternalUISemanticsGrammar.g:5282:8: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
+                {
+                // InternalUISemanticsGrammar.g:5282:8: ( ( ruleJvmFormalParameter ) )
+                // InternalUISemanticsGrammar.g:5283:9: ( ruleJvmFormalParameter )
+                {
+                // InternalUISemanticsGrammar.g:5283:9: ( ruleJvmFormalParameter )
+                // InternalUISemanticsGrammar.g:5284:10: ruleJvmFormalParameter
+                {
+                pushFollow(FOLLOW_67);
+                ruleJvmFormalParameter();
+
+                state._fsp--;
+                if (state.failed) return ;
+
+                }
+
+
+                }
+
+                // InternalUISemanticsGrammar.g:5287:8: ( ',' ( ( ruleJvmFormalParameter ) ) )*
+                loop140:
+                do {
+                    int alt140=2;
+                    int LA140_0 = input.LA(1);
+
+                    if ( (LA140_0==71) ) {
+                        alt140=1;
+                    }
+
+
+                    switch (alt140) {
+                	case 1 :
+                	    // InternalUISemanticsGrammar.g:5288:9: ',' ( ( ruleJvmFormalParameter ) )
+                	    {
+                	    match(input,71,FOLLOW_31); if (state.failed) return ;
+                	    // InternalUISemanticsGrammar.g:5289:9: ( ( ruleJvmFormalParameter ) )
+                	    // InternalUISemanticsGrammar.g:5290:10: ( ruleJvmFormalParameter )
+                	    {
+                	    // InternalUISemanticsGrammar.g:5290:10: ( ruleJvmFormalParameter )
+                	    // InternalUISemanticsGrammar.g:5291:11: ruleJvmFormalParameter
+                	    {
+                	    pushFollow(FOLLOW_67);
+                	    ruleJvmFormalParameter();
+
+                	    state._fsp--;
+                	    if (state.failed) return ;
+
+                	    }
+
+
+                	    }
+
+
+                	    }
+                	    break;
+
+                	default :
+                	    break loop140;
+                    }
+                } while (true);
+
+
+                }
+                break;
+
+        }
+
+        // InternalUISemanticsGrammar.g:5296:7: ( ( '|' ) )
+        // InternalUISemanticsGrammar.g:5297:8: ( '|' )
+        {
+        // InternalUISemanticsGrammar.g:5297:8: ( '|' )
+        // InternalUISemanticsGrammar.g:5298:9: '|'
+        {
+        match(input,77,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred31_InternalUISemanticsGrammar
+
+    // $ANTLR start synpred32_InternalUISemanticsGrammar
+    public final void synpred32_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:5375:4: ( ( () '[' ) )
+        // InternalUISemanticsGrammar.g:5375:5: ( () '[' )
+        {
+        // InternalUISemanticsGrammar.g:5375:5: ( () '[' )
+        // InternalUISemanticsGrammar.g:5376:5: () '['
+        {
+        // InternalUISemanticsGrammar.g:5376:5: ()
+        // InternalUISemanticsGrammar.g:5377:5: 
+        {
+        }
+
+        match(input,75,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred32_InternalUISemanticsGrammar
+
+    // $ANTLR start synpred33_InternalUISemanticsGrammar
+    public final void synpred33_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:5535:5: ( '<' )
+        // InternalUISemanticsGrammar.g:5535:6: '<'
+        {
+        match(input,44,FOLLOW_2); if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred33_InternalUISemanticsGrammar
+
+    // $ANTLR start synpred34_InternalUISemanticsGrammar
+    public final void synpred34_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:5592:5: ( ( '(' ) )
+        // InternalUISemanticsGrammar.g:5592:6: ( '(' )
+        {
+        // InternalUISemanticsGrammar.g:5592:6: ( '(' )
+        // InternalUISemanticsGrammar.g:5593:6: '('
+        {
+        match(input,72,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred34_InternalUISemanticsGrammar
+
+    // $ANTLR start synpred35_InternalUISemanticsGrammar
+    public final void synpred35_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:5611:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
+        // InternalUISemanticsGrammar.g:5611:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
+        {
+        // InternalUISemanticsGrammar.g:5611:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
+        // InternalUISemanticsGrammar.g:5612:7: () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
+        {
+        // InternalUISemanticsGrammar.g:5612:7: ()
+        // InternalUISemanticsGrammar.g:5613:7: 
+        {
+        }
+
+        // InternalUISemanticsGrammar.g:5614:7: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
+        int alt143=2;
+        int LA143_0 = input.LA(1);
+
+        if ( (LA143_0==RULE_ID||LA143_0==57||LA143_0==72) ) {
+            alt143=1;
+        }
+        switch (alt143) {
+            case 1 :
+                // InternalUISemanticsGrammar.g:5615:8: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
+                {
+                // InternalUISemanticsGrammar.g:5615:8: ( ( ruleJvmFormalParameter ) )
+                // InternalUISemanticsGrammar.g:5616:9: ( ruleJvmFormalParameter )
+                {
+                // InternalUISemanticsGrammar.g:5616:9: ( ruleJvmFormalParameter )
+                // InternalUISemanticsGrammar.g:5617:10: ruleJvmFormalParameter
+                {
+                pushFollow(FOLLOW_67);
+                ruleJvmFormalParameter();
+
+                state._fsp--;
+                if (state.failed) return ;
+
+                }
+
+
+                }
+
+                // InternalUISemanticsGrammar.g:5620:8: ( ',' ( ( ruleJvmFormalParameter ) ) )*
+                loop142:
+                do {
+                    int alt142=2;
+                    int LA142_0 = input.LA(1);
+
+                    if ( (LA142_0==71) ) {
+                        alt142=1;
+                    }
+
+
+                    switch (alt142) {
+                	case 1 :
+                	    // InternalUISemanticsGrammar.g:5621:9: ',' ( ( ruleJvmFormalParameter ) )
+                	    {
+                	    match(input,71,FOLLOW_31); if (state.failed) return ;
+                	    // InternalUISemanticsGrammar.g:5622:9: ( ( ruleJvmFormalParameter ) )
+                	    // InternalUISemanticsGrammar.g:5623:10: ( ruleJvmFormalParameter )
+                	    {
+                	    // InternalUISemanticsGrammar.g:5623:10: ( ruleJvmFormalParameter )
+                	    // InternalUISemanticsGrammar.g:5624:11: ruleJvmFormalParameter
+                	    {
+                	    pushFollow(FOLLOW_67);
+                	    ruleJvmFormalParameter();
+
+                	    state._fsp--;
+                	    if (state.failed) return ;
+
+                	    }
+
+
+                	    }
+
+
+                	    }
+                	    break;
+
+                	default :
+                	    break loop142;
+                    }
+                } while (true);
+
+
+                }
+                break;
+
+        }
+
+        // InternalUISemanticsGrammar.g:5629:7: ( ( '|' ) )
+        // InternalUISemanticsGrammar.g:5630:8: ( '|' )
+        {
+        // InternalUISemanticsGrammar.g:5630:8: ( '|' )
+        // InternalUISemanticsGrammar.g:5631:9: '|'
+        {
+        match(input,77,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred35_InternalUISemanticsGrammar
+
+    // $ANTLR start synpred36_InternalUISemanticsGrammar
+    public final void synpred36_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:5708:4: ( ( () '[' ) )
+        // InternalUISemanticsGrammar.g:5708:5: ( () '[' )
+        {
+        // InternalUISemanticsGrammar.g:5708:5: ( () '[' )
+        // InternalUISemanticsGrammar.g:5709:5: () '['
+        {
+        // InternalUISemanticsGrammar.g:5709:5: ()
+        // InternalUISemanticsGrammar.g:5710:5: 
+        {
+        }
+
+        match(input,75,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred36_InternalUISemanticsGrammar
+
+    // $ANTLR start synpred37_InternalUISemanticsGrammar
+    public final void synpred37_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:6051: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 )
+        // InternalUISemanticsGrammar.g:
+        {
+        if ( (input.LA(1)>=RULE_STRING && input.LA(1)<=RULE_DECIMAL)||input.LA(1)==14||(input.LA(1)>=19 && input.LA(1)<=21)||input.LA(1)==33||input.LA(1)==44||(input.LA(1)>=60 && input.LA(1)<=61)||input.LA(1)==65||input.LA(1)==72||(input.LA(1)>=74 && input.LA(1)<=75)||input.LA(1)==78||input.LA(1)==80||(input.LA(1)>=83 && input.LA(1)<=85)||(input.LA(1)>=88 && input.LA(1)<=96)||input.LA(1)==98 ) {
+            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 synpred37_InternalUISemanticsGrammar
+
+    // $ANTLR start synpred38_InternalUISemanticsGrammar
+    public final void synpred38_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:6122:6: ( 'catch' )
+        // InternalUISemanticsGrammar.g:6122:7: 'catch'
+        {
+        match(input,99,FOLLOW_2); if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred38_InternalUISemanticsGrammar
+
+    // $ANTLR start synpred39_InternalUISemanticsGrammar
+    public final void synpred39_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:6143:7: ( 'finally' )
+        // InternalUISemanticsGrammar.g:6143:8: 'finally'
+        {
+        match(input,97,FOLLOW_2); if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred39_InternalUISemanticsGrammar
+
+    // $ANTLR start synpred42_InternalUISemanticsGrammar
+    public final void synpred42_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:6387:5: ( '.' )
+        // InternalUISemanticsGrammar.g:6387:6: '.'
+        {
+        match(input,68,FOLLOW_2); if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred42_InternalUISemanticsGrammar
+
+    // $ANTLR start synpred43_InternalUISemanticsGrammar
+    public final void synpred43_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:6513:5: ( ( () ruleArrayBrackets ) )
+        // InternalUISemanticsGrammar.g:6513:6: ( () ruleArrayBrackets )
+        {
+        // InternalUISemanticsGrammar.g:6513:6: ( () ruleArrayBrackets )
+        // InternalUISemanticsGrammar.g:6514:6: () ruleArrayBrackets
+        {
+        // InternalUISemanticsGrammar.g:6514:6: ()
+        // InternalUISemanticsGrammar.g:6515:6: 
+        {
+        }
+
+        pushFollow(FOLLOW_2);
+        ruleArrayBrackets();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred43_InternalUISemanticsGrammar
+
+    // $ANTLR start synpred44_InternalUISemanticsGrammar
+    public final void synpred44_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:6710:5: ( '<' )
+        // InternalUISemanticsGrammar.g:6710:6: '<'
+        {
+        match(input,44,FOLLOW_2); if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred44_InternalUISemanticsGrammar
+
+    // $ANTLR start synpred45_InternalUISemanticsGrammar
+    public final void synpred45_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:6766:6: ( ( () '.' ) )
+        // InternalUISemanticsGrammar.g:6766:7: ( () '.' )
+        {
+        // InternalUISemanticsGrammar.g:6766:7: ( () '.' )
+        // InternalUISemanticsGrammar.g:6767:7: () '.'
+        {
+        // InternalUISemanticsGrammar.g:6767:7: ()
+        // InternalUISemanticsGrammar.g:6768:7: 
+        {
+        }
+
+        match(input,68,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred45_InternalUISemanticsGrammar
+
+    // $ANTLR start synpred46_InternalUISemanticsGrammar
+    public final void synpred46_InternalUISemanticsGrammar_fragment() throws RecognitionException {   
+        // InternalUISemanticsGrammar.g:6804:7: ( '<' )
+        // InternalUISemanticsGrammar.g:6804:8: '<'
+        {
+        match(input,44,FOLLOW_2); if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred46_InternalUISemanticsGrammar
+
+    // Delegated rules
+
+    public final boolean synpred9_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred9_InternalUISemanticsGrammar_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_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred15_InternalUISemanticsGrammar_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_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred19_InternalUISemanticsGrammar_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_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred32_InternalUISemanticsGrammar_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_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred43_InternalUISemanticsGrammar_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_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred10_InternalUISemanticsGrammar_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_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred37_InternalUISemanticsGrammar_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_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred21_InternalUISemanticsGrammar_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_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred26_InternalUISemanticsGrammar_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_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred5_InternalUISemanticsGrammar_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_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred38_InternalUISemanticsGrammar_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 synpred3_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred3_InternalUISemanticsGrammar_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_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred42_InternalUISemanticsGrammar_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_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred16_InternalUISemanticsGrammar_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_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred31_InternalUISemanticsGrammar_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_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred20_InternalUISemanticsGrammar_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_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred27_InternalUISemanticsGrammar_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_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred6_InternalUISemanticsGrammar_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_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred17_InternalUISemanticsGrammar_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 synpred30_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred30_InternalUISemanticsGrammar_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_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred2_InternalUISemanticsGrammar_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_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred46_InternalUISemanticsGrammar_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 synpred12_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred12_InternalUISemanticsGrammar_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_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred35_InternalUISemanticsGrammar_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_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred39_InternalUISemanticsGrammar_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_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred23_InternalUISemanticsGrammar_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_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred13_InternalUISemanticsGrammar_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 synpred34_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred34_InternalUISemanticsGrammar_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_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred45_InternalUISemanticsGrammar_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_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred7_InternalUISemanticsGrammar_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_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1_InternalUISemanticsGrammar_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_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred8_InternalUISemanticsGrammar_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_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred11_InternalUISemanticsGrammar_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_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred36_InternalUISemanticsGrammar_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_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred18_InternalUISemanticsGrammar_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_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred14_InternalUISemanticsGrammar_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_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred33_InternalUISemanticsGrammar_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_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred25_InternalUISemanticsGrammar_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_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred29_InternalUISemanticsGrammar_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_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred44_InternalUISemanticsGrammar_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 synpred4_InternalUISemanticsGrammar() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred4_InternalUISemanticsGrammar_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 DFA11 dfa11 = new DFA11(this);
+    protected DFA25 dfa25 = new DFA25(this);
+    protected DFA35 dfa35 = new DFA35(this);
+    protected DFA38 dfa38 = new DFA38(this);
+    protected DFA54 dfa54 = new DFA54(this);
+    protected DFA53 dfa53 = new DFA53(this);
+    protected DFA55 dfa55 = new DFA55(this);
+    protected DFA57 dfa57 = new DFA57(this);
+    protected DFA66 dfa66 = new DFA66(this);
+    protected DFA73 dfa73 = new DFA73(this);
+    protected DFA72 dfa72 = new DFA72(this);
+    protected DFA95 dfa95 = new DFA95(this);
+    protected DFA94 dfa94 = new DFA94(this);
+    protected DFA96 dfa96 = new DFA96(this);
+    protected DFA100 dfa100 = new DFA100(this);
+    protected DFA103 dfa103 = new DFA103(this);
+    protected DFA102 dfa102 = new DFA102(this);
+    protected DFA104 dfa104 = new DFA104(this);
+    protected DFA107 dfa107 = new DFA107(this);
+    protected DFA125 dfa125 = new DFA125(this);
+    protected DFA123 dfa123 = new DFA123(this);
+    static final String dfa_1s = "\7\uffff";
+    static final String dfa_2s = "\2\uffff\1\4\2\uffff\1\4\1\uffff";
+    static final String dfa_3s = "\1\5\1\uffff\1\15\1\5\1\uffff\1\15\1\uffff";
+    static final String dfa_4s = "\1\24\1\uffff\1\104\1\26\1\uffff\1\104\1\uffff";
+    static final String dfa_5s = "\1\uffff\1\1\2\uffff\1\2\1\uffff\1\3";
+    static final String dfa_6s = "\7\uffff}>";
+    static final String[] dfa_7s = {
+            "\1\2\16\uffff\1\1",
+            "",
+            "\1\4\2\uffff\1\4\2\uffff\1\4\3\uffff\1\4\2\uffff\1\4\51\uffff\1\3",
+            "\1\5\20\uffff\1\6",
+            "",
+            "\1\4\2\uffff\1\4\2\uffff\1\4\3\uffff\1\4\2\uffff\1\4\51\uffff\1\3",
+            ""
+    };
+
+    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 DFA11 extends DFA {
+
+        public DFA11(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 11;
+            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 "345:5: ( ( ( (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 ) ) )";
+        }
+    }
+    static final String dfa_8s = "\12\uffff";
+    static final String dfa_9s = "\1\10\11\uffff";
+    static final String dfa_10s = "\1\4\7\0\2\uffff";
+    static final String dfa_11s = "\1\143\7\0\2\uffff";
+    static final String dfa_12s = "\10\uffff\1\2\1\1";
+    static final String dfa_13s = "\1\uffff\1\0\1\1\1\2\1\3\1\4\1\6\1\5\2\uffff}>";
+    static final String[] dfa_14s = {
+            "\5\10\5\uffff\2\10\3\uffff\4\10\1\uffff\2\10\6\uffff\2\10\5\uffff\1\1\1\2\1\3\1\4\1\5\1\6\1\7\37\10\1\uffff\26\10",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            ""
+    };
+
+    static final short[] dfa_8 = DFA.unpackEncodedString(dfa_8s);
+    static final short[] dfa_9 = DFA.unpackEncodedString(dfa_9s);
+    static final char[] dfa_10 = DFA.unpackEncodedStringToUnsignedChars(dfa_10s);
+    static final char[] dfa_11 = DFA.unpackEncodedStringToUnsignedChars(dfa_11s);
+    static final short[] dfa_12 = DFA.unpackEncodedString(dfa_12s);
+    static final short[] dfa_13 = DFA.unpackEncodedString(dfa_13s);
+    static final short[][] dfa_14 = unpackEncodedStringArray(dfa_14s);
+
+    class DFA25 extends DFA {
+
+        public DFA25(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 25;
+            this.eot = dfa_8;
+            this.eof = dfa_9;
+            this.min = dfa_10;
+            this.max = dfa_11;
+            this.accept = dfa_12;
+            this.special = dfa_13;
+            this.transition = dfa_14;
+        }
+        public String getDescription() {
+            return "1248: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 LA25_1 = input.LA(1);
+
+                         
+                        int index25_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred1_InternalUISemanticsGrammar()) ) {s = 9;}
+
+                        else if ( (true) ) {s = 8;}
+
+                         
+                        input.seek(index25_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA25_2 = input.LA(1);
+
+                         
+                        int index25_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred1_InternalUISemanticsGrammar()) ) {s = 9;}
+
+                        else if ( (true) ) {s = 8;}
+
+                         
+                        input.seek(index25_2);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA25_3 = input.LA(1);
+
+                         
+                        int index25_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred1_InternalUISemanticsGrammar()) ) {s = 9;}
+
+                        else if ( (true) ) {s = 8;}
+
+                         
+                        input.seek(index25_3);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA25_4 = input.LA(1);
+
+                         
+                        int index25_4 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred1_InternalUISemanticsGrammar()) ) {s = 9;}
+
+                        else if ( (true) ) {s = 8;}
+
+                         
+                        input.seek(index25_4);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA25_5 = input.LA(1);
+
+                         
+                        int index25_5 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred1_InternalUISemanticsGrammar()) ) {s = 9;}
+
+                        else if ( (true) ) {s = 8;}
+
+                         
+                        input.seek(index25_5);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA25_7 = input.LA(1);
+
+                         
+                        int index25_7 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred1_InternalUISemanticsGrammar()) ) {s = 9;}
+
+                        else if ( (true) ) {s = 8;}
+
+                         
+                        input.seek(index25_7);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA25_6 = input.LA(1);
+
+                         
+                        int index25_6 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred1_InternalUISemanticsGrammar()) ) {s = 9;}
+
+                        else if ( (true) ) {s = 8;}
+
+                         
+                        input.seek(index25_6);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 25, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_15s = "\13\uffff";
+    static final String dfa_16s = "\1\1\12\uffff";
+    static final String dfa_17s = "\1\4\1\uffff\10\0\1\uffff";
+    static final String dfa_18s = "\1\143\1\uffff\10\0\1\uffff";
+    static final String dfa_19s = "\1\uffff\1\2\10\uffff\1\1";
+    static final String dfa_20s = "\2\uffff\1\0\1\5\1\6\1\7\1\4\1\1\1\2\1\3\1\uffff}>";
+    static final String[] dfa_21s = {
+            "\5\1\5\uffff\2\1\3\uffff\4\1\1\uffff\2\1\6\uffff\2\1\5\uffff\5\1\1\2\1\3\10\1\1\4\1\5\1\6\1\7\1\10\1\11\21\1\1\uffff\26\1",
+            "",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            ""
+    };
+
+    static final short[] dfa_15 = DFA.unpackEncodedString(dfa_15s);
+    static final short[] dfa_16 = DFA.unpackEncodedString(dfa_16s);
+    static final char[] dfa_17 = DFA.unpackEncodedStringToUnsignedChars(dfa_17s);
+    static final char[] dfa_18 = DFA.unpackEncodedStringToUnsignedChars(dfa_18s);
+    static final short[] dfa_19 = DFA.unpackEncodedString(dfa_19s);
+    static final short[] dfa_20 = DFA.unpackEncodedString(dfa_20s);
+    static final short[][] dfa_21 = unpackEncodedStringArray(dfa_21s);
+
+    class DFA35 extends DFA {
+
+        public DFA35(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 35;
+            this.eot = dfa_15;
+            this.eof = dfa_16;
+            this.min = dfa_17;
+            this.max = dfa_18;
+            this.accept = dfa_19;
+            this.special = dfa_20;
+            this.transition = dfa_21;
+        }
+        public String getDescription() {
+            return "()* loopback of 1962: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 LA35_2 = input.LA(1);
+
+                         
+                        int index35_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred7_InternalUISemanticsGrammar()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index35_2);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA35_7 = input.LA(1);
+
+                         
+                        int index35_7 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred7_InternalUISemanticsGrammar()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index35_7);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA35_8 = input.LA(1);
+
+                         
+                        int index35_8 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred7_InternalUISemanticsGrammar()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index35_8);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA35_9 = input.LA(1);
+
+                         
+                        int index35_9 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred7_InternalUISemanticsGrammar()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index35_9);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA35_6 = input.LA(1);
+
+                         
+                        int index35_6 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred7_InternalUISemanticsGrammar()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index35_6);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA35_3 = input.LA(1);
+
+                         
+                        int index35_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred7_InternalUISemanticsGrammar()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index35_3);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA35_4 = input.LA(1);
+
+                         
+                        int index35_4 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred7_InternalUISemanticsGrammar()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index35_4);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 7 : 
+                        int LA35_5 = input.LA(1);
+
+                         
+                        int index35_5 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred7_InternalUISemanticsGrammar()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index35_5);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 35, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_22s = "\1\54\2\uffff\1\55\7\uffff";
+    static final String dfa_23s = "\1\73\2\uffff\1\70\7\uffff";
+    static final String dfa_24s = "\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_25s = "\13\uffff}>";
+    static final String[] dfa_26s = {
+            "\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_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 DFA38 extends DFA {
+
+        public DFA38(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 38;
+            this.eot = dfa_15;
+            this.eof = dfa_15;
+            this.min = dfa_22;
+            this.max = dfa_23;
+            this.accept = dfa_24;
+            this.special = dfa_25;
+            this.transition = dfa_26;
+        }
+        public String getDescription() {
+            return "2038:2: (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' )";
+        }
+    }
+    static final String dfa_27s = "\116\uffff";
+    static final String dfa_28s = "\1\2\115\uffff";
+    static final String dfa_29s = "\1\4\1\0\114\uffff";
+    static final String dfa_30s = "\1\143\1\0\114\uffff";
+    static final String dfa_31s = "\2\uffff\1\2\112\uffff\1\1";
+    static final String dfa_32s = "\1\uffff\1\0\114\uffff}>";
+    static final String[] dfa_33s = {
+            "\5\2\5\uffff\2\2\3\uffff\4\2\1\uffff\2\2\6\uffff\2\2\5\uffff\41\2\1\1\4\2\1\uffff\26\2",
+            "\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 DFA54 extends DFA {
+
+        public DFA54(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 54;
+            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 "2939: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 LA54_1 = input.LA(1);
+
+                         
+                        int index54_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred16_InternalUISemanticsGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index54_1);
+                        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_34s = "\44\uffff";
+    static final String dfa_35s = "\1\4\2\0\41\uffff";
+    static final String dfa_36s = "\1\142\2\0\41\uffff";
+    static final String dfa_37s = "\3\uffff\2\1\1\2\35\uffff\1\3";
+    static final String dfa_38s = "\1\0\1\1\1\2\41\uffff}>";
+    static final String[] dfa_39s = {
+            "\1\5\1\1\3\5\5\uffff\1\5\4\uffff\3\5\13\uffff\1\5\12\uffff\1\5\14\uffff\1\3\2\uffff\2\5\3\uffff\1\5\6\uffff\1\2\1\43\2\5\1\uffff\1\4\1\5\1\uffff\1\5\2\uffff\3\5\2\uffff\11\5\1\uffff\1\5",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_34 = DFA.unpackEncodedString(dfa_34s);
+    static final char[] dfa_35 = DFA.unpackEncodedStringToUnsignedChars(dfa_35s);
+    static final char[] dfa_36 = DFA.unpackEncodedStringToUnsignedChars(dfa_36s);
+    static final short[] dfa_37 = DFA.unpackEncodedString(dfa_37s);
+    static final short[] dfa_38 = DFA.unpackEncodedString(dfa_38s);
+    static final short[][] dfa_39 = unpackEncodedStringArray(dfa_39s);
+
+    class DFA53 extends DFA {
+
+        public DFA53(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 53;
+            this.eot = dfa_34;
+            this.eof = dfa_34;
+            this.min = dfa_35;
+            this.max = dfa_36;
+            this.accept = dfa_37;
+            this.special = dfa_38;
+            this.transition = dfa_39;
+        }
+        public String getDescription() {
+            return "2958: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 LA53_0 = input.LA(1);
+
+                         
+                        int index53_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA53_0==RULE_ID) ) {s = 1;}
+
+                        else if ( (LA53_0==72) ) {s = 2;}
+
+                        else if ( (LA53_0==57) && (synpred17_InternalUISemanticsGrammar())) {s = 3;}
+
+                        else if ( (LA53_0==77) && (synpred17_InternalUISemanticsGrammar())) {s = 4;}
+
+                        else if ( (LA53_0==RULE_STRING||(LA53_0>=RULE_HEX && LA53_0<=RULE_DECIMAL)||LA53_0==14||(LA53_0>=19 && LA53_0<=21)||LA53_0==33||LA53_0==44||(LA53_0>=60 && LA53_0<=61)||LA53_0==65||(LA53_0>=74 && LA53_0<=75)||LA53_0==78||LA53_0==80||(LA53_0>=83 && LA53_0<=85)||(LA53_0>=88 && LA53_0<=96)||LA53_0==98) ) {s = 5;}
+
+                        else if ( (LA53_0==73) ) {s = 35;}
+
+                         
+                        input.seek(index53_0);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA53_1 = input.LA(1);
+
+                         
+                        int index53_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred17_InternalUISemanticsGrammar()) ) {s = 4;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index53_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA53_2 = input.LA(1);
+
+                         
+                        int index53_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred17_InternalUISemanticsGrammar()) ) {s = 4;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index53_2);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 53, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String[] dfa_40s = {
+            "\5\2\5\uffff\2\2\3\uffff\4\2\1\uffff\2\2\6\uffff\2\2\5\uffff\44\2\1\1\1\2\1\uffff\26\2",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final short[][] dfa_40 = unpackEncodedStringArray(dfa_40s);
+
+    class DFA55 extends DFA {
+
+        public DFA55(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 55;
+            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_40;
+        }
+        public String getDescription() {
+            return "3056: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 LA55_1 = input.LA(1);
+
+                         
+                        int index55_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred18_InternalUISemanticsGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index55_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 55, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_41s = "\40\uffff";
+    static final String dfa_42s = "\1\4\26\uffff\1\0\10\uffff";
+    static final String dfa_43s = "\1\142\26\uffff\1\0\10\uffff";
+    static final String dfa_44s = "\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_45s = "\1\0\26\uffff\1\1\10\uffff}>";
+    static final String[] dfa_46s = {
+            "\1\14\1\5\3\14\5\uffff\1\2\4\uffff\3\5\13\uffff\1\5\12\uffff\1\5\33\uffff\1\35\1\uffff\2\14\2\uffff\1\26\1\uffff\1\3\2\uffff\1\27\1\30\1\31\2\uffff\1\5\1\1\4\14\1\32\1\33\1\34\1\uffff\1\4",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_41 = DFA.unpackEncodedString(dfa_41s);
+    static final char[] dfa_42 = DFA.unpackEncodedStringToUnsignedChars(dfa_42s);
+    static final char[] dfa_43 = DFA.unpackEncodedStringToUnsignedChars(dfa_43s);
+    static final short[] dfa_44 = DFA.unpackEncodedString(dfa_44s);
+    static final short[] dfa_45 = DFA.unpackEncodedString(dfa_45s);
+    static final short[][] dfa_46 = unpackEncodedStringArray(dfa_46s);
+
+    class DFA57 extends DFA {
+
+        public DFA57(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 57;
+            this.eot = dfa_41;
+            this.eof = dfa_41;
+            this.min = dfa_42;
+            this.max = dfa_43;
+            this.accept = dfa_44;
+            this.special = dfa_45;
+            this.transition = dfa_46;
+        }
+        public String getDescription() {
+            return "3101: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 LA57_0 = input.LA(1);
+
+                         
+                        int index57_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA57_0==89) ) {s = 1;}
+
+                        else if ( (LA57_0==14) ) {s = 2;}
+
+                        else if ( (LA57_0==80) ) {s = 3;}
+
+                        else if ( (LA57_0==98) && (synpred19_InternalUISemanticsGrammar())) {s = 4;}
+
+                        else if ( (LA57_0==RULE_ID||(LA57_0>=19 && LA57_0<=21)||LA57_0==33||LA57_0==44||LA57_0==88) ) {s = 5;}
+
+                        else if ( (LA57_0==RULE_STRING||(LA57_0>=RULE_HEX && LA57_0<=RULE_DECIMAL)||(LA57_0>=74 && LA57_0<=75)||(LA57_0>=90 && LA57_0<=93)) ) {s = 12;}
+
+                        else if ( (LA57_0==78) ) {s = 22;}
+
+                        else if ( (LA57_0==83) ) {s = 23;}
+
+                        else if ( (LA57_0==84) ) {s = 24;}
+
+                        else if ( (LA57_0==85) ) {s = 25;}
+
+                        else if ( (LA57_0==94) ) {s = 26;}
+
+                        else if ( (LA57_0==95) ) {s = 27;}
+
+                        else if ( (LA57_0==96) ) {s = 28;}
+
+                        else if ( (LA57_0==72) ) {s = 29;}
+
+                         
+                        input.seek(index57_0);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA57_23 = input.LA(1);
+
+                         
+                        int index57_23 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred20_InternalUISemanticsGrammar()) ) {s = 30;}
+
+                        else if ( (true) ) {s = 31;}
+
+                         
+                        input.seek(index57_23);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 57, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_47s = "\46\uffff";
+    static final String dfa_48s = "\1\4\2\0\43\uffff";
+    static final String dfa_49s = "\1\142\2\0\43\uffff";
+    static final String dfa_50s = "\3\uffff\2\1\1\2\40\uffff";
+    static final String dfa_51s = "\1\0\1\1\1\2\43\uffff}>";
+    static final String[] dfa_52s = {
+            "\1\5\1\1\3\5\5\uffff\1\5\4\uffff\3\5\13\uffff\1\5\12\uffff\1\5\14\uffff\1\3\2\uffff\2\5\3\uffff\1\5\6\uffff\1\2\1\uffff\3\5\1\4\1\5\1\uffff\1\5\2\uffff\16\5\1\uffff\1\5",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_47 = DFA.unpackEncodedString(dfa_47s);
+    static final char[] dfa_48 = DFA.unpackEncodedStringToUnsignedChars(dfa_48s);
+    static final char[] dfa_49 = DFA.unpackEncodedStringToUnsignedChars(dfa_49s);
+    static final short[] dfa_50 = DFA.unpackEncodedString(dfa_50s);
+    static final short[] dfa_51 = DFA.unpackEncodedString(dfa_51s);
+    static final short[][] dfa_52 = unpackEncodedStringArray(dfa_52s);
+
+    class DFA66 extends DFA {
+
+        public DFA66(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 66;
+            this.eot = dfa_47;
+            this.eof = dfa_47;
+            this.min = dfa_48;
+            this.max = dfa_49;
+            this.accept = dfa_50;
+            this.special = dfa_51;
+            this.transition = dfa_52;
+        }
+        public String getDescription() {
+            return "3593: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 LA66_0 = input.LA(1);
+
+                         
+                        int index66_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA66_0==RULE_ID) ) {s = 1;}
+
+                        else if ( (LA66_0==72) ) {s = 2;}
+
+                        else if ( (LA66_0==57) && (synpred23_InternalUISemanticsGrammar())) {s = 3;}
+
+                        else if ( (LA66_0==77) && (synpred23_InternalUISemanticsGrammar())) {s = 4;}
+
+                        else if ( (LA66_0==RULE_STRING||(LA66_0>=RULE_HEX && LA66_0<=RULE_DECIMAL)||LA66_0==14||(LA66_0>=19 && LA66_0<=21)||LA66_0==33||LA66_0==44||(LA66_0>=60 && LA66_0<=61)||LA66_0==65||(LA66_0>=74 && LA66_0<=76)||LA66_0==78||LA66_0==80||(LA66_0>=83 && LA66_0<=96)||LA66_0==98) ) {s = 5;}
+
+                         
+                        input.seek(index66_0);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA66_1 = input.LA(1);
+
+                         
+                        int index66_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred23_InternalUISemanticsGrammar()) ) {s = 4;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index66_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA66_2 = input.LA(1);
+
+                         
+                        int index66_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred23_InternalUISemanticsGrammar()) ) {s = 4;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index66_2);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 66, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_53s = "\43\uffff";
+    static final String dfa_54s = "\1\4\1\0\41\uffff";
+    static final String dfa_55s = "\1\142\1\0\41\uffff";
+    static final String dfa_56s = "\2\uffff\1\2\37\uffff\1\1";
+    static final String dfa_57s = "\1\uffff\1\0\41\uffff}>";
+    static final String[] dfa_58s = {
+            "\5\2\5\uffff\1\2\4\uffff\3\2\13\uffff\1\2\12\uffff\1\2\14\uffff\1\2\2\uffff\2\2\3\uffff\1\2\6\uffff\1\1\1\uffff\2\2\2\uffff\1\2\1\uffff\1\2\2\uffff\3\2\2\uffff\11\2\1\uffff\1\2",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    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 DFA73 extends DFA {
+
+        public DFA73(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 73;
+            this.eot = dfa_53;
+            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 "4059: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 LA73_1 = input.LA(1);
+
+                         
+                        int index73_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred26_InternalUISemanticsGrammar()) ) {s = 34;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index73_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 73, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_59s = "\42\uffff";
+    static final String dfa_60s = "\1\4\2\0\37\uffff";
+    static final String dfa_61s = "\1\142\2\0\37\uffff";
+    static final String dfa_62s = "\3\uffff\1\1\1\2\35\uffff";
+    static final String dfa_63s = "\1\0\1\1\1\2\37\uffff}>";
+    static final String[] dfa_64s = {
+            "\1\4\1\1\3\4\5\uffff\1\4\4\uffff\3\4\13\uffff\1\4\12\uffff\1\4\14\uffff\1\3\2\uffff\2\4\3\uffff\1\4\6\uffff\1\2\1\uffff\2\4\2\uffff\1\4\1\uffff\1\4\2\uffff\3\4\2\uffff\11\4\1\uffff\1\4",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_59 = DFA.unpackEncodedString(dfa_59s);
+    static final char[] dfa_60 = DFA.unpackEncodedStringToUnsignedChars(dfa_60s);
+    static final char[] dfa_61 = DFA.unpackEncodedStringToUnsignedChars(dfa_61s);
+    static final short[] dfa_62 = DFA.unpackEncodedString(dfa_62s);
+    static final short[] dfa_63 = DFA.unpackEncodedString(dfa_63s);
+    static final short[][] dfa_64 = unpackEncodedStringArray(dfa_64s);
+
+    class DFA72 extends DFA {
+
+        public DFA72(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 72;
+            this.eot = dfa_59;
+            this.eof = dfa_59;
+            this.min = dfa_60;
+            this.max = dfa_61;
+            this.accept = dfa_62;
+            this.special = dfa_63;
+            this.transition = dfa_64;
+        }
+        public String getDescription() {
+            return "4128: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 LA72_0 = input.LA(1);
+
+                         
+                        int index72_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA72_0==RULE_ID) ) {s = 1;}
+
+                        else if ( (LA72_0==72) ) {s = 2;}
+
+                        else if ( (LA72_0==57) && (synpred27_InternalUISemanticsGrammar())) {s = 3;}
+
+                        else if ( (LA72_0==RULE_STRING||(LA72_0>=RULE_HEX && LA72_0<=RULE_DECIMAL)||LA72_0==14||(LA72_0>=19 && LA72_0<=21)||LA72_0==33||LA72_0==44||(LA72_0>=60 && LA72_0<=61)||LA72_0==65||(LA72_0>=74 && LA72_0<=75)||LA72_0==78||LA72_0==80||(LA72_0>=83 && LA72_0<=85)||(LA72_0>=88 && LA72_0<=96)||LA72_0==98) ) {s = 4;}
+
+                         
+                        input.seek(index72_0);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA72_1 = input.LA(1);
+
+                         
+                        int index72_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred27_InternalUISemanticsGrammar()) ) {s = 3;}
+
+                        else if ( (true) ) {s = 4;}
+
+                         
+                        input.seek(index72_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA72_2 = input.LA(1);
+
+                         
+                        int index72_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred27_InternalUISemanticsGrammar()) ) {s = 3;}
+
+                        else if ( (true) ) {s = 4;}
+
+                         
+                        input.seek(index72_2);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 72, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA95 extends DFA {
+
+        public DFA95(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 95;
+            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 "5257: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 LA95_1 = input.LA(1);
+
+                         
+                        int index95_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred30_InternalUISemanticsGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index95_1);
+                        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;
+        }
+    }
+
+    class DFA94 extends DFA {
+
+        public DFA94(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 94;
+            this.eot = dfa_34;
+            this.eof = dfa_34;
+            this.min = dfa_35;
+            this.max = dfa_36;
+            this.accept = dfa_37;
+            this.special = dfa_38;
+            this.transition = dfa_39;
+        }
+        public String getDescription() {
+            return "5276: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 LA94_0 = input.LA(1);
+
+                         
+                        int index94_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA94_0==RULE_ID) ) {s = 1;}
+
+                        else if ( (LA94_0==72) ) {s = 2;}
+
+                        else if ( (LA94_0==57) && (synpred31_InternalUISemanticsGrammar())) {s = 3;}
+
+                        else if ( (LA94_0==77) && (synpred31_InternalUISemanticsGrammar())) {s = 4;}
+
+                        else if ( (LA94_0==RULE_STRING||(LA94_0>=RULE_HEX && LA94_0<=RULE_DECIMAL)||LA94_0==14||(LA94_0>=19 && LA94_0<=21)||LA94_0==33||LA94_0==44||(LA94_0>=60 && LA94_0<=61)||LA94_0==65||(LA94_0>=74 && LA94_0<=75)||LA94_0==78||LA94_0==80||(LA94_0>=83 && LA94_0<=85)||(LA94_0>=88 && LA94_0<=96)||LA94_0==98) ) {s = 5;}
+
+                        else if ( (LA94_0==73) ) {s = 35;}
+
+                         
+                        input.seek(index94_0);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA94_1 = input.LA(1);
+
+                         
+                        int index94_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred31_InternalUISemanticsGrammar()) ) {s = 4;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index94_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA94_2 = input.LA(1);
+
+                         
+                        int index94_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred31_InternalUISemanticsGrammar()) ) {s = 4;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index94_2);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 94, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA96 extends DFA {
+
+        public DFA96(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 96;
+            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_40;
+        }
+        public String getDescription() {
+            return "5374: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 LA96_1 = input.LA(1);
+
+                         
+                        int index96_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred32_InternalUISemanticsGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index96_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 96, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String[] dfa_65s = {
+            "\5\2\5\uffff\2\2\3\uffff\4\2\1\uffff\2\2\6\uffff\2\2\5\uffff\5\2\1\1\40\2\1\uffff\26\2",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final short[][] dfa_65 = unpackEncodedStringArray(dfa_65s);
+
+    class DFA100 extends DFA {
+
+        public DFA100(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 100;
+            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_65;
+        }
+        public String getDescription() {
+            return "5533: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 LA100_1 = input.LA(1);
+
+                         
+                        int index100_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred33_InternalUISemanticsGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index100_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 100, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA103 extends DFA {
+
+        public DFA103(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 103;
+            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 "5590: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 LA103_1 = input.LA(1);
+
+                         
+                        int index103_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred34_InternalUISemanticsGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index103_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 103, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA102 extends DFA {
+
+        public DFA102(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 102;
+            this.eot = dfa_34;
+            this.eof = dfa_34;
+            this.min = dfa_35;
+            this.max = dfa_36;
+            this.accept = dfa_37;
+            this.special = dfa_38;
+            this.transition = dfa_39;
+        }
+        public String getDescription() {
+            return "5609: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 LA102_0 = input.LA(1);
+
+                         
+                        int index102_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA102_0==RULE_ID) ) {s = 1;}
+
+                        else if ( (LA102_0==72) ) {s = 2;}
+
+                        else if ( (LA102_0==57) && (synpred35_InternalUISemanticsGrammar())) {s = 3;}
+
+                        else if ( (LA102_0==77) && (synpred35_InternalUISemanticsGrammar())) {s = 4;}
+
+                        else if ( (LA102_0==RULE_STRING||(LA102_0>=RULE_HEX && LA102_0<=RULE_DECIMAL)||LA102_0==14||(LA102_0>=19 && LA102_0<=21)||LA102_0==33||LA102_0==44||(LA102_0>=60 && LA102_0<=61)||LA102_0==65||(LA102_0>=74 && LA102_0<=75)||LA102_0==78||LA102_0==80||(LA102_0>=83 && LA102_0<=85)||(LA102_0>=88 && LA102_0<=96)||LA102_0==98) ) {s = 5;}
+
+                        else if ( (LA102_0==73) ) {s = 35;}
+
+                         
+                        input.seek(index102_0);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA102_1 = input.LA(1);
+
+                         
+                        int index102_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred35_InternalUISemanticsGrammar()) ) {s = 4;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index102_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA102_2 = input.LA(1);
+
+                         
+                        int index102_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred35_InternalUISemanticsGrammar()) ) {s = 4;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index102_2);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 102, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA104 extends DFA {
+
+        public DFA104(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 104;
+            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_40;
+        }
+        public String getDescription() {
+            return "5707: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 LA104_1 = input.LA(1);
+
+                         
+                        int index104_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred36_InternalUISemanticsGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index104_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 104, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_66s = "\1\41\115\uffff";
+    static final String dfa_67s = "\1\4\40\0\55\uffff";
+    static final String dfa_68s = "\1\143\40\0\55\uffff";
+    static final String dfa_69s = "\41\uffff\1\2\53\uffff\1\1";
+    static final String dfa_70s = "\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_71s = {
+            "\1\27\1\1\1\23\1\24\1\25\5\uffff\1\12\1\41\3\uffff\1\4\1\3\1\5\1\41\1\uffff\2\41\6\uffff\1\41\1\2\5\uffff\5\41\1\15\17\41\1\10\1\7\3\41\1\6\6\41\1\40\1\41\1\17\1\20\1\41\1\uffff\1\31\1\41\1\13\2\41\1\32\1\33\1\34\2\41\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_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 DFA107 extends DFA {
+
+        public DFA107(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 107;
+            this.eot = dfa_27;
+            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 "6050: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 LA107_1 = input.LA(1);
+
+                         
+                        int index107_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred37_InternalUISemanticsGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index107_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA107_2 = input.LA(1);
+
+                         
+                        int index107_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred37_InternalUISemanticsGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index107_2);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA107_3 = input.LA(1);
+
+                         
+                        int index107_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred37_InternalUISemanticsGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index107_3);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA107_4 = input.LA(1);
+
+                         
+                        int index107_4 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred37_InternalUISemanticsGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index107_4);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA107_5 = input.LA(1);
+
+                         
+                        int index107_5 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred37_InternalUISemanticsGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index107_5);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA107_6 = input.LA(1);
+
+                         
+                        int index107_6 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred37_InternalUISemanticsGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index107_6);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA107_7 = input.LA(1);
+
+                         
+                        int index107_7 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred37_InternalUISemanticsGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index107_7);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 7 : 
+                        int LA107_8 = input.LA(1);
+
+                         
+                        int index107_8 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred37_InternalUISemanticsGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index107_8);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 8 : 
+                        int LA107_9 = input.LA(1);
+
+                         
+                        int index107_9 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred37_InternalUISemanticsGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index107_9);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 9 : 
+                        int LA107_10 = input.LA(1);
+
+                         
+                        int index107_10 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred37_InternalUISemanticsGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index107_10);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 10 : 
+                        int LA107_11 = input.LA(1);
+
+                         
+                        int index107_11 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred37_InternalUISemanticsGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index107_11);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 11 : 
+                        int LA107_12 = input.LA(1);
+
+                         
+                        int index107_12 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred37_InternalUISemanticsGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index107_12);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 12 : 
+                        int LA107_13 = input.LA(1);
+
+                         
+                        int index107_13 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred37_InternalUISemanticsGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index107_13);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 13 : 
+                        int LA107_14 = input.LA(1);
+
+                         
+                        int index107_14 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred37_InternalUISemanticsGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index107_14);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 14 : 
+                        int LA107_15 = input.LA(1);
+
+                         
+                        int index107_15 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred37_InternalUISemanticsGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index107_15);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 15 : 
+                        int LA107_16 = input.LA(1);
+
+                         
+                        int index107_16 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred37_InternalUISemanticsGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index107_16);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 16 : 
+                        int LA107_17 = input.LA(1);
+
+                         
+                        int index107_17 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred37_InternalUISemanticsGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index107_17);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 17 : 
+                        int LA107_18 = input.LA(1);
+
+                         
+                        int index107_18 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred37_InternalUISemanticsGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index107_18);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 18 : 
+                        int LA107_19 = input.LA(1);
+
+                         
+                        int index107_19 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred37_InternalUISemanticsGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index107_19);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 19 : 
+                        int LA107_20 = input.LA(1);
+
+                         
+                        int index107_20 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred37_InternalUISemanticsGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index107_20);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 20 : 
+                        int LA107_21 = input.LA(1);
+
+                         
+                        int index107_21 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred37_InternalUISemanticsGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index107_21);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 21 : 
+                        int LA107_22 = input.LA(1);
+
+                         
+                        int index107_22 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred37_InternalUISemanticsGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index107_22);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 22 : 
+                        int LA107_23 = input.LA(1);
+
+                         
+                        int index107_23 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred37_InternalUISemanticsGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index107_23);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 23 : 
+                        int LA107_24 = input.LA(1);
+
+                         
+                        int index107_24 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred37_InternalUISemanticsGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index107_24);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 24 : 
+                        int LA107_25 = input.LA(1);
+
+                         
+                        int index107_25 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred37_InternalUISemanticsGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index107_25);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 25 : 
+                        int LA107_26 = input.LA(1);
+
+                         
+                        int index107_26 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred37_InternalUISemanticsGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index107_26);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 26 : 
+                        int LA107_27 = input.LA(1);
+
+                         
+                        int index107_27 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred37_InternalUISemanticsGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index107_27);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 27 : 
+                        int LA107_28 = input.LA(1);
+
+                         
+                        int index107_28 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred37_InternalUISemanticsGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index107_28);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 28 : 
+                        int LA107_29 = input.LA(1);
+
+                         
+                        int index107_29 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred37_InternalUISemanticsGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index107_29);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 29 : 
+                        int LA107_30 = input.LA(1);
+
+                         
+                        int index107_30 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred37_InternalUISemanticsGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index107_30);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 30 : 
+                        int LA107_31 = input.LA(1);
+
+                         
+                        int index107_31 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred37_InternalUISemanticsGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index107_31);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 31 : 
+                        int LA107_32 = input.LA(1);
+
+                         
+                        int index107_32 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred37_InternalUISemanticsGrammar()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index107_32);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 107, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_72s = "\123\uffff";
+    static final String dfa_73s = "\1\2\122\uffff";
+    static final String dfa_74s = "\1\4\1\0\121\uffff";
+    static final String dfa_75s = "\1\145\1\0\121\uffff";
+    static final String dfa_76s = "\2\uffff\1\2\117\uffff\1\1";
+    static final String dfa_77s = "\1\uffff\1\0\121\uffff}>";
+    static final String[] dfa_78s = {
+            "\5\2\5\uffff\2\2\3\uffff\4\2\1\uffff\2\2\6\uffff\6\2\1\uffff\5\2\1\1\40\2\1\uffff\26\2\1\uffff\1\2",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_72 = DFA.unpackEncodedString(dfa_72s);
+    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 DFA125 extends DFA {
+
+        public DFA125(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 125;
+            this.eot = dfa_72;
+            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 "6708: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 LA125_1 = input.LA(1);
+
+                         
+                        int index125_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred44_InternalUISemanticsGrammar()) ) {s = 82;}
+
+                        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;
+        }
+    }
+
+    class DFA123 extends DFA {
+
+        public DFA123(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 123;
+            this.eot = dfa_72;
+            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 "6802: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 LA123_1 = input.LA(1);
+
+                         
+                        int index123_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred46_InternalUISemanticsGrammar()) ) {s = 82;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index123_1);
+                        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;
+        }
+    }
+ 
+
+    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[]{0x0000000004012002L});
+    public static final BitSet FOLLOW_4 = new BitSet(new long[]{0x0000000000004000L});
+    public static final BitSet FOLLOW_5 = new BitSet(new long[]{0x0000000000008020L});
+    public static final BitSet FOLLOW_6 = new BitSet(new long[]{0x0000000004010002L});
+    public static final BitSet FOLLOW_7 = new BitSet(new long[]{0x0000000004000002L});
+    public static final BitSet FOLLOW_8 = new BitSet(new long[]{0x0000000000060002L});
+    public static final BitSet FOLLOW_9 = new BitSet(new long[]{0x0000000000000010L});
+    public static final BitSet FOLLOW_10 = new BitSet(new long[]{0x0000000000040002L});
+    public static final BitSet FOLLOW_11 = new BitSet(new long[]{0x0000000000100020L});
+    public static final BitSet FOLLOW_12 = new BitSet(new long[]{0x0000000000200020L});
+    public static final BitSet FOLLOW_13 = new BitSet(new long[]{0x0000000000400020L});
+    public static final BitSet FOLLOW_14 = new BitSet(new long[]{0x0000000001000002L});
+    public static final BitSet FOLLOW_15 = new BitSet(new long[]{0x0000000002000000L});
+    public static final BitSet FOLLOW_16 = new BitSet(new long[]{0x0000000000000020L});
+    public static final BitSet FOLLOW_17 = new BitSet(new long[]{0x00000000B8008000L});
+    public static final BitSet FOLLOW_18 = new BitSet(new long[]{0x0000000038008000L});
+    public static final BitSet FOLLOW_19 = new BitSet(new long[]{0x0000001E00008000L});
+    public static final BitSet FOLLOW_20 = new BitSet(new long[]{0x0000000000008000L});
+    public static final BitSet FOLLOW_21 = new BitSet(new long[]{0x0000000030008000L});
+    public static final BitSet FOLLOW_22 = new BitSet(new long[]{0x0000001000008000L});
+    public static final BitSet FOLLOW_23 = new BitSet(new long[]{0x0000000020008000L});
+    public static final BitSet FOLLOW_24 = new BitSet(new long[]{0x0000000040008000L});
+    public static final BitSet FOLLOW_25 = new BitSet(new long[]{0x0000000040000002L});
+    public static final BitSet FOLLOW_26 = new BitSet(new long[]{0x0000000100000000L});
+    public static final BitSet FOLLOW_27 = new BitSet(new long[]{0x0000001C00000002L});
+    public static final BitSet FOLLOW_28 = new BitSet(new long[]{0x0000001000000002L});
+    public static final BitSet FOLLOW_29 = new BitSet(new long[]{0x0000001800000000L});
+    public static final BitSet FOLLOW_30 = new BitSet(new long[]{0x0000001000000000L});
+    public static final BitSet FOLLOW_31 = new BitSet(new long[]{0x0200000000000020L,0x0000000000000100L});
+    public static final BitSet FOLLOW_32 = new BitSet(new long[]{0x0000002000000002L});
+    public static final BitSet FOLLOW_33 = new BitSet(new long[]{0x0000004000000000L});
+    public static final BitSet FOLLOW_34 = new BitSet(new long[]{0x30001002003841F0L,0x00000005FF394D02L});
+    public static final BitSet FOLLOW_35 = new BitSet(new long[]{0x00003F8000000002L});
+    public static final BitSet FOLLOW_36 = new BitSet(new long[]{0x0000100000000000L});
+    public static final BitSet FOLLOW_37 = new BitSet(new long[]{0x0000600000000000L});
+    public static final BitSet FOLLOW_38 = new BitSet(new long[]{0x0000400000000000L});
+    public static final BitSet FOLLOW_39 = new BitSet(new long[]{0x0000800000000002L});
+    public static final BitSet FOLLOW_40 = new BitSet(new long[]{0x0001000000000002L});
+    public static final BitSet FOLLOW_41 = new BitSet(new long[]{0x001E000000000002L});
+    public static final BitSet FOLLOW_42 = new BitSet(new long[]{0x0020700000000002L});
+    public static final BitSet FOLLOW_43 = new BitSet(new long[]{0x0FC0300000000002L});
+    public static final BitSet FOLLOW_44 = new BitSet(new long[]{0x0100000000000000L});
+    public static final BitSet FOLLOW_45 = new BitSet(new long[]{0x0000200000000000L});
+    public static final BitSet FOLLOW_46 = new BitSet(new long[]{0x0200100000000000L});
+    public static final BitSet FOLLOW_47 = new BitSet(new long[]{0x3000000000000002L});
+    public static final BitSet FOLLOW_48 = new BitSet(new long[]{0xC000000000400002L,0x0000000000000001L});
+    public static final BitSet FOLLOW_49 = new BitSet(new long[]{0x0000000002000002L});
+    public static final BitSet FOLLOW_50 = new BitSet(new long[]{0x0000000000000002L,0x000000000000000CL});
+    public static final BitSet FOLLOW_51 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000070L});
+    public static final BitSet FOLLOW_52 = new BitSet(new long[]{0x0000000200380020L});
+    public static final BitSet FOLLOW_53 = new BitSet(new long[]{0x0000100200380020L,0x0000000001000000L});
+    public static final BitSet FOLLOW_54 = new BitSet(new long[]{0x0200000000000020L,0x0000001000000100L});
+    public static final BitSet FOLLOW_55 = new BitSet(new long[]{0x0000200000000000L,0x0000000000000080L});
+    public static final BitSet FOLLOW_56 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000970L});
+    public static final BitSet FOLLOW_57 = new BitSet(new long[]{0x32001002003841F0L,0x00000005FF396F02L});
+    public static final BitSet FOLLOW_58 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000200L});
+    public static final BitSet FOLLOW_59 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000280L});
+    public static final BitSet FOLLOW_60 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000870L});
+    public static final BitSet FOLLOW_61 = new BitSet(new long[]{0x300010020038C1F0L,0x00000005FF394D02L});
+    public static final BitSet FOLLOW_62 = new BitSet(new long[]{0x0000000000008000L,0x0000000000000080L});
+    public static final BitSet FOLLOW_63 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000800L});
+    public static final BitSet FOLLOW_64 = new BitSet(new long[]{0x30001002003841F0L,0x00000005FF395D02L});
+    public static final BitSet FOLLOW_65 = new BitSet(new long[]{0x0000000000000000L,0x0000000000001080L});
+    public static final BitSet FOLLOW_66 = new BitSet(new long[]{0x32001002003841F0L,0x00000005FFF97D02L});
+    public static final BitSet FOLLOW_67 = new BitSet(new long[]{0x0000000000000000L,0x0000000000002080L});
+    public static final BitSet FOLLOW_68 = new BitSet(new long[]{0x30001002003841F0L,0x00000005FFF95D02L});
+    public static final BitSet FOLLOW_69 = new BitSet(new long[]{0x0000000000000000L,0x0000000000001000L});
+    public static final BitSet FOLLOW_70 = new BitSet(new long[]{0x30001002013841F2L,0x00000005FFF94D02L});
+    public static final BitSet FOLLOW_71 = new BitSet(new long[]{0x30001002003841F2L,0x00000005FFF94D02L});
+    public static final BitSet FOLLOW_72 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000100L});
+    public static final BitSet FOLLOW_73 = new BitSet(new long[]{0x0000000000000002L,0x0000000000008000L});
+    public static final BitSet FOLLOW_74 = new BitSet(new long[]{0x32001002003841F0L,0x00000005FF394D02L});
+    public static final BitSet FOLLOW_75 = new BitSet(new long[]{0x0200000100008020L,0x0000000000060180L});
+    public static final BitSet FOLLOW_76 = new BitSet(new long[]{0x0000000100000000L,0x0000000000040080L});
+    public static final BitSet FOLLOW_77 = new BitSet(new long[]{0x0000000100000000L,0x0000000000000080L});
+    public static final BitSet FOLLOW_78 = new BitSet(new long[]{0x30001002013841F0L,0x00000005FFF94D02L});
+    public static final BitSet FOLLOW_79 = new BitSet(new long[]{0x0000000001000000L,0x0000000000000080L});
+    public static final BitSet FOLLOW_80 = new BitSet(new long[]{0x30001002003841F0L,0x00000005FFF94D02L});
+    public static final BitSet FOLLOW_81 = new BitSet(new long[]{0x30001002013841F0L,0x00000005FF394D02L});
+    public static final BitSet FOLLOW_82 = new BitSet(new long[]{0x0000000001000000L});
+    public static final BitSet FOLLOW_83 = new BitSet(new long[]{0x30001002003841F0L,0x00000005FF394F02L});
+    public static final BitSet FOLLOW_84 = new BitSet(new long[]{0x0000000000000000L,0x0000000000100000L});
+    public static final BitSet FOLLOW_85 = new BitSet(new long[]{0x300010020038C1F0L,0x00000005FFF94D02L});
+    public static final BitSet FOLLOW_86 = new BitSet(new long[]{0x300010020138C1F0L,0x00000005FFF94D02L});
+    public static final BitSet FOLLOW_87 = new BitSet(new long[]{0x0000004000000002L});
+    public static final BitSet FOLLOW_88 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000900L});
+    public static final BitSet FOLLOW_89 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000800L});
+    public static final BitSet FOLLOW_90 = new BitSet(new long[]{0x0000100000000002L,0x0000000000000900L});
+    public static final BitSet FOLLOW_91 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000A00L});
+    public static final BitSet FOLLOW_92 = new BitSet(new long[]{0x30001002003841F2L,0x00000005FF394D02L});
+    public static final BitSet FOLLOW_93 = new BitSet(new long[]{0x0000000000000000L,0x0000000A00000000L});
+    public static final BitSet FOLLOW_94 = new BitSet(new long[]{0x0000000000000002L,0x0000000A00000000L});
+    public static final BitSet FOLLOW_95 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000010L});
+    public static final BitSet FOLLOW_96 = new BitSet(new long[]{0x0000000000000180L});
+    public static final BitSet FOLLOW_97 = new BitSet(new long[]{0x0200000000000020L,0x0000000000000300L});
+    public static final BitSet FOLLOW_98 = new BitSet(new long[]{0x0200000000000000L});
+    public static final BitSet FOLLOW_99 = new BitSet(new long[]{0x0000100000000002L});
+    public static final BitSet FOLLOW_100 = new BitSet(new long[]{0x0000100000000002L,0x0000000000000010L});
+    public static final BitSet FOLLOW_101 = new BitSet(new long[]{0x0000000200000002L,0x0000000001000000L});
+    public static final BitSet FOLLOW_102 = new BitSet(new long[]{0x0000000000000002L,0x0000002000000000L});
+    public static final BitSet FOLLOW_103 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000010L});
+    public static final BitSet FOLLOW_104 = new BitSet(new long[]{0x0000000000400000L});
+    public static final BitSet FOLLOW_105 = new BitSet(new long[]{0x0000000000880002L});
+    public static final BitSet FOLLOW_106 = new BitSet(new long[]{0x0000000000000022L});
+
+}
\ No newline at end of file
diff --git a/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/serializer/UISemanticsGrammarSemanticSequencer.java b/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/serializer/UISemanticsGrammarSemanticSequencer.java
index 44fcb86..75be64e 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/serializer/UISemanticsGrammarSemanticSequencer.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/serializer/UISemanticsGrammarSemanticSequencer.java
@@ -7,13 +7,17 @@
  *
  * Contributors:
  *         Florian Pirchner - Initial implementation
+ *
+ * generated by Xtext 2.11.0
+ *
  */
 
 package org.eclipse.osbp.ecview.uisemantics.serializer;
 
 import com.google.inject.Inject;
-import com.google.inject.Provider;
+import java.util.Set;
 import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
 import org.eclipse.osbp.ecview.semantic.uisemantics.UiSemanticsPackage;
 import org.eclipse.osbp.ecview.semantic.uisemantics.UxAction;
 import org.eclipse.osbp.ecview.semantic.uisemantics.UxAvailableBindings;
@@ -29,6 +33,9 @@
 import org.eclipse.osbp.ecview.semantic.uisemantics.UxViewCategory;
 import org.eclipse.osbp.ecview.semantic.uisemantics.UxVisibleableOption;
 import org.eclipse.osbp.ecview.uisemantics.services.UISemanticsGrammarGrammarAccess;
+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;
@@ -38,14 +45,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;
@@ -90,1256 +91,379 @@
 	@Inject
 	private UISemanticsGrammarGrammarAccess grammarAccess;
 	
-	public void createSequence(EObject context, EObject semanticObject) {
-		if(semanticObject.eClass().getEPackage() == TypesPackage.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 == 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() == UiSemanticsPackage.eINSTANCE) switch(semanticObject.eClass().getClassifierID()) {
+		else if (epackage == UiSemanticsPackage.eINSTANCE)
+			switch (semanticObject.eClass().getClassifierID()) {
 			case UiSemanticsPackage.UX_ACTION:
-				if(context == grammarAccess.getUxActionRule()) {
-					sequence_UxAction(context, (UxAction) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UxAction(context, (UxAction) semanticObject); 
+				return; 
 			case UiSemanticsPackage.UX_AVAILABLE_BINDINGS:
-				if(context == grammarAccess.getUxAvailableBindingsRule()) {
-					sequence_UxAvailableBindings(context, (UxAvailableBindings) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UxAvailableBindings(context, (UxAvailableBindings) semanticObject); 
+				return; 
 			case UiSemanticsPackage.UX_AVAILABLE_VALIDATOR_PROPERTIES:
-				if(context == grammarAccess.getUxAvailableValidatorPropertiesRule()) {
-					sequence_UxAvailableValidatorProperties(context, (UxAvailableValidatorProperties) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UxAvailableValidatorProperties(context, (UxAvailableValidatorProperties) semanticObject); 
+				return; 
 			case UiSemanticsPackage.UX_AVAILABLE_VISIBILITY_OPTIONS:
-				if(context == grammarAccess.getUxAvailableVisibilityOptionsRule()) {
-					sequence_UxAvailableVisibilityOptions(context, (UxAvailableVisibilityOptions) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UxAvailableVisibilityOptions(context, (UxAvailableVisibilityOptions) semanticObject); 
+				return; 
 			case UiSemanticsPackage.UX_BINDINGABLE_OPTION:
-				if(context == grammarAccess.getUxBindingableOptionRule()) {
-					sequence_UxBindingableOption(context, (UxBindingableOption) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UxBindingableOption(context, (UxBindingableOption) semanticObject); 
+				return; 
 			case UiSemanticsPackage.UX_EPACKAGE_IMPORT:
-				if(context == grammarAccess.getUxEPackageImportRule()) {
-					sequence_UxEPackageImport(context, (UxEPackageImport) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UxEPackageImport(context, (UxEPackageImport) semanticObject); 
+				return; 
 			case UiSemanticsPackage.UX_ELEMENT_DEFINITION:
-				if(context == grammarAccess.getUxElementDefinitionRule()) {
-					sequence_UxElementDefinition(context, (UxElementDefinition) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UxElementDefinition(context, (UxElementDefinition) semanticObject); 
+				return; 
 			case UiSemanticsPackage.UX_ELEMENT_URI:
-				if(context == grammarAccess.getUxElementURIRule()) {
-					sequence_UxElementURI(context, (UxElementURI) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UxElementURI(context, (UxElementURI) semanticObject); 
+				return; 
 			case UiSemanticsPackage.UX_IMPORT_SECTION_DECLARATION:
-				if(context == grammarAccess.getXImportDeclarationRule()) {
-					sequence_XImportDeclaration(context, (UxImportSectionDeclaration) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_XImportDeclaration(context, (UxImportSectionDeclaration) semanticObject); 
+				return; 
 			case UiSemanticsPackage.UX_MODEL:
-				if(context == grammarAccess.getUxModelRule()) {
-					sequence_UxModel(context, (UxModel) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UxModel(context, (UxModel) semanticObject); 
+				return; 
 			case UiSemanticsPackage.UX_VALIDATOR_PROPERTY:
-				if(context == grammarAccess.getUxValidatorPropertyRule()) {
-					sequence_UxValidatorProperty(context, (UxValidatorProperty) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UxValidatorProperty(context, (UxValidatorProperty) semanticObject); 
+				return; 
 			case UiSemanticsPackage.UX_VIEW_CATEGORY:
-				if(context == grammarAccess.getUxViewCategoryRule()) {
-					sequence_UxViewCategory(context, (UxViewCategory) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UxViewCategory(context, (UxViewCategory) semanticObject); 
+				return; 
 			case UiSemanticsPackage.UX_VISIBLEABLE_OPTION:
-				if(context == grammarAccess.getUxVisibleableOptionRule()) {
-					sequence_UxVisibleableOption(context, (UxVisibleableOption) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_UxVisibleableOption(context, (UxVisibleableOption) 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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.getXAdditiveExpressionRule() ||
-				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAndExpressionRule() ||
-				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   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()) {
-					sequence_XListLiteral(context, (XListLiteral) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_XListLiteral(context, (XListLiteral) semanticObject); 
+				return; 
 			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.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.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.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.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.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.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.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.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.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.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.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.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.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.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;
+				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:
+	 *     UxAction returns UxAction
+	 *
 	 * Constraint:
 	 *     (name=QualifiedName externalCommandId=STRING? initialDisabled?='disabled'?)
 	 */
-	protected void sequence_UxAction(EObject context, UxAction semanticObject) {
+	protected void sequence_UxAction(ISerializationContext context, UxAction semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UxAvailableBindings returns UxAvailableBindings
+	 *
 	 * Constraint:
-	 *     (bindings+=UxBindingableOption*)
+	 *     (superElement=[UxElementDefinition|ID]? bindings+=UxBindingableOption*)
 	 */
-	protected void sequence_UxAvailableBindings(EObject context, UxAvailableBindings semanticObject) {
+	protected void sequence_UxAvailableBindings(ISerializationContext context, UxAvailableBindings semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UxAvailableValidatorProperties returns UxAvailableValidatorProperties
+	 *
 	 * Constraint:
-	 *     (properties+=UxValidatorProperty*)
+	 *     properties+=UxValidatorProperty*
 	 */
-	protected void sequence_UxAvailableValidatorProperties(EObject context, UxAvailableValidatorProperties semanticObject) {
+	protected void sequence_UxAvailableValidatorProperties(ISerializationContext context, UxAvailableValidatorProperties semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UxAvailableVisibilityOptions returns UxAvailableVisibilityOptions
+	 *
 	 * Constraint:
-	 *     (bindings+=UxVisibleableOption*)
+	 *     bindings+=UxVisibleableOption*
 	 */
-	protected void sequence_UxAvailableVisibilityOptions(EObject context, UxAvailableVisibilityOptions semanticObject) {
+	protected void sequence_UxAvailableVisibilityOptions(ISerializationContext context, UxAvailableVisibilityOptions semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UxBindingableOption returns UxBindingableOption
+	 *
 	 * Constraint:
 	 *     (final?='final'? listbinding?='list'? name=ID jvmType=JvmTypeReference targetName=ID?)
 	 */
-	protected void sequence_UxBindingableOption(EObject context, UxBindingableOption semanticObject) {
+	protected void sequence_UxBindingableOption(ISerializationContext context, UxBindingableOption semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UxEPackageImport returns UxEPackageImport
+	 *
 	 * Constraint:
 	 *     (ePackage=[EPackage|STRING] alias=ID)
 	 */
-	protected void sequence_UxEPackageImport(EObject context, UxEPackageImport semanticObject) {
-		if(errorAcceptor != null) {
-			if(transientValues.isValueTransient(semanticObject, UiSemanticsPackage.Literals.UX_EPACKAGE_IMPORT__ALIAS) == ValueTransient.YES)
-				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiSemanticsPackage.Literals.UX_EPACKAGE_IMPORT__ALIAS));
-			if(transientValues.isValueTransient(semanticObject, UiSemanticsPackage.Literals.UX_EPACKAGE_IMPORT__EPACKAGE) == ValueTransient.YES)
+	protected void sequence_UxEPackageImport(ISerializationContext context, UxEPackageImport semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, UiSemanticsPackage.Literals.UX_EPACKAGE_IMPORT__EPACKAGE) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiSemanticsPackage.Literals.UX_EPACKAGE_IMPORT__EPACKAGE));
+			if (transientValues.isValueTransient(semanticObject, UiSemanticsPackage.Literals.UX_EPACKAGE_IMPORT__ALIAS) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiSemanticsPackage.Literals.UX_EPACKAGE_IMPORT__ALIAS));
 		}
-		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
-		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
-		feeder.accept(grammarAccess.getUxEPackageImportAccess().getEPackageEPackageSTRINGTerminalRuleCall_0_0_1(), semanticObject.getEPackage());
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getUxEPackageImportAccess().getEPackageEPackageSTRINGTerminalRuleCall_0_0_1(), semanticObject.eGet(UiSemanticsPackage.Literals.UX_EPACKAGE_IMPORT__EPACKAGE, false));
 		feeder.accept(grammarAccess.getUxEPackageImportAccess().getAliasIDTerminalRuleCall_2_0(), semanticObject.getAlias());
 		feeder.finish();
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UxElementDefinition returns UxElementDefinition
+	 *
 	 * Constraint:
 	 *     (
 	 *         name=ID 
@@ -1349,89 +473,116 @@
 	 *         validatorContainer=UxAvailableValidatorProperties?
 	 *     )
 	 */
-	protected void sequence_UxElementDefinition(EObject context, UxElementDefinition semanticObject) {
+	protected void sequence_UxElementDefinition(ISerializationContext context, UxElementDefinition semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UxElementURI returns UxElementURI
+	 *
 	 * Constraint:
 	 *     (ePackage=[UxEPackageImport|ID] eClass=[EClass|ID])
 	 */
-	protected void sequence_UxElementURI(EObject context, UxElementURI semanticObject) {
-		if(errorAcceptor != null) {
-			if(transientValues.isValueTransient(semanticObject, UiSemanticsPackage.Literals.UX_ELEMENT_URI__EPACKAGE) == ValueTransient.YES)
+	protected void sequence_UxElementURI(ISerializationContext context, UxElementURI semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, UiSemanticsPackage.Literals.UX_ELEMENT_URI__EPACKAGE) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiSemanticsPackage.Literals.UX_ELEMENT_URI__EPACKAGE));
-			if(transientValues.isValueTransient(semanticObject, UiSemanticsPackage.Literals.UX_ELEMENT_URI__ECLASS) == ValueTransient.YES)
+			if (transientValues.isValueTransient(semanticObject, UiSemanticsPackage.Literals.UX_ELEMENT_URI__ECLASS) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiSemanticsPackage.Literals.UX_ELEMENT_URI__ECLASS));
 		}
-		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
-		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
-		feeder.accept(grammarAccess.getUxElementURIAccess().getEPackageUxEPackageImportIDTerminalRuleCall_1_0_1(), semanticObject.getEPackage());
-		feeder.accept(grammarAccess.getUxElementURIAccess().getEClassEClassIDTerminalRuleCall_3_0_1(), semanticObject.getEClass());
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getUxElementURIAccess().getEPackageUxEPackageImportIDTerminalRuleCall_1_0_1(), semanticObject.eGet(UiSemanticsPackage.Literals.UX_ELEMENT_URI__EPACKAGE, false));
+		feeder.accept(grammarAccess.getUxElementURIAccess().getEClassEClassIDTerminalRuleCall_3_0_1(), semanticObject.eGet(UiSemanticsPackage.Literals.UX_ELEMENT_URI__ECLASS, false));
 		feeder.finish();
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UxModel returns UxModel
+	 *
 	 * Constraint:
 	 *     (importSection=XImportSection? viewActions+=UxAction* categories+=UxViewCategory* elementDefinitions+=UxElementDefinition*)
 	 */
-	protected void sequence_UxModel(EObject context, UxModel semanticObject) {
+	protected void sequence_UxModel(ISerializationContext context, UxModel semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UxValidatorProperty returns UxValidatorProperty
+	 *
 	 * Constraint:
 	 *     name=ID
 	 */
-	protected void sequence_UxValidatorProperty(EObject context, UxValidatorProperty semanticObject) {
-		if(errorAcceptor != null) {
-			if(transientValues.isValueTransient(semanticObject, UiSemanticsPackage.Literals.UX_VALIDATOR_PROPERTY__NAME) == ValueTransient.YES)
+	protected void sequence_UxValidatorProperty(ISerializationContext context, UxValidatorProperty semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, UiSemanticsPackage.Literals.UX_VALIDATOR_PROPERTY__NAME) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiSemanticsPackage.Literals.UX_VALIDATOR_PROPERTY__NAME));
 		}
-		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
-		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
 		feeder.accept(grammarAccess.getUxValidatorPropertyAccess().getNameIDTerminalRuleCall_1_0(), semanticObject.getName());
 		feeder.finish();
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UxViewCategory returns UxViewCategory
+	 *
 	 * Constraint:
 	 *     name=QualifiedName
 	 */
-	protected void sequence_UxViewCategory(EObject context, UxViewCategory semanticObject) {
-		if(errorAcceptor != null) {
-			if(transientValues.isValueTransient(semanticObject, UiSemanticsPackage.Literals.UX_VIEW_CATEGORY__NAME) == ValueTransient.YES)
+	protected void sequence_UxViewCategory(ISerializationContext context, UxViewCategory semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, UiSemanticsPackage.Literals.UX_VIEW_CATEGORY__NAME) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiSemanticsPackage.Literals.UX_VIEW_CATEGORY__NAME));
 		}
-		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
-		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
 		feeder.accept(grammarAccess.getUxViewCategoryAccess().getNameQualifiedNameParserRuleCall_0(), semanticObject.getName());
 		feeder.finish();
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     UxVisibleableOption returns UxVisibleableOption
+	 *
 	 * Constraint:
 	 *     (name=ID jvmType=JvmTypeReference)
 	 */
-	protected void sequence_UxVisibleableOption(EObject context, UxVisibleableOption semanticObject) {
-		genericSequencer.createSequence(context, semanticObject);
+	protected void sequence_UxVisibleableOption(ISerializationContext context, UxVisibleableOption semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, UiSemanticsPackage.Literals.UX_ENDPOINT_DEF__NAME) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiSemanticsPackage.Literals.UX_ENDPOINT_DEF__NAME));
+			if (transientValues.isValueTransient(semanticObject, UiSemanticsPackage.Literals.UX_ENDPOINT_DEF__JVM_TYPE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiSemanticsPackage.Literals.UX_ENDPOINT_DEF__JVM_TYPE));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getUxVisibleableOptionAccess().getNameIDTerminalRuleCall_1_0(), semanticObject.getName());
+		feeder.accept(grammarAccess.getUxVisibleableOptionAccess().getJvmTypeJvmTypeReferenceParserRuleCall_2_0(), semanticObject.getJvmType());
+		feeder.finish();
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     XImportDeclaration returns UxImportSectionDeclaration
+	 *
 	 * Constraint:
 	 *     (
 	 *         (static?='static' extension?='extension'? importedType=[JvmDeclaredType|QualifiedNameInStaticImport] (wildcard?='*' | memberName=ValidID)) | 
 	 *         importedType=[JvmDeclaredType|QualifiedName] | 
-	 *         importedNamespace=QualifiedNameWithWildcard
+	 *         importedNamespace=QualifiedNameWithWildcard | 
+	 *         importedEPackage=UxEPackageImport
 	 *     )
 	 */
-	protected void sequence_XImportDeclaration(EObject context, UxImportSectionDeclaration semanticObject) {
+	protected void sequence_XImportDeclaration(ISerializationContext context, UxImportSectionDeclaration semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
+	
+	
 }
diff --git a/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/serializer/UISemanticsGrammarSyntacticSequencer.java b/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/serializer/UISemanticsGrammarSyntacticSequencer.java
index aa97069..a42e2c4 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/serializer/UISemanticsGrammarSyntacticSequencer.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/serializer/UISemanticsGrammarSyntacticSequencer.java
@@ -7,6 +7,9 @@
  *
  * Contributors:
  *         Florian Pirchner - Initial implementation
+ *
+ * generated by Xtext 2.11.0
+ *
  */
 
 package org.eclipse.osbp.ecview.uisemantics.serializer;
@@ -53,9 +56,9 @@
 	
 	@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 "";
 	}
@@ -88,85 +91,204 @@
 		List<INode> transitionNodes = collectNodes(fromNode, toNode);
 		for (AbstractElementAlias syntax : transition.getAmbiguousSyntaxes()) {
 			List<INode> syntaxNodes = getNodesFor(transitionNodes, syntax);
-			if(match_UxModel___ActionsKeyword_2_0_LeftCurlyBracketKeyword_2_1_RightCurlyBracketKeyword_2_3__q.equals(syntax))
+			if (match_UxModel___ActionsKeyword_2_0_LeftCurlyBracketKeyword_2_1_RightCurlyBracketKeyword_2_3__q.equals(syntax))
 				emit_UxModel___ActionsKeyword_2_0_LeftCurlyBracketKeyword_2_1_RightCurlyBracketKeyword_2_3__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_UxModel___CategoriesKeyword_3_0_LeftCurlyBracketKeyword_3_1_RightCurlyBracketKeyword_3_3__q.equals(syntax))
+			else if (match_UxModel___CategoriesKeyword_3_0_LeftCurlyBracketKeyword_3_1_RightCurlyBracketKeyword_3_3__q.equals(syntax))
 				emit_UxModel___CategoriesKeyword_3_0_LeftCurlyBracketKeyword_3_1_RightCurlyBracketKeyword_3_3__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_1_1_q.equals(syntax))
+			else if (match_XImportDeclaration_SemicolonKeyword_1_1_q.equals(syntax))
 				emit_XImportDeclaration_SemicolonKeyword_1_1_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_XParenthesizedExpression_LeftParenthesisKeyword_0_a.equals(syntax))
+			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:
+	 * Ambiguous syntax:
 	 *     ('actions' '{' '}')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) (ambiguity) 'categories' '{' categories+=UxViewCategory
+	 *     (rule start) (ambiguity) ('categories' '{' '}')? (rule start)
+	 *     (rule start) (ambiguity) ('categories' '{' '}')? elementDefinitions+=UxElementDefinition
+	 *     importSection=XImportSection (ambiguity) 'categories' '{' categories+=UxViewCategory
+	 *     importSection=XImportSection (ambiguity) ('categories' '{' '}')? (rule end)
+	 *     importSection=XImportSection (ambiguity) ('categories' '{' '}')? elementDefinitions+=UxElementDefinition
 	 */
 	protected void emit_UxModel___ActionsKeyword_2_0_LeftCurlyBracketKeyword_2_1_RightCurlyBracketKeyword_2_3__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('categories' '{' '}')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) ('actions' '{' '}')? (ambiguity) (rule start)
+	 *     (rule start) ('actions' '{' '}')? (ambiguity) elementDefinitions+=UxElementDefinition
+	 *     importSection=XImportSection ('actions' '{' '}')? (ambiguity) (rule end)
+	 *     importSection=XImportSection ('actions' '{' '}')? (ambiguity) elementDefinitions+=UxElementDefinition
+	 *     viewActions+=UxAction '}' (ambiguity) (rule end)
+	 *     viewActions+=UxAction '}' (ambiguity) elementDefinitions+=UxElementDefinition
 	 */
 	protected void emit_UxModel___CategoriesKeyword_3_0_LeftCurlyBracketKeyword_3_1_RightCurlyBracketKeyword_3_3__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:
+	 *     importedEPackage=UxEPackageImport (ambiguity) (rule end)
 	 */
 	protected void emit_XImportDeclaration_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) '#' '[' ']' (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.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/services/UISemanticsGrammarGrammarAccess.java b/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/services/UISemanticsGrammarGrammarAccess.java
index 503f73c..50c8078 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/services/UISemanticsGrammarGrammarAccess.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/services/UISemanticsGrammarGrammarAccess.java
@@ -7,28 +7,37 @@
  *
  * Contributors:
  *         Florian Pirchner - Initial implementation
+ *
+ * generated by Xtext 2.11.0
+ *
  */
 
 package org.eclipse.osbp.ecview.uisemantics.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.xtext.Action;
+import org.eclipse.xtext.Alternatives;
+import org.eclipse.xtext.Assignment;
+import org.eclipse.xtext.CrossReference;
+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.service.AbstractElementFinder.AbstractGrammarElementFinder;
 import org.eclipse.xtext.service.GrammarProvider;
-import org.eclipse.xtext.service.AbstractElementFinder.*;
-
 import org.eclipse.xtext.xbase.services.XbaseGrammarAccess;
 import org.eclipse.xtext.xbase.services.XtypeGrammarAccess;
 
 @Singleton
 public class UISemanticsGrammarGrammarAccess extends AbstractGrammarElementFinder {
 	
-	
 	public class UxModelElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UxModel");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.UxModel");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUxModelAction_0 = (Action)cGroup.eContents().get(0);
 		private final Assignment cImportSectionAssignment_1 = (Assignment)cGroup.eContents().get(1);
@@ -48,69 +57,72 @@
 		private final Assignment cElementDefinitionsAssignment_4 = (Assignment)cGroup.eContents().get(4);
 		private final RuleCall cElementDefinitionsUxElementDefinitionParserRuleCall_4_0 = (RuleCall)cElementDefinitionsAssignment_4.eContents().get(0);
 		
-		//UxModel returns semantic::UxModel:
-		//	{semantic::UxModel} importSection=XImportSection? ("actions" "{" viewActions+=UxAction* "}")? ("categories" "{"
-		//	categories+=UxViewCategory* "}")? elementDefinitions+=UxElementDefinition*;
-		public ParserRule getRule() { return rule; }
-
-		//{semantic::UxModel} importSection=XImportSection? ("actions" "{" viewActions+=UxAction* "}")? ("categories" "{"
-		//categories+=UxViewCategory* "}")? elementDefinitions+=UxElementDefinition*
+		//UxModel:
+		//	{UxModel} importSection=XImportSection? ('actions' '{'
+		//	viewActions+=UxAction*
+		//	'}')? ('categories' '{'
+		//	categories+=UxViewCategory*
+		//	'}')?
+		//	elementDefinitions+=UxElementDefinition*;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UxModel} importSection=XImportSection? ('actions' '{' viewActions+=UxAction* '}')? ('categories' '{'
+		//categories+=UxViewCategory* '}')? elementDefinitions+=UxElementDefinition*
 		public Group getGroup() { return cGroup; }
-
-		//{semantic::UxModel}
+		
+		//{UxModel}
 		public Action getUxModelAction_0() { return cUxModelAction_0; }
-
+		
 		//importSection=XImportSection?
 		public Assignment getImportSectionAssignment_1() { return cImportSectionAssignment_1; }
-
+		
 		//XImportSection
 		public RuleCall getImportSectionXImportSectionParserRuleCall_1_0() { return cImportSectionXImportSectionParserRuleCall_1_0; }
-
-		//("actions" "{" viewActions+=UxAction* "}")?
+		
+		//('actions' '{' viewActions+=UxAction* '}')?
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"actions"
+		
+		//'actions'
 		public Keyword getActionsKeyword_2_0() { return cActionsKeyword_2_0; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_2_1() { return cLeftCurlyBracketKeyword_2_1; }
-
+		
 		//viewActions+=UxAction*
 		public Assignment getViewActionsAssignment_2_2() { return cViewActionsAssignment_2_2; }
-
+		
 		//UxAction
 		public RuleCall getViewActionsUxActionParserRuleCall_2_2_0() { return cViewActionsUxActionParserRuleCall_2_2_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_2_3() { return cRightCurlyBracketKeyword_2_3; }
-
-		//("categories" "{" categories+=UxViewCategory* "}")?
+		
+		//('categories' '{' categories+=UxViewCategory* '}')?
 		public Group getGroup_3() { return cGroup_3; }
-
-		//"categories"
+		
+		//'categories'
 		public Keyword getCategoriesKeyword_3_0() { return cCategoriesKeyword_3_0; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_3_1() { return cLeftCurlyBracketKeyword_3_1; }
-
+		
 		//categories+=UxViewCategory*
 		public Assignment getCategoriesAssignment_3_2() { return cCategoriesAssignment_3_2; }
-
+		
 		//UxViewCategory
 		public RuleCall getCategoriesUxViewCategoryParserRuleCall_3_2_0() { return cCategoriesUxViewCategoryParserRuleCall_3_2_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_3_3() { return cRightCurlyBracketKeyword_3_3; }
-
+		
 		//elementDefinitions+=UxElementDefinition*
 		public Assignment getElementDefinitionsAssignment_4() { return cElementDefinitionsAssignment_4; }
-
+		
 		//UxElementDefinition
 		public RuleCall getElementDefinitionsUxElementDefinitionParserRuleCall_4_0() { return cElementDefinitionsUxElementDefinitionParserRuleCall_4_0; }
 	}
-
 	public class UxActionElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UxAction");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.UxAction");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Assignment cNameAssignment_0 = (Assignment)cGroup.eContents().get(0);
 		private final RuleCall cNameQualifiedNameParserRuleCall_0_0 = (RuleCall)cNameAssignment_0.eContents().get(0);
@@ -121,56 +133,54 @@
 		private final Assignment cInitialDisabledAssignment_2 = (Assignment)cGroup.eContents().get(2);
 		private final Keyword cInitialDisabledDisabledKeyword_2_0 = (Keyword)cInitialDisabledAssignment_2.eContents().get(0);
 		
-		//UxAction returns semantic::UxAction:
-		//	name=QualifiedName ("externalCommand" externalCommandId=STRING)? initialDisabled?="disabled"?;
-		public ParserRule getRule() { return rule; }
-
-		//name=QualifiedName ("externalCommand" externalCommandId=STRING)? initialDisabled?="disabled"?
+		//UxAction:
+		//	name=QualifiedName ('externalCommand' externalCommandId=STRING)? initialDisabled?="disabled"?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//name=QualifiedName ('externalCommand' externalCommandId=STRING)? initialDisabled?="disabled"?
 		public Group getGroup() { return cGroup; }
-
+		
 		//name=QualifiedName
 		public Assignment getNameAssignment_0() { return cNameAssignment_0; }
-
+		
 		//QualifiedName
 		public RuleCall getNameQualifiedNameParserRuleCall_0_0() { return cNameQualifiedNameParserRuleCall_0_0; }
-
-		//("externalCommand" externalCommandId=STRING)?
+		
+		//('externalCommand' externalCommandId=STRING)?
 		public Group getGroup_1() { return cGroup_1; }
-
-		//"externalCommand"
+		
+		//'externalCommand'
 		public Keyword getExternalCommandKeyword_1_0() { return cExternalCommandKeyword_1_0; }
-
+		
 		//externalCommandId=STRING
 		public Assignment getExternalCommandIdAssignment_1_1() { return cExternalCommandIdAssignment_1_1; }
-
+		
 		//STRING
 		public RuleCall getExternalCommandIdSTRINGTerminalRuleCall_1_1_0() { return cExternalCommandIdSTRINGTerminalRuleCall_1_1_0; }
-
+		
 		//initialDisabled?="disabled"?
 		public Assignment getInitialDisabledAssignment_2() { return cInitialDisabledAssignment_2; }
-
+		
 		//"disabled"
 		public Keyword getInitialDisabledDisabledKeyword_2_0() { return cInitialDisabledDisabledKeyword_2_0; }
 	}
-
 	public class UxViewCategoryElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UxViewCategory");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.UxViewCategory");
 		private final Assignment cNameAssignment = (Assignment)rule.eContents().get(1);
 		private final RuleCall cNameQualifiedNameParserRuleCall_0 = (RuleCall)cNameAssignment.eContents().get(0);
 		
-		//UxViewCategory returns semantic::UxViewCategory:
+		//UxViewCategory:
 		//	name=QualifiedName;
-		public ParserRule getRule() { return rule; }
-
+		@Override public ParserRule getRule() { return rule; }
+		
 		//name=QualifiedName
 		public Assignment getNameAssignment() { return cNameAssignment; }
-
+		
 		//QualifiedName
 		public RuleCall getNameQualifiedNameParserRuleCall_0() { return cNameQualifiedNameParserRuleCall_0; }
 	}
-
 	public class XImportDeclarationElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "XImportDeclaration");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.XImportDeclaration");
 		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
 		private final Group cGroup_0 = (Group)cAlternatives.eContents().get(0);
 		private final Action cUxImportSectionDeclarationAction_0_0 = (Action)cGroup_0.eContents().get(0);
@@ -202,115 +212,114 @@
 		private final RuleCall cImportedEPackageUxEPackageImportParserRuleCall_1_0_1_0 = (RuleCall)cImportedEPackageAssignment_1_0_1.eContents().get(0);
 		private final Keyword cSemicolonKeyword_1_1 = (Keyword)cGroup_1.eContents().get(1);
 		
-		//XImportDeclaration returns semantic::UxImportSectionDeclaration:
-		//	{semantic::UxImportSectionDeclaration} ("import" (static?="static" extension?="extension"?
-		//	importedType=[JvmDeclaredType|QualifiedNameInStaticImport] (wildcard?="*" | memberName=ValidID) |
+		//XImportDeclaration UxImportSectionDeclaration:
+		//	{UxImportSectionDeclaration} ('import' (static?='static' extension?='extension'?
+		//	importedType=[JvmDeclaredType|QualifiedNameInStaticImport] (wildcard?='*' | memberName=ValidID) |
 		//	importedType=[JvmDeclaredType|QualifiedName] | importedNamespace=QualifiedNameWithWildcard)) | ("ePackage"
-		//	importedEPackage=UxEPackageImport) ";"?;
-		public ParserRule getRule() { return rule; }
-
-		//{semantic::UxImportSectionDeclaration} ("import" (static?="static" extension?="extension"?
-		//importedType=[JvmDeclaredType|QualifiedNameInStaticImport] (wildcard?="*" | memberName=ValidID) |
+		//	importedEPackage=UxEPackageImport) ';'?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UxImportSectionDeclaration} ('import' (static?='static' extension?='extension'?
+		//importedType=[JvmDeclaredType|QualifiedNameInStaticImport] (wildcard?='*' | memberName=ValidID) |
 		//importedType=[JvmDeclaredType|QualifiedName] | importedNamespace=QualifiedNameWithWildcard)) | ("ePackage"
-		//importedEPackage=UxEPackageImport) ";"?
+		//importedEPackage=UxEPackageImport) ';'?
 		public Alternatives getAlternatives() { return cAlternatives; }
-
-		//{semantic::UxImportSectionDeclaration} ("import" (static?="static" extension?="extension"?
-		//importedType=[JvmDeclaredType|QualifiedNameInStaticImport] (wildcard?="*" | memberName=ValidID) |
+		
+		//{UxImportSectionDeclaration} ('import' (static?='static' extension?='extension'?
+		//importedType=[JvmDeclaredType|QualifiedNameInStaticImport] (wildcard?='*' | memberName=ValidID) |
 		//importedType=[JvmDeclaredType|QualifiedName] | importedNamespace=QualifiedNameWithWildcard))
 		public Group getGroup_0() { return cGroup_0; }
-
-		//{semantic::UxImportSectionDeclaration}
+		
+		//{UxImportSectionDeclaration}
 		public Action getUxImportSectionDeclarationAction_0_0() { return cUxImportSectionDeclarationAction_0_0; }
-
-		//"import" (static?="static" extension?="extension"? importedType=[JvmDeclaredType|QualifiedNameInStaticImport]
-		//(wildcard?="*" | memberName=ValidID) | importedType=[JvmDeclaredType|QualifiedName] |
+		
+		//'import' (static?='static' extension?='extension'? importedType=[JvmDeclaredType|QualifiedNameInStaticImport]
+		//(wildcard?='*' | memberName=ValidID) | importedType=[JvmDeclaredType|QualifiedName] |
 		//importedNamespace=QualifiedNameWithWildcard)
 		public Group getGroup_0_1() { return cGroup_0_1; }
-
-		//"import"
+		
+		//'import'
 		public Keyword getImportKeyword_0_1_0() { return cImportKeyword_0_1_0; }
-
-		//static?="static" extension?="extension"? importedType=[JvmDeclaredType|QualifiedNameInStaticImport] (wildcard?="*" |
+		
+		//static?='static' extension?='extension'? importedType=[JvmDeclaredType|QualifiedNameInStaticImport] (wildcard?='*' |
 		//memberName=ValidID) | importedType=[JvmDeclaredType|QualifiedName] | importedNamespace=QualifiedNameWithWildcard
 		public Alternatives getAlternatives_0_1_1() { return cAlternatives_0_1_1; }
-
-		//static?="static" extension?="extension"? importedType=[JvmDeclaredType|QualifiedNameInStaticImport] (wildcard?="*" |
+		
+		//static?='static' extension?='extension'? importedType=[JvmDeclaredType|QualifiedNameInStaticImport] (wildcard?='*' |
 		//memberName=ValidID)
 		public Group getGroup_0_1_1_0() { return cGroup_0_1_1_0; }
-
-		//static?="static"
+		
+		//static?='static'
 		public Assignment getStaticAssignment_0_1_1_0_0() { return cStaticAssignment_0_1_1_0_0; }
-
-		//"static"
+		
+		//'static'
 		public Keyword getStaticStaticKeyword_0_1_1_0_0_0() { return cStaticStaticKeyword_0_1_1_0_0_0; }
-
-		//extension?="extension"?
+		
+		//extension?='extension'?
 		public Assignment getExtensionAssignment_0_1_1_0_1() { return cExtensionAssignment_0_1_1_0_1; }
-
-		//"extension"
+		
+		//'extension'
 		public Keyword getExtensionExtensionKeyword_0_1_1_0_1_0() { return cExtensionExtensionKeyword_0_1_1_0_1_0; }
-
+		
 		//importedType=[JvmDeclaredType|QualifiedNameInStaticImport]
 		public Assignment getImportedTypeAssignment_0_1_1_0_2() { return cImportedTypeAssignment_0_1_1_0_2; }
-
+		
 		//[JvmDeclaredType|QualifiedNameInStaticImport]
 		public CrossReference getImportedTypeJvmDeclaredTypeCrossReference_0_1_1_0_2_0() { return cImportedTypeJvmDeclaredTypeCrossReference_0_1_1_0_2_0; }
-
+		
 		//QualifiedNameInStaticImport
 		public RuleCall getImportedTypeJvmDeclaredTypeQualifiedNameInStaticImportParserRuleCall_0_1_1_0_2_0_1() { return cImportedTypeJvmDeclaredTypeQualifiedNameInStaticImportParserRuleCall_0_1_1_0_2_0_1; }
-
-		//wildcard?="*" | memberName=ValidID
+		
+		//wildcard?='*' | memberName=ValidID
 		public Alternatives getAlternatives_0_1_1_0_3() { return cAlternatives_0_1_1_0_3; }
-
-		//wildcard?="*"
+		
+		//wildcard?='*'
 		public Assignment getWildcardAssignment_0_1_1_0_3_0() { return cWildcardAssignment_0_1_1_0_3_0; }
-
-		//"*"
+		
+		//'*'
 		public Keyword getWildcardAsteriskKeyword_0_1_1_0_3_0_0() { return cWildcardAsteriskKeyword_0_1_1_0_3_0_0; }
-
+		
 		//memberName=ValidID
 		public Assignment getMemberNameAssignment_0_1_1_0_3_1() { return cMemberNameAssignment_0_1_1_0_3_1; }
-
+		
 		//ValidID
 		public RuleCall getMemberNameValidIDParserRuleCall_0_1_1_0_3_1_0() { return cMemberNameValidIDParserRuleCall_0_1_1_0_3_1_0; }
-
+		
 		//importedType=[JvmDeclaredType|QualifiedName]
 		public Assignment getImportedTypeAssignment_0_1_1_1() { return cImportedTypeAssignment_0_1_1_1; }
-
+		
 		//[JvmDeclaredType|QualifiedName]
 		public CrossReference getImportedTypeJvmDeclaredTypeCrossReference_0_1_1_1_0() { return cImportedTypeJvmDeclaredTypeCrossReference_0_1_1_1_0; }
-
+		
 		//QualifiedName
 		public RuleCall getImportedTypeJvmDeclaredTypeQualifiedNameParserRuleCall_0_1_1_1_0_1() { return cImportedTypeJvmDeclaredTypeQualifiedNameParserRuleCall_0_1_1_1_0_1; }
-
+		
 		//importedNamespace=QualifiedNameWithWildcard
 		public Assignment getImportedNamespaceAssignment_0_1_1_2() { return cImportedNamespaceAssignment_0_1_1_2; }
-
+		
 		//QualifiedNameWithWildcard
 		public RuleCall getImportedNamespaceQualifiedNameWithWildcardParserRuleCall_0_1_1_2_0() { return cImportedNamespaceQualifiedNameWithWildcardParserRuleCall_0_1_1_2_0; }
-
-		//("ePackage" importedEPackage=UxEPackageImport) ";"?
+		
+		//("ePackage" importedEPackage=UxEPackageImport) ';'?
 		public Group getGroup_1() { return cGroup_1; }
-
+		
 		//"ePackage" importedEPackage=UxEPackageImport
 		public Group getGroup_1_0() { return cGroup_1_0; }
-
+		
 		//"ePackage"
 		public Keyword getEPackageKeyword_1_0_0() { return cEPackageKeyword_1_0_0; }
-
+		
 		//importedEPackage=UxEPackageImport
 		public Assignment getImportedEPackageAssignment_1_0_1() { return cImportedEPackageAssignment_1_0_1; }
-
+		
 		//UxEPackageImport
 		public RuleCall getImportedEPackageUxEPackageImportParserRuleCall_1_0_1_0() { return cImportedEPackageUxEPackageImportParserRuleCall_1_0_1_0; }
-
-		//";"?
+		
+		//';'?
 		public Keyword getSemicolonKeyword_1_1() { return cSemicolonKeyword_1_1; }
 	}
-
 	public class UxEPackageImportElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UxEPackageImport");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.UxEPackageImport");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Assignment cEPackageAssignment_0 = (Assignment)cGroup.eContents().get(0);
 		private final CrossReference cEPackageEPackageCrossReference_0_0 = (CrossReference)cEPackageAssignment_0.eContents().get(0);
@@ -319,34 +328,33 @@
 		private final Assignment cAliasAssignment_2 = (Assignment)cGroup.eContents().get(2);
 		private final RuleCall cAliasIDTerminalRuleCall_2_0 = (RuleCall)cAliasAssignment_2.eContents().get(0);
 		
-		//UxEPackageImport returns semantic::UxEPackageImport:
-		//	ePackage=[ecore::EPackage|STRING] "as" alias=ID;
-		public ParserRule getRule() { return rule; }
-
-		//ePackage=[ecore::EPackage|STRING] "as" alias=ID
+		//UxEPackageImport:
+		//	ePackage=[EPackage|STRING] 'as' alias=ID;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//ePackage=[EPackage|STRING] 'as' alias=ID
 		public Group getGroup() { return cGroup; }
-
-		//ePackage=[ecore::EPackage|STRING]
+		
+		//ePackage=[EPackage|STRING]
 		public Assignment getEPackageAssignment_0() { return cEPackageAssignment_0; }
-
-		//[ecore::EPackage|STRING]
+		
+		//[EPackage|STRING]
 		public CrossReference getEPackageEPackageCrossReference_0_0() { return cEPackageEPackageCrossReference_0_0; }
-
+		
 		//STRING
 		public RuleCall getEPackageEPackageSTRINGTerminalRuleCall_0_0_1() { return cEPackageEPackageSTRINGTerminalRuleCall_0_0_1; }
-
-		//"as"
+		
+		//'as'
 		public Keyword getAsKeyword_1() { return cAsKeyword_1; }
-
+		
 		//alias=ID
 		public Assignment getAliasAssignment_2() { return cAliasAssignment_2; }
-
+		
 		//ID
 		public RuleCall getAliasIDTerminalRuleCall_2_0() { return cAliasIDTerminalRuleCall_2_0; }
 	}
-
 	public class UxElementDefinitionElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UxElementDefinition");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.UxElementDefinition");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cElementKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
@@ -374,143 +382,146 @@
 		private final Keyword cRightCurlyBracketKeyword_6_3 = (Keyword)cGroup_6.eContents().get(3);
 		private final Keyword cRightCurlyBracketKeyword_7 = (Keyword)cGroup.eContents().get(7);
 		
-		//UxElementDefinition returns semantic::UxElementDefinition:
-		//	"element" name=ID "{" uri=UxElementURI? ("bindings" "{" bindingContainer=UxAvailableBindings "}")? ("visibility" "{"
-		//	visibilityContainer=UxAvailableVisibilityOptions "}")? ("validator" "{"
-		//	validatorContainer=UxAvailableValidatorProperties "}")? "}";
-		public ParserRule getRule() { return rule; }
-
-		//"element" name=ID "{" uri=UxElementURI? ("bindings" "{" bindingContainer=UxAvailableBindings "}")? ("visibility" "{"
-		//visibilityContainer=UxAvailableVisibilityOptions "}")? ("validator" "{"
-		//validatorContainer=UxAvailableValidatorProperties "}")? "}"
+		//UxElementDefinition:
+		//	'element' name=ID '{'
+		//	uri=UxElementURI? ('bindings' '{'
+		//	bindingContainer=UxAvailableBindings
+		//	'}')? ('visibility' '{'
+		//	visibilityContainer=UxAvailableVisibilityOptions
+		//	'}')? ('validator' '{'
+		//	validatorContainer=UxAvailableValidatorProperties
+		//	'}')?
+		//	'}';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'element' name=ID '{' uri=UxElementURI? ('bindings' '{' bindingContainer=UxAvailableBindings '}')? ('visibility' '{'
+		//visibilityContainer=UxAvailableVisibilityOptions '}')? ('validator' '{'
+		//validatorContainer=UxAvailableValidatorProperties '}')? '}'
 		public Group getGroup() { return cGroup; }
-
-		//"element"
+		
+		//'element'
 		public Keyword getElementKeyword_0() { return cElementKeyword_0; }
-
+		
 		//name=ID
 		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
-
+		
 		//uri=UxElementURI?
 		public Assignment getUriAssignment_3() { return cUriAssignment_3; }
-
+		
 		//UxElementURI
 		public RuleCall getUriUxElementURIParserRuleCall_3_0() { return cUriUxElementURIParserRuleCall_3_0; }
-
-		//("bindings" "{" bindingContainer=UxAvailableBindings "}")?
+		
+		//('bindings' '{' bindingContainer=UxAvailableBindings '}')?
 		public Group getGroup_4() { return cGroup_4; }
-
-		//"bindings"
+		
+		//'bindings'
 		public Keyword getBindingsKeyword_4_0() { return cBindingsKeyword_4_0; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4_1() { return cLeftCurlyBracketKeyword_4_1; }
-
+		
 		//bindingContainer=UxAvailableBindings
 		public Assignment getBindingContainerAssignment_4_2() { return cBindingContainerAssignment_4_2; }
-
+		
 		//UxAvailableBindings
 		public RuleCall getBindingContainerUxAvailableBindingsParserRuleCall_4_2_0() { return cBindingContainerUxAvailableBindingsParserRuleCall_4_2_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
-
-		//("visibility" "{" visibilityContainer=UxAvailableVisibilityOptions "}")?
+		
+		//('visibility' '{' visibilityContainer=UxAvailableVisibilityOptions '}')?
 		public Group getGroup_5() { return cGroup_5; }
-
-		//"visibility"
+		
+		//'visibility'
 		public Keyword getVisibilityKeyword_5_0() { return cVisibilityKeyword_5_0; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_5_1() { return cLeftCurlyBracketKeyword_5_1; }
-
+		
 		//visibilityContainer=UxAvailableVisibilityOptions
 		public Assignment getVisibilityContainerAssignment_5_2() { return cVisibilityContainerAssignment_5_2; }
-
+		
 		//UxAvailableVisibilityOptions
 		public RuleCall getVisibilityContainerUxAvailableVisibilityOptionsParserRuleCall_5_2_0() { return cVisibilityContainerUxAvailableVisibilityOptionsParserRuleCall_5_2_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_5_3() { return cRightCurlyBracketKeyword_5_3; }
-
-		//("validator" "{" validatorContainer=UxAvailableValidatorProperties "}")?
+		
+		//('validator' '{' validatorContainer=UxAvailableValidatorProperties '}')?
 		public Group getGroup_6() { return cGroup_6; }
-
-		//"validator"
+		
+		//'validator'
 		public Keyword getValidatorKeyword_6_0() { return cValidatorKeyword_6_0; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_6_1() { return cLeftCurlyBracketKeyword_6_1; }
-
+		
 		//validatorContainer=UxAvailableValidatorProperties
 		public Assignment getValidatorContainerAssignment_6_2() { return cValidatorContainerAssignment_6_2; }
-
+		
 		//UxAvailableValidatorProperties
 		public RuleCall getValidatorContainerUxAvailableValidatorPropertiesParserRuleCall_6_2_0() { return cValidatorContainerUxAvailableValidatorPropertiesParserRuleCall_6_2_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_6_3() { return cRightCurlyBracketKeyword_6_3; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_7() { return cRightCurlyBracketKeyword_7; }
 	}
-
 	public class UxAvailableValidatorPropertiesElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UxAvailableValidatorProperties");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.UxAvailableValidatorProperties");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUxAvailableValidatorPropertiesAction_0 = (Action)cGroup.eContents().get(0);
 		private final Assignment cPropertiesAssignment_1 = (Assignment)cGroup.eContents().get(1);
 		private final RuleCall cPropertiesUxValidatorPropertyParserRuleCall_1_0 = (RuleCall)cPropertiesAssignment_1.eContents().get(0);
 		
-		//UxAvailableValidatorProperties returns semantic::UxAvailableValidatorProperties:
-		//	{semantic::UxAvailableValidatorProperties} properties+=UxValidatorProperty*;
-		public ParserRule getRule() { return rule; }
-
-		//{semantic::UxAvailableValidatorProperties} properties+=UxValidatorProperty*
+		//UxAvailableValidatorProperties:
+		//	{UxAvailableValidatorProperties} properties+=UxValidatorProperty*;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UxAvailableValidatorProperties} properties+=UxValidatorProperty*
 		public Group getGroup() { return cGroup; }
-
-		//{semantic::UxAvailableValidatorProperties}
+		
+		//{UxAvailableValidatorProperties}
 		public Action getUxAvailableValidatorPropertiesAction_0() { return cUxAvailableValidatorPropertiesAction_0; }
-
+		
 		//properties+=UxValidatorProperty*
 		public Assignment getPropertiesAssignment_1() { return cPropertiesAssignment_1; }
-
+		
 		//UxValidatorProperty
 		public RuleCall getPropertiesUxValidatorPropertyParserRuleCall_1_0() { return cPropertiesUxValidatorPropertyParserRuleCall_1_0; }
 	}
-
 	public class UxValidatorPropertyElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UxValidatorProperty");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.UxValidatorProperty");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cPropertyKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
 		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
 		
-		//UxValidatorProperty returns semantic::UxValidatorProperty:
-		//	"property" name=ID;
-		public ParserRule getRule() { return rule; }
-
-		//"property" name=ID
+		//UxValidatorProperty:
+		//	'property' name=ID;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'property' name=ID
 		public Group getGroup() { return cGroup; }
-
-		//"property"
+		
+		//'property'
 		public Keyword getPropertyKeyword_0() { return cPropertyKeyword_0; }
-
+		
 		//name=ID
 		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
 	}
-
 	public class UxElementURIElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UxElementURI");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.UxElementURI");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cUriKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cEPackageAssignment_1 = (Assignment)cGroup.eContents().get(1);
@@ -521,88 +532,106 @@
 		private final CrossReference cEClassEClassCrossReference_3_0 = (CrossReference)cEClassAssignment_3.eContents().get(0);
 		private final RuleCall cEClassEClassIDTerminalRuleCall_3_0_1 = (RuleCall)cEClassEClassCrossReference_3_0.eContents().get(1);
 		
-		//UxElementURI returns semantic::UxElementURI:
-		//	"uri" ePackage=[semantic::UxEPackageImport] ":" eClass=[ecore::EClass];
-		public ParserRule getRule() { return rule; }
-
-		//"uri" ePackage=[semantic::UxEPackageImport] ":" eClass=[ecore::EClass]
+		//UxElementURI:
+		//	'uri' ePackage=[UxEPackageImport] ":" eClass=[EClass];
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'uri' ePackage=[UxEPackageImport] ":" eClass=[EClass]
 		public Group getGroup() { return cGroup; }
-
-		//"uri"
+		
+		//'uri'
 		public Keyword getUriKeyword_0() { return cUriKeyword_0; }
-
-		//ePackage=[semantic::UxEPackageImport]
+		
+		//ePackage=[UxEPackageImport]
 		public Assignment getEPackageAssignment_1() { return cEPackageAssignment_1; }
-
-		//[semantic::UxEPackageImport]
+		
+		//[UxEPackageImport]
 		public CrossReference getEPackageUxEPackageImportCrossReference_1_0() { return cEPackageUxEPackageImportCrossReference_1_0; }
-
+		
 		//ID
 		public RuleCall getEPackageUxEPackageImportIDTerminalRuleCall_1_0_1() { return cEPackageUxEPackageImportIDTerminalRuleCall_1_0_1; }
-
+		
 		//":"
 		public Keyword getColonKeyword_2() { return cColonKeyword_2; }
-
-		//eClass=[ecore::EClass]
+		
+		//eClass=[EClass]
 		public Assignment getEClassAssignment_3() { return cEClassAssignment_3; }
-
-		//[ecore::EClass]
+		
+		//[EClass]
 		public CrossReference getEClassEClassCrossReference_3_0() { return cEClassEClassCrossReference_3_0; }
-
+		
 		//ID
 		public RuleCall getEClassEClassIDTerminalRuleCall_3_0_1() { return cEClassEClassIDTerminalRuleCall_3_0_1; }
 	}
-
 	public class UxAvailableBindingsElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UxAvailableBindings");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.UxAvailableBindings");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUxAvailableBindingsAction_0 = (Action)cGroup.eContents().get(0);
-		private final Assignment cBindingsAssignment_1 = (Assignment)cGroup.eContents().get(1);
-		private final RuleCall cBindingsUxBindingableOptionParserRuleCall_1_0 = (RuleCall)cBindingsAssignment_1.eContents().get(0);
+		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
+		private final Keyword cExtendsKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
+		private final Assignment cSuperElementAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
+		private final CrossReference cSuperElementUxElementDefinitionCrossReference_1_1_0 = (CrossReference)cSuperElementAssignment_1_1.eContents().get(0);
+		private final RuleCall cSuperElementUxElementDefinitionIDTerminalRuleCall_1_1_0_1 = (RuleCall)cSuperElementUxElementDefinitionCrossReference_1_1_0.eContents().get(1);
+		private final Assignment cBindingsAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cBindingsUxBindingableOptionParserRuleCall_2_0 = (RuleCall)cBindingsAssignment_2.eContents().get(0);
 		
-		//UxAvailableBindings returns semantic::UxAvailableBindings:
-		//	{semantic::UxAvailableBindings} bindings+=UxBindingableOption*;
-		public ParserRule getRule() { return rule; }
-
-		//{semantic::UxAvailableBindings} bindings+=UxBindingableOption*
+		//UxAvailableBindings:
+		//	{UxAvailableBindings} ('extends' superElement=[UxElementDefinition])?
+		//	bindings+=UxBindingableOption*;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UxAvailableBindings} ('extends' superElement=[UxElementDefinition])? bindings+=UxBindingableOption*
 		public Group getGroup() { return cGroup; }
-
-		//{semantic::UxAvailableBindings}
+		
+		//{UxAvailableBindings}
 		public Action getUxAvailableBindingsAction_0() { return cUxAvailableBindingsAction_0; }
-
+		
+		//('extends' superElement=[UxElementDefinition])?
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//'extends'
+		public Keyword getExtendsKeyword_1_0() { return cExtendsKeyword_1_0; }
+		
+		//superElement=[UxElementDefinition]
+		public Assignment getSuperElementAssignment_1_1() { return cSuperElementAssignment_1_1; }
+		
+		//[UxElementDefinition]
+		public CrossReference getSuperElementUxElementDefinitionCrossReference_1_1_0() { return cSuperElementUxElementDefinitionCrossReference_1_1_0; }
+		
+		//ID
+		public RuleCall getSuperElementUxElementDefinitionIDTerminalRuleCall_1_1_0_1() { return cSuperElementUxElementDefinitionIDTerminalRuleCall_1_1_0_1; }
+		
 		//bindings+=UxBindingableOption*
-		public Assignment getBindingsAssignment_1() { return cBindingsAssignment_1; }
-
+		public Assignment getBindingsAssignment_2() { return cBindingsAssignment_2; }
+		
 		//UxBindingableOption
-		public RuleCall getBindingsUxBindingableOptionParserRuleCall_1_0() { return cBindingsUxBindingableOptionParserRuleCall_1_0; }
+		public RuleCall getBindingsUxBindingableOptionParserRuleCall_2_0() { return cBindingsUxBindingableOptionParserRuleCall_2_0; }
 	}
-
 	public class UxAvailableVisibilityOptionsElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UxAvailableVisibilityOptions");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.UxAvailableVisibilityOptions");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cUxAvailableVisibilityOptionsAction_0 = (Action)cGroup.eContents().get(0);
 		private final Assignment cBindingsAssignment_1 = (Assignment)cGroup.eContents().get(1);
 		private final RuleCall cBindingsUxVisibleableOptionParserRuleCall_1_0 = (RuleCall)cBindingsAssignment_1.eContents().get(0);
 		
-		//UxAvailableVisibilityOptions returns semantic::UxAvailableVisibilityOptions:
-		//	{semantic::UxAvailableVisibilityOptions} bindings+=UxVisibleableOption*;
-		public ParserRule getRule() { return rule; }
-
-		//{semantic::UxAvailableVisibilityOptions} bindings+=UxVisibleableOption*
+		//UxAvailableVisibilityOptions:
+		//	{UxAvailableVisibilityOptions} bindings+=UxVisibleableOption*;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{UxAvailableVisibilityOptions} bindings+=UxVisibleableOption*
 		public Group getGroup() { return cGroup; }
-
-		//{semantic::UxAvailableVisibilityOptions}
+		
+		//{UxAvailableVisibilityOptions}
 		public Action getUxAvailableVisibilityOptionsAction_0() { return cUxAvailableVisibilityOptionsAction_0; }
-
+		
 		//bindings+=UxVisibleableOption*
 		public Assignment getBindingsAssignment_1() { return cBindingsAssignment_1; }
-
+		
 		//UxVisibleableOption
 		public RuleCall getBindingsUxVisibleableOptionParserRuleCall_1_0() { return cBindingsUxVisibleableOptionParserRuleCall_1_0; }
 	}
-
 	public class UxBindingableOptionElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UxBindingableOption");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.UxBindingableOption");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Assignment cFinalAssignment_0 = (Assignment)cGroup.eContents().get(0);
 		private final Keyword cFinalFinalKeyword_0_0 = (Keyword)cFinalAssignment_0.eContents().get(0);
@@ -618,55 +647,54 @@
 		private final Assignment cTargetNameAssignment_5_1 = (Assignment)cGroup_5.eContents().get(1);
 		private final RuleCall cTargetNameIDTerminalRuleCall_5_1_0 = (RuleCall)cTargetNameAssignment_5_1.eContents().get(0);
 		
-		//UxBindingableOption returns semantic::UxBindingableOption:
-		//	final?="final"? listbinding?="list"? "endpoint" name=ID jvmType=JvmTypeReference ("target" targetName=ID)?;
-		public ParserRule getRule() { return rule; }
-
-		//final?="final"? listbinding?="list"? "endpoint" name=ID jvmType=JvmTypeReference ("target" targetName=ID)?
+		//UxBindingableOption:
+		//	final?='final'? listbinding?='list'? 'endpoint' name=ID jvmType=JvmTypeReference ('target' targetName=ID)?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//final?='final'? listbinding?='list'? 'endpoint' name=ID jvmType=JvmTypeReference ('target' targetName=ID)?
 		public Group getGroup() { return cGroup; }
-
-		//final?="final"?
+		
+		//final?='final'?
 		public Assignment getFinalAssignment_0() { return cFinalAssignment_0; }
-
-		//"final"
+		
+		//'final'
 		public Keyword getFinalFinalKeyword_0_0() { return cFinalFinalKeyword_0_0; }
-
-		//listbinding?="list"?
+		
+		//listbinding?='list'?
 		public Assignment getListbindingAssignment_1() { return cListbindingAssignment_1; }
-
-		//"list"
+		
+		//'list'
 		public Keyword getListbindingListKeyword_1_0() { return cListbindingListKeyword_1_0; }
-
-		//"endpoint"
+		
+		//'endpoint'
 		public Keyword getEndpointKeyword_2() { return cEndpointKeyword_2; }
-
+		
 		//name=ID
 		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
-
+		
 		//jvmType=JvmTypeReference
 		public Assignment getJvmTypeAssignment_4() { return cJvmTypeAssignment_4; }
-
+		
 		//JvmTypeReference
 		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_4_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_4_0; }
-
-		//("target" targetName=ID)?
+		
+		//('target' targetName=ID)?
 		public Group getGroup_5() { return cGroup_5; }
-
-		//"target"
+		
+		//'target'
 		public Keyword getTargetKeyword_5_0() { return cTargetKeyword_5_0; }
-
+		
 		//targetName=ID
 		public Assignment getTargetNameAssignment_5_1() { return cTargetNameAssignment_5_1; }
-
+		
 		//ID
 		public RuleCall getTargetNameIDTerminalRuleCall_5_1_0() { return cTargetNameIDTerminalRuleCall_5_1_0; }
 	}
-
 	public class UxVisibleableOptionElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UxVisibleableOption");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar.UxVisibleableOption");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cEndpointKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
@@ -674,25 +702,25 @@
 		private final Assignment cJvmTypeAssignment_2 = (Assignment)cGroup.eContents().get(2);
 		private final RuleCall cJvmTypeJvmTypeReferenceParserRuleCall_2_0 = (RuleCall)cJvmTypeAssignment_2.eContents().get(0);
 		
-		//UxVisibleableOption returns semantic::UxVisibleableOption:
-		//	"endpoint" name=ID jvmType=JvmTypeReference;
-		public ParserRule getRule() { return rule; }
-
-		//"endpoint" name=ID jvmType=JvmTypeReference
+		//UxVisibleableOption:
+		//	'endpoint' name=ID jvmType=JvmTypeReference;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'endpoint' name=ID jvmType=JvmTypeReference
 		public Group getGroup() { return cGroup; }
-
-		//"endpoint"
+		
+		//'endpoint'
 		public Keyword getEndpointKeyword_0() { return cEndpointKeyword_0; }
-
+		
 		//name=ID
 		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
-
+		
 		//ID
 		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
-
+		
 		//jvmType=JvmTypeReference
 		public Assignment getJvmTypeAssignment_2() { return cJvmTypeAssignment_2; }
-
+		
 		//JvmTypeReference
 		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_2_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_2_0; }
 	}
@@ -713,14 +741,18 @@
 	private final UxVisibleableOptionElements pUxVisibleableOption;
 	
 	private final Grammar grammar;
-
+	
 	private final XbaseGrammarAccess gaXbase;
+	
+	private final XtypeGrammarAccess gaXtype;
 
 	@Inject
 	public UISemanticsGrammarGrammarAccess(GrammarProvider grammarProvider,
-		XbaseGrammarAccess gaXbase) {
+			XbaseGrammarAccess gaXbase,
+			XtypeGrammarAccess gaXtype) {
 		this.grammar = internalFindGrammar(grammarProvider);
 		this.gaXbase = gaXbase;
+		this.gaXtype = gaXtype;
 		this.pUxModel = new UxModelElements();
 		this.pUxAction = new UxActionElements();
 		this.pUxViewCategory = new UxViewCategoryElements();
@@ -752,20 +784,28 @@
 		return grammar;
 	}
 	
-	
+	@Override
 	public Grammar getGrammar() {
 		return grammar;
 	}
 	
-
+	
 	public XbaseGrammarAccess getXbaseGrammarAccess() {
 		return gaXbase;
 	}
+	
+	public XtypeGrammarAccess getXtypeGrammarAccess() {
+		return gaXtype;
+	}
 
 	
-	//UxModel returns semantic::UxModel:
-	//	{semantic::UxModel} importSection=XImportSection? ("actions" "{" viewActions+=UxAction* "}")? ("categories" "{"
-	//	categories+=UxViewCategory* "}")? elementDefinitions+=UxElementDefinition*;
+	//UxModel:
+	//	{UxModel} importSection=XImportSection? ('actions' '{'
+	//	viewActions+=UxAction*
+	//	'}')? ('categories' '{'
+	//	categories+=UxViewCategory*
+	//	'}')?
+	//	elementDefinitions+=UxElementDefinition*;
 	public UxModelElements getUxModelAccess() {
 		return pUxModel;
 	}
@@ -773,9 +813,9 @@
 	public ParserRule getUxModelRule() {
 		return getUxModelAccess().getRule();
 	}
-
-	//UxAction returns semantic::UxAction:
-	//	name=QualifiedName ("externalCommand" externalCommandId=STRING)? initialDisabled?="disabled"?;
+	
+	//UxAction:
+	//	name=QualifiedName ('externalCommand' externalCommandId=STRING)? initialDisabled?="disabled"?;
 	public UxActionElements getUxActionAccess() {
 		return pUxAction;
 	}
@@ -783,8 +823,8 @@
 	public ParserRule getUxActionRule() {
 		return getUxActionAccess().getRule();
 	}
-
-	//UxViewCategory returns semantic::UxViewCategory:
+	
+	//UxViewCategory:
 	//	name=QualifiedName;
 	public UxViewCategoryElements getUxViewCategoryAccess() {
 		return pUxViewCategory;
@@ -793,12 +833,12 @@
 	public ParserRule getUxViewCategoryRule() {
 		return getUxViewCategoryAccess().getRule();
 	}
-
-	//XImportDeclaration returns semantic::UxImportSectionDeclaration:
-	//	{semantic::UxImportSectionDeclaration} ("import" (static?="static" extension?="extension"?
-	//	importedType=[JvmDeclaredType|QualifiedNameInStaticImport] (wildcard?="*" | memberName=ValidID) |
+	
+	//XImportDeclaration UxImportSectionDeclaration:
+	//	{UxImportSectionDeclaration} ('import' (static?='static' extension?='extension'?
+	//	importedType=[JvmDeclaredType|QualifiedNameInStaticImport] (wildcard?='*' | memberName=ValidID) |
 	//	importedType=[JvmDeclaredType|QualifiedName] | importedNamespace=QualifiedNameWithWildcard)) | ("ePackage"
-	//	importedEPackage=UxEPackageImport) ";"?;
+	//	importedEPackage=UxEPackageImport) ';'?;
 	public XImportDeclarationElements getXImportDeclarationAccess() {
 		return pXImportDeclaration;
 	}
@@ -806,9 +846,9 @@
 	public ParserRule getXImportDeclarationRule() {
 		return getXImportDeclarationAccess().getRule();
 	}
-
-	//UxEPackageImport returns semantic::UxEPackageImport:
-	//	ePackage=[ecore::EPackage|STRING] "as" alias=ID;
+	
+	//UxEPackageImport:
+	//	ePackage=[EPackage|STRING] 'as' alias=ID;
 	public UxEPackageImportElements getUxEPackageImportAccess() {
 		return pUxEPackageImport;
 	}
@@ -816,11 +856,17 @@
 	public ParserRule getUxEPackageImportRule() {
 		return getUxEPackageImportAccess().getRule();
 	}
-
-	//UxElementDefinition returns semantic::UxElementDefinition:
-	//	"element" name=ID "{" uri=UxElementURI? ("bindings" "{" bindingContainer=UxAvailableBindings "}")? ("visibility" "{"
-	//	visibilityContainer=UxAvailableVisibilityOptions "}")? ("validator" "{"
-	//	validatorContainer=UxAvailableValidatorProperties "}")? "}";
+	
+	//UxElementDefinition:
+	//	'element' name=ID '{'
+	//	uri=UxElementURI? ('bindings' '{'
+	//	bindingContainer=UxAvailableBindings
+	//	'}')? ('visibility' '{'
+	//	visibilityContainer=UxAvailableVisibilityOptions
+	//	'}')? ('validator' '{'
+	//	validatorContainer=UxAvailableValidatorProperties
+	//	'}')?
+	//	'}';
 	public UxElementDefinitionElements getUxElementDefinitionAccess() {
 		return pUxElementDefinition;
 	}
@@ -828,9 +874,9 @@
 	public ParserRule getUxElementDefinitionRule() {
 		return getUxElementDefinitionAccess().getRule();
 	}
-
-	//UxAvailableValidatorProperties returns semantic::UxAvailableValidatorProperties:
-	//	{semantic::UxAvailableValidatorProperties} properties+=UxValidatorProperty*;
+	
+	//UxAvailableValidatorProperties:
+	//	{UxAvailableValidatorProperties} properties+=UxValidatorProperty*;
 	public UxAvailableValidatorPropertiesElements getUxAvailableValidatorPropertiesAccess() {
 		return pUxAvailableValidatorProperties;
 	}
@@ -838,9 +884,9 @@
 	public ParserRule getUxAvailableValidatorPropertiesRule() {
 		return getUxAvailableValidatorPropertiesAccess().getRule();
 	}
-
-	//UxValidatorProperty returns semantic::UxValidatorProperty:
-	//	"property" name=ID;
+	
+	//UxValidatorProperty:
+	//	'property' name=ID;
 	public UxValidatorPropertyElements getUxValidatorPropertyAccess() {
 		return pUxValidatorProperty;
 	}
@@ -848,9 +894,9 @@
 	public ParserRule getUxValidatorPropertyRule() {
 		return getUxValidatorPropertyAccess().getRule();
 	}
-
-	//UxElementURI returns semantic::UxElementURI:
-	//	"uri" ePackage=[semantic::UxEPackageImport] ":" eClass=[ecore::EClass];
+	
+	//UxElementURI:
+	//	'uri' ePackage=[UxEPackageImport] ":" eClass=[EClass];
 	public UxElementURIElements getUxElementURIAccess() {
 		return pUxElementURI;
 	}
@@ -858,9 +904,10 @@
 	public ParserRule getUxElementURIRule() {
 		return getUxElementURIAccess().getRule();
 	}
-
-	//UxAvailableBindings returns semantic::UxAvailableBindings:
-	//	{semantic::UxAvailableBindings} bindings+=UxBindingableOption*;
+	
+	//UxAvailableBindings:
+	//	{UxAvailableBindings} ('extends' superElement=[UxElementDefinition])?
+	//	bindings+=UxBindingableOption*;
 	public UxAvailableBindingsElements getUxAvailableBindingsAccess() {
 		return pUxAvailableBindings;
 	}
@@ -868,9 +915,9 @@
 	public ParserRule getUxAvailableBindingsRule() {
 		return getUxAvailableBindingsAccess().getRule();
 	}
-
-	//UxAvailableVisibilityOptions returns semantic::UxAvailableVisibilityOptions:
-	//	{semantic::UxAvailableVisibilityOptions} bindings+=UxVisibleableOption*;
+	
+	//UxAvailableVisibilityOptions:
+	//	{UxAvailableVisibilityOptions} bindings+=UxVisibleableOption*;
 	public UxAvailableVisibilityOptionsElements getUxAvailableVisibilityOptionsAccess() {
 		return pUxAvailableVisibilityOptions;
 	}
@@ -878,9 +925,9 @@
 	public ParserRule getUxAvailableVisibilityOptionsRule() {
 		return getUxAvailableVisibilityOptionsAccess().getRule();
 	}
-
-	//UxBindingableOption returns semantic::UxBindingableOption:
-	//	final?="final"? listbinding?="list"? "endpoint" name=ID jvmType=JvmTypeReference ("target" targetName=ID)?;
+	
+	//UxBindingableOption:
+	//	final?='final'? listbinding?='list'? 'endpoint' name=ID jvmType=JvmTypeReference ('target' targetName=ID)?;
 	public UxBindingableOptionElements getUxBindingableOptionAccess() {
 		return pUxBindingableOption;
 	}
@@ -888,9 +935,9 @@
 	public ParserRule getUxBindingableOptionRule() {
 		return getUxBindingableOptionAccess().getRule();
 	}
-
-	//UxVisibleableOption returns semantic::UxVisibleableOption:
-	//	"endpoint" name=ID jvmType=JvmTypeReference;
+	
+	//UxVisibleableOption:
+	//	'endpoint' name=ID jvmType=JvmTypeReference;
 	public UxVisibleableOptionElements getUxVisibleableOptionAccess() {
 		return pUxVisibleableOption;
 	}
@@ -898,7 +945,7 @@
 	public ParserRule getUxVisibleableOptionRule() {
 		return getUxVisibleableOptionAccess().getRule();
 	}
-
+	
 	//XExpression:
 	//	XAssignment;
 	public XbaseGrammarAccess.XExpressionElements getXExpressionAccess() {
@@ -908,8 +955,8 @@
 	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)?;
@@ -920,9 +967,9 @@
 	public ParserRule getXAssignmentRule() {
 		return getXAssignmentAccess().getRule();
 	}
-
+	
 	//OpSingleAssign:
-	//	"=";
+	//	'=';
 	public XbaseGrammarAccess.OpSingleAssignElements getOpSingleAssignAccess() {
 		return gaXbase.getOpSingleAssignAccess();
 	}
@@ -930,9 +977,11 @@
 	public ParserRule getOpSingleAssignRule() {
 		return getOpSingleAssignAccess().getRule();
 	}
-
+	
 	//OpMultiAssign:
-	//	"+=" | "-=" | "*=" | "/=" | "%=" | "<" "<" "=" | ">" ">"? ">=";
+	//	'+=' | '-=' | '*=' | '/=' | '%=' |
+	//	'<' '<' '=' |
+	//	'>' '>'? '>=';
 	public XbaseGrammarAccess.OpMultiAssignElements getOpMultiAssignAccess() {
 		return gaXbase.getOpMultiAssignAccess();
 	}
@@ -940,8 +989,8 @@
 	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() {
@@ -951,9 +1000,9 @@
 	public ParserRule getXOrExpressionRule() {
 		return getXOrExpressionAccess().getRule();
 	}
-
+	
 	//OpOr:
-	//	"||";
+	//	'||';
 	public XbaseGrammarAccess.OpOrElements getOpOrAccess() {
 		return gaXbase.getOpOrAccess();
 	}
@@ -961,8 +1010,8 @@
 	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() {
@@ -972,9 +1021,9 @@
 	public ParserRule getXAndExpressionRule() {
 		return getXAndExpressionAccess().getRule();
 	}
-
+	
 	//OpAnd:
-	//	"&&";
+	//	'&&';
 	public XbaseGrammarAccess.OpAndElements getOpAndAccess() {
 		return gaXbase.getOpAndAccess();
 	}
@@ -982,8 +1031,8 @@
 	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() {
@@ -993,9 +1042,9 @@
 	public ParserRule getXEqualityExpressionRule() {
 		return getXEqualityExpressionAccess().getRule();
 	}
-
+	
 	//OpEquality:
-	//	"==" | "!=" | "===" | "!==";
+	//	'==' | '!=' | '===' | '!==';
 	public XbaseGrammarAccess.OpEqualityElements getOpEqualityAccess() {
 		return gaXbase.getOpEqualityAccess();
 	}
@@ -1003,10 +1052,10 @@
 	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 gaXbase.getXRelationalExpressionAccess();
@@ -1015,9 +1064,9 @@
 	public ParserRule getXRelationalExpressionRule() {
 		return getXRelationalExpressionAccess().getRule();
 	}
-
+	
 	//OpCompare:
-	//	">=" | "<" "=" | ">" | "<";
+	//	'>=' | '<' '=' | '>' | '<';
 	public XbaseGrammarAccess.OpCompareElements getOpCompareAccess() {
 		return gaXbase.getOpCompareAccess();
 	}
@@ -1025,8 +1074,8 @@
 	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() {
@@ -1036,9 +1085,15 @@
 	public ParserRule getXOtherOperatorExpressionRule() {
 		return getXOtherOperatorExpressionAccess().getRule();
 	}
-
+	
 	//OpOther:
-	//	"->" | "..<" | ">" ".." | ".." | "=>" | ">" (=> (">" ">") | ">") | "<" (=> ("<" "<") | "<" | "=>") | "<>" | "?:";
+	//	'->'
+	//	| '..<'
+	//	| '>' '..'
+	//	| '..'
+	//	| '=>'
+	//	| '>' (=> ('>' '>') | '>') | '<' (=> ('<' '<') | '<' | '=>') | '<>'
+	//	| '?:';
 	public XbaseGrammarAccess.OpOtherElements getOpOtherAccess() {
 		return gaXbase.getOpOtherAccess();
 	}
@@ -1046,8 +1101,8 @@
 	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() {
@@ -1057,9 +1112,9 @@
 	public ParserRule getXAdditiveExpressionRule() {
 		return getXAdditiveExpressionAccess().getRule();
 	}
-
+	
 	//OpAdd:
-	//	"+" | "-";
+	//	'+' | '-';
 	public XbaseGrammarAccess.OpAddElements getOpAddAccess() {
 		return gaXbase.getOpAddAccess();
 	}
@@ -1067,8 +1122,8 @@
 	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() {
@@ -1078,9 +1133,9 @@
 	public ParserRule getXMultiplicativeExpressionRule() {
 		return getXMultiplicativeExpressionAccess().getRule();
 	}
-
+	
 	//OpMulti:
-	//	"*" | "**" | "/" | "%";
+	//	'*' | '**' | '/' | '%';
 	public XbaseGrammarAccess.OpMultiElements getOpMultiAccess() {
 		return gaXbase.getOpMultiAccess();
 	}
@@ -1088,9 +1143,10 @@
 	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 gaXbase.getXUnaryOperationAccess();
 	}
@@ -1098,7 +1154,7 @@
 	public ParserRule getXUnaryOperationRule() {
 		return getXUnaryOperationAccess().getRule();
 	}
-
+	
 	//OpUnary:
 	//	"!" | "-" | "+";
 	public XbaseGrammarAccess.OpUnaryElements getOpUnaryAccess() {
@@ -1108,9 +1164,9 @@
 	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 gaXbase.getXCastedExpressionAccess();
 	}
@@ -1118,8 +1174,8 @@
 	public ParserRule getXCastedExpressionRule() {
 		return getXCastedExpressionAccess().getRule();
 	}
-
-	//XPostfixOperation returns XExpression:
+	
+	//XPostfixOperation XExpression:
 	//	XMemberFeatureCall => ({XPostfixOperation.operand=current} feature=[types::JvmIdentifiableElement|OpPostfix])?;
 	public XbaseGrammarAccess.XPostfixOperationElements getXPostfixOperationAccess() {
 		return gaXbase.getXPostfixOperationAccess();
@@ -1128,7 +1184,7 @@
 	public ParserRule getXPostfixOperationRule() {
 		return getXPostfixOperationAccess().getRule();
 	}
-
+	
 	//OpPostfix:
 	//	"++" | "--";
 	public XbaseGrammarAccess.OpPostfixElements getOpPostfixAccess() {
@@ -1138,14 +1194,16 @@
 	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 gaXbase.getXMemberFeatureCallAccess();
 	}
@@ -1153,8 +1211,8 @@
 	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;
@@ -1165,8 +1223,8 @@
 	public ParserRule getXPrimaryExpressionRule() {
 		return getXPrimaryExpressionAccess().getRule();
 	}
-
-	//XLiteral returns XExpression:
+	
+	//XLiteral XExpression:
 	//	XCollectionLiteral | XClosure | XBooleanLiteral | XNumberLiteral | XNullLiteral | XStringLiteral | XTypeLiteral;
 	public XbaseGrammarAccess.XLiteralElements getXLiteralAccess() {
 		return gaXbase.getXLiteralAccess();
@@ -1175,7 +1233,7 @@
 	public ParserRule getXLiteralRule() {
 		return getXLiteralAccess().getRule();
 	}
-
+	
 	//XCollectionLiteral:
 	//	XSetLiteral | XListLiteral;
 	public XbaseGrammarAccess.XCollectionLiteralElements getXCollectionLiteralAccess() {
@@ -1185,9 +1243,9 @@
 	public ParserRule getXCollectionLiteralRule() {
 		return getXCollectionLiteralAccess().getRule();
 	}
-
+	
 	//XSetLiteral:
-	//	{XSetLiteral} "#" "{" (elements+=XExpression ("," elements+=XExpression)*)? "}";
+	//	{XSetLiteral} '#' '{' (elements+=XExpression (',' elements+=XExpression)*)? '}';
 	public XbaseGrammarAccess.XSetLiteralElements getXSetLiteralAccess() {
 		return gaXbase.getXSetLiteralAccess();
 	}
@@ -1195,9 +1253,9 @@
 	public ParserRule getXSetLiteralRule() {
 		return getXSetLiteralAccess().getRule();
 	}
-
+	
 	//XListLiteral:
-	//	{XListLiteral} "#" "[" (elements+=XExpression ("," elements+=XExpression)*)? "]";
+	//	{XListLiteral} '#' '[' (elements+=XExpression (',' elements+=XExpression)*)? ']';
 	public XbaseGrammarAccess.XListLiteralElements getXListLiteralAccess() {
 		return gaXbase.getXListLiteralAccess();
 	}
@@ -1205,10 +1263,14 @@
 	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 gaXbase.getXClosureAccess();
 	}
@@ -1216,9 +1278,9 @@
 	public ParserRule getXClosureRule() {
 		return getXClosureAccess().getRule();
 	}
-
-	//XExpressionInClosure returns XExpression:
-	//	{XBlockExpression} (expressions+=XExpressionOrVarDeclaration ";"?)*;
+	
+	//XExpressionInClosure XExpression:
+	//	{XBlockExpression} (expressions+=XExpressionOrVarDeclaration ';'?)*;
 	public XbaseGrammarAccess.XExpressionInClosureElements getXExpressionInClosureAccess() {
 		return gaXbase.getXExpressionInClosureAccess();
 	}
@@ -1226,10 +1288,10 @@
 	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 gaXbase.getXShortClosureAccess();
 	}
@@ -1237,9 +1299,9 @@
 	public ParserRule getXShortClosureRule() {
 		return getXShortClosureAccess().getRule();
 	}
-
-	//XParenthesizedExpression returns XExpression:
-	//	"(" XExpression ")";
+	
+	//XParenthesizedExpression XExpression:
+	//	'(' XExpression ')';
 	public XbaseGrammarAccess.XParenthesizedExpressionElements getXParenthesizedExpressionAccess() {
 		return gaXbase.getXParenthesizedExpressionAccess();
 	}
@@ -1247,9 +1309,11 @@
 	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 gaXbase.getXIfExpressionAccess();
 	}
@@ -1257,11 +1321,13 @@
 	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 gaXbase.getXSwitchExpressionAccess();
 	}
@@ -1269,9 +1335,9 @@
 	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 gaXbase.getXCasePartAccess();
 	}
@@ -1279,9 +1345,10 @@
 	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 gaXbase.getXForLoopExpressionAccess();
@@ -1290,11 +1357,12 @@
 	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 gaXbase.getXBasicForLoopExpressionAccess();
 	}
@@ -1302,9 +1370,11 @@
 	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 gaXbase.getXWhileExpressionAccess();
 	}
@@ -1312,9 +1382,12 @@
 	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 gaXbase.getXDoWhileExpressionAccess();
 	}
@@ -1322,9 +1395,11 @@
 	public ParserRule getXDoWhileExpressionRule() {
 		return getXDoWhileExpressionAccess().getRule();
 	}
-
-	//XBlockExpression returns XExpression:
-	//	{XBlockExpression} "{" (expressions+=XExpressionOrVarDeclaration ";"?)* "}";
+	
+	//XBlockExpression XExpression:
+	//	{XBlockExpression}
+	//	'{' (expressions+=XExpressionOrVarDeclaration ';'?)*
+	//	'}';
 	public XbaseGrammarAccess.XBlockExpressionElements getXBlockExpressionAccess() {
 		return gaXbase.getXBlockExpressionAccess();
 	}
@@ -1332,8 +1407,8 @@
 	public ParserRule getXBlockExpressionRule() {
 		return getXBlockExpressionAccess().getRule();
 	}
-
-	//XExpressionOrVarDeclaration returns XExpression:
+	
+	//XExpressionOrVarDeclaration XExpression:
 	//	XVariableDeclaration | XExpression;
 	public XbaseGrammarAccess.XExpressionOrVarDeclarationElements getXExpressionOrVarDeclarationAccess() {
 		return gaXbase.getXExpressionOrVarDeclarationAccess();
@@ -1342,9 +1417,9 @@
 	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 gaXbase.getXVariableDeclarationAccess();
@@ -1353,8 +1428,8 @@
 	public ParserRule getXVariableDeclarationRule() {
 		return getXVariableDeclarationAccess().getRule();
 	}
-
-	//JvmFormalParameter returns types::JvmFormalParameter:
+	
+	//JvmFormalParameter types::JvmFormalParameter:
 	//	parameterType=JvmTypeReference? name=ValidID;
 	public XbaseGrammarAccess.JvmFormalParameterElements getJvmFormalParameterAccess() {
 		return gaXbase.getJvmFormalParameterAccess();
@@ -1363,8 +1438,8 @@
 	public ParserRule getJvmFormalParameterRule() {
 		return getJvmFormalParameterAccess().getRule();
 	}
-
-	//FullJvmFormalParameter returns types::JvmFormalParameter:
+	
+	//FullJvmFormalParameter types::JvmFormalParameter:
 	//	parameterType=JvmTypeReference name=ValidID;
 	public XbaseGrammarAccess.FullJvmFormalParameterElements getFullJvmFormalParameterAccess() {
 		return gaXbase.getFullJvmFormalParameterAccess();
@@ -1373,11 +1448,13 @@
 	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 gaXbase.getXFeatureCallAccess();
 	}
@@ -1385,9 +1462,9 @@
 	public ParserRule getXFeatureCallRule() {
 		return getXFeatureCallAccess().getRule();
 	}
-
+	
 	//FeatureCallID:
-	//	ValidID | "extends" | "static" | "import" | "extension";
+	//	ValidID | 'extends' | 'static' | 'import' | 'extension';
 	public XbaseGrammarAccess.FeatureCallIDElements getFeatureCallIDAccess() {
 		return gaXbase.getFeatureCallIDAccess();
 	}
@@ -1395,9 +1472,9 @@
 	public ParserRule getFeatureCallIDRule() {
 		return getFeatureCallIDAccess().getRule();
 	}
-
+	
 	//IdOrSuper:
-	//	FeatureCallID | "super";
+	//	FeatureCallID | 'super';
 	public XbaseGrammarAccess.IdOrSuperElements getIdOrSuperAccess() {
 		return gaXbase.getIdOrSuperAccess();
 	}
@@ -1405,11 +1482,13 @@
 	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 gaXbase.getXConstructorCallAccess();
@@ -1418,9 +1497,9 @@
 	public ParserRule getXConstructorCallRule() {
 		return getXConstructorCallAccess().getRule();
 	}
-
-	//XBooleanLiteral returns XExpression:
-	//	{XBooleanLiteral} ("false" | isTrue?="true");
+	
+	//XBooleanLiteral XExpression:
+	//	{XBooleanLiteral} ('false' | isTrue?='true');
 	public XbaseGrammarAccess.XBooleanLiteralElements getXBooleanLiteralAccess() {
 		return gaXbase.getXBooleanLiteralAccess();
 	}
@@ -1428,9 +1507,9 @@
 	public ParserRule getXBooleanLiteralRule() {
 		return getXBooleanLiteralAccess().getRule();
 	}
-
-	//XNullLiteral returns XExpression:
-	//	{XNullLiteral} "null";
+	
+	//XNullLiteral XExpression:
+	//	{XNullLiteral} 'null';
 	public XbaseGrammarAccess.XNullLiteralElements getXNullLiteralAccess() {
 		return gaXbase.getXNullLiteralAccess();
 	}
@@ -1438,8 +1517,8 @@
 	public ParserRule getXNullLiteralRule() {
 		return getXNullLiteralAccess().getRule();
 	}
-
-	//XNumberLiteral returns XExpression:
+	
+	//XNumberLiteral XExpression:
 	//	{XNumberLiteral} value=Number;
 	public XbaseGrammarAccess.XNumberLiteralElements getXNumberLiteralAccess() {
 		return gaXbase.getXNumberLiteralAccess();
@@ -1448,8 +1527,8 @@
 	public ParserRule getXNumberLiteralRule() {
 		return getXNumberLiteralAccess().getRule();
 	}
-
-	//XStringLiteral returns XExpression:
+	
+	//XStringLiteral XExpression:
 	//	{XStringLiteral} value=STRING;
 	public XbaseGrammarAccess.XStringLiteralElements getXStringLiteralAccess() {
 		return gaXbase.getXStringLiteralAccess();
@@ -1458,9 +1537,9 @@
 	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 gaXbase.getXTypeLiteralAccess();
 	}
@@ -1468,9 +1547,9 @@
 	public ParserRule getXTypeLiteralRule() {
 		return getXTypeLiteralAccess().getRule();
 	}
-
-	//XThrowExpression returns XExpression:
-	//	{XThrowExpression} "throw" expression=XExpression;
+	
+	//XThrowExpression XExpression:
+	//	{XThrowExpression} 'throw' expression=XExpression;
 	public XbaseGrammarAccess.XThrowExpressionElements getXThrowExpressionAccess() {
 		return gaXbase.getXThrowExpressionAccess();
 	}
@@ -1478,9 +1557,9 @@
 	public ParserRule getXThrowExpressionRule() {
 		return getXThrowExpressionAccess().getRule();
 	}
-
-	//XReturnExpression returns XExpression:
-	//	{XReturnExpression} "return" -> expression=XExpression?;
+	
+	//XReturnExpression XExpression:
+	//	{XReturnExpression} 'return' -> expression=XExpression?;
 	public XbaseGrammarAccess.XReturnExpressionElements getXReturnExpressionAccess() {
 		return gaXbase.getXReturnExpressionAccess();
 	}
@@ -1488,10 +1567,12 @@
 	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 gaXbase.getXTryCatchFinallyExpressionAccess();
 	}
@@ -1499,9 +1580,10 @@
 	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 gaXbase.getXSynchronizedExpressionAccess();
 	}
@@ -1509,9 +1591,9 @@
 	public ParserRule getXSynchronizedExpressionRule() {
 		return getXSynchronizedExpressionAccess().getRule();
 	}
-
+	
 	//XCatchClause:
-	//	"catch" "(" declaredParam=FullJvmFormalParameter ")" expression=XExpression;
+	//	=> 'catch' '(' declaredParam=FullJvmFormalParameter ')' expression=XExpression;
 	public XbaseGrammarAccess.XCatchClauseElements getXCatchClauseAccess() {
 		return gaXbase.getXCatchClauseAccess();
 	}
@@ -1519,9 +1601,9 @@
 	public ParserRule getXCatchClauseRule() {
 		return getXCatchClauseAccess().getRule();
 	}
-
+	
 	//QualifiedName:
-	//	ValidID ("." ValidID)*;
+	//	ValidID (=> '.' ValidID)*;
 	public XbaseGrammarAccess.QualifiedNameElements getQualifiedNameAccess() {
 		return gaXbase.getQualifiedNameAccess();
 	}
@@ -1529,9 +1611,9 @@
 	public ParserRule getQualifiedNameRule() {
 		return getQualifiedNameAccess().getRule();
 	}
-
+	
 	//Number hidden():
-	//	HEX | (INT | DECIMAL) ("." (INT | DECIMAL))?;
+	//	HEX | (INT | DECIMAL) ('.' (INT | DECIMAL))?;
 	public XbaseGrammarAccess.NumberElements getNumberAccess() {
 		return gaXbase.getNumberAccess();
 	}
@@ -1539,12 +1621,12 @@
 	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 gaXbase.getStaticQualifierAccess();
 	}
@@ -1552,213 +1634,213 @@
 	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 gaXbase.getHEXRule();
-	} 
-
+	}
+	
 	//terminal INT returns ecore::EInt:
-	//	"0".."9" ("0".."9" | "_")*;
+	//	'0'..'9' ('0'..'9' | '_')*;
 	public TerminalRule 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 gaXbase.getDECIMALRule();
-	} 
-
+	}
+	
 	//JvmTypeReference:
-	//	JvmParameterizedTypeReference => ({JvmGenericArrayTypeReference.componentType=current} ArrayBrackets)* |
-	//	XFunctionTypeRef;
+	//	JvmParameterizedTypeReference => ({JvmGenericArrayTypeReference.componentType=current} ArrayBrackets)*
+	//	| XFunctionTypeRef;
 	public XtypeGrammarAccess.JvmTypeReferenceElements getJvmTypeReferenceAccess() {
-		return gaXbase.getJvmTypeReferenceAccess();
+		return gaXtype.getJvmTypeReferenceAccess();
 	}
 	
 	public ParserRule getJvmTypeReferenceRule() {
 		return getJvmTypeReferenceAccess().getRule();
 	}
-
+	
 	//ArrayBrackets:
-	//	"[" "]";
+	//	'[' ']';
 	public XtypeGrammarAccess.ArrayBracketsElements getArrayBracketsAccess() {
-		return gaXbase.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 gaXbase.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 gaXbase.getJvmParameterizedTypeReferenceAccess();
+		return gaXtype.getJvmParameterizedTypeReferenceAccess();
 	}
 	
 	public ParserRule getJvmParameterizedTypeReferenceRule() {
 		return getJvmParameterizedTypeReferenceAccess().getRule();
 	}
-
-	//JvmArgumentTypeReference returns JvmTypeReference:
+	
+	//JvmArgumentTypeReference JvmTypeReference:
 	//	JvmTypeReference | JvmWildcardTypeReference;
 	public XtypeGrammarAccess.JvmArgumentTypeReferenceElements getJvmArgumentTypeReferenceAccess() {
-		return gaXbase.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 gaXbase.getJvmWildcardTypeReferenceAccess();
+		return gaXtype.getJvmWildcardTypeReferenceAccess();
 	}
 	
 	public ParserRule getJvmWildcardTypeReferenceRule() {
 		return getJvmWildcardTypeReferenceAccess().getRule();
 	}
-
+	
 	//JvmUpperBound:
-	//	"extends" typeReference=JvmTypeReference;
+	//	'extends' typeReference=JvmTypeReference;
 	public XtypeGrammarAccess.JvmUpperBoundElements getJvmUpperBoundAccess() {
-		return gaXbase.getJvmUpperBoundAccess();
+		return gaXtype.getJvmUpperBoundAccess();
 	}
 	
 	public ParserRule getJvmUpperBoundRule() {
 		return getJvmUpperBoundAccess().getRule();
 	}
-
-	//JvmUpperBoundAnded returns JvmUpperBound:
-	//	"&" typeReference=JvmTypeReference;
+	
+	//JvmUpperBoundAnded JvmUpperBound:
+	//	'&' typeReference=JvmTypeReference;
 	public XtypeGrammarAccess.JvmUpperBoundAndedElements getJvmUpperBoundAndedAccess() {
-		return gaXbase.getJvmUpperBoundAndedAccess();
+		return gaXtype.getJvmUpperBoundAndedAccess();
 	}
 	
 	public ParserRule getJvmUpperBoundAndedRule() {
 		return getJvmUpperBoundAndedAccess().getRule();
 	}
-
+	
 	//JvmLowerBound:
-	//	"super" typeReference=JvmTypeReference;
+	//	'super' typeReference=JvmTypeReference;
 	public XtypeGrammarAccess.JvmLowerBoundElements getJvmLowerBoundAccess() {
-		return gaXbase.getJvmLowerBoundAccess();
+		return gaXtype.getJvmLowerBoundAccess();
 	}
 	
 	public ParserRule getJvmLowerBoundRule() {
 		return getJvmLowerBoundAccess().getRule();
 	}
-
-	//JvmLowerBoundAnded returns JvmLowerBound:
-	//	"&" typeReference=JvmTypeReference;
+	
+	//JvmLowerBoundAnded JvmLowerBound:
+	//	'&' typeReference=JvmTypeReference;
 	public XtypeGrammarAccess.JvmLowerBoundAndedElements getJvmLowerBoundAndedAccess() {
-		return gaXbase.getJvmLowerBoundAndedAccess();
+		return gaXtype.getJvmLowerBoundAndedAccess();
 	}
 	
 	public ParserRule getJvmLowerBoundAndedRule() {
 		return getJvmLowerBoundAndedAccess().getRule();
 	}
-
+	
 	//JvmTypeParameter:
 	//	name=ValidID (constraints+=JvmUpperBound constraints+=JvmUpperBoundAnded*)?;
 	public XtypeGrammarAccess.JvmTypeParameterElements getJvmTypeParameterAccess() {
-		return gaXbase.getJvmTypeParameterAccess();
+		return gaXtype.getJvmTypeParameterAccess();
 	}
 	
 	public ParserRule getJvmTypeParameterRule() {
 		return getJvmTypeParameterAccess().getRule();
 	}
-
+	
 	//QualifiedNameWithWildcard:
-	//	QualifiedName "." "*";
+	//	super::QualifiedName '.' '*';
 	public XtypeGrammarAccess.QualifiedNameWithWildcardElements getQualifiedNameWithWildcardAccess() {
-		return gaXbase.getQualifiedNameWithWildcardAccess();
+		return gaXtype.getQualifiedNameWithWildcardAccess();
 	}
 	
 	public ParserRule getQualifiedNameWithWildcardRule() {
 		return getQualifiedNameWithWildcardAccess().getRule();
 	}
-
+	
 	//ValidID:
 	//	ID;
 	public XtypeGrammarAccess.ValidIDElements getValidIDAccess() {
-		return gaXbase.getValidIDAccess();
+		return gaXtype.getValidIDAccess();
 	}
 	
 	public ParserRule getValidIDRule() {
 		return getValidIDAccess().getRule();
 	}
-
+	
 	//XImportSection:
-	//	importDeclarations+=XImportDeclaration+;
+	//	importDeclarations+=super::XImportDeclaration+;
 	public XtypeGrammarAccess.XImportSectionElements getXImportSectionAccess() {
-		return gaXbase.getXImportSectionAccess();
+		return gaXtype.getXImportSectionAccess();
 	}
 	
 	public ParserRule getXImportSectionRule() {
 		return getXImportSectionAccess().getRule();
 	}
-
+	
 	//QualifiedNameInStaticImport:
-	//	(ValidID ".")+;
+	//	(ValidID '.')+;
 	public XtypeGrammarAccess.QualifiedNameInStaticImportElements getQualifiedNameInStaticImportAccess() {
-		return gaXbase.getQualifiedNameInStaticImportAccess();
+		return gaXtype.getQualifiedNameInStaticImportAccess();
 	}
 	
 	public ParserRule getQualifiedNameInStaticImportRule() {
 		return getQualifiedNameInStaticImportAccess().getRule();
 	}
-
+	
 	//terminal ID:
-	//	"^"? ("a".."z" | "A".."Z" | "$" | "_") ("a".."z" | "A".."Z" | "$" | "_" | "0".."9")*;
+	//	'^'? ('a'..'z' | 'A'..'Z' | '$' | '_') ('a'..'z' | 'A'..'Z' | '$' | '_' | '0'..'9')*;
 	public TerminalRule getIDRule() {
-		return gaXbase.getIDRule();
-	} 
-
+		return gaXtype.getIDRule();
+	}
+	
 	//terminal STRING:
-	//	"\"" ("\\" . / * ('b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\\') * / | !("\\" | "\""))* "\""? | "\'" ("\\" .
-	//	/ * ('b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\\') * / | !("\\" | "\'"))* "\'"?;
+	//	'"' ('\\' . | !('\\' | '"'))* '"'? |
+	//	"'" ('\\' . | !('\\' | "'"))* "'"?;
 	public TerminalRule getSTRINGRule() {
-		return gaXbase.getSTRINGRule();
-	} 
-
+		return gaXtype.getSTRINGRule();
+	}
+	
 	//terminal ML_COMMENT:
-	//	"/ *"->"* /";
+	//	'/*'->'*/';
 	public TerminalRule getML_COMMENTRule() {
-		return gaXbase.getML_COMMENTRule();
-	} 
-
+		return gaXtype.getML_COMMENTRule();
+	}
+	
 	//terminal SL_COMMENT:
-	//	"//" !("\n" | "\r")* ("\r"? "\n")?;
+	//	'//' !('\n' | '\r')* ('\r'? '\n')?;
 	public TerminalRule getSL_COMMENTRule() {
-		return gaXbase.getSL_COMMENTRule();
-	} 
-
+		return gaXtype.getSL_COMMENTRule();
+	}
+	
 	//terminal WS:
-	//	(" " | "\t" | "\r" | "\n")+;
+	//	' ' | '\t' | '\r' | '\n'+;
 	public TerminalRule getWSRule() {
-		return gaXbase.getWSRule();
-	} 
-
+		return gaXtype.getWSRule();
+	}
+	
 	//terminal ANY_OTHER:
 	//	.;
 	public TerminalRule getANY_OTHERRule() {
-		return gaXbase.getANY_OTHERRule();
-	} 
+		return gaXtype.getANY_OTHERRule();
+	}
 }
diff --git a/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/validation/AbstractUISemanticsGrammarValidator.java b/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/validation/AbstractUISemanticsGrammarValidator.java
index b70008b..bb09b20 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/validation/AbstractUISemanticsGrammarValidator.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src-gen/org/eclipse/osbp/ecview/uisemantics/validation/AbstractUISemanticsGrammarValidator.java
@@ -7,6 +7,9 @@
  *
  * Contributors:
  *         Florian Pirchner - Initial implementation
+ *
+ * generated by Xtext 2.11.0
+ *
  */
 
 package org.eclipse.osbp.ecview.uisemantics.validation;
@@ -14,16 +17,18 @@
 import java.util.ArrayList;
 import java.util.List;
 import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.xtext.xbase.validation.XbaseValidator;
 
-public class AbstractUISemanticsGrammarValidator extends org.eclipse.xtext.xbase.validation.XbaseValidator {
-
+public abstract class AbstractUISemanticsGrammarValidator extends XbaseValidator {
+	
 	@Override
 	protected List<EPackage> getEPackages() {
-	    List<EPackage> result = new ArrayList<EPackage>(super.getEPackages());
-	    result.add(EPackage.Registry.INSTANCE.getEPackage("http://osbp.eclipse.org/ecview/dsl/uimodel/semantics"));
-	    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/ecview/dsl/uimodel/semantics"));
+		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.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UiSemanticsPackage.java b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UiSemanticsPackage.java
index 45c29e1..69df3fc 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UiSemanticsPackage.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UiSemanticsPackage.java
@@ -370,13 +370,22 @@
 	int UX_ELEMENT_URI_FEATURE_COUNT = 2;
 
 	/**
+	 * The feature id for the '<em><b>Super Element</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UX_AVAILABLE_BINDINGS__SUPER_ELEMENT = 0;
+
+	/**
 	 * The feature id for the '<em><b>Bindings</b></em>' containment reference list.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int UX_AVAILABLE_BINDINGS__BINDINGS = 0;
+	int UX_AVAILABLE_BINDINGS__BINDINGS = 1;
 
 	/**
 	 * The number of structural features of the '<em>Ux Available Bindings</em>' class.
@@ -385,7 +394,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int UX_AVAILABLE_BINDINGS_FEATURE_COUNT = 1;
+	int UX_AVAILABLE_BINDINGS_FEATURE_COUNT = 2;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.osbp.ecview.semantic.uisemantics.impl.UxAvailableVisibilityOptionsImpl <em>Ux Available Visibility Options</em>}' class.
@@ -979,6 +988,17 @@
 	EClass getUxAvailableBindings();
 
 	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.ecview.semantic.uisemantics.UxAvailableBindings#getSuperElement <em>Super Element</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Super Element</em>'.
+	 * @see org.eclipse.osbp.ecview.semantic.uisemantics.UxAvailableBindings#getSuperElement()
+	 * @see #getUxAvailableBindings()
+	 * @generated
+	 */
+	EReference getUxAvailableBindings_SuperElement();
+
+	/**
 	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.ecview.semantic.uisemantics.UxAvailableBindings#getBindings <em>Bindings</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -1409,6 +1429,14 @@
 		EClass UX_AVAILABLE_BINDINGS = eINSTANCE.getUxAvailableBindings();
 
 		/**
+		 * The meta object literal for the '<em><b>Super Element</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference UX_AVAILABLE_BINDINGS__SUPER_ELEMENT = eINSTANCE.getUxAvailableBindings_SuperElement();
+
+		/**
 		 * The meta object literal for the '<em><b>Bindings</b></em>' containment reference list feature.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
diff --git a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxAction.java b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxAction.java
index 7693db0..3919c32 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxAction.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxAction.java
@@ -19,12 +19,12 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.UxAction#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.UxAction#getExternalCommandId <em>External Command Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.UxAction#isInitialDisabled <em>Initial Disabled</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uisemantics.UiSemanticsPackage#getUxAction()
  * @model
diff --git a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxAvailableBindings.java b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxAvailableBindings.java
index 436f077..ab927e2 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxAvailableBindings.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxAvailableBindings.java
@@ -21,10 +21,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
+ *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.UxAvailableBindings#getSuperElement <em>Super Element</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.UxAvailableBindings#getBindings <em>Bindings</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uisemantics.UiSemanticsPackage#getUxAvailableBindings()
  * @model
@@ -32,6 +33,32 @@
  */
 public interface UxAvailableBindings extends EObject {
 	/**
+	 * Returns the value of the '<em><b>Super Element</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Super Element</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Super Element</em>' reference.
+	 * @see #setSuperElement(UxElementDefinition)
+	 * @see org.eclipse.osbp.ecview.semantic.uisemantics.UiSemanticsPackage#getUxAvailableBindings_SuperElement()
+	 * @model
+	 * @generated
+	 */
+	UxElementDefinition getSuperElement();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.ecview.semantic.uisemantics.UxAvailableBindings#getSuperElement <em>Super Element</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Super Element</em>' reference.
+	 * @see #getSuperElement()
+	 * @generated
+	 */
+	void setSuperElement(UxElementDefinition value);
+
+	/**
 	 * Returns the value of the '<em><b>Bindings</b></em>' containment reference list.
 	 * The list contents are of type {@link org.eclipse.osbp.ecview.semantic.uisemantics.UxBindingableOption}.
 	 * <!-- begin-user-doc -->
diff --git a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxAvailableValidatorProperties.java b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxAvailableValidatorProperties.java
index 476c3e1..4db689a 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxAvailableValidatorProperties.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxAvailableValidatorProperties.java
@@ -21,10 +21,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.UxAvailableValidatorProperties#getProperties <em>Properties</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uisemantics.UiSemanticsPackage#getUxAvailableValidatorProperties()
  * @model
diff --git a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxAvailableVisibilityOptions.java b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxAvailableVisibilityOptions.java
index 919f62b..8120f19 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxAvailableVisibilityOptions.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxAvailableVisibilityOptions.java
@@ -21,10 +21,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.UxAvailableVisibilityOptions#getBindings <em>Bindings</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uisemantics.UiSemanticsPackage#getUxAvailableVisibilityOptions()
  * @model
diff --git a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxEPackageImport.java b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxEPackageImport.java
index 8966a6a..b834979 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxEPackageImport.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxEPackageImport.java
@@ -20,11 +20,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.UxEPackageImport#getAlias <em>Alias</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.UxEPackageImport#getEPackage <em>EPackage</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uisemantics.UiSemanticsPackage#getUxEPackageImport()
  * @model
diff --git a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxElementDefinition.java b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxElementDefinition.java
index 820098e..a546d28 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxElementDefinition.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxElementDefinition.java
@@ -19,6 +19,7 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.UxElementDefinition#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.UxElementDefinition#getUri <em>Uri</em>}</li>
@@ -26,7 +27,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.UxElementDefinition#getVisibilityContainer <em>Visibility Container</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.UxElementDefinition#getValidatorContainer <em>Validator Container</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uisemantics.UiSemanticsPackage#getUxElementDefinition()
  * @model
diff --git a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxElementURI.java b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxElementURI.java
index e53b29b..804e5d1 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxElementURI.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxElementURI.java
@@ -20,11 +20,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.UxElementURI#getEPackage <em>EPackage</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.UxElementURI#getEClass <em>EClass</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uisemantics.UiSemanticsPackage#getUxElementURI()
  * @model
diff --git a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxEndpointDef.java b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxEndpointDef.java
index 520b5ef..09f72a3 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxEndpointDef.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxEndpointDef.java
@@ -21,6 +21,7 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.UxEndpointDef#isFinal <em>Final</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.UxEndpointDef#getName <em>Name</em>}</li>
@@ -28,7 +29,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.UxEndpointDef#isListbinding <em>Listbinding</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.UxEndpointDef#getTargetName <em>Target Name</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uisemantics.UiSemanticsPackage#getUxEndpointDef()
  * @model abstract="true"
diff --git a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxImportSectionDeclaration.java b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxImportSectionDeclaration.java
index 9696838..d2c6e83 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxImportSectionDeclaration.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxImportSectionDeclaration.java
@@ -19,10 +19,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.UxImportSectionDeclaration#getImportedEPackage <em>Imported EPackage</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uisemantics.UiSemanticsPackage#getUxImportSectionDeclaration()
  * @model
diff --git a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxModel.java b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxModel.java
index f4cb30f..e37ca0b 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxModel.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxModel.java
@@ -23,13 +23,13 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.UxModel#getImportSection <em>Import Section</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.UxModel#getElementDefinitions <em>Element Definitions</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.UxModel#getViewActions <em>View Actions</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.UxModel#getCategories <em>Categories</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uisemantics.UiSemanticsPackage#getUxModel()
  * @model
diff --git a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxValidatorProperty.java b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxValidatorProperty.java
index a2f8847..02e07e8 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxValidatorProperty.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxValidatorProperty.java
@@ -19,10 +19,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.UxValidatorProperty#getName <em>Name</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uisemantics.UiSemanticsPackage#getUxValidatorProperty()
  * @model
diff --git a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxViewCategory.java b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxViewCategory.java
index a281c68..2b01257 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxViewCategory.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/UxViewCategory.java
@@ -19,10 +19,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.UxViewCategory#getName <em>Name</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.ecview.semantic.uisemantics.UiSemanticsPackage#getUxViewCategory()
  * @model
diff --git a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UiSemanticsPackageImpl.java b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UiSemanticsPackageImpl.java
index 5a0fc93..df57444 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UiSemanticsPackageImpl.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UiSemanticsPackageImpl.java
@@ -400,13 +400,22 @@
 	}
 
 	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getUxAvailableBindings_SuperElement() {
+		return (EReference)uxAvailableBindingsEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->.
 	 *
 	 * @return the ux available bindings_ bindings
 	 * @generated
 	 */
 	public EReference getUxAvailableBindings_Bindings() {
-		return (EReference)uxAvailableBindingsEClass.getEStructuralFeatures().get(0);
+		return (EReference)uxAvailableBindingsEClass.getEStructuralFeatures().get(1);
 	}
 
 	/**
@@ -693,6 +702,7 @@
 		createEReference(uxElementURIEClass, UX_ELEMENT_URI__ECLASS);
 
 		uxAvailableBindingsEClass = createEClass(UX_AVAILABLE_BINDINGS);
+		createEReference(uxAvailableBindingsEClass, UX_AVAILABLE_BINDINGS__SUPER_ELEMENT);
 		createEReference(uxAvailableBindingsEClass, UX_AVAILABLE_BINDINGS__BINDINGS);
 
 		uxAvailableVisibilityOptionsEClass = createEClass(UX_AVAILABLE_VISIBILITY_OPTIONS);
@@ -790,6 +800,7 @@
 		initEReference(getUxElementURI_EClass(), theEcorePackage.getEClass(), null, "eClass", null, 0, 1, UxElementURI.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
 		initEClass(uxAvailableBindingsEClass, UxAvailableBindings.class, "UxAvailableBindings", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getUxAvailableBindings_SuperElement(), this.getUxElementDefinition(), null, "superElement", null, 0, 1, UxAvailableBindings.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEReference(getUxAvailableBindings_Bindings(), this.getUxBindingableOption(), null, "bindings", null, 0, -1, UxAvailableBindings.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
 		initEClass(uxAvailableVisibilityOptionsEClass, UxAvailableVisibilityOptions.class, "UxAvailableVisibilityOptions", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
diff --git a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxActionImpl.java b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxActionImpl.java
index 0fc8297..6a256a1 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxActionImpl.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxActionImpl.java
@@ -26,12 +26,12 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.impl.UxActionImpl#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.impl.UxActionImpl#getExternalCommandId <em>External Command Id</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.impl.UxActionImpl#isInitialDisabled <em>Initial Disabled</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxAvailableBindingsImpl.java b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxAvailableBindingsImpl.java
index 749c36c..1e02cdf 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxAvailableBindingsImpl.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxAvailableBindingsImpl.java
@@ -11,16 +11,19 @@
 package org.eclipse.osbp.ecview.semantic.uisemantics.impl;
 
 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;
 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;
 import org.eclipse.emf.ecore.util.InternalEList;
 import org.eclipse.osbp.ecview.semantic.uisemantics.UiSemanticsPackage;
 import org.eclipse.osbp.ecview.semantic.uisemantics.UxAvailableBindings;
 import org.eclipse.osbp.ecview.semantic.uisemantics.UxBindingableOption;
+import org.eclipse.osbp.ecview.semantic.uisemantics.UxElementDefinition;
 
 /**
  * <!-- begin-user-doc -->
@@ -28,15 +31,25 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
+ *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.impl.UxAvailableBindingsImpl#getSuperElement <em>Super Element</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.impl.UxAvailableBindingsImpl#getBindings <em>Bindings</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
 public class UxAvailableBindingsImpl extends MinimalEObjectImpl.Container implements UxAvailableBindings {
 	/**
+	 * The cached value of the '{@link #getSuperElement() <em>Super Element</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getSuperElement()
+	 * @generated
+	 * @ordered
+	 */
+	protected UxElementDefinition superElement;
+	/**
 	 * The cached value of the '{@link #getBindings() <em>Bindings</em>}' containment reference list.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -70,6 +83,44 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	public UxElementDefinition getSuperElement() {
+		if (superElement != null && superElement.eIsProxy()) {
+			InternalEObject oldSuperElement = (InternalEObject)superElement;
+			superElement = (UxElementDefinition)eResolveProxy(oldSuperElement);
+			if (superElement != oldSuperElement) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, UiSemanticsPackage.UX_AVAILABLE_BINDINGS__SUPER_ELEMENT, oldSuperElement, superElement));
+			}
+		}
+		return superElement;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public UxElementDefinition basicGetSuperElement() {
+		return superElement;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setSuperElement(UxElementDefinition newSuperElement) {
+		UxElementDefinition oldSuperElement = superElement;
+		superElement = newSuperElement;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, UiSemanticsPackage.UX_AVAILABLE_BINDINGS__SUPER_ELEMENT, oldSuperElement, superElement));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	public EList<UxBindingableOption> getBindings() {
 		if (bindings == null) {
 			bindings = new EObjectContainmentEList<UxBindingableOption>(UxBindingableOption.class, this, UiSemanticsPackage.UX_AVAILABLE_BINDINGS__BINDINGS);
@@ -99,6 +150,9 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
+			case UiSemanticsPackage.UX_AVAILABLE_BINDINGS__SUPER_ELEMENT:
+				if (resolve) return getSuperElement();
+				return basicGetSuperElement();
 			case UiSemanticsPackage.UX_AVAILABLE_BINDINGS__BINDINGS:
 				return getBindings();
 		}
@@ -114,6 +168,9 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
+			case UiSemanticsPackage.UX_AVAILABLE_BINDINGS__SUPER_ELEMENT:
+				setSuperElement((UxElementDefinition)newValue);
+				return;
 			case UiSemanticsPackage.UX_AVAILABLE_BINDINGS__BINDINGS:
 				getBindings().clear();
 				getBindings().addAll((Collection<? extends UxBindingableOption>)newValue);
@@ -130,6 +187,9 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
+			case UiSemanticsPackage.UX_AVAILABLE_BINDINGS__SUPER_ELEMENT:
+				setSuperElement((UxElementDefinition)null);
+				return;
 			case UiSemanticsPackage.UX_AVAILABLE_BINDINGS__BINDINGS:
 				getBindings().clear();
 				return;
@@ -145,6 +205,8 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
+			case UiSemanticsPackage.UX_AVAILABLE_BINDINGS__SUPER_ELEMENT:
+				return superElement != null;
 			case UiSemanticsPackage.UX_AVAILABLE_BINDINGS__BINDINGS:
 				return bindings != null && !bindings.isEmpty();
 		}
diff --git a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxAvailableValidatorPropertiesImpl.java b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxAvailableValidatorPropertiesImpl.java
index ebcbf3e..e90e88f 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxAvailableValidatorPropertiesImpl.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxAvailableValidatorPropertiesImpl.java
@@ -34,10 +34,10 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.impl.UxAvailableValidatorPropertiesImpl#getProperties <em>Properties</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxAvailableVisibilityOptionsImpl.java b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxAvailableVisibilityOptionsImpl.java
index fa26d46..1cfca80 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxAvailableVisibilityOptionsImpl.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxAvailableVisibilityOptionsImpl.java
@@ -34,10 +34,10 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.impl.UxAvailableVisibilityOptionsImpl#getBindings <em>Bindings</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxBindingableOptionImpl.java b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxBindingableOptionImpl.java
index ef04ea2..512a793 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxBindingableOptionImpl.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxBindingableOptionImpl.java
@@ -20,8 +20,6 @@
  * <!-- begin-user-doc -->
  * An implementation of the model object '<em><b>Ux Bindingable Option</b></em>'.
  * <!-- end-user-doc -->
- * <p>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxEPackageImportImpl.java b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxEPackageImportImpl.java
index 5a59e1f..a8100c7 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxEPackageImportImpl.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxEPackageImportImpl.java
@@ -29,11 +29,11 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.impl.UxEPackageImportImpl#getAlias <em>Alias</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.impl.UxEPackageImportImpl#getEPackage <em>EPackage</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxElementDefinitionImpl.java b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxElementDefinitionImpl.java
index a8c8125..188d603 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxElementDefinitionImpl.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxElementDefinitionImpl.java
@@ -30,6 +30,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.impl.UxElementDefinitionImpl#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.impl.UxElementDefinitionImpl#getUri <em>Uri</em>}</li>
@@ -37,7 +38,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.impl.UxElementDefinitionImpl#getVisibilityContainer <em>Visibility Container</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.impl.UxElementDefinitionImpl#getValidatorContainer <em>Validator Container</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxElementURIImpl.java b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxElementURIImpl.java
index d430afc..0528bbf 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxElementURIImpl.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxElementURIImpl.java
@@ -29,11 +29,11 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.impl.UxElementURIImpl#getEPackage <em>EPackage</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.impl.UxElementURIImpl#getEClass <em>EClass</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxEndpointDefImpl.java b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxEndpointDefImpl.java
index e5d5391..1da8e41 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxEndpointDefImpl.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxEndpointDefImpl.java
@@ -31,6 +31,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.impl.UxEndpointDefImpl#isFinal <em>Final</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.impl.UxEndpointDefImpl#getName <em>Name</em>}</li>
@@ -38,7 +39,6 @@
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.impl.UxEndpointDefImpl#isListbinding <em>Listbinding</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.impl.UxEndpointDefImpl#getTargetName <em>Target Name</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxImportSectionDeclarationImpl.java b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxImportSectionDeclarationImpl.java
index 3769516..8e58cb2 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxImportSectionDeclarationImpl.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxImportSectionDeclarationImpl.java
@@ -27,10 +27,10 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.impl.UxImportSectionDeclarationImpl#getImportedEPackage <em>Imported EPackage</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxModelImpl.java b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxModelImpl.java
index f830d04..26e0179 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxModelImpl.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxModelImpl.java
@@ -34,13 +34,13 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.impl.UxModelImpl#getImportSection <em>Import Section</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.impl.UxModelImpl#getElementDefinitions <em>Element Definitions</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.impl.UxModelImpl#getViewActions <em>View Actions</em>}</li>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.impl.UxModelImpl#getCategories <em>Categories</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxValidatorPropertyImpl.java b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxValidatorPropertyImpl.java
index e33164c..b7e23b0 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxValidatorPropertyImpl.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxValidatorPropertyImpl.java
@@ -26,10 +26,10 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.impl.UxValidatorPropertyImpl#getName <em>Name</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxValueBindingEndpointDefImpl.java b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxValueBindingEndpointDefImpl.java
index 3f2810c..7efa78c 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxValueBindingEndpointDefImpl.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxValueBindingEndpointDefImpl.java
@@ -19,8 +19,6 @@
  * <!-- begin-user-doc -->
  * An implementation of the model object '<em><b>Ux Value Binding Endpoint Def</b></em>'.
  * <!-- end-user-doc -->
- * <p>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxViewCategoryImpl.java b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxViewCategoryImpl.java
index 1194fc2..6708528 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxViewCategoryImpl.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxViewCategoryImpl.java
@@ -26,10 +26,10 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.ecview.semantic.uisemantics.impl.UxViewCategoryImpl#getName <em>Name</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxVisibleableOptionImpl.java b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxVisibleableOptionImpl.java
index 2f02bbb..85a5be3 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxVisibleableOptionImpl.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/impl/UxVisibleableOptionImpl.java
@@ -19,8 +19,6 @@
  * <!-- begin-user-doc -->
  * An implementation of the model object '<em><b>Ux Visibleable Option</b></em>'.
  * <!-- end-user-doc -->
- * <p>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/util/UiSemanticsSwitch.java b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/util/UiSemanticsSwitch.java
index e710f59..3220a9e 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/util/UiSemanticsSwitch.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/semantic/uisemantics/util/UiSemanticsSwitch.java
@@ -54,7 +54,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
 	 */
diff --git a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/uisemantics/GenerateUISemanticsGrammar.mwe2 b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/uisemantics/GenerateUISemanticsGrammar.mwe2
index 56fd7bd..f59d40f 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/uisemantics/GenerateUISemanticsGrammar.mwe2
+++ b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/uisemantics/GenerateUISemanticsGrammar.mwe2
@@ -12,141 +12,78 @@
 module org.eclipse.osbp.ecview.uisemantics.GenerateUISemanticsGrammar
 
 import org.eclipse.emf.mwe.utils.*
-import org.eclipse.xtext.generator.*
-import org.eclipse.xtext.ui.generator.*
+import org.eclipse.xtext.xtext.generator.*
+import org.eclipse.xtext.xtext.generator.model.project.*
 
-var fileExtensions = "uisemantic"
-var projectName = "org.eclipse.osbp.ecview.uisemantics"
-var grammarURI = "platform:/resource/${projectName}/src/org/eclipse/osbp/ecview/uisemantics/UISemanticsGrammar.xtext"
-var runtimeProject = "../${projectName}"
-var generateXtendStub = true
-var encoding = "UTF-8"
+var rootPath = ".."
+
+var fileHeaderText = "/**
+ * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf), Loetz GmbH&Co.KG (Heidelberg)
+ * 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:
+ *         Florian Pirchner - Initial implementation
+ *
+ * generated by Xtext \${version}
+ *
+ */
+
+"
 
 Workflow {
-	bean = StandaloneSetup {
-//		uriMap = {
-//			from = "platform:/resource/org.eclipse.osbp.ecview.semantic.uisemantics/"
-//			to = "file://Users/admin/git/osbp-ecview-addons/org.eclipse.osbp.ecview.semantic.uisemantics/"
-//		}
 
-		resourceSet = org.eclipse.xtext.resource.XtextResourceSet : theResourceSet {}
-		scanClassPath = true
-		platformUri = "${runtimeProject}/.."// The following two lines can be removed, if Xbase is not used.
-		registerGeneratedEPackage = "org.eclipse.xtext.xbase.XbasePackage"
-		registerGenModelFile = "platform:/resource/org.eclipse.xtext.xbase/model/Xbase.genmodel"
-		/*
-		 *  ui semantics 
-		 */
-		registerGeneratedEPackage = "org.eclipse.osbp.ecview.semantic.uisemantics.UiSemanticsPackage"
-		registerGenModelFile =
-		"platform:/resource/org.eclipse.osbp.ecview.uisemantics/model/UISemanticsGrammar.genmodel"
-	}
+	component = XtextGenerator {
+		configuration = {
+			project = StandardProjectConfig {
+				baseName = "org.eclipse.osbp.ecview.uisemantics"
+				rootPath = rootPath
+				genericIde = {
+					enabled = true
+					name = "org.eclipse.osbp.ecview.uisemantics.ide"
+				}
+				runtimeTest = {
+					enabled = true
+				}
+				eclipsePlugin = {
+					enabled = true
+				}
+				eclipsePluginTest = {
+					enabled = false
+				}
+				createEclipseMetaData = true
+			}
+			code = {
+				encoding = "UTF-8"
+				lineDelimiter = "\n"
+				fileHeader = fileHeaderText
+			}
+		}
 
-	component = DirectoryCleaner {
-		directory = "${runtimeProject}/src-gen"
-	}
-
-	component = DirectoryCleaner {
-		directory = "${runtimeProject}/model/generated"
-	}
-
-	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 {
-			forcedResourceSet = theResourceSet
-			uri = grammarURI
-
-			// Java API to access grammar elements (required by several other fragments)
-			fragment = grammarAccess.GrammarAccessFragment auto-inject {}
-
-			// the old serialization component
-			// fragment = parseTreeConstructor.ParseTreeConstructorFragment auto-inject {}    
-
-			// serializer 2.0
-			fragment = serializer.SerializerFragment auto-inject {
+		language = StandardLanguage {
+			name = "org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar"
+			fileExtensions = "uisemantic"
+			
+			referencedResource = "platform:/resource/org.eclipse.osbp.ecview.uisemantics/model/UISemanticsGrammar.ecore"
+			referencedResource = "platform:/resource/org.eclipse.osbp.ecview.uisemantics/model/UISemanticsGrammar.genmodel"
+			
+			generateXtendStubs = false
+			
+			serializer = {
 				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
-			//  }
+			validator = {
+			// composedCheck = "org.eclipse.xtext.validation.NamesAreUniqueValidator"
 			}
 
-			// Xtend-based API for validation
-			fragment = validation.ValidatorFragment auto-inject {
-			//    composedCheck = "org.eclipse.xtext.validation.ImportUriValidator"
-			//    composedCheck = "org.eclipse.xtext.validation.NamesAreUniqueValidator"
+			generator = {
+				generateStub = false
+				generateJavaMain = false
+				generateXtendStub = false
 			}
 
-			// 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 {}
-
-			// 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 {}
 		}
 	}
 }
diff --git a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/uisemantics/UISemanticsGrammar.xtext b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/uisemantics/UISemanticsGrammar.xtext
index 9ff9394..2b9695d 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/uisemantics/UISemanticsGrammar.xtext
+++ b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/uisemantics/UISemanticsGrammar.xtext
@@ -11,13 +11,12 @@
 
 grammar org.eclipse.osbp.ecview.uisemantics.UISemanticsGrammar with org.eclipse.xtext.xbase.Xbase
 
-import "http://www.eclipse.org/xtext/xbase/Xtype" as type 
+import "http://www.eclipse.org/emf/2002/Ecore"
 import "http://www.eclipse.org/xtext/common/JavaVMTypes"
-import "http://www.eclipse.org/emf/2002/Ecore" as ecore
-import "http://osbp.eclipse.org/ecview/dsl/uimodel/semantics" as semantic
+import "http://osbp.eclipse.org/ecview/dsl/uimodel/semantics"
 
-UxModel returns semantic::UxModel:
-	{semantic::UxModel}
+UxModel returns UxModel:
+	{UxModel}
 	importSection=XImportSection?
 	('actions' '{'
 	viewActions+=UxAction*
@@ -27,24 +26,24 @@
 	'}')?
 	elementDefinitions+=UxElementDefinition*;
 
-UxAction returns semantic::UxAction:
+UxAction returns UxAction:
 	name=QualifiedName ('externalCommand' externalCommandId=STRING)? (initialDisabled?="disabled")?;
 
-UxViewCategory returns semantic::UxViewCategory:
+UxViewCategory returns UxViewCategory:
 	name=QualifiedName;
 
-XImportDeclaration returns semantic::UxImportSectionDeclaration:
-	{semantic::UxImportSectionDeclaration}
+XImportDeclaration returns UxImportSectionDeclaration:
+	{UxImportSectionDeclaration}
 	('import' ((static?='static' extension?='extension'? importedType=[JvmDeclaredType|QualifiedNameInStaticImport]
 	(wildcard?='*' | memberName=ValidID))
 	| importedType=[JvmDeclaredType|QualifiedName]
 	| importedNamespace=QualifiedNameWithWildcard))
 	| (("ePackage" importedEPackage=UxEPackageImport)) ';'?;
 
-UxEPackageImport returns semantic::UxEPackageImport:
-	ePackage=[ecore::EPackage|STRING] 'as' alias=ID;
+UxEPackageImport returns UxEPackageImport:
+	ePackage=[EPackage|STRING] 'as' alias=ID;
 
-UxElementDefinition returns semantic::UxElementDefinition:
+UxElementDefinition returns UxElementDefinition:
 	'element' name=ID '{'
 	(uri=UxElementURI)?
 	('bindings' '{'
@@ -58,27 +57,28 @@
 	'}')?
 	'}';
 
-UxAvailableValidatorProperties returns semantic::UxAvailableValidatorProperties:
-	{semantic::UxAvailableValidatorProperties}
+UxAvailableValidatorProperties returns UxAvailableValidatorProperties:
+	{UxAvailableValidatorProperties}
 	properties+=UxValidatorProperty*;
 
-UxValidatorProperty returns semantic::UxValidatorProperty:
+UxValidatorProperty returns UxValidatorProperty:
 	'property' name=ID;
 
-UxElementURI returns semantic::UxElementURI:
-	'uri' ePackage=[semantic::UxEPackageImport] ":" eClass=[ecore::EClass];
+UxElementURI returns UxElementURI:
+	'uri' ePackage=[UxEPackageImport] ":" eClass=[EClass];
 
-UxAvailableBindings returns semantic::UxAvailableBindings:
-	{semantic::UxAvailableBindings}
+UxAvailableBindings returns UxAvailableBindings:
+	{UxAvailableBindings}
+	('extends' superElement=[UxElementDefinition])?
 	bindings+=UxBindingableOption*;
 
-UxAvailableVisibilityOptions returns semantic::UxAvailableVisibilityOptions:
-	{semantic::UxAvailableVisibilityOptions}
+UxAvailableVisibilityOptions returns UxAvailableVisibilityOptions:
+	{UxAvailableVisibilityOptions}
 	bindings+=UxVisibleableOption*;
 
-UxBindingableOption returns semantic::UxBindingableOption:
+UxBindingableOption returns UxBindingableOption:
 	(final?='final')? (listbinding?='list')? 'endpoint' name=ID jvmType=JvmTypeReference ('target' targetName=ID)?;
 
-UxVisibleableOption returns semantic::UxVisibleableOption:
+UxVisibleableOption returns UxVisibleableOption:
 	'endpoint' name=ID jvmType=JvmTypeReference;
 
diff --git a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/uisemantics/UISemanticsGrammarRuntimeModule.java b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/uisemantics/UISemanticsGrammarRuntimeModule.java
index 25026b4..6a5ab0d 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/uisemantics/UISemanticsGrammarRuntimeModule.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/uisemantics/UISemanticsGrammarRuntimeModule.java
@@ -10,13 +10,19 @@
  */
 package org.eclipse.osbp.ecview.uisemantics;
 
-import org.eclipse.xtext.linking.ILinkingService;
-import org.eclipse.xtext.scoping.IScopeProvider;
-import org.eclipse.xtext.xbase.scoping.batch.XbaseBatchScopeProvider;
+import org.eclipse.osbp.ecview.uisemantics.formatting.UISemanticsGrammarFormatter;
 import org.eclipse.osbp.ecview.uisemantics.linking.UiSemanticsLinkingService;
 import org.eclipse.osbp.ecview.uisemantics.naming.QualifiedNameProvider;
 import org.eclipse.osbp.ecview.uisemantics.scoping.ScopeProvider;
 import org.eclipse.osbp.ecview.uisemantics.scoping.UiImportedNamespaceAwareLocalScopeProvider;
+import org.eclipse.xtext.findReferences.TargetURICollector;
+import org.eclipse.xtext.formatting.IFormatter;
+import org.eclipse.xtext.linking.ILinkingService;
+import org.eclipse.xtext.resource.persistence.IResourceStorageFacade;
+import org.eclipse.xtext.scoping.IScopeProvider;
+import org.eclipse.xtext.xbase.jvmmodel.JvmModelTargetURICollector;
+import org.eclipse.xtext.xbase.resource.BatchLinkableResourceStorageFacade;
+import org.eclipse.xtext.xbase.scoping.batch.IBatchScopeProvider;
 
 import com.google.inject.Binder;
 import com.google.inject.name.Names;
@@ -25,9 +31,21 @@
  * Use this class to register components to be used at runtime / without the
  * Equinox extension registry.
  */
-public class UISemanticsGrammarRuntimeModule extends
-		org.eclipse.osbp.ecview.uisemantics.AbstractUISemanticsGrammarRuntimeModule {
+public class UISemanticsGrammarRuntimeModule
+		extends org.eclipse.osbp.ecview.uisemantics.AbstractUISemanticsGrammarRuntimeModule {
 
+	public Class<? extends IResourceStorageFacade> bindResourceStorageFacade() {
+		return BatchLinkableResourceStorageFacade.class;
+	}
+	
+	public Class<? extends TargetURICollector> bindTargetURICollector() {
+		return JvmModelTargetURICollector.class;
+	}
+
+	public Class<? extends IFormatter> bindIFormatter() {
+		return UISemanticsGrammarFormatter.class;
+	}
+	
 	public Class<? extends org.eclipse.xtext.naming.IQualifiedNameProvider> bindIQualifiedNameProvider() {
 		return QualifiedNameProvider.class;
 	}
@@ -37,16 +55,14 @@
 		return ScopeProvider.class;
 	}
 
-	@Override
-	public Class<? extends XbaseBatchScopeProvider> bindXbaseBatchScopeProvider() {
+	public Class<? extends IBatchScopeProvider> bindIBatchScopeProvider() {
 		return ScopeProvider.class;
 	}
 
 	@Override
 	public void configureIScopeProviderDelegate(Binder binder) {
 		binder.bind(IScopeProvider.class)
-				.annotatedWith(
-						Names.named("org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider.delegate"))
+				.annotatedWith(Names.named("org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider.delegate"))
 				.to(UiImportedNamespaceAwareLocalScopeProvider.class);
 	}
 
diff --git a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/uisemantics/naming/QualifiedNameProvider.java b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/uisemantics/naming/QualifiedNameProvider.java
index 3d66033..928a6c5 100644
--- a/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/uisemantics/naming/QualifiedNameProvider.java
+++ b/org.eclipse.osbp.ecview.uisemantics/src/org/eclipse/osbp/ecview/uisemantics/naming/QualifiedNameProvider.java
@@ -11,12 +11,15 @@
 
 package org.eclipse.osbp.ecview.uisemantics.naming;
 
+import java.util.UUID;
+
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EPackage;
 import org.eclipse.xtext.naming.IQualifiedNameConverter;
 import org.eclipse.xtext.naming.QualifiedName;
 import org.eclipse.xtext.xbase.scoping.XbaseQualifiedNameProvider;
 import org.eclipse.osbp.ecview.semantic.uisemantics.UxAction;
+import org.eclipse.osbp.ecview.semantic.uisemantics.UxAvailableBindings;
 import org.eclipse.osbp.ecview.semantic.uisemantics.UxEPackageImport;
 
 import com.google.inject.Inject;
@@ -41,6 +44,9 @@
 			}
 		} else if (obj instanceof UxAction) {
 			return nameConverter.toQualifiedName(((UxAction) obj).getName());
+		} else if (obj instanceof UxAvailableBindings) {
+			// return a random value to ensure this element will be exported by the index
+			return super.getFullyQualifiedName(obj.eContainer()).append("bindings");
 		}
 
 		return super.getFullyQualifiedName(obj);
diff --git a/org.eclipse.osbp.ecview.uisemantics/xtend-gen/org/eclipse/osbp/ecview/uisemantics/formatting/UISemanticsGrammarFormatter.java b/org.eclipse.osbp.ecview.uisemantics/xtend-gen/org/eclipse/osbp/ecview/uisemantics/formatting/UISemanticsGrammarFormatter.java
index 1c88639..f4c552e 100644
--- a/org.eclipse.osbp.ecview.uisemantics/xtend-gen/org/eclipse/osbp/ecview/uisemantics/formatting/UISemanticsGrammarFormatter.java
+++ b/org.eclipse.osbp.ecview.uisemantics/xtend-gen/org/eclipse/osbp/ecview/uisemantics/formatting/UISemanticsGrammarFormatter.java
@@ -23,6 +23,7 @@
  */
 @SuppressWarnings("all")
 public class UISemanticsGrammarFormatter extends AbstractDeclarativeFormatter {
+  @Override
   protected void configureFormatting(final FormattingConfig c) {
   }
 }
diff --git a/org.eclipse.osbp.ecview.vaadin.ide.preview/.project b/org.eclipse.osbp.ecview.vaadin.ide.preview/.project
index e963cb9..433685b 100644
--- a/org.eclipse.osbp.ecview.vaadin.ide.preview/.project
+++ b/org.eclipse.osbp.ecview.vaadin.ide.preview/.project
@@ -41,12 +41,12 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<name>org.eclipse.pde.ds.core.builder</name>
 			<arguments>
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.eclipse.pde.ds.core.builder</name>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>
 		</buildCommand>
diff --git a/org.eclipse.osbp.ecview.vaadin.ide.preview/META-INF/MANIFEST.MF b/org.eclipse.osbp.ecview.vaadin.ide.preview/META-INF/MANIFEST.MF
index e16c8e2..c881448 100644
--- a/org.eclipse.osbp.ecview.vaadin.ide.preview/META-INF/MANIFEST.MF
+++ b/org.eclipse.osbp.ecview.vaadin.ide.preview/META-INF/MANIFEST.MF
@@ -9,12 +9,12 @@
  org.eclipse.swt;bundle-version="3.103.0",
  org.eclipse.jface;bundle-version="3.10.0",
  org.eclipse.ui;bundle-version="3.106.0",
- com.vaadin.server;bundle-version="[7.5.7,7.7.0)",
- com.vaadin.shared;bundle-version="[7.5.7,7.7.0)",
- com.vaadin.themes;bundle-version="[7.5.7,7.7.0)",
+ com.vaadin.server;bundle-version="[7.7.6,7.8.0)",
+ com.vaadin.shared;bundle-version="[7.7.6,7.8.0)",
+ com.vaadin.themes;bundle-version="[7.7.6,7.8.0)",
  javax.servlet;bundle-version="3.0.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;bundle-version="[2.11.0,2.12.0)",
+ org.eclipse.xtext.ui.shared;bundle-version="[2.11.0,2.12.0)",
  org.eclipse.osbp.ecview.core.common;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.ecview.core.common.editparts.emf;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.ecview.core.common.model;bundle-version="[0.9.0,0.10.0)",
@@ -26,23 +26,23 @@
  org.eclipse.osbp.ecview.core.ui.presentation.common;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.ecview.core.util.emf;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.runtime.web.ecview.presentation.vaadin;bundle-version="[0.9.0,0.10.0)",
- org.eclipse.core.databinding;bundle-version="[1.4.1,1.5.0)",
- org.eclipse.core.databinding.beans;bundle-version="[1.2.200,1.5.0)",
- org.eclipse.core.databinding.observable;bundle-version="[1.4.1,1.5.0)",
- org.eclipse.core.databinding.property;bundle-version="[1.4.200,1.5.0)",
+ org.eclipse.core.databinding;bundle-version="[1.6.0,1.7.0)",
+ org.eclipse.core.databinding.beans;bundle-version="[1.3.100,1.4.0)",
+ org.eclipse.core.databinding.observable;bundle-version="[1.6.0,1.7.0)",
+ org.eclipse.core.databinding.property;bundle-version="[1.6.0,1.7.0)",
  org.eclipse.emf.databinding;bundle-version="1.3.0",
  org.eclipse.osbp.runtime.web.vaadin.databinding;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.ecview.dsl.ui;bundle-version="[0.9.0,0.10.0)",
- org.eclipse.xtext;bundle-version="[2.7.3,2.8.0)",
+ org.eclipse.xtext;bundle-version="[2.11.0,2.12.0)",
  org.eclipse.jdt.core;bundle-version="3.10.0",
  org.eclipse.osbp.ecview.dsl;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.xtext.builder.ui.access;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.runtime.web.vaadin.widgetset;bundle-version="[0.9.0,0.10.0)",
- org.eclipse.jetty.server;bundle-version="[8.1.14,9.0.0)",
- org.eclipse.jetty.http;bundle-version="[8.1.14,9.0.0)",
- org.eclipse.jetty.servlet;bundle-version="[8.1.14,9.0.0)",
- org.eclipse.jetty.util;bundle-version="[8.1.14,9.0.0)",
- org.eclipse.jetty.websocket;bundle-version="[8.1.14,9.0.0)",
+ org.eclipse.jetty.server;bundle-version="[9.4.1,9.4.2)",
+ org.eclipse.jetty.http;bundle-version="[9.4.1,9.4.2)",
+ org.eclipse.jetty.servlet;bundle-version="[9.4.1,9.4.2)",
+ org.eclipse.jetty.util;bundle-version="[9.4.1,9.4.2)",
+ org.eclipse.jetty.websocket.api;bundle-version="[9.4.1,9.4.2)",
  org.eclipse.equinox.http.servlet,
  org.eclipse.osbp.ide.core.api;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.ide.core.ui.shared;bundle-version="[0.9.0,0.10.0)",
diff --git a/org.eclipse.osbp.ecview.vaadin.ide.preview/src/org/eclipse/osbp/ecview/vaadin/ide/preview/jetty/PreviewJettyManager.java b/org.eclipse.osbp.ecview.vaadin.ide.preview/src/org/eclipse/osbp/ecview/vaadin/ide/preview/jetty/PreviewJettyManager.java
index 76ab36d..36c8ebd 100644
--- a/org.eclipse.osbp.ecview.vaadin.ide.preview/src/org/eclipse/osbp/ecview/vaadin/ide/preview/jetty/PreviewJettyManager.java
+++ b/org.eclipse.osbp.ecview.vaadin.ide.preview/src/org/eclipse/osbp/ecview/vaadin/ide/preview/jetty/PreviewJettyManager.java
@@ -24,12 +24,11 @@
 import javax.servlet.ServletResponse;
 
 import org.eclipse.equinox.http.servlet.HttpServiceServlet;
+import org.eclipse.jetty.server.AbstractNetworkConnector;
 import org.eclipse.jetty.server.Connector;
 import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.bio.SocketConnector;
+import org.eclipse.jetty.server.ServerConnector;
 import org.eclipse.jetty.server.handler.ContextHandlerCollection;
-import org.eclipse.jetty.server.nio.SelectChannelConnector;
-import org.eclipse.jetty.server.session.HashSessionManager;
 import org.eclipse.jetty.server.session.SessionHandler;
 import org.eclipse.jetty.servlet.ServletContextHandler;
 import org.eclipse.jetty.servlet.ServletHolder;
@@ -41,23 +40,23 @@
 	 * name="http.port" type="Integer" (default: 0 -- first available port)
 	 */
 	public static final String PROP_HTTP_PORT = "http.port"; //$NON-NLS-1$
-	
+
 	/**
 	 * name="other.info" type="String"
 	 */
 	public static final String PROP_OTHER_INFO = "other.info"; //$NON-NLS-1$
-	
+
 	public static final String PROP_IDEPREVIEW = "idepreview";
 	public static final String PROP_MOBILEPREVIEW = "mobilepreview";
-	
-//	private static final int HTTP_PORT = 8099;
+
+	// private static final int HTTP_PORT = 8099;
 	private static final String CONTEXT_TEMPDIR = "javax.servlet.context.tempdir"; //$NON-NLS-1$
 	private static final String DIR_PREFIX = "preview"; //$NON-NLS-1$
 	private static final String INTERNAL_CONTEXT_CLASSLOADER = "org.eclipse.equinox.http.jetty.internal.ContextClassLoader"; //$NON-NLS-1$
 
 	private Server server;
 	private File workDir;
-	
+
 	private int port;
 
 	public PreviewJettyManager(File workDir) {
@@ -85,7 +84,7 @@
 		stop();
 		Server server = new Server(0);
 
-		Connector httpConnector = createHttpConnector();
+		Connector httpConnector = createHttpConnector(server);
 		server.addConnector(httpConnector);
 
 		ContextHandlerCollection handlers = new ContextHandlerCollection();
@@ -97,7 +96,8 @@
 		server.setHandler(handlers);
 		try {
 			server.start();
-			port = server.getConnectors()[0].getLocalPort();
+			AbstractNetworkConnector connector = (AbstractNetworkConnector) server.getConnectors()[0];
+			port = connector.getLocalPort();
 			System.getProperties().setProperty("preview.port", Integer.toString(port));
 		} catch (Exception e) {
 			throw new RuntimeException(e.getMessage(), e);
@@ -106,14 +106,12 @@
 	}
 
 	protected ServletContextHandler createServletContext(String contextPath) {
-		ServletHolder holder = new ServletHolder(
-				new InternalHttpServiceServlet());
+		ServletHolder holder = new ServletHolder(new InternalHttpServiceServlet());
 		holder.setInitOrder(0);
 		holder.setInitParameter(Constants.SERVICE_VENDOR, "OSBP.org"); //$NON-NLS-1$
-		holder.setInitParameter(Constants.SERVICE_DESCRIPTION,
-				"ECView" + contextPath); //$NON-NLS-1$
-//		holder.setInitParameter(PROP_HTTP_PORT,
-//				Integer.toString(HTTP_PORT));
+		holder.setInitParameter(Constants.SERVICE_DESCRIPTION, "ECView" + contextPath); //$NON-NLS-1$
+		// holder.setInitParameter(PROP_HTTP_PORT,
+		// Integer.toString(HTTP_PORT));
 		holder.setInitParameter(PROP_OTHER_INFO, contextPath);
 		ServletContextHandler httpContext = createHttpContext("/" + contextPath);
 
@@ -126,14 +124,8 @@
 		server = null;
 	}
 
-	private Connector createHttpConnector() {
-		Connector connector;
-		if (getDefaultNIOEnablement()) {
-			connector = new SelectChannelConnector();
-		} else {
-			connector = new SocketConnector();
-		}
-//		connector.setPort(HTTP_PORT);
+	private Connector createHttpConnector(Server server) {
+		Connector connector = new ServerConnector(server);
 		return connector;
 	}
 
@@ -141,17 +133,16 @@
 		Properties systemProperties = System.getProperties();
 		String javaVendor = systemProperties.getProperty("java.vendor", ""); //$NON-NLS-1$ //$NON-NLS-2$
 		if (javaVendor.equals("IBM Corporation")) { //$NON-NLS-1$
-			String javaVersion = systemProperties.getProperty(
-					"java.version", ""); //$NON-NLS-1$ //$NON-NLS-2$
+			String javaVersion = systemProperties.getProperty("java.version", ""); //$NON-NLS-1$ //$NON-NLS-2$
 			if (javaVersion.startsWith("1.4")) //$NON-NLS-1$
 				return Boolean.FALSE;
 			// Note: no problems currently logged with 1.5
 			if (javaVersion.equals("1.6.0")) { //$NON-NLS-1$
-				String jclVersion = systemProperties.getProperty(
-						"java.jcl.version", ""); //$NON-NLS-1$ //$NON-NLS-2$
+				String jclVersion = systemProperties.getProperty("java.jcl.version", ""); //$NON-NLS-1$ //$NON-NLS-2$
 				if (jclVersion.startsWith("2007")) //$NON-NLS-1$
 					return Boolean.FALSE;
-				if (jclVersion.startsWith("2008") && !jclVersion.startsWith("200811") && !jclVersion.startsWith("200812")) //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				if (jclVersion.startsWith("2008") && !jclVersion.startsWith("200811") //$NON-NLS-1$ //$NON-NLS-2$
+						&& !jclVersion.startsWith("200812")) //$NON-NLS-1$
 					return Boolean.FALSE;
 			}
 		}
@@ -162,8 +153,7 @@
 		ServletContextHandler httpContext = new ServletContextHandler();
 		// hack in the mime type for xsd until jetty fixes it (bug 393218)
 		httpContext.getMimeTypes().addMimeMapping("xsd", "application/xml"); //$NON-NLS-1$ //$NON-NLS-2$
-		httpContext.setAttribute(INTERNAL_CONTEXT_CLASSLOADER, Thread
-				.currentThread().getContextClassLoader());
+		httpContext.setAttribute(INTERNAL_CONTEXT_CLASSLOADER, Thread.currentThread().getContextClassLoader());
 		httpContext.setClassLoader(this.getClass().getClassLoader());
 		httpContext.setContextPath(contextPath);
 
@@ -171,9 +161,7 @@
 		contextWorkDir.mkdir();
 		httpContext.setAttribute(CONTEXT_TEMPDIR, contextWorkDir);
 
-		HashSessionManager sessionManager = new HashSessionManager();
-
-		httpContext.setSessionHandler(new SessionHandler(sessionManager));
+		httpContext.setSessionHandler(new SessionHandler());
 
 		return httpContext;
 	}
@@ -185,8 +173,7 @@
 
 		public void init(ServletConfig config) throws ServletException {
 			ServletContext context = config.getServletContext();
-			contextLoader = (ClassLoader) context
-					.getAttribute(INTERNAL_CONTEXT_CLASSLOADER);
+			contextLoader = (ClassLoader) context.getAttribute(INTERNAL_CONTEXT_CLASSLOADER);
 
 			Thread thread = Thread.currentThread();
 			ClassLoader current = thread.getContextClassLoader();
@@ -210,8 +197,7 @@
 			contextLoader = null;
 		}
 
-		public void service(ServletRequest req, ServletResponse res)
-				throws ServletException, IOException {
+		public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
 			Thread thread = Thread.currentThread();
 			ClassLoader current = thread.getContextClassLoader();
 			thread.setContextClassLoader(contextLoader);
diff --git a/org.eclipse.osbp.ecview.xtext.builder.participant.i18n/META-INF/MANIFEST.MF b/org.eclipse.osbp.ecview.xtext.builder.participant.i18n/META-INF/MANIFEST.MF
index 46b7665..e631c6c 100644
--- a/org.eclipse.osbp.ecview.xtext.builder.participant.i18n/META-INF/MANIFEST.MF
+++ b/org.eclipse.osbp.ecview.xtext.builder.participant.i18n/META-INF/MANIFEST.MF
@@ -7,8 +7,8 @@
 Bundle-RequiredExecutionEnvironment: JavaSE-1.7
 Require-Bundle: com.google.guava;bundle-version="[10.0.0,19.0.0)",
  org.objectweb.asm;bundle-version="3.3.1",
- org.eclipse.xtext.common.types;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.11.0,2.12.0)",
+ org.eclipse.xtext;bundle-version="[2.11.0,2.12.0)",
  org.eclipse.osbp.xtext.builder.metadata.services;bundle-version="[0.9.0,0.10.0)",
  org.apache.commons.collections;bundle-version="3.2.0",
  org.eclipse.core.runtime;bundle-version="3.10.0",
diff --git a/org.eclipse.osbp.ecview.xtext.builder.participant.tests/.project b/org.eclipse.osbp.ecview.xtext.builder.participant.tests/.project
index 35dac10..1b1d717 100644
--- a/org.eclipse.osbp.ecview.xtext.builder.participant.tests/.project
+++ b/org.eclipse.osbp.ecview.xtext.builder.participant.tests/.project
@@ -26,6 +26,11 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
+			<name>org.eclipse.babel.editor.rbeBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
 			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>
@@ -36,5 +41,6 @@
 		<nature>org.eclipse.m2e.core.maven2Nature</nature>
 		<nature>org.eclipse.pde.PluginNature</nature>
 		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.babel.editor.rbeNature</nature>
 	</natures>
 </projectDescription>
diff --git a/org.eclipse.osbp.ecview.xtext.builder.participant.tests/META-INF/MANIFEST.MF b/org.eclipse.osbp.ecview.xtext.builder.participant.tests/META-INF/MANIFEST.MF
index bd69faf..41ec14d 100644
--- a/org.eclipse.osbp.ecview.xtext.builder.participant.tests/META-INF/MANIFEST.MF
+++ b/org.eclipse.osbp.ecview.xtext.builder.participant.tests/META-INF/MANIFEST.MF
@@ -5,17 +5,17 @@
 Bundle-Version: 0.9.0.qualifier
 Bundle-SymbolicName: org.eclipse.osbp.ecview.xtext.builder.participant.tests
 Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Export-Package: org.eclipse.osbp.ecview.xtext.builder.participant.tests;x-internal:=true;version="0.9.0"
 Require-Bundle: com.google.guava;bundle-version="[10.0.0,19.0.0)",
  org.objectweb.asm;bundle-version="3.3.1",
- org.eclipse.xtext.common.types;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.11.0,2.12.0)",
+ org.eclipse.xtext;bundle-version="[2.11.0,2.12.0)",
  org.eclipse.osbp.xtext.builder.metadata.services;bundle-version="[0.9.0,0.10.0)",
  org.knowhowlab.osgi.testing.assertions;bundle-version="[1.3.0,1.3.1)",
  org.knowhowlab.osgi.testing.utils;bundle-version="[1.2.2,1.2.3)",
  org.junit;bundle-version="4.11.0",
- org.eclipse.xtext.xbase;bundle-version="[2.7.3,2.8.0)",
+ org.eclipse.xtext.xbase;bundle-version="[2.11.0,2.12.0)",
  org.eclipse.equinox.ds;bundle-version="1.4.101",
  org.eclipse.equinox.util;bundle-version="1.0.500",
  org.eclipse.osbp.ecview.core.common.model;bundle-version="[0.9.0,0.10.0)",
diff --git a/org.eclipse.osbp.ecview.xtext.builder.participant/META-INF/MANIFEST.MF b/org.eclipse.osbp.ecview.xtext.builder.participant/META-INF/MANIFEST.MF
index c692add..21c0609 100644
--- a/org.eclipse.osbp.ecview.xtext.builder.participant/META-INF/MANIFEST.MF
+++ b/org.eclipse.osbp.ecview.xtext.builder.participant/META-INF/MANIFEST.MF
@@ -4,14 +4,14 @@
 Bundle-Vendor: Eclipse OSBP
 Bundle-Version: 0.9.0.qualifier
 Bundle-SymbolicName: org.eclipse.osbp.ecview.xtext.builder.participant
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Export-Package: org.eclipse.osbp.ecview.xtext.builder.participant;
   uses:="org.eclipse.osbp.ecview.core.common.model.core";version="0.9.0",
  org.eclipse.osbp.ecview.xtext.builder.participant.impl;x-internal:=true;version="0.9.0"
 Require-Bundle: com.google.guava;bundle-version="[10.0.0,19.0.0)",
  org.objectweb.asm;bundle-version="3.3.1",
- org.eclipse.xtext.common.types;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.11.0,2.12.0)",
+ org.eclipse.xtext;bundle-version="[2.11.0,2.12.0)",
  org.eclipse.osbp.xtext.builder.metadata.services;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.ecview.core.common.model;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.ecview.core.extension.model;bundle-version="[0.9.0,0.10.0)",
diff --git a/pom.xml b/pom.xml
index 4a97ab0..869815b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -20,7 +20,6 @@
 
 	<groupId>org.eclipse.osbp.ecview</groupId>
 	<artifactId>org.eclipse.osbp.ecview.aggregator</artifactId>
-	<version>0.9.0-SNAPSHOT</version>
 	<packaging>pom</packaging>
 
 	<url>${distribution.site.url}</url>
@@ -44,12 +43,14 @@
 
 	<modules>
 		<module>org.eclipse.osbp.ecview.dsl</module>
+		<module>org.eclipse.osbp.ecview.dsl.ide</module>
 		<module>org.eclipse.osbp.ecview.dsl.ui</module>
 		<module>org.eclipse.osbp.ecview.dsl.lib</module>
 		<module>org.eclipse.osbp.ecview.eclipse.ui.examples</module>
 <!-- 		<module>org.eclipse.osbp.ecview.examples.vaadin</module> -->
 		<module>org.eclipse.osbp.ecview.jetty.manager</module>
 		<module>org.eclipse.osbp.ecview.uisemantics</module>
+		<module>org.eclipse.osbp.ecview.uisemantics.ide</module>
 		<module>org.eclipse.osbp.ecview.uisemantics.ui</module>
 		<module>org.eclipse.osbp.ecview.vaadin.ide.preview</module>
 		<module>org.eclipse.osbp.ecview.xtext.builder.participant</module>
@@ -119,7 +120,7 @@
 				<plugin>
 					<groupId>org.eclipse.xtend</groupId>
 					<artifactId>xtend-maven-plugin</artifactId>
-					<version>2.7.3</version>
+					<version>2.11.0</version>
 					<executions>
 						<execution>
 							<goals>
diff --git a/target-luna.target b/target-luna.target
deleted file mode 100644
index a46734c..0000000
--- a/target-luna.target
+++ /dev/null
@@ -1,92 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<?pde version="3.8"?><target includeMode="feature" name="org.eclipse.osbp.xtext.builder.target.luna" sequenceNumber="61">
-<locations>
-<location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="planner" includeSource="true" type="InstallableUnit">
-<unit id="org.eclipse.xtend.sdk.feature.group" version="2.6.1.v201406120726"/>
-<unit id="org.eclipse.xpand.sdk.feature.group" version="2.0.0.v201406030414"/>
-<unit id="org.eclipse.xpand.feature.group" version="2.0.0.v201406030414"/>
-<unit id="org.eclipse.xtend.backend.feature.group" version="2.0.0.v201406030414"/>
-<unit id="org.eclipse.xtend.ui.feature.group" version="2.0.0.v201406030414"/>
-<unit id="org.eclipse.xpand.ui.feature.group" version="2.0.0.v201406030414"/>
-<unit id="org.eclipse.xtend.backend.sdk.feature.group" version="2.0.0.v201406030414"/>
-<unit id="org.eclipse.xpand.doc.feature.group" version="2.0.0.v201406030414"/>
-<unit id="org.eclipse.xpand.all.feature.group" version="2.0.0.v201406030414"/>
-<unit id="org.eclipse.xtend.backend.uml2types.feature.group" version="2.0.0.v201406030414"/>
-<unit id="org.eclipse.xtend.feature.group" version="2.0.0.v201406030414"/>
-<unit id="org.eclipse.emf.mwe2.language.sdk.feature.group" version="2.6.1.v201406120758"/>
-<unit id="org.eclipse.xtend.backend.xsdtypes.feature.group" version="2.0.0.v201406030414"/>
-<unit id="org.eclipse.xtend.typesystem.xsd.feature.group" version="2.0.0.v201406030414"/>
-<unit id="org.eclipse.xtend.typesystem.uml2.feature.group" version="2.0.0.v201406030414"/>
-<unit id="org.eclipse.xpand.examples.feature.group" version="2.0.0.v201406030414"/>
-<unit id="org.eclipse.xtext.sdk.feature.group" version="2.6.1.v201406120726"/>
-<unit id="org.eclipse.xtend.dependencies.feature.group" version="2.0.0.v201406030414"/>
-<unit id="org.eclipse.xpand.support.feature.group" version="2.0.0.v201406030414"/>
-<unit id="org.eclipse.xtend.middleend.xtend.feature.group" version="2.0.0.v201406030414"/>
-<unit id="org.eclipse.emf.mwe2.runtime.sdk.feature.group" version="2.6.1.v201406110919"/>
-<unit id="org.eclipse.xtend.middleend.xpand.feature.group" version="2.0.0.v201406030414"/>
-<unit id="org.eclipse.xtend.typesystem.emf.feature.group" version="2.0.0.v201406030414"/>
-<repository location="http://download.eclipse.org/modeling/tmf/xtext/updates/composite/releases/"/>
-</location>
-<location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="planner" includeSource="true" type="InstallableUnit">
-<unit id="org.eclipse.sdk.ide" version="4.4.0.I20140606-1215"/>
-<repository location="http://download.eclipse.org/eclipse/updates/4.4"/>
-</location>
-<location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="planner" includeSource="true" type="InstallableUnit">
-<unit id="org.eclipse.emf.edit.ui.feature.group" version="2.10.0.v20140519-0339"/>
-<unit id="org.eclipse.emf.codegen.ui.feature.group" version="2.8.0.v20140519-0339"/>
-<unit id="org.eclipse.emf.gwt.common.feature.group" version="2.9.0.v20140519-0339"/>
-<unit id="org.eclipse.xsd.editor.feature.group" version="2.8.0.v20140519-0339"/>
-<unit id="org.eclipse.emf.databinding.feature.group" version="1.4.0.v20140519-0339"/>
-<unit id="org.eclipse.emf.converter.feature.group" version="2.10.0.v20140519-0339"/>
-<unit id="org.eclipse.emf.mapping.ecore.feature.group" version="2.8.0.v20140519-0339"/>
-<unit id="org.eclipse.emf.mapping.feature.group" version="2.8.0.v20140519-0339"/>
-<unit id="org.eclipse.xsd.feature.group" version="2.10.0.v20140519-0339"/>
-<unit id="org.eclipse.emf.oda.feature.group" version="1.3.0.v20140519-0339"/>
-<unit id="org.eclipse.emf.edit.feature.group" version="2.10.0.v20140519-0339"/>
-<unit id="org.eclipse.emf.databinding.edit.feature.group" version="1.4.0.v20140519-0339"/>
-<unit id="org.eclipse.emf.ecore.editor.feature.group" version="2.10.0.v20140519-0339"/>
-<unit id="org.eclipse.emf.rap.edit.ui.feature.group" version="2.9.0.v20140519-0339"/>
-<unit id="org.eclipse.emf.gwt.edit.feature.group" version="2.8.0.v20140519-0339"/>
-<unit id="org.eclipse.xsd.sdk.feature.group" version="2.10.0.v20140519-0339"/>
-<unit id="org.eclipse.emf.gwt.ecore.edit.feature.group" version="2.8.0.v20140519-0339"/>
-<unit id="org.eclipse.emf.gwt.edit.ui.feature.group" version="2.7.0.v20140519-0339"/>
-<unit id="org.eclipse.emf.mapping.ui.feature.group" version="2.8.0.v20140519-0339"/>
-<unit id="org.eclipse.emf.examples.feature.group" version="2.10.0.v20140519-0339"/>
-<unit id="org.eclipse.emf.oda.ecore.feature.group" version="1.3.0.v20140519-0339"/>
-<unit id="org.eclipse.emf.doc.feature.group" version="2.9.0.v20140519-0339"/>
-<unit id="org.eclipse.xsd.doc.feature.group" version="2.9.0.v20140519-0339"/>
-<unit id="org.eclipse.emf.codegen.ecore.ui.feature.group" version="2.10.0.v20140519-0339"/>
-<unit id="org.eclipse.emf.codegen.ecore.feature.group" version="2.10.0.v20140519-0339"/>
-<unit id="org.eclipse.xsd.ecore.converter.feature.group" version="2.9.0.v20140519-0339"/>
-<unit id="org.eclipse.xsd.mapping.editor.feature.group" version="2.9.0.v20140519-0339"/>
-<unit id="org.eclipse.emf.sdk.feature.group" version="2.10.0.v20140519-0339"/>
-<unit id="org.eclipse.xsd.edit.feature.group" version="2.8.0.v20140519-0339"/>
-<unit id="org.eclipse.emf.rap.sdk.feature.group" version="2.10.0.v20140519-0339"/>
-<unit id="org.eclipse.emf.all.feature.group" version="2.10.0.v20140519-0339"/>
-<unit id="org.eclipse.emf.rap.common.ui.feature.group" version="2.8.0.v20140519-0339"/>
-<unit id="org.eclipse.emf.oda.ecore.ui.feature.group" version="1.2.0.v20140519-0339"/>
-<unit id="org.eclipse.emf.rap.feature.group" version="2.10.0.v20140519-0339"/>
-<unit id="org.eclipse.emf.oda.sdk.feature.group" version="1.3.0.v20140519-0339"/>
-<unit id="org.eclipse.emf.feature.group" version="2.10.0.v20140519-0339"/>
-<unit id="org.eclipse.emf.common.ui.feature.group" version="2.9.0.v20140519-0339"/>
-<unit id="org.eclipse.emf.gwt.ecore.feature.group" version="2.9.0.v20140519-0339"/>
-<unit id="org.eclipse.emf.ecore.edit.feature.group" version="2.9.0.v20140519-0339"/>
-<unit id="org.eclipse.emf.mapping.ecore.editor.feature.group" version="2.9.0.v20140519-0339"/>
-<unit id="org.eclipse.emf.codegen.feature.group" version="2.10.0.v20140519-0339"/>
-<unit id="org.eclipse.emf.common.feature.group" version="2.10.0.v20140514-1158"/>
-<unit id="org.eclipse.xsd.mapping.feature.group" version="2.8.0.v20140519-0339"/>
-<unit id="org.eclipse.emf.gwt.feature.group" version="2.9.0.v20140519-0339"/>
-<unit id="org.eclipse.emf.ecore.feature.group" version="2.10.0.v20140514-1158"/>
-<unit id="org.eclipse.emf.gwt.sdk.feature.group" version="2.9.0.v20140519-0339"/>
-<repository location="http://download.eclipse.org/modeling/tmf/xtext/updates/composite/releases/"/>
-</location>
-<location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="planner" includeSource="true" type="InstallableUnit">
-<unit id="org.eclipse.emf.mwe.core.feature.group" version="1.3.3.v201406110919"/>
-<unit id="org.eclipse.emf.mwe.ui.feature.group" version="1.3.3.v201406110919"/>
-<unit id="org.eclipse.emf.mwe.license.feature.group" version="2.6.0.v201406110919"/>
-<unit id="org.eclipse.emf.mwe.sdk.feature.group" version="1.3.3.v201406110919"/>
-<unit id="org.eclipse.emf.mwe.doc.feature.group" version="1.3.3.v201406110919"/>
-<repository location="http://download.eclipse.org/modeling/tmf/xtext/updates/composite/releases/"/>
-</location>
-</locations>
-</target>
